Lazarus 本地化/多个项目
Lazarus localization / multiple projects
我有一些 Delphi 经验,我正在尝试使用 Lazarus 构建一个项目,这对我来说是全新的。
我想,我已经阅读了有关 Lazarus 的所有可用信息,Translating/Internationalization/Localization,但我无法找到我真正想要的东西。
我一直在一个有 3 或 4 个 EXEcutables 的项目中工作,它们共享相同的数据库、相同的接口(表单继承)、通用工具、设置以及通用和相关字符串。
我不想有 3 或 4 个不同名称的 .po 文件(每个 EXE 一个),它们之间共享相同的公共字符串。
有解决办法吗?
- 可能对所有应用强制执行一个 "gobal.po"?怎么样?
- 我是否必须创建自己的系统来本地化\集中一个文件中的所有字符串?
有什么建议吗?
感谢您的帮助。
问候,
使用一个共享语言单元,将所有项目的所有字符串放入其中。创建一个包,将此共享字符串单元添加到其中。为此包打开 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 事件中)。
我有一些 Delphi 经验,我正在尝试使用 Lazarus 构建一个项目,这对我来说是全新的。
我想,我已经阅读了有关 Lazarus 的所有可用信息,Translating/Internationalization/Localization,但我无法找到我真正想要的东西。
我一直在一个有 3 或 4 个 EXEcutables 的项目中工作,它们共享相同的数据库、相同的接口(表单继承)、通用工具、设置以及通用和相关字符串。
我不想有 3 或 4 个不同名称的 .po 文件(每个 EXE 一个),它们之间共享相同的公共字符串。
有解决办法吗?
- 可能对所有应用强制执行一个 "gobal.po"?怎么样?
- 我是否必须创建自己的系统来本地化\集中一个文件中的所有字符串?
有什么建议吗?
感谢您的帮助。 问候,
使用一个共享语言单元,将所有项目的所有字符串放入其中。创建一个包,将此共享字符串单元添加到其中。为此包打开 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 事件中)。