Используйте единицу общего языка, в которую вы помещаете все строки всех проектов. Создайте пакет, в который вы добавите эту общую строку. Включите 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).
это именно то, что я искал. спасибо! – antseq