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

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

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

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

Сообщение midisa » 19.10.2013 21:50:45

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

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

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

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


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

Сообщение midisa » 20.10.2013 08:22:16

А например из этого что то применимо для лазаря?
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 работает прекрасно, переводит вроде все элементы.
midisa
новенький
 
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk

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

Сообщение ssadragon » 20.10.2013 10:18:37

Народ а кто-нибудь знает почему происходит замена буквы "р" (русской) в .ро файлах на "#209Ђ"?
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

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

Сообщение wwswowsogon » 21.10.2013 11:36:53

А почему бы просто не использовать, скажем, .cfg файл, в котором содержится текущий язык, и много языковых файлов, где все надписи на разных языках, и в зависимости от текущего языка загружать тот или иной файл.
Я бы именно так и сделал, но видимо, это не лучший способ, поскольку то, что здесь обсуждается, сложнее.
wwswowsogon
постоялец
 
Сообщения: 157
Зарегистрирован: 23.12.2008 20:41:37

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

Сообщение alexs » 21.10.2013 23:00:46

Штатный метод с .po файлами самый простой.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение midisa » 22.10.2013 07:59:45

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 секунд:
было бы интересно услышать отзывы о других вариантах, о которых говорил (давал ссылку) выше .... может кто то пробовал использовать на лазаре?
midisa
новенький
 
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk

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

Сообщение trexxet » 22.10.2013 23:25:45

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

И хранить язык в целочисленной переменной. Текст выводить по номеру строки умноженной на язык
Код: Выделить всё
Label1.Text := Text[2*LanguageID];
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

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

Сообщение zub » 23.10.2013 01:22:27

Ненадо придумываать велики.
Надо юзать PO
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение svk12 » 23.10.2013 10:34:07

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


Все строки в тексте программы нужно преобразовать в resourcestring, тогда они попадут в .po,
где их можно перевести. То же касается свойств компонентов типа TMemo, например - Hint.
svk12
постоялец
 
Сообщения: 409
Зарегистрирован: 09.06.2008 18:42:47

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

Сообщение Devel0 » 23.10.2013 11:41:19

Свойства компонентов автоматически попадают в po, если включена i18n для lfm (в инспекторе проекта).
Devel0
новенький
 
Сообщения: 66
Зарегистрирован: 24.07.2011 10:43:13

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

Сообщение svk12 » 23.10.2013 11:43:30

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

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

Сообщение zub » 23.10.2013 12:38:37

>>Хинты попадают криво.
Можно пример кривости?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение svk12 » 23.10.2013 13:31:52

Вот начало .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 ""
svk12
постоялец
 
Сообщения: 409
Зарегистрирован: 09.06.2008 18:42:47

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

Сообщение zub » 23.10.2013 13:44:23

Это не лазаревский файл - он уже редактировался сторонней утилитой.
В чем косяк та?
у меня вроде всё норм создается
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 проекта требуется дополнительная пересборка проекта чтобы строки разбежались по всем файлам локализации
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru