如何国际化delphi应用程序

可能重复:
翻译申请

国际化我用delphi xe2编写的应用程序的最佳方式是什么?

我已经看到了stringtable资源,但是我很担心,因为我有这样的感觉,那就是实现可能是耗时费力的。

还有其他同样有效的方法来做到这一点?

Solutions Collecting From Web of "如何国际化delphi应用程序"

也许不是最好的翻译工具,但我使用GNU Gettext多年。 这个过程很简单:

  • 你运行dxgettext来提取字符串
  • 你翻译或给予翻译的文件
  • 我个人喜欢poEdit工具来翻译和管理翻译库
  • 可选:将您的翻译文件合并到最终的EXE中
  • 或者你把翻译文件放在子目录中,就是这样!

http://dxgettext.po.dk/

更新:

1 / GNU Gettext包含在JCL / JVCL库中,您只需要在启动时激活此选项。

2 / Gnu Gettext可以翻译库中的所有东西,就像VCL,JCL / JVCL一样! 这不仅限于你的代码!

在这里你可以找到关于这个主题的两篇文章:

  • Multilingua应用程序与GNU gettext
  • 标准方法的Multilingua应用程序(IDE)

你可以找到其他的方法和组件(我用过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; 

正如你所看到的,这不是一个可以复制和粘贴的实例,我只是想向你展示背后的想法。 如果有什么不清楚的地方,请发表评论,我可以延长我的回答。

一些说明:

  • 我认为以utf8格式进行翻译是很重要的。
  • 使用xls使本地化人员更容易生活,如果他们毁了你的XML文件(如果翻译者不是专业人士,可能会发生你以Microsoft Word格式取回你的XML文件)
  • 你可以把你的字典文件放入资源,并从那里加载。

优点

  • 这样你可以改变语言的运行时间
  • 如果你需要另一种语言,你只需要编辑字典文件。

缺点

  • 如果你有很多形式,连接所有的标签,按钮等是一个噩梦,但你可以用智能的方式自动化它。
  • 它减慢了你的应用程序的一点点,但不是太多,如果改变你的应用程序语言不经常发生。

有一个叫做sisulizer的产品,它可以在你构建我认为可执行的文件后生效。 还没有尝试过,但我读了很多关于它。

看看这个