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

1つのオプションは、Delphiの統合翻訳環境を使用することです。

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

于 2013-01-22T13:02:29.467 に答える
0

sisulizerと呼ばれる製品があります。これは、実行可能ファイルをビルドした後に機能すると思います。試したことはありませんが、よく読んでいます。

これを見てください

于 2013-01-22T13:02:29.833 に答える
0

ここでは、このテーマに関する 2 つの記事を見つけることができます。

他の方法と商用コンポーネントを見つけることができます(私はTsiLangコンポーネントを使用しました-優れたライブラリ-)

挨拶。

于 2013-01-22T11:36:41.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 に答える