可能重复:
翻译应用程序
国际化我用 delphi xe2 编写的应用程序的最佳方法是什么?
我已经看过stringtable
资源,但我很担心,因为我觉得实施可能既费时又费力。
还有其他同样有效的方法可以做到这一点吗?
也许不是最好的翻译工具,但我使用GNU Gettext已经很多年了。这个过程非常简单:
更新:
1/ GNU Gettext 包含在 JCL/JVCL 库中,您只需在启动时激活此选项。
2/ Gnu Gettext可以翻译库中的所有内容,如VCL、JCL/JVCL!它不仅限于您的代码!
一种选择是使用 Delphi 中的集成翻译环境:
有一个名为 sisulizer 的产品,我认为它在您构建了可执行文件后才能工作。没有尝试过,但我已经阅读了很多关于它的内容。
我不知道这是国际化应用程序的最佳方式,但对我来说它有效。这是一种自制的。
我创建了一个 xml 文件,它是包含翻译的字典,但您可以使用任何其他格式,从 json 到 xls(也许这是最好的)。然后实现了一个从这个文件中读取翻译的类,以及一种在语言更改运行时注册程序的方法,我认为这是一个很好的特性。
TDictionary = class
private
fOnChanged: TSignal;
fLanguage: String;
procedure setLanguage( const Value: String );
public
procedure loadFromFile( filename: string );
function getTranslation( id: string; lang: string = '' ): string;
property language: String read fLanguage write setLanguage;
property onChanged: TSignal read fonChanged;
end;
...
function TDictionary.getTranslation( id: string; lang: string = '' ): string;
begin
if lang = '' then
lang := Language; // use the default lang.
// read the translation from the file.
end;
procedure TDictionary.setLanguage( const Value: String );
begin
fLanguage := Value;
onChanged.Execute;
end;
TSignal是一个注册方法的类,如果你调用Execute
执行所有注册的方法,也许在xe2中你有为此内置的东西,在delphi7中我必须自己创建这个类,但实现起来很有趣。
在表单的 createForm 中:
procedure TMyClass.doTranslate( dictionary: TObject );
begin
with dictionary as TDictionary do
begin
caption := dictionary.getTranslation( 'myclass.caption' );
button.caption := dictionary.getTranslation( 'some id' );
end;
// or you can go through Controls array, and automate the assignment.
end;
procedure TMyClass.FormCreate(Sender: TObject);
begin
Dictionary.onChanged.register( doTranslate );
doTranslate( dictionary );
end;
procedure TMyClass.FormDestroy(Sender: TObject);
begin
Dictionary.onChanged.deregister( doTranslate );
end;
如您所见,这不是一个可以复制和粘贴的工作示例,我只是想向您展示背后的想法。如果有不清楚的地方,请发表评论,我可以扩展我的答案。
一些注意事项:
优点
缺点