Смена языка интерфейса в программе "на лету"
Модератор: Модераторы
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Re: Смена языка интерфейса в программе "на лету"
vitaly_l, Я, вообще-то, не думаю, что буду использовать больше 5 языков. Понадобится, поменяю подход.
Re: Смена языка интерфейса в программе "на лету"
Лекс Айрин писал(а):Я, вообще-то, не думаю, что буду использовать больше 5 языков. Понадобится, поменяю подход.
Так Вам на каждую переменную нужно строку в case составить, это накладно. Там есть какая-то возможность перебрать переменные в режиме цикла.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Re: Смена языка интерфейса в программе "на лету"
vitaly_l, зачем? Можно использовать inc файлы, а переводы описывать отдельно, да и я буду описывать единую процедуру смены языка для всей программы.... вариантов больше одного.
Как ни странно, но вариант с циклом более затратен... ведь язык может быть любой, а значит и перебор может быть относительно долгим. В идеале, проще связать каждый файл перевода с текстовой константой... надо будет поискать более простой способ. Чисто для интереса.
Как ни странно, но вариант с циклом более затратен... ведь язык может быть любой, а значит и перебор может быть относительно долгим. В идеале, проще связать каждый файл перевода с текстовой константой... надо будет поискать более простой способ. Чисто для интереса.
Re: Смена языка интерфейса в программе "на лету"
Править чужой исходник какбы не айс. Через неделю будет новая версия - будете занова править?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Re: Смена языка интерфейса в программе "на лету"
zub, возможно. А возможно просто форкну его.
Re: Смена языка интерфейса в программе "на лету"
>>vitaly_l, зачем? Можно использовать inc файлы, а переводы описывать отдельно, да и я буду описывать единую процедуру смены языка для всей программы.... вариантов больше одного.
Можно использовать какие хочешь файлы с любыми расширениями и содержимым. Смысл в том чтобы нигде не хардкодить перевод в программу, перевод осущестлять отдельно от исходников. Программа вообще ничего не должна знать что что ее будут переводить и какими средствами это будет делаться.
При использовании великов - это никогда не получится. При использовании средств поддерживаемых компилятором и средой - пожалуйста, только пометь нуждающееся в переводе места ResourceString и TTranslateString
Так получится действительно отделишь мух от котлет, а не просто сделаешь видимость что они разделены
Можно использовать какие хочешь файлы с любыми расширениями и содержимым. Смысл в том чтобы нигде не хардкодить перевод в программу, перевод осущестлять отдельно от исходников. Программа вообще ничего не должна знать что что ее будут переводить и какими средствами это будет делаться.
При использовании великов - это никогда не получится. При использовании средств поддерживаемых компилятором и средой - пожалуйста, только пометь нуждающееся в переводе места ResourceString и TTranslateString
Так получится действительно отделишь мух от котлет, а не просто сделаешь видимость что они разделены
Re: Смена языка интерфейса в программе "на лету"
Использую i18n и LCLTranslator все переводиться кроме DBGrid.Columns.
Хотя в сгенерированом PO файле все есть:
#: tmainform.dbgrid1.columns[0].title.caption
msgctxt "tmainform.dbgrid1.columns[0].title.caption"
msgid "TitleTest"
msgstr "Тест"
Но при переключении языка заголовки колонок остаются прежними. Если кто сталкивался подскажите как решить проблему.
Хотя в сгенерированом PO файле все есть:
#: tmainform.dbgrid1.columns[0].title.caption
msgctxt "tmainform.dbgrid1.columns[0].title.caption"
msgid "TitleTest"
msgstr "Тест"
Но при переключении языка заголовки колонок остаются прежними. Если кто сталкивался подскажите как решить проблему.
Re: Смена языка интерфейса в программе "на лету"
AndrewFG писал(а): i18n и LCLTranslator все переводиться кроме DBGrid.Columns.
Сделайте минимальный пример, только с одной DBGrid и укажите, что именно не переводится.
Re: Смена языка интерфейса в программе "на лету"
Взял пример из Lazarus: translation. Бросил на форму DBGrid, Добавил колонку, во файле translation_demo.ru.po записал перевод заголовка колонки. Меняю язык, заголовок колонки не реагирует.
На скриншоте все видно:

Неужели никто не сталкивался, никому не нужно было переключение языка интерфейса ? Похоже придется лезть в дебри чужого кода (((
На скриншоте все видно:

Неужели никто не сталкивался, никому не нужно было переключение языка интерфейса ? Похоже придется лезть в дебри чужого кода (((
Re: Смена языка интерфейса в программе "на лету"
Разобрался с причиной по которой не переводятся заголовки в DBGrid. Оказалось что в файле lcltranslator.pas который из LCL в методе TUpdateTranslator.IntUpdateTranslation при проверке переводить или не переводить идет проверка свойства с помощью IsStoredProp. И DBGrid->Columns->Title->Caption эту проверку не проходит. Если закоментировать все сразу переводиться!
Вроде проблема найдена и решена. Но момент который смущает: Зачем эта проверка вообще ? Если свойство не stored то на нужный язык и переводить ее нельзя? Не вылезет ли где нибудь проблема если IsStoredProp убрать?
И еще: подскажите кто знает как сообщать разработчикам FPC/Lazarus о найденных проблемах?
Код: Выделить всё
procedure TUpdateTranslator.IntUpdateTranslation(AnInstance: TPersistent);
var
i,j: integer;
APropCount: integer;
APropList: PPropList;
APropInfo: PPropInfo;
TmpStr: string;
APersistentProp: TPersistent;
StoreStackPath: string;
begin
APropCount := GetPropList(AnInstance.ClassInfo, APropList);
try
for i := 0 to APropCount-1 do
begin
APropInfo:=APropList^[i];
if Assigned(PPropInfo(APropInfo)^.GetProc) and
assigned(APropInfo^.PropType)
(*and IsStoredProp(AnInstance, APropInfo)*) // <-----
then
case APropInfo^.PropType^.Kind of
tkUString,
tkSString,
tkLString,
tkAString,
tkWString
: begin
Вроде проблема найдена и решена. Но момент который смущает: Зачем эта проверка вообще ? Если свойство не stored то на нужный язык и переводить ее нельзя? Не вылезет ли где нибудь проблема если IsStoredProp убрать?
И еще: подскажите кто знает как сообщать разработчикам FPC/Lazarus о найденных проблемах?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Re: Смена языка интерфейса в программе "на лету"
AndrewFG, для начала, обнови Лазарус и FPC до актуального транка, возможно, что проблему уже исправили. Если нет, то тебе на
https://bugs.freepascal.org/view_all_bu ... oject_id=1
https://bugs.freepascal.org/view_all_bu ... oject_id=1
