Локализация программы
Модератор: Модераторы
Локализация программы
Приспичило сделать возможность локализации программы.
С константами определенными в программе всё понятно - resourcestring->*.po
А как поступить с текстами не определенными в программе, получаемыми в рантайме, заводить под них неиспользуемые константы чтоб автоматом попадали в *.po?
Не хочется делать разные наборы рантайм окружения для разных локализаций.
С константами определенными в программе всё понятно - resourcestring->*.po
А как поступить с текстами не определенными в программе, получаемыми в рантайме, заводить под них неиспользуемые константы чтоб автоматом попадали в *.po?
Не хочется делать разные наборы рантайм окружения для разных локализаций.
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
А как поступить с текстами не определенными в программе, получаемыми в рантайме, заводить под них неиспользуемые константы чтоб автоматом попадали в *.po?
Это что за тексты такие? Если фразы строятся из фрагментов, то достаточно локализовать фрагменты (возможно, в учётом возможных падежей). Если пользователь что-то вводит, то это как бы локализовываться не должно.
Что там ещё в рантайме можнт быть?
Много что, например меню, тулбары грузится из внешнего файла - соответственно заголовки и хинты меню и кнопок в исходниках программы не фигурирют.
Самый жуткий случай - инспектор объектов. При запуске парсятся обрезки исходников (interface части) чтоб можно было в нем посмотреть любые структуры данных, "человеческие" названия этих структур лежат в коментариях исходников
Самый жуткий случай - инспектор объектов. При запуске парсятся обрезки исходников (interface части) чтоб можно было в нем посмотреть любые структуры данных, "человеческие" названия этих структур лежат в коментариях исходников
zub писал(а):Много что, например меню, тулбары грузится из внешнего файла - соответственно заголовки и хинты меню и кнопок в исходниках программы не фигурирют.
Самый жуткий случай - инспектор объектов. При запуске парсятся обрезки исходников (interface части) чтоб можно было в нем посмотреть любые структуры данных, "человеческие" названия этих структур лежат в коментариях исходников
В данном случае, локализовать возможно после загрузки данных - заменять загруженные тексты у меню, тулбаров и т.д. на локализованые.
В данном случае, локализовать возможно после загрузки данных - заменять загруженные тексты у меню, тулбаров и т.д. на локализованые.
да, переведу при загрузке внешних файлов. Как запихать нужные тексты в PO? poedit не позволяет добавлять тексты в существующий PO, руками их добавлять не очень удобно и есть ли гарантии что лазарь в один прекрасный момент не потрет добавленные тексты?
Мне кажется самая дурацкая система локализации это PO (или gettext), это на самом деле напоминает костыльную систему, когда исходники на си нужно было срочно локализовать ее и придумали.
Самая простая система, это взять за основу английский язык, и завести файлы перевода английских фраз на другие языки, многие так делают. Завести одну функцию, которая будет переводить фразу, и везде где вы вставляете текст, его просто нужно обрамлять функцией.
Превращается в
Где функция t ищет перевод фразы My text, если она есть, она ее переводит, если нет - оставляет эту фразу как есть. Эта самая гибкая рантайм система которую я видел.
Ну и файл .lng должен выглядить примерно так:
Проблема передачи параметров в фразу решается функцией Format:
Самая простая система, это взять за основу английский язык, и завести файлы перевода английских фраз на другие языки, многие так делают. Завести одну функцию, которая будет переводить фразу, и везде где вы вставляете текст, его просто нужно обрамлять функцией.
Код: Выделить всё
Label1.Caption := 'My text';
Превращается в
Код: Выделить всё
Label1.Caption := t('My text');
Где функция t ищет перевод фразы My text, если она есть, она ее переводит, если нет - оставляет эту фразу как есть. Эта самая гибкая рантайм система которую я видел.
Ну и файл .lng должен выглядить примерно так:
Код: Выделить всё
My text=Мой текст
...
Проблема передачи параметров в фразу решается функцией Format:
Код: Выделить всё
Label1.caption := t('My %s Text', [S]);
Мне кажется самая дурацкая система локализации это PO (или gettext), это на самом деле напоминает костыльную систему, когда исходники на си нужно было срочно локализовать ее и придумали.
Самая простая система, это взять за основу английский язык, и завести файлы перевода английских фраз на другие языки, многие так делают. Завести одну функцию, которая будет переводить фразу, и везде где вы вставляете текст, его просто нужно обрамлять функцией.
С PO можно работать также. то что можно переводить все resourcestring разом просто дополнительная плюшка.
Добавлено спустя 2 часа 1 минуту 24 секунды:
Получается 2 проблемы:
1) как добавить все неопределенные в программе строки в PO
2) как отследить и удалить в PO строки которые потеряли актуальность и не используются программой?
первую планирую решить ключом командной строки, при обнаружении которого программа в случае не нахождения в po текста будет его туда добавлять с последующим сохранением файла.
вторую видимо придется решать руками, т.к. некоторые строки будут использоваться редко, их можно ошибочно вычистить, а через недельку они понадобятся.
Я знаю в PO есть привязка к номеру строки в исходниках? Последний раз я ковырял эту систему в Drupal, мне показалось это очень глупым, потому что когда исходники менялись, то и перевод не работал.
Насколько я понял привязку можно не использовать
при Identifier:='' получается полный аналго t(text), но в сложных случаях Identifier совсем не помешает
Код: Выделить всё
po.Translate(Identifier, OriginalValue);при Identifier:='' получается полный аналго t(text), но в сложных случаях Identifier совсем не помешает
Nik
Спасибо.
А как использовать локализацию компонентов? Программ использует пакет anchordocking, он переведен и имеет свои po и ru.po. Как научить лазаря добавлять po файлы пакетов в po программы?
Свежачок в тему: http://lazarus.freepascal.org/index.php?topic=11640.0
Спасибо.
А как использовать локализацию компонентов? Программ использует пакет anchordocking, он переведен и имеет свои po и ru.po. Как научить лазаря добавлять po файлы пакетов в po программы?
Если я правильно понимаю, то добавлять один po-файл в другой не нужно, нужно просто подкладывать файлы локализации LCL и пакетов в ту же папку где лежат файлы локализации программы, а потом делать так, как тут:
http://wiki.lazarus.freepascal.org/Tran ... 0.BC.D1.8B
Ещё можно взглянуть на исходники defaulttranslator.pas в составе LCL, там около 370 строки выполняется локализация констант LCL, вот примерно так же, имхо, нужно делать и для пакетов.
http://wiki.lazarus.freepascal.org/Tran ... 0.BC.D1.8B
Ещё можно взглянуть на исходники defaulttranslator.pas в составе LCL, там около 370 строки выполняется локализация констант LCL, вот примерно так же, имхо, нужно делать и для пакетов.
-
yantux
- постоялец
- Сообщения: 133
- Зарегистрирован: 29.10.2007 15:02:33
- Откуда: Санкт-Петербург
- Контактная информация:
Мне кажется локализация с po файлами не очень удобная. У обычного объекта lazarus есть поля caption, hint и им подобные. При смене пользователем языка, надо менять только их значения. Поэтому почему бы не сделать метод, который бы читал с помощью tmemo, текствой файл с нужной локализацией и прописывал значения полей caption, hint?
Что если сделать обычный текстовой файл eng.lng, ru.lng, fr.lng, в которых будет текст типа "settings=настойки". Т.е. сделать нечто похожее на словарь или базу данных соответствия английского слова национальному? Соответсвенно, в главном классе tform1 сделать метод, в который бы приваивал полям caption, hint новые значения при смене языка пользователем.
Что если сделать обычный текстовой файл eng.lng, ru.lng, fr.lng, в которых будет текст типа "settings=настойки". Т.е. сделать нечто похожее на словарь или базу данных соответствия английского слова национальному? Соответсвенно, в главном классе tform1 сделать метод, в который бы приваивал полям caption, hint новые значения при смене языка пользователем.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
yantux писал(а): Поэтому почему бы не сделать метод, который бы читал с помощью tmemo, текствой файл с нужной локализацией и прописывал значения полей caption, hint?
Это уже всё есть.
Работает именно так, как ты описал.
Для примера - глянь в исходники DC или моего FBManager-a (там-же подсмотрел). На всё - 120 строк кода вместе с коментариями в 2-х модулях.
Odyssey
Спасибо, заработало! Я думал есть способ перевести всё одним вызовом
Каждый пакет отдельно - можно чтонибудь забыть да и куча PO имхо не удобно.
Спасибо, заработало! Я думал есть способ перевести всё одним вызовом
Код: Выделить всё
TranslateResourceStrings(муPO);Каждый пакет отдельно - можно чтонибудь забыть да и куча PO имхо не удобно.
