Смена языка интерфейса в программе "на лету"
Модератор: Модераторы
А в чем проблема ?
Установить язык аккуратно завершить LCL Application.Terminate; , а в проекте написать что-то вроде :
Const
reboot : boolean = false ; // константу разумеется в модуль главной формы
...
begin
{$I project1.lrs}
Repeat
Reboot : = false ;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
until not Reboot ;
end.
Установить язык аккуратно завершить LCL Application.Terminate; , а в проекте написать что-то вроде :
Const
reboot : boolean = false ; // константу разумеется в модуль главной формы
...
begin
{$I project1.lrs}
Repeat
Reboot : = false ;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
until not Reboot ;
end.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Alex2013 писал(а):А в чем проблема ?
Const
reboot : boolean = false ; // константу разумеется в модуль главной формы
...
begin
{$I project1.lrs}
Repeat
Reboot : = false ;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
until not Reboot ;
end.
Прикольная идея. Не думал, что так можно. МОжет поэкспериментирую над этим. А вообще, была мысль сделать еще до безобразия проще: появляется мессейдж с просьбой перезагрузить программу. Правда нужно было бы как-то определять нужный код языка до собственно еще загрузки всех форм и самого файла настроек программы.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Alex2013, Накуа такие проблемы?
Я спокойненько сделал смену языка и без ребута проги.
Добавлено спустя 1 минуту 30 секунд:
Это как раз не особая проблема.
Я спокойненько сделал смену языка и без ребута проги.
Добавлено спустя 1 минуту 30 секунд:
Ichthyander писал(а):Правда нужно было бы как-то определять нужный код языка до собственно еще загрузки всех форм и самого файла настроек программы.
Это как раз не особая проблема.
Лекс Айрин
>>Меню спокойно заменяется динамически простым присваиванием
тогда нужно быть последовательным и создат вторые (третьи, четвертые...) локализованные копии всех фором)) Несерьезеый имхо подход - локализация должна быть отдельно и выполнятся без копания в исходниках программы. gettext и po - для этого стандартный и общепринятый способ, зачем придумывать костыли?
>>Я спокойненько сделал смену языка и без ребута проги.
кроме того, ваш метод для смены языка налету также как и PO требует пересоздание форм (без разницы как это выполняется - "ребут", "присвоение" или чтото еще) - значит он ничем не лучше
>>Меню спокойно заменяется динамически простым присваиванием
тогда нужно быть последовательным и создат вторые (третьи, четвертые...) локализованные копии всех фором)) Несерьезеый имхо подход - локализация должна быть отдельно и выполнятся без копания в исходниках программы. gettext и po - для этого стандартный и общепринятый способ, зачем придумывать костыли?
>>Я спокойненько сделал смену языка и без ребута проги.
кроме того, ваш метод для смены языка налету также как и PO требует пересоздание форм (без разницы как это выполняется - "ребут", "присвоение" или чтото еще) - значит он ничем не лучше
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub писал(а):тогда нужно быть последовательным и создат вторые (третьи, четвертые...) локализованные копии всех фором)) Несерьезеый имхо подход - локализация должна быть отдельно и выполнятся без копания в исходниках программы.
А у меня и прога несерьезная)) И я не думал серьезно над этим вопросом. Но если задумаюсь, то:
1) Буду создавать меню динамически.
2) Буду использовать языковые файлы собственного формата. Или же в обычным текстовым.
3) Заведу сохраняемый в настройках список языков, процедуру Setlanguage (или функцию, не суть важно).
4) сделаю это отдельным модулем
zub писал(а):кроме того, ваш метод для смены языка налету также как и PO требует пересоздание форм (без разницы как это выполняется - "ребут", "присвоение" или чтото еще) - значит он ничем не лучше
С какого перепугу?
>>С какого перепугу?
C такого, что локализация это не только меню, но еще и тонна всяких лабелов, капшенов, хинтов, буттонов и иже с ними... Ладно меню переключаете динамически, с формами придется повозиться и в итоге прийти к их пересозданию, либо отказу от локализации налету без "перезапуска" программы. Если программа "несеръезная" - перезапуск\пересоздание никаких сложностей не вызывает, сложности появляются если в текущей сессии есть какиелибо динамические данные - их для "ребута" нужно будет сохранить а потом заново открыть
>>Но если задумаюсь, то:
>>1..5
Это всё уже есть в gettext. Плюсом к нему еще и поддержка со стороны компилятора\иде и куча сторонних программ для перевода PO.
Единственная сложность с PO это перевод "рантаймных" строк - тех которые не фигурируют ни в исходниках ни на формах, а читаются программой при работе из сторонних файлов. Их надо подмешать в PO файл генерируемый компилятором так чтобы при следующей компиляции он их не выкинул, либо держать в отдельном PO и поддерживать их актуальность самому
В части удобства использования любой костыль проиграет gettext, если конечно разработчики FPC\Lazarus не примут ваши патчи с поддержкой вашего формата))
C такого, что локализация это не только меню, но еще и тонна всяких лабелов, капшенов, хинтов, буттонов и иже с ними... Ладно меню переключаете динамически, с формами придется повозиться и в итоге прийти к их пересозданию, либо отказу от локализации налету без "перезапуска" программы. Если программа "несеръезная" - перезапуск\пересоздание никаких сложностей не вызывает, сложности появляются если в текущей сессии есть какиелибо динамические данные - их для "ребута" нужно будет сохранить а потом заново открыть
>>Но если задумаюсь, то:
>>1..5
Это всё уже есть в gettext. Плюсом к нему еще и поддержка со стороны компилятора\иде и куча сторонних программ для перевода PO.
Единственная сложность с PO это перевод "рантаймных" строк - тех которые не фигурируют ни в исходниках ни на формах, а читаются программой при работе из сторонних файлов. Их надо подмешать в PO файл генерируемый компилятором так чтобы при следующей компиляции он их не выкинул, либо держать в отдельном PO и поддерживать их актуальность самому
В части удобства использования любой костыль проиграет gettext, если конечно разработчики FPC\Lazarus не примут ваши патчи с поддержкой вашего формата))
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub писал(а):C такого, что локализация это не только меню, но еще и тонна всяких лабелов, капшенов, хинтов, буттонов и иже с ними... Ладно меню переключаете динамически, с формами придется повозиться и в итоге прийти к их пересозданию, либо отказу от локализации налету без "перезапуска" программы.
...тонна всяких лабелов, капшенов эт сетера спокойно переименовывается без пересоздания формы. Я это уже сделал. Еще проще чем с меню получается. Даже если требуется полностью другая форма, необязательно ее пересоздавать. Достаточно скрыть и отобразить другую. С точно таким же дизайном, но другим языком.
Да и меню можно переименовывать динамически... просто сложнее. Я пока этим не решился пострадать.
zub писал(а):Это всё уже есть в gettext. Плюсом к нему еще и поддержка со стороны компилятораиде и куча сторонних программ для перевода PO.
а вот поддержка компилятора/иде... это как раз минус, а не плюс. Если найдется лучшая система на нее будет сложнее перейти.
Добавлено спустя 6 минут 17 секунд:
zub писал(а):В части удобства использования любой костыль проиграет gettext, если конечно разработчики FPC\Lazarus не примут ваши патчи с поддержкой вашего формата))
Не примет точно. Я буду делать совсем по другому... Если буду. Желательно так, что бы перевод можно было сделать, допустим, в гугл переводчике и подключить к программе.
>>Желательно так, что бы перевод можно было сделать, допустим, в гугл переводчике и подключить к программе.
И это можно сделать c PO))
>>а вот поддержка компилятора/иде... это как раз минус, а не плюс. Если найдется лучшая система на нее будет сложнее перейти.
Нет, плюс!
с велосипедов полюбому легче будет перейти)) да и ненайдется ничего))
>>...тонна всяких лабелов, капшенов эт сетера спокойно переименовывается без пересоздания формы.
да, споконо переименовываются тонной рукописных сеттеров. Либо своей процедурой пробегающей по всем контролам, но тогда в контролах нужно хранить "привязку" по которой будем брать соответствующее значение из своей системы локализации. Писать приблуду которая будет поддерживать в актуальном состоянии "привязки" и содержимое локализаций или делать это руками...
Зачем? всё уже сделано и прекрасно работает.
>>необязательно ее пересоздавать. Достаточно скрыть и отобразить другую
Мы друг друга не понимаем. Именно это я и подразумеваю под "пересоздать" - тот процесс который происходит в Application.CreateForm и аналогичных - чтоб форму показать надо ее создать. Собственно что будет "пересоздаваться" - другая форма (ваш вариант) или этаже с другой локализацией (po) неважно.
>>Не примет точно. Я буду делать совсем по другому...
Согласен с разрабами FPC\Lazarus, потому что усилия надо тратить на более полезные вещи, а не на свои варианты локализации))
Я понимаю велосипедистов которые изобретают чтобы понять как что устроено, сам таким являюсь. Но когда отвергается хороший вариант в пользу какойто умозрительной выгоды - чтото тут нетак))
И это можно сделать c PO))
>>а вот поддержка компилятора/иде... это как раз минус, а не плюс. Если найдется лучшая система на нее будет сложнее перейти.
Нет, плюс!
с велосипедов полюбому легче будет перейти)) да и ненайдется ничего))
>>...тонна всяких лабелов, капшенов эт сетера спокойно переименовывается без пересоздания формы.
да, споконо переименовываются тонной рукописных сеттеров. Либо своей процедурой пробегающей по всем контролам, но тогда в контролах нужно хранить "привязку" по которой будем брать соответствующее значение из своей системы локализации. Писать приблуду которая будет поддерживать в актуальном состоянии "привязки" и содержимое локализаций или делать это руками...
Зачем? всё уже сделано и прекрасно работает.
>>необязательно ее пересоздавать. Достаточно скрыть и отобразить другую
Мы друг друга не понимаем. Именно это я и подразумеваю под "пересоздать" - тот процесс который происходит в Application.CreateForm и аналогичных - чтоб форму показать надо ее создать. Собственно что будет "пересоздаваться" - другая форма (ваш вариант) или этаже с другой локализацией (po) неважно.
>>Не примет точно. Я буду делать совсем по другому...
Согласен с разрабами FPC\Lazarus, потому что усилия надо тратить на более полезные вещи, а не на свои варианты локализации))
Я понимаю велосипедистов которые изобретают чтобы понять как что устроено, сам таким являюсь. Но когда отвергается хороший вариант в пользу какойто умозрительной выгоды - чтото тут нетак))
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub писал(а):И это можно сделать c PO))
Нельзя. Нужно будет очень много копипастить.
zub писал(а):да, споконо переименовываются тонной рукописных сеттеров. Либо своей процедурой пробегающей по всем контролам, но тогда в контролах нужно хранить "привязку" по которой будем брать соответствующее значение из своей системы локализации.
Абсолютно так же как и стандартным способом.
zub писал(а):Собственно что будет "пересоздаваться" - другая форма (ваш вариант) или этаже с другой локализацией (po) неважно.
вообще-то пересоздать это создать форму заново, что для главной формы является аналогом перезапуска проги. Открыть другую форму это уже другой процесс.
zub писал(а):Мы друг друга не понимаем.
Скорее всего.
zub писал(а):Согласен с разрабами FPC\Lazarus, потому что усилия надо тратить на более полезные вещи, а не на свои варианты локализации))
Почитайте о минусах монополии. Можно на экономических ресурсах. Выбор должен быть всегда.
zub писал(а): Но когда отвергается хороший вариант в пользу какойто умозрительной выгоды - чтото тут нетак))
Вариантов ответа два. В моем случае, перетоксикоз манами. Пока я не пойму идеологию я не буду пользоваться компонентом.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Лекс Айрин писал(а):zub писал(а):И это можно сделать c PO))
Нельзя. Нужно будет очень много копипастить.
В программе POEdit предлагается сразу несколько вариантов перевода. Есть собственная база переводов и другие фишки онлайн перевода прямо в интерфейсе программы. Есть и другие программы для работы с файлами PO, наверняка где-то есть именно интеграция с Google переводчиком
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Ichthyander,не... не из окна проги, а именно перевод содержимого файла перевода до последней точки. Это немного другое. Нафига мне автоматизация копипаста? А в РО файлах много такого, что переводить нельзя ни в коем случае.
На это дело есть как куча сторонних программ, так и сам гугль об этом заботится http://www.opennet.ru/opennews/art.shtml?num=33492
>>А в РО файлах много такого, что переводить нельзя ни в коем случае.
естественно, в вашем формате тоже подобное появится - тут либо служебная информация в файле, либо удобство использования - выбирайте чтото одно))
Добавлено спустя 9 минут 56 секунд:
>>вообще-то пересоздать это создать форму заново, что для главной формы является аналогом перезапуска проги. Открыть другую форму это уже другой процесс.
"Главная" форма отличается от не главной только тем что числится в application как "главная" и процесс ее создания и показа предлагается автоматически (то что в lpr), но никто не мешает в него вмешаться и сделать так как нужно. перезапуск арограммы это совсем другое
>>А в РО файлах много такого, что переводить нельзя ни в коем случае.
естественно, в вашем формате тоже подобное появится - тут либо служебная информация в файле, либо удобство использования - выбирайте чтото одно))
Добавлено спустя 9 минут 56 секунд:
>>вообще-то пересоздать это создать форму заново, что для главной формы является аналогом перезапуска проги. Открыть другую форму это уже другой процесс.
"Главная" форма отличается от не главной только тем что числится в application как "главная" и процесс ее создания и показа предлагается автоматически (то что в lpr), но никто не мешает в него вмешаться и сделать так как нужно. перезапуск арограммы это совсем другое
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub писал(а):естественно, в вашем формате тоже подобное появится - тут либо служебная информация в файле, либо удобство использования - выбирайте чтото одно))
А вот не появится. Как там в мульте было... лучше день потерять, а потом за 5 минут долететь.
zub писал(а):и процесс ее создания и показа предлагается автоматически (то что в lpr)
Вообще-то, не только главная форма создается автоматически. Просто она создается так обязательно. (кстати, я бы сам не решился бы создавать лишние формы просто ради удобства. Память то они жруть.) Остальные по умолчанию создаются, но скрываются.
>>А вот не появится. Как там в мульте было... лучше день потерять, а потом за 5 минут долететь.
Дайте пример получения локализованной строки из программы. Po делает это по идентификатору.
>>Вообще-то, не только главная форма создается автоматически
Я не предлагаю создавать или не создавать. лишь говорю о том что все эти процессы под контролем програмиста и сделать это можно разными способами.
Дайте пример получения локализованной строки из программы. Po делает это по идентификатору.
>>Вообще-то, не только главная форма создается автоматически
Я не предлагаю создавать или не создавать. лишь говорю о том что все эти процессы под контролем програмиста и сделать это можно разными способами.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub вообще-то я говорил теоретически... ну ладно.
Выносим все строки программы в отдельные переменные (или вообще в одну переменную массив, например, с именем AllCaption) и ассоциируем переменные/ную со строками в файле. Заменяя файл меняем перевод. Я не пытаюсь получить идентификатор. Он тупо не нужен. Процедура смены языка знает где менять. Да, в дизайнере не будут отображаться заголовки, пункты меню и т.п. (да и то необязательно, можно и проставить для удобства).
Есть процедура заполняющая массив из файла. это элементарно, даже думать лень. Над выбором языка тоже думать лень.
В программе это будет выглядеть примерно как..
Добавлено спустя 3 минуты 22 секунды:
Что-то загорелся я идеей это реализовать. Удобно же.
Выносим все строки программы в отдельные переменные (или вообще в одну переменную массив, например, с именем AllCaption) и ассоциируем переменные/ную со строками в файле. Заменяя файл меняем перевод. Я не пытаюсь получить идентификатор. Он тупо не нужен. Процедура смены языка знает где менять. Да, в дизайнере не будут отображаться заголовки, пункты меню и т.п. (да и то необязательно, можно и проставить для удобства).
Есть процедура заполняющая массив из файла. это элементарно, даже думать лень. Над выбором языка тоже думать лень.
В программе это будет выглядеть примерно как..
Код: Выделить всё
MainForm.GroupBox1.Caption:=AllCaption[0];
MainForm.FontBold.Caption:='AllCaption[1];
MainForm.FontItalic.Caption:=AllCaption[2];
....
FormN.SaveTree.Hint:=AllCaption[xxx];
Добавлено спустя 3 минуты 22 секунды:
Что-то загорелся я идеей это реализовать. Удобно же.
