重複の可能性:
アプリケーションの翻訳
Delphi xe2 で書かれたアプリケーションを国際化する最良の方法は何ですか?
リソースを見たstringtable
ことがありますが、実装には時間と労力がかかるのではないかと心配しています。
これを行うための他の同様に有効な方法はありますか?
重複の可能性:
アプリケーションの翻訳
Delphi xe2 で書かれたアプリケーションを国際化する最良の方法は何ですか?
リソースを見たstringtable
ことがありますが、実装には時間と労力がかかるのではないかと心配しています。
これを行うための他の同様に有効な方法はありますか?
翻訳には最適なツールではないかもしれませんが、私は長年GNU Gettextを使用しています。プロセスは非常に簡単です。
アップデート:
1/ GNU Gettext は JCL/JVCL ライブラリに含まれています。起動時にこのオプションを有効にするだけです。
2/ Gnu Gettext は、ライブラリ内のすべてを VCL、JCL/JVCL などに変換できます。それはあなたのコードに限定されるだけではありません!
1つのオプションは、Delphiの統合翻訳環境を使用することです。
sisulizerと呼ばれる製品があります。これは、実行可能ファイルをビルドした後に機能すると思います。試したことはありませんが、よく読んでいます。
ここでは、このテーマに関する 2 つの記事を見つけることができます。
他の方法と商用コンポーネントを見つけることができます(私はTsiLangコンポーネントを使用しました-優れたライブラリ-)
挨拶。
これがアプリケーションを国際化する最良の方法かどうかはわかりませんが、私にとってはうまくいきました。自家製の一種です。
翻訳を含む辞書である 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;
ご覧のとおり、これはコピーして貼り付けることができる実際の例ではありません。背後にあるアイデアをお見せしたかっただけです。不明な点がある場合は、コメントしてください。回答を拡張できます。
いくつかのメモ:
長所
短所