如何将delphi应用程序国际化



可能重复:
翻译应用程序

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

我看到了stringtable资源,但我很担心,因为我觉得实现可能很耗时,也很费力。

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

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

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

http://dxgettext.po.dk/

更新:

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

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

一个选项是使用Delphi:中的集成翻译环境

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

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

  • 使用GNU gettext的多语言应用程序
  • 使用标准方法的多语言应用程序(IDE(

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

问候。

我不知道这是国际化应用程序的最佳方式,但对我来说,它起到了作用。这是一种自制

我创建了一个xml文件,它是包含翻译的字典,但您可以使用任何其他格式,从json到xls(也许这是最好的(。Than实现了一个从这个文件中读取翻译的类,以及在语言在运行时更改的情况下注册过程的方法,我认为这是一个很好的功能。

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文件(
  • 您可以将字典文件放入资源中,然后从那里加载

Pros

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

Cons

  • 如果你有很多表单,连接所有的标签、按钮等是一场噩梦,但你可以用聪明的方式实现自动化
  • 如果不经常更改应用程序语言,它会稍微降低应用程序的速度,但不会太慢

有一个名为sisulizer的产品,我认为它在构建了可执行文件之后就可以工作了。我还没试过,但我读了很多关于它的书。

看看这个

最新更新