Lazarus 本地化/多个项目

Lazarus localization / multiple projects

我有一些 Delphi 经验,我正在尝试使用 Lazarus 构建一个项目,这对我来说是全新的。

我想,我已经阅读了有关 Lazarus 的所有可用信息,Translating/Internationalization/Localization,但我无法找到我真正想要的东西。

我一直在一个有 3 或 4 个 EXEcutables 的项目中工作,它们共享相同的数据库、相同的接口(表单继承)、通用工具、设置以及通用和相关字符串。

我不想有 3 或 4 个不同名称的 .po 文件(每个 EXE 一个),它们之间共享相同的公共字符串。

有解决办法吗?

有什么建议吗?

感谢您的帮助。 问候,

使用一个共享语言单元,将所有项目的所有字符串放入其中。创建一个包,将此共享字符串单元添加到其中。为此包打开 i18n。编译包,你会在languages文件夹中得到共享的po文件。

对于每个需要资源字符串的项目,您必须将此包添加为要求 - 最简单的方法是在包编辑器中添加 select "Use" / "Add to project".

不要为项目打开 i18n,因为这会将项目 po 文件添加到语言文件夹。

为了在每个项目中使用翻译后的字符串,将单元 "Translations" 添加到 uses 并调用

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;

如果用户select使用新语言,例如来自包含所有可用翻译的组合框,您必须调用 TranslateUnitResourceStrings,然后为每个现有表单调用 SetCaptions(如果是动态创建的表单,SetCaptions 将是自动调用,因为它在 FormCreate 事件中)。