可能重复:
翻译申请
国际化我用delphi xe2编写的应用程序的最佳方式是什么?
我已经看到了stringtable
资源,但是我很担心,因为我有这样的感觉,那就是实现可能是耗时费力的。
还有其他同样有效的方法来做到这一点?
也许不是最好的翻译工具,但我使用GNU Gettext多年。 这个过程很简单:
更新:
1 / GNU Gettext包含在JCL / JVCL库中,您只需要在启动时激活此选项。
2 / Gnu Gettext可以翻译库中的所有东西,就像VCL,JCL / JVCL一样! 这不仅限于你的代码!
一种选择是使用德尔福的集成翻译环境:
在这里你可以找到关于这个主题的两篇文章:
你可以找到其他的方法和组件(我用过TsiLang组件 – 优秀的库)
一声问候。
我不知道这是一个应用程序国际化的最佳方式,但对我来说,它的工作。 这是一种自制的 。
我创建了一个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;
正如你所看到的,这不是一个可以复制和粘贴的实例,我只是想向你展示背后的想法。 如果有什么不清楚的地方,请发表评论,我可以延长我的回答。
一些说明:
优点
缺点
有一个叫做sisulizer的产品,它可以在你构建我认为可执行的文件后生效。 还没有尝试过,但我读了很多关于它。
看看这个