2016-09-18 8 views
2

У меня есть опыт Delphi, и я пытаюсь построить проект с Lazarus, который для меня совершенно новый.Локализация Lazarus/несколько проектов

Я думаю, что я прочитал всю доступную информацию о Лазаресе, переводе/интернационализации/локализации, но мне не удалось найти то, что я действительно хочу.

Я работаю в проекте с 3 или 4 EXEcutables, которые разделяют между ними, той же базой данных тот же интерфейс (наследование формы), общие утилиты, настройки и общие и связанные строки.

Я не хочу иметь 3 или 4 файла .po с разными именами (по одному для каждого EXE), с одинаковыми общими строками, разделяемыми между ними.

Есть ли решение для этого?

  • Возможно, необходимо ОДНО «gobal.po» для всех приложений? как?
  • Мне нужно создать свою собственную систему для локализации \ централизации всех строк в ОДНОМ файле?

любые предложения?

благодарит за любую помощь. приветствует,

ответ

4

Используйте единицу общего языка, в которую вы помещаете все строки всех проектов. Создайте пакет, в который вы добавите эту общую строку. Включите i18n для этого пакета. Скомпилируйте пакет, и вы получите общий файл po в папке языков.

Для каждого проекта, требующего строк ресурсов, вы должны добавить этот пакет в качестве требования - самый простой способ сделать это - в редакторе пакетов и выбрать «Использовать»/«Добавить в проект».

Не включайте i18n для проектов, потому что это добавит файлы проекта po в папку языков.

Для того, чтобы использовать переведенные строки в каждом проекте, добавить модуль «Перевод» к использованию и называют

TranslateUnitResourceStrings(
    StringsUnit, 
    Format('languages\%s.%s.po', [StringsUnit, ALang]) 
); 

Здесь StringsUnit это имя общего блока со всеми собранными строками ресурсов. ALang - это символ языка, который должен использоваться, например. 'de' для немецкого языка, 'fr' для французского и т. д.

И теперь сложная часть ... Так как i18n выключен, строки, назначенные подписи компонентов, автоматически не помещаются в файл po. Таким образом, вы оставляете только заголовки компонентов, создаете строку ресурса для каждого из них (в «stringsunit», конечно), а затем во время выполнения назначайте подписи ресурсу. Может быть, что-то вроде этого:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    SetCaptions; 
end; 

procedure TForm1.SetCaptions; 
begin 
    Caption := RSTitleOfForm1;   // resource string for form title 
    Label1.Caption := RSYDateLabel; // label caption showing "Date:" 
    // etc. 
end; 

Если пользователь выбирает новый язык, например, из выпадающего списка со всеми имеющимися переводами, вы должны вызвать TranslateUnitResourceStrings, а затем SetCaptions для каждой существующей формы (в случае динамически создаваемых форм, SetCaptions будут вызваны автоматически, так как они находятся в событии FormCreate).

+0

это именно то, что я искал. спасибо! – antseq