Смена языка интерфейса в программе "на лету"

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Смена языка интерфейса в программе "на лету"

Сообщение zub » 16.06.2015 14:29:56

>>AllCaption[xxx]
Т.е. связь gui->AllCaption по индексу массива. Насколько понимаю для связи AllCaption->файл локализации индекс в массиве станет номером строки в файле?
Потянет для лкализации диалога с yes,no,cancel
Для чегото серъезного - это содом и гомора(( Вопервых придется в мозгу держать индексы строк которые набегают со страшной силой. Во вторых рано или поздно придет необходимость убрать ставшие ненужными строки в начале массива... оставлять их пустыми и держать свободные диапозоны в мозгу? потом постепенно заполнять новыми строками? поправлять индексы во всех исходниках? писать на это дело свой парсер?
Таки попробуйте поюзать po и поймите для чего там то что переводить ненадо и что там тоже также можно получить локализованую строку по идентификатору (идентификатором только выступает не абстрактный индекс, а текстовая строка однозначно идентифицирующая переводимый текст в исходниках или на форме). Po это не чтото скрытое и переводящее формы при их сождании, это какраз
>>Что-то загорелся я идеей это реализовать. Удобно же.

Кроме того, повторяю, ваш подход не вносит никаких преимуществ в части локализации "налету" относительно Po. Этот момент в обоих случаях происходит совершенно одинаково.
zub
долгожитель
 
Сообщения: 2470
Зарегистрирован: 14.11.2005 23:51:26

Re: Смена языка интерфейса в программе "на лету"

Сообщение Лекс Айрин » 16.06.2015 15:38:16

zub писал(а):Т.е. связь gui->AllCaption по индексу массива. Насколько понимаю для связи AllCaption->файл локализации индекс в массиве станет номером строки в файле?


zub писал(а):Вопервых придется в мозгу держать индексы строк которые набегают со страшной силой.


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

Просто стереть нужную строку из файла, оставив один перевод строки. Пустая строка -- неиспользуемая. Места она почти не занимает, так что пусть будет. Если правильно организовать, то всякие yes/no идут в начале файла. Сам файл это хелп.

zub писал(а):поправлять индексы во всех исходниках? писать на это дело свой парсер?


Да. Не так уж это и много, если не использовать очень уж большой проект. Зато я точно знаю что к чему относится. Не понял зачем парсер? Имхо, он то как раз не нужен.

zub писал(а): Этот момент в обоих случаях происходит совершенно одинаково.

В случае с РО добавляется лишний код.

zub писал(а):Таки попробуйте поюзать po и поймите для чего там то что переводить ненадо

Я не понимаю идеологии кода, а значит, не контролирую его. Не хочу выглядеть обезьяной с гранатой. Плюс, я думаю как перейти на что-то пусть и более платформозависимое, но более легкое. Соответственно выбираю то, что я могу реализовать по минимуму используя библиотечный код.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4492
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Смена языка интерфейса в программе "на лету"

Сообщение zub » 16.06.2015 16:20:02

>>Да. Не так уж это и много, если не использовать очень уж большой проект. Зато я точно знаю что к чему относится. Не понял зачем парсер? Имхо, он то как раз не нужен.
Я против ручной работы, даже если кажется (а это только кажется, поверте) что ее немного. Вы уже упомянали песню - лучше день потерять, а потом за 5 минут долететь.

>>В случае с РО добавляется лишний код.
Какой?
просто
Код: Выделить всё
MainForm.FontBold.Caption:='AllCaption[1];

заменяется на соответствующий механизм из PO. А вот лишний велосипедный код - загрузка файла локализации, формирование массива, поиск по массиву с вариантом перевода если вдруг локализация пока не полная - какраз убирается

И да еще "маленький" плюс - тутже заодно, чудесным образом, имеем перевод всего lcl'евского добра
zub
долгожитель
 
Сообщения: 2470
Зарегистрирован: 14.11.2005 23:51:26

Re: Смена языка интерфейса в программе "на лету"

Сообщение Лекс Айрин » 16.06.2015 16:30:09

zub писал(а):А вот лишний велосипедный код - загрузка файла локализации, формирование массива, поиск по массиву с вариантом перевода если вдруг локализация пока не полная - какраз убирается


Этот код так же легко меняется на код доступа из самого екзешника, но... и это существенно, в случае использования отдельного файла я могу добавить поддержку хоть ломанной смеси суахили и бенгали, а то и марсианского арго не перекомпилируя исполнимый файл.

Добавлено спустя 12 минут 9 секунд:
zub писал(а):И да еще "маленький" плюс - тутже заодно, чудесным образом, имеем перевод всего lcl'евского добра


Если честно, не вставляет. Я вообще не обращаю внимания на язык системных кнопок. Будет (или будут :) ) напрягать -- либо подправлю код Лазаруса, либо использую API диалоги.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4492
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Смена языка интерфейса в программе "на лету"

Сообщение zub » 16.06.2015 16:43:24

E:\lazarus\lcl\languages>dir
Содержимое папки E:\lazarus\lcl\languages
14.06.2015 21:19 <DIR> .
14.06.2015 21:19 <DIR> ..
04.03.2015 21:46 42 294 lclstrconsts.ca.po
04.03.2015 21:46 45 873 lclstrconsts.cs.po
26.04.2015 00:16 42 925 lclstrconsts.de.po
30.04.2015 23:04 47 354 lclstrconsts.es.po
04.03.2015 21:46 42 707 lclstrconsts.fi.po
13.04.2015 15:30 47 521 lclstrconsts.fr.po
04.03.2015 21:46 49 462 lclstrconsts.he.po
07.06.2015 02:03 47 364 lclstrconsts.hu.po
04.03.2015 21:46 41 552 lclstrconsts.id.po
04.03.2015 21:46 46 329 lclstrconsts.it.po
04.03.2015 21:46 51 864 lclstrconsts.ja.po
04.03.2015 21:46 47 808 lclstrconsts.lt.po
07.03.2015 18:24 46 234 lclstrconsts.nl.po
04.03.2015 21:46 41 707 lclstrconsts.no.po
04.03.2015 21:46 39 430 lclstrconsts.pl.po
04.03.2015 21:46 34 070 lclstrconsts.po
04.03.2015 21:46 47 403 lclstrconsts.pt_BR.po
04.03.2015 21:46 54 561 lclstrconsts.ru.po
04.03.2015 21:46 40 774 lclstrconsts.sk.po
04.03.2015 21:46 42 237 lclstrconsts.tr.po
04.03.2015 21:46 54 617 lclstrconsts.uk.po
04.03.2015 21:46 41 016 lclstrconsts.zh_CN.po
27.01.2011 20:19 827 README.txt


копируете файл lclstrconsts.po в lclstrconsts.Lang.po, делаете перевод (руками или автоматический) и поддержка соответствующего Lang появляется. Ничего перекомпилировать ненужно. Компилятор за актуальностью всех этих файлов следит, ставшее ненужным вычищает автоматически, никакой мороки с последующими изменениями кода нет
zub
долгожитель
 
Сообщения: 2470
Зарегистрирован: 14.11.2005 23:51:26

Re: Смена языка интерфейса в программе "на лету"

Сообщение Лекс Айрин » 16.06.2015 17:58:38

zub, И это все вставляется в код :shock: ?

Хорошо... где мой марсианский арго, появившийся, допустим, в 2048 году? (прогу я скомпилирую, например, через месяц от сего числа). Компилятор стерт (разработчик забил на него и удалил репы) и вместо него я использую несовместимый по коду и языку SuperPascal и RAD CasualConstructor. Исходники стерты, да и если были бы ничего не решали. С меня срочно требуют 100500 разных переводов. Прога работает в режиме совместимости и менять люди ее не хотят. (как ни странно, некоторые, например, еще пользуются DOS прогами). Чем я тогда буду с РО файлами отличаться от неудачника? Придется мне тогда брать в руки редактор ресурсов и править перевод прямо в екзешнике... и так до тех пор, пока не обслужу всех.

zub писал(а):Ничего перекомпилировать ненужно.

Даже если требуется добавить новый язык в уже скомпилированную прогу? Мне кажется вы врете. Плюс, указанные Вами файлы это перевод стандартных надписей программы (в моем случае русский вариант еще и не до конца переведен где это возможно). Для нестандартных (надписей/языков) придется готовить свои файлы и их актуальность Ваша забота.

Да и существует проблема при обновлении среды, если чуть подправляешь исходники компилятора. (речь о снапшотной версии) А это по любому придется делать при добавлении своего языка в Лазарус.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4492
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Смена языка интерфейса в программе "на лету"

Сообщение zub » 16.06.2015 19:20:19

>>И это все вставляется в код ?
Конечно нет, один из этих файлов будет загружен в рантайме и заменит содержимое LCLных resourcestring.
в 2048 году если ваш родной арго войдет в стандарты и система отрапортует программе (которая скомпилирована сегодня) что надо использовать именно арго - будет загружен lclstrconsts.арго.po и вуаля.
Если марсиане не планируют у нас стандартизироваться, тогда конечно о его загрузке нужно позаботиться самостоятельно, а не использовать штатный механизм, который для ресурсных строк выглядит примерно так:
Код: Выделить всё
      GetLanguageIDs(Lang, FallbackLang); // получение желаемого языка от системы, определено в модуле gettext
      TranslateUnitResourceStrings('LCLStrConsts', PODirectory + 'lclstrconsts.%s.po', Lang, FallbackLang);//перевод всех ресурсных строк модуля\пакета, в данном случае лцлных

а например самомтоятельно просканировать этот PODirectory на предмет доступных локализаций (po файлов) и предложить выбрать пользователю нужную. Такчто программы написаные сейчас с использованием po готовы к контакту)))

>> С меня срочно требуют 100500 разных переводов
Копируете исходный файл как я писал постом выше и переводите. ничего перекомпилировать ненадо

>>Придется мне тогда брать в руки редактор ресурсов и править перевод прямо в екзешнике... и так до тех пор, пока не обслужу всех.
Это несветит ни при каких раскладах.

>>Даже если требуется добавить новый язык в уже скомпилированную прогу? Мне кажется вы врете. Плюс, указанные Вами файлы это перевод стандартных надписей программы (в моем случае русский вариант еще и не до конца переведен где это возможно).
В лазаре так принято - по PO на каждый пакет. т.е. у вас будет: myproga.po; lclstrconsts.po полюбому, плюс еще чтонить если используете другие пакеты. Нет не вру))

>>Для нестандартных (надписей/языков) придется готовить свои файлы и их актуальность Ваша забота.
Да, перевод ресурсных строк и строк на формах несколько отличается, но актуальность соответствующих файлов это забота компилятора и иде. компилятор даже заботливо пометит ваши переводы как возможно неточные (fuzzy) если вы отредактируете исходную строчку, не говоря о том что сам выкинет уже неактуальные строки и добавит вновь появившиеся. Причем не только в исходный PO, а во все уже локализованные PO файлы.

>>Да и существует проблема при обновлении среды, если чуть подправляешь исходники компилятора. (речь о снапшотной версии) А это по любому придется делать при добавлении своего языка в Лазарус
Единственная проблема с этим связанная - с PO не работают привычные патчи, он может меняться компилятором кардинально (естественно с сохранением всех переводов), и система контроля версий будет вам говорить что файл изменен, хотя изменений небыло - была просто перекомпиляция.
zub
долгожитель
 
Сообщения: 2470
Зарегистрирован: 14.11.2005 23:51:26

Re: Смена языка интерфейса в программе "на лету"

Сообщение Лекс Айрин » 16.06.2015 19:59:47

zub, то есть,
А вот лишний велосипедный код - загрузка файла локализации, формирование массива, поиск по массиву с вариантом перевода если вдруг локализация пока не полная - какраз убирается

касается и варианта с РО. Ведь как уже выяснили, массив с переводами тоже формируется, да и с файла инфа качается.

Не убедили Вы меня в преимуществах стандартного подхода. Все равно кода намного больше, а профит почти тот же.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4492
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Смена языка интерфейса в программе "на лету"

Сообщение zub » 16.06.2015 20:36:04

>>касается и варианта с РО. Ведь как уже выяснили, массив с переводами тоже формируется, да и с файла инфа качается.
Я говорил чтото другое? да грузится и формируется, только не массив а какойнить хэш мап, для быстрого поиска

>>Не убедили Вы меня в преимуществах стандартного подхода. Все равно кода намного больше, а профит почти тот же.
Не убедил, фиг с ним. Но в каком месте кода то больше? его вообще нет - перевод ресурсных строк парой строк кода, подключение транслятора для перевода форм тоже несколько строчек... ГДЕ? весь код уже написан умными дядьками из команд fpc\lazarus))
Вам придется ручками (с индексом подглядываемым из блокнота) перевести строчки и также подключить к лцлю свой транслятор, в котором от индекса придется отказаться и искать в своем массиве по значению (т.е. по уму написать тотже быстрый хэшмапчик)

Я вот лично из нашей беседы сделал вывод что велосипед даже не приблизится к po по возможностям - просто нет места для плюсов относительно стандартных методов (плюсом то что ваш код будет прост и понятен для вас я не считаю - для остальных он таким не будет :D )
zub
долгожитель
 
Сообщения: 2470
Зарегистрирован: 14.11.2005 23:51:26

Re: Смена языка интерфейса в программе "на лету"

Сообщение Лекс Айрин » 17.06.2015 09:28:58

zub, код он остается кодом даже если его написал другой программист. А насчет возможностей... Мне нужна только одна -- перевод. Остальное от лукавого.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4492
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

localization

Сообщение heX » 19.02.2016 17:35:05

Сделал локализацию в своей программе (меняется на лету), все отлично работает (lazarus 1.4).
Но есть один неприятный баг - не локализируются кнопки связанные с TAction.
И плюс в локализацию заматываются строки из всех кнопок связанных с TAction и строка из самого TAction.
Это приводит к увеличению размера "*,po" файлов и сбивает с толку переводчиков.
Перерыл все примеры - везде выносят строки в отдельный модуль resourcestrings и при смене языка перекладывают значения в TAction.
Это както коряво...
Никто незнает как можно сделать нормально? - чтобы TAction корректно участвовали в переводе.

UPD: Сам разобрался - все отлично работает.
Последний раз редактировалось heX 20.02.2016 17:44:56, всего редактировалось 2 раз(а).
heX
новенький
 
Сообщения: 12
Зарегистрирован: 19.02.2016 17:20:32

Re: localization

Сообщение Ichthyander » 19.02.2016 20:40:31

heX писал(а):Сделал локализацию в своей программе (меняется на лету), все отлично работает (lazarus 1.4).

Как реализовали смену языка "на лету"?
Но есть один неприятный баг - не локализируются кнопки связанные с TAction.

Не меняются на лету или не локализуются? Добавили модуль DefaultTranslator в файл *.pas, где они объявлены? Еще нужно попробовать сдвинуть файл формы, чтобы Lazarus пересохранил форму и создал специальные файлы локализации.
И плюс в локализацию заматываются строки из всех кнопок связанных с TAction и строка из самого TAction.
Это приводит к увеличению размера "*,po" файлов и сбивает с толку переводчиков.

Программа автоматом, выносит все строковые надписи в файлы локазизации для тех модулей, где указан Deafaultatranslator в блоке Uses
Перерыл все примеры - везде выносят строки в отдельный модуль resourcestrings

Это очень удобно и логично. Кроме того, отделяет код от переводимого текста.
и при смене языка перекладывают значения в TAction.
Это както коряво...
Никто незнает как можно сделать нормально? - чтобы TAction корректно участвовали в переводе.

Тут я честно говоря не понял Вас... Может форумчане подскажут
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 442
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Смена языка интерфейса в программе "на лету"

Сообщение vitaly_l » 19.02.2016 21:55:11

Ichthyander писал(а):и при смене языка перекладывают значения в TAction.
Это както коряво...
Никто незнает как можно сделать нормально? - чтобы TAction корректно участвовали в переводе.

Тут я честно говоря не понял Вас... Может форумчане подскажут

Я делал через SessionProperties и сохранял всё в ini. При смене/редактировании ini можно было сменить надписи на кнопках.
Но это требовало перезагрузки программы.

alexs писал(а):Штатный прекрасно работает со ресурсными константами.

Как-то люди пропускают самое интересное. Какие штатные?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Смена языка интерфейса в программе "на лету"

Сообщение Ichthyander » 20.02.2016 07:49:01

vitaly_l писал(а):и при смене языка перекладывают значения в TAction.
Я делал через SessionProperties и сохранял всё в ini. При смене/редактировании ini можно было сменить надписи на кнопках.
Но это требовало перезагрузки программы.

alexs писал(а):Штатный прекрасно работает со ресурсными константами.

Как-то люди пропускают самое интересное. Какие штатные?
.

Штатные средства: это локализация с помощью файлов .po. Посмотрите в свойствах своих проектов в Lazarus, там где i18n вкладка. Это и есть стандартные средства по локализации своих приложений. Ну и прочтите первый пост данного топика )
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 442
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Смена языка интерфейса в программе "на лету"

Сообщение Лекс Айрин » 20.02.2016 09:42:29

vitaly_l писал(а):При смене/редактировании ini можно было сменить надписи на кнопках.
Но это требовало перезагрузки программы.

А у меня не требовало... что я делаю не так?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4492
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru