可能重复:
Translate application
使用delphi xe2编写的应用程序国际化的最佳方法是什么?
我见过stringtable
资源,但我很担心,因为我觉得实施可能既耗时又费力。
还有其他同样有效的方法吗?
答案 0 :(得分:3)
也许不是翻译的最佳工具,但我使用GNU Gettext多年。 这个过程非常简单:
<强>更新强>
1 / GNU Gettext包含在JCL / JVCL库中,您只需要在启动时激活此选项。
2 / Gnu Gettext可以翻译库中的所有内容,如VCL,JCL / JVCL也!它不仅限于您的代码!
答案 1 :(得分:1)
一种选择是使用Delphi中的集成翻译环境:
答案 2 :(得分:0)
答案 3 :(得分:0)
我不知道这是将应用程序国际化的最佳方式,但对我来说它是有效的。这是一种自制的。
我创建了一个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;
正如您所看到的,这是不一个可以复制和粘贴的工作示例,我只是想向您展示背后的想法。如果有什么不清楚,请评论,我可以扩展我的答案。
一些注意事项:
赞成
缺点
答案 4 :(得分:0)
有一款名为sisulizer的产品,它可以在我构建可执行文件之后运行。 Haven没试过,但我已经读过很多关于它的事了。