Кто и как реализует многоязычный интерфейс?

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

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

midisa
новенький
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk
Контактная информация:

Кто и как реализует многоязычный интерфейс?

Сообщение midisa »

Какие простые способы есть реализации многоязычного интерфейса? Кроме того что описан в вики. Кто то использует другие способы загрузки po файла?

Форм много, подгружать ресурсы в каждой форме, не совсем удобно .... может можно это реализовать в одном месте, при старте программы?

Буду признателен, если кто то предложит свой вариант загрузки po файла.

Заранее всем спасибо.
midisa
новенький
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk
Контактная информация:

Сообщение midisa »

А например из этого что то применимо для лазаря?
http://www.webdelphi.ru/2012/09/23-resh ... ilozhenij/

Добавлено спустя 49 минут 6 секунд:
Читаю эту статью. Делаю все как нужно: http://wiki.freepascal.org/Translations ... rograms/ru
Этот вариант:

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

{Прежде всего добавьте модули "gettext" и "translations"}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      PODirectory, Lang, FallbackLang: String;
    begin
      PODirectory := '/path/to/lazarus/lcl/languages/';
      GetLanguageIDs(Lang, FallbackLang); // определено в модуле gettext
      TranslateUnitResourceStrings('LCLStrConsts', PODirectory + 'lclstrconsts.%s.po', Lang, FallbackLang);
      MessageDlg('Title', 'Text', mtInformation, [mbOk, mbCancel, mbYes], 0);
    end;

Вообще не работает. Смотрел его 3 месяца назад, сейчас смотрю .... может я не понимаю как он работает ...

А этот вариант:

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

LRSTranslator := TPoTranslator.Create(ExtractFilePath(ParamStr(0))+'language/'+ExtractFileName(ParamStr(0))+'.po');

Работает прекрасно, но переводит только Caption, а меню и TabControl оставляет не переведенным.

Может все таки есть какой то вариант который будет переводить сразу все надписи?

Добавлено спустя 29 минут 42 секунды:
С файлами .mo работает прекрасно, переводит вроде все элементы.
ssadragon
постоялец
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Сообщение ssadragon »

Народ а кто-нибудь знает почему происходит замена буквы "р" (русской) в .ро файлах на "#209Ђ"?
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

А почему бы просто не использовать, скажем, .cfg файл, в котором содержится текущий язык, и много языковых файлов, где все надписи на разных языках, и в зависимости от текущего языка загружать тот или иной файл.
Я бы именно так и сделал, но видимо, это не лучший способ, поскольку то, что здесь обсуждается, сложнее.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Штатный метод с .po файлами самый простой.
midisa
новенький
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk
Контактная информация:

Сообщение midisa »

alexs писал(а):Штатный метод с .po файлами самый простой.


если бы этот метод работал то наверное было бы (наверное) круто:

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

{Прежде всего добавьте модули "gettext" и "translations"}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      PODirectory, Lang, FallbackLang: String;
    begin
      PODirectory := '/path/to/lazarus/lcl/languages/';
      GetLanguageIDs(Lang, FallbackLang); // определено в модуле gettext
      TranslateUnitResourceStrings('LCLStrConsts', PODirectory + 'lclstrconsts.%s.po', Lang, FallbackLang);
      MessageDlg('Title', 'Text', mtInformation, [mbOk, mbCancel, mbYes], 0);
    end;


но он не работает ... видимо что то забыли прописать ...
Я пока используя вариат с .mo файлами работает корректно, а MessageBox храню и перевожу в ini файле.

Добавлено спустя 1 минуту 36 секунд:
было бы интересно услышать отзывы о других вариантах, о которых говорил (давал ссылку) выше .... может кто то пробовал использовать на лазаре?
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Загрузить обычный текстовый файл со строками на чередующихся языках в массив. Т.е.

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

Назад
Back
Zuruck

И хранить язык в целочисленной переменной. Текст выводить по номеру строки умноженной на язык

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

Label1.Text := Text[2*LanguageID];
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Ненадо придумываать велики.
Надо юзать PO
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

trexxet писал(а):MessageBox храню и перевожу в ini файле.


Все строки в тексте программы нужно преобразовать в resourcestring, тогда они попадут в .po,
где их можно перевести. То же касается свойств компонентов типа TMemo, например - Hint.
Devel0
новенький
Сообщения: 66
Зарегистрирован: 24.07.2011 10:43:13

Сообщение Devel0 »

Свойства компонентов автоматически попадают в po, если включена i18n для lfm (в инспекторе проекта).
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

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

Сообщение zub »

>>Хинты попадают криво.
Можно пример кривости?
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

Вот начало .po файла с хинтом:

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

msgid "hinthinthinthintMemo"
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.4\n"

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

Сообщение zub »

Это не лазаревский файл - он уже редактировался сторонней утилитой.
В чем косяк та?
у меня вроде всё норм создается
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"

#: tform1.caption
msgid "Form1"
msgstr ""

#: tform1.memo1.hint
msgid "Memo1-HINT"
msgstr ""

#: tform1.togglebox1.caption
msgid "ToggleBox1-caption"
msgstr ""


Добавлено спустя 1 час 21 минуту 37 секунд:
Не надо трогать то что сгенерировано компилятором, надо скопировать этот файл рядом для соответствующей локализации и переводить уже копию, при дальнейшей разработке проекта компилятор будет синхронизировать оригинальный PO и локализованные.
Для себя после топика http://freepascal.ru/forum/viewtopic.php?f=5&t=6602 я сделал модуль http://svn.shamangrad.net/zcad/trunk/ca ... ations.pas - в добавок к штатным возможностям PO добавил перевод рантайм строк, добавление их в общий PO проекта, поддержание PO в актуальном состоянии (выкидывание уже ненужных рантайм строк).
Из замеченных глюков - иногда переводы 2х определенных строк меняются местами и помечаются как "подозрительные", но это явно не компилятор с лазарем барахлят, а я с проверкой строк на актуальность. Также т.к. я добавляю строки только в основной PO проекта требуется дополнительная пересборка проекта чтобы строки разбежались по всем файлам локализации
Ответить