3

可能重复:
翻译应用程序

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

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

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

4

5 回答 5

3

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

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

http://dxgettext.po.dk/

更新:

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

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

于 2013-01-22T10:41:07.063 回答
2

一种选择是使用 Delphi 中的集成翻译环境:

http://docwiki.embarcadero.com/RADStudio/XE3/en/Localizing_Applications_by_Using_Translation_Manager_Overview

于 2013-01-22T13:02:29.467 回答
0

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

您可以找到其他方法和商业组件(我使用过TsiLang 组件-优秀库-)

问候。

于 2013-01-22T11:36:41.833 回答
0

有一个名为 sisulizer 的产品,我认为它在您构建了可执行文件后才能工作。没有尝试过,但我已经阅读了很多关于它的内容。

看看这个

于 2013-01-22T13:02:29.833 回答
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 文件,您也会更轻松(如果翻译人员不是教授,您可能会以 microsoft word 格式取回您的 xml 文件)
  • 您可以将字典文件放入资源中,然后从那里加载。

优点

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

缺点

  • 如果您有许多表单,连接所有标签、按钮等将是一场噩梦,但您可以通过智能方式将其自动化。
  • 如果更改您的应用程序语言不那么频繁,它会稍微减慢您的应用程序,但不会太多。
于 2013-01-22T11:52:45.553 回答