ant*_*seq 2 freepascal lazarus
我有一些 Delphi 经验,并且正在尝试使用 Lazarus 构建一个项目,这对我来说是全新的。
我想,我已经阅读了有关 Lazarus、翻译/国际化/本地化的所有可用信息,但我无法找到我真正想要的内容。
我一直在一个包含 3 或 4 个可执行文件的项目中工作,它们之间共享相同的数据库、相同的接口(表单继承)、通用实用程序、设置以及通用和相关字符串。
我不想有 3 或 4 个具有不同名称的 .po 文件(每个 EXE 一个),并且它们之间共享相同的公共字符串。
有解决办法吗?
有什么建议么?
谢谢你的帮助。问候,
使用共享语言单元,将所有项目的所有字符串放入其中。创建一个包,向其中添加此共享字符串单元。为此包启用 i18n。编译该包,您将在 languages 文件夹中获得共享 po 文件。
对于每个需要资源字符串的项目,您必须添加此包作为要求 - 最简单的方法是在包编辑器中并选择“使用”/“添加到项目”。
不要为项目打开 i18n,因为这会将项目 po 文件添加到 languages 文件夹中。
为了在每个项目中使用翻译后的字符串,请添加单元“Translations”以使用并调用
TranslateUnitResourceStrings(
StringsUnit,
Format('languages\%s.%s.po', [StringsUnit, ALang])
);
Run Code Online (Sandbox Code Playgroud)
这里的 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;
Run Code Online (Sandbox Code Playgroud)
如果用户选择一种新语言,例如从具有所有可用翻译的组合框中选择,则必须调用 TranslateUnitResourceStrings,然后为每个现有表单调用 SetCaptions(如果是动态创建的表单,将自动调用 SetCaptions,因为它位于 FormCreate 事件中) )。