如何国际化delphi应用程序

时间:2013-01-22 10:32:39

标签: windows delphi winapi delphi-xe2 lang

  

可能重复:
  Translate application

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

我见过stringtable资源,但我很担心,因为我觉得实施可能既耗时又费力。

还有其他同样有效的方法吗?

5 个答案:

答案 0 :(得分:3)

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

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

http://dxgettext.po.dk/

<强>更新

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

2 / Gnu Gettext可以翻译库中的所有内容,如VCL,JCL / JVCL也!它不仅限于您的代码!

答案 1 :(得分:1)

答案 2 :(得分:0)

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

你可以找到其他方法和常用组件(我使用过TsiLang components - 优秀的库 - )

问候语。

答案 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;

正如您所看到的,这是一个可以复制和粘贴的工作示例,我只是想向您展示背后的想法。如果有什么不清楚,请评论,我可以扩展我的答案。

一些注意事项:

  • 我认为以utf8格式翻译很重要。
  • 使用xls使本地化程序更容易,如果它们破坏了您的xml文件(如果转换程序不是prof。,则可能会发生以Microsoft Word格式取回xml文件)
  • 您可以将字典文件放入资源中,然后从那里加载。

赞成

  • 这样您就可以更改语言运行时
  • 如果您需要其他语言,则只需编辑字典文件。

缺点

  • 如果您有多种形式,连接所有标签,按钮等都是一场噩梦,但您可以通过智能方式实现自动化。
  • 如果不经常更改您的应用语言,它会使您的应用减慢一点,但不会太多。

答案 4 :(得分:0)

有一款名为sisulizer的产品,它可以在我构建可执行文件之后运行。 Haven没试过,但我已经读过很多关于它的事了。

Have a look at this