【问题标题】:how to internationalize a delphi application [duplicate]如何国际化delphi应用程序[重复]
【发布时间】:2013-01-22 10:32:39
【问题描述】:

可能重复:
Translate application

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

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

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

【问题讨论】:

  • 将应用程序国际化总是很费力的。 :(

标签: windows delphi winapi delphi-xe2 lang


【解决方案1】:

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

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

http://dxgettext.po.dk/

更新:

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

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

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

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

      你可以找到其他方法和商业组件(我用过TsiLang components -excellent library-)

      问候。

      【讨论】:

        【解决方案4】:

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

        我创建了一个 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 文件)
        • 您可以将字典文件放入资源中,然后从那里加载。

        优点

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

        缺点

        • 如果您有许多表单,连接所有标签、按钮等将是一场噩梦,但您可以通过智能方式实现自动化。
        • 如果不经常更改应用语言,它会稍微降低应用速度,但不会太慢。

        【讨论】:

          【解决方案5】:

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

          Have a look at this

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-24
            • 1970-01-01
            相关资源
            最近更新 更多