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

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

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

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

Сообщение zub » 02.01.2011 13:59:04

Приспичило сделать возможность локализации программы.
С константами определенными в программе всё понятно - resourcestring->*.po
А как поступить с текстами не определенными в программе, получаемыми в рантайме, заводить под них неиспользуемые константы чтоб автоматом попадали в *.po?
Не хочется делать разные наборы рантайм окружения для разных локализаций.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Nik » 02.01.2011 14:54:29

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

Это что за тексты такие? Если фразы строятся из фрагментов, то достаточно локализовать фрагменты (возможно, в учётом возможных падежей). Если пользователь что-то вводит, то это как бы локализовываться не должно.
Что там ещё в рантайме можнт быть?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение zub » 02.01.2011 15:26:31

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

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

Сообщение perlpunk » 02.01.2011 17:00:13

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

В данном случае, локализовать возможно после загрузки данных - заменять загруженные тексты у меню, тулбаров и т.д. на локализованые.
perlpunk
новенький
 
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

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

Сообщение zub » 02.01.2011 20:46:57

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

да, переведу при загрузке внешних файлов. Как запихать нужные тексты в PO? poedit не позволяет добавлять тексты в существующий PO, руками их добавлять не очень удобно и есть ли гарантии что лазарь в один прекрасный момент не потрет добавленные тексты?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение devels » 03.01.2011 11:53:48

Мне кажется самая дурацкая система локализации это 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]);
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

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

Сообщение zub » 03.01.2011 12:19:01

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

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

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

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

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

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

Сообщение devels » 03.01.2011 15:36:11

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

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

Сообщение zub » 03.01.2011 15:46:34

Насколько я понял привязку можно не использовать
Код: Выделить всё
po.Translate(Identifier, OriginalValue);

при Identifier:='' получается полный аналго t(text), но в сложных случаях Identifier совсем не помешает
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Nik » 03.01.2011 20:18:08

Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение zub » 09.01.2011 23:31:18

Nik

Спасибо.

А как использовать локализацию компонентов? Программ использует пакет anchordocking, он переведен и имеет свои po и ru.po. Как научить лазаря добавлять po файлы пакетов в po программы?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Odyssey » 10.01.2011 16:34:15

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

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

Ещё можно взглянуть на исходники defaulttranslator.pas в составе LCL, там около 370 строки выполняется локализация констант LCL, вот примерно так же, имхо, нужно делать и для пакетов.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

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

Сообщение yantux » 10.01.2011 23:06:37

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

Что если сделать обычный текстовой файл eng.lng, ru.lng, fr.lng, в которых будет текст типа "settings=настойки". Т.е. сделать нечто похожее на словарь или базу данных соответствия английского слова национальному? Соответсвенно, в главном классе tform1 сделать метод, в который бы приваивал полям caption, hint новые значения при смене языка пользователем.
yantux
постоялец
 
Сообщения: 133
Зарегистрирован: 29.10.2007 16:02:33
Откуда: Санкт-Петербург

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

Сообщение alexs » 11.01.2011 01:27:39

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

Это уже всё есть.
Работает именно так, как ты описал.
Для примера - глянь в исходники DC или моего FBManager-a (там-же подсмотрел). На всё - 120 строк кода вместе с коментариями в 2-х модулях.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение zub » 11.01.2011 17:21:12

Odyssey
Спасибо, заработало! Я думал есть способ перевести всё одним вызовом
Код: Выделить всё
TranslateResourceStrings(муPO);

Каждый пакет отдельно - можно чтонибудь забыть да и куча PO имхо не удобно.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron