Локализация программы

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

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

zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Локализация программы

Сообщение zub »

Приспичило сделать возможность локализации программы.
С константами определенными в программе всё понятно - resourcestring->*.po
А как поступить с текстами не определенными в программе, получаемыми в рантайме, заводить под них неиспользуемые константы чтоб автоматом попадали в *.po?
Не хочется делать разные наборы рантайм окружения для разных локализаций.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

А как поступить с текстами не определенными в программе, получаемыми в рантайме, заводить под них неиспользуемые константы чтоб автоматом попадали в *.po?

Это что за тексты такие? Если фразы строятся из фрагментов, то достаточно локализовать фрагменты (возможно, в учётом возможных падежей). Если пользователь что-то вводит, то это как бы локализовываться не должно.
Что там ещё в рантайме можнт быть?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Много что, например меню, тулбары грузится из внешнего файла - соответственно заголовки и хинты меню и кнопок в исходниках программы не фигурирют.
Самый жуткий случай - инспектор объектов. При запуске парсятся обрезки исходников (interface части) чтоб можно было в нем посмотреть любые структуры данных, "человеческие" названия этих структур лежат в коментариях исходников
perlpunk
новенький
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

Сообщение perlpunk »

zub писал(а):Много что, например меню, тулбары грузится из внешнего файла - соответственно заголовки и хинты меню и кнопок в исходниках программы не фигурирют.
Самый жуткий случай - инспектор объектов. При запуске парсятся обрезки исходников (interface части) чтоб можно было в нем посмотреть любые структуры данных, "человеческие" названия этих структур лежат в коментариях исходников

В данном случае, локализовать возможно после загрузки данных - заменять загруженные тексты у меню, тулбаров и т.д. на локализованые.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

В данном случае, локализовать возможно после загрузки данных - заменять загруженные тексты у меню, тулбаров и т.д. на локализованые.

да, переведу при загрузке внешних файлов. Как запихать нужные тексты в PO? poedit не позволяет добавлять тексты в существующий PO, руками их добавлять не очень удобно и есть ли гарантии что лазарь в один прекрасный момент не потрет добавленные тексты?
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

Мне кажется самая дурацкая система локализации это PO (или gettext), это на самом деле напоминает костыльную систему, когда исходники на си нужно было срочно локализовать ее и придумали.

Самая простая система, это взять за основу английский язык, и завести файлы перевода английских фраз на другие языки, многие так делают. Завести одну функцию, которая будет переводить фразу, и везде где вы вставляете текст, его просто нужно обрамлять функцией.

Код: Выделить всё

Label1.Caption := 'My text';


Превращается в

Код: Выделить всё

Label1.Caption := t('My text');


Где функция t ищет перевод фразы My text, если она есть, она ее переводит, если нет - оставляет эту фразу как есть. Эта самая гибкая рантайм система которую я видел.

Ну и файл .lng должен выглядить примерно так:

Код: Выделить всё

My text=Мой текст
...


Проблема передачи параметров в фразу решается функцией Format:

Код: Выделить всё

Label1.caption := t('My %s Text', [S]);
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Мне кажется самая дурацкая система локализации это PO (или gettext), это на самом деле напоминает костыльную систему, когда исходники на си нужно было срочно локализовать ее и придумали.

Самая простая система, это взять за основу английский язык, и завести файлы перевода английских фраз на другие языки, многие так делают. Завести одну функцию, которая будет переводить фразу, и везде где вы вставляете текст, его просто нужно обрамлять функцией.

С PO можно работать также. то что можно переводить все resourcestring разом просто дополнительная плюшка.

Добавлено спустя 2 часа 1 минуту 24 секунды:
Получается 2 проблемы:
1) как добавить все неопределенные в программе строки в PO
2) как отследить и удалить в PO строки которые потеряли актуальность и не используются программой?

первую планирую решить ключом командной строки, при обнаружении которого программа в случае не нахождения в po текста будет его туда добавлять с последующим сохранением файла.
вторую видимо придется решать руками, т.к. некоторые строки будут использоваться редко, их можно ошибочно вычистить, а через недельку они понадобятся.
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

Я знаю в PO есть привязка к номеру строки в исходниках? Последний раз я ковырял эту систему в Drupal, мне показалось это очень глупым, потому что когда исходники менялись, то и перевод не работал.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Насколько я понял привязку можно не использовать

Код: Выделить всё

po.Translate(Identifier, OriginalValue);

при Identifier:='' получается полный аналго t(text), но в сложных случаях Identifier совсем не помешает
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Nik

Спасибо.

А как использовать локализацию компонентов? Программ использует пакет anchordocking, он переведен и имеет свои po и ru.po. Как научить лазаря добавлять po файлы пакетов в po программы?
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Если я правильно понимаю, то добавлять один po-файл в другой не нужно, нужно просто подкладывать файлы локализации LCL и пакетов в ту же папку где лежат файлы локализации программы, а потом делать так, как тут:

http://wiki.lazarus.freepascal.org/Tran ... 0.BC.D1.8B

Ещё можно взглянуть на исходники defaulttranslator.pas в составе LCL, там около 370 строки выполняется локализация констант LCL, вот примерно так же, имхо, нужно делать и для пакетов.
yantux
постоялец
Сообщения: 133
Зарегистрирован: 29.10.2007 15:02:33
Откуда: Санкт-Петербург
Контактная информация:

Сообщение yantux »

Мне кажется локализация с po файлами не очень удобная. У обычного объекта lazarus есть поля caption, hint и им подобные. При смене пользователем языка, надо менять только их значения. Поэтому почему бы не сделать метод, который бы читал с помощью tmemo, текствой файл с нужной локализацией и прописывал значения полей caption, hint?

Что если сделать обычный текстовой файл eng.lng, ru.lng, fr.lng, в которых будет текст типа "settings=настойки". Т.е. сделать нечто похожее на словарь или базу данных соответствия английского слова национальному? Соответсвенно, в главном классе tform1 сделать метод, в который бы приваивал полям caption, hint новые значения при смене языка пользователем.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

yantux писал(а): Поэтому почему бы не сделать метод, который бы читал с помощью tmemo, текствой файл с нужной локализацией и прописывал значения полей caption, hint?

Это уже всё есть.
Работает именно так, как ты описал.
Для примера - глянь в исходники DC или моего FBManager-a (там-же подсмотрел). На всё - 120 строк кода вместе с коментариями в 2-х модулях.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Odyssey
Спасибо, заработало! Я думал есть способ перевести всё одним вызовом

Код: Выделить всё

TranslateResourceStrings(муPO);

Каждый пакет отдельно - можно чтонибудь забыть да и куча PO имхо не удобно.
Ответить