也许不是最好的翻译工具,但我已经使用GNU Gettext很多年了。 整个过程非常简单:
更新:
1/ GNU Gettext已经包含在JCL/JVCL库中,你只需要在启动时激活此选项即可。
2/ Gnu Gettext可以翻译库中的一切内容,包括VCL、JCL/JVCL等!不仅仅限于你的代码!
我不知道这是否是国际化应用程序的最佳方式,但对我而言,它起作用了。这是一种自制的方法。
我创建了一个 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;
Execute
,则会执行所有已注册的方法。也许在xe2中,您已经有一些内置的东西来实现这一点,在delphi7中,我不得不自己创建这个类,但实现它很有趣。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;
正如您所看到的,这不是一个可以复制和粘贴的工作示例,我只是想向您展示其背后的思想。如果有什么不清楚的地方,请评论一下,我可以扩展我的答案。
一些注意事项:
优点
缺点