web-dev-qa-db-ja.com

C#/ WinFormsで多言語アプリケーションを作成するためのベストプラクティスは?

私はこれが当てはまる小さなプロジェクトに取り組む必要があるため、C#で複数の言語に適したアプリケーションを作成することを検討してきました。これを行うには、基本的に2つの方法があります。

フォームのLocalizableプロパティをtrueに設定し、Languageプロパティを設定し、すべてのラベルなどを埋めれば、完了です。私がこれで見ている主な欠点は、複数の言語に対応するフォームの一部ではない他のもの(ポップアップウィンドウ、ログファイル、ウィンドウなど)を作成する方法です。

「Lang.en-us.resx」などのリソースファイルを作成し、「Lang.nl-nl.resx」などの言語ごとに1つ作成して、文字列で埋めます。 IDEは私のためにクラスを自動的に生成するようです。そのため、コードではLang.SomeTextを使用するだけです。コード内のラベルやその他のキャプション(およびこれらのリソースでデータバインディングが機能するようには見えません)。

ただし、これを行う方法は他にもあると確信しています。

だから、ベストプラクティスは何ですか?小規模なアプリケーション(いくつかのフォーム、データベース接続など)にとって最も簡単なものは何ですか?また、大規模なアプリケーションに最適なものは何ですか?

93
pbean

多言語アプリケーションには常にリソースファイルを使用しています。
それらの使用方法を説明するWeb上の多くの記事があります。

2つの異なる方法を使用しました。

  • フォームごとのリソースファイル
  • グローバルリソースファイル

リソースファイル/フォームは実装が簡単で、リソースファイルに値を入力するだけで済みますが、ラベルがアプリケーション全体に分散しているため、このアプローチの維持が難しくなります。

グローバルリソースファイルを使用すると、すべてのラベル(画像など)を1つのファイル(言語ごと)に集中化できますが、フォームロードでラベルを手動で設定することを意味します。このファイルは、エラーメッセージなどにも使用できます。

味の質問...

最後に、英語とフランス語でプログラムを作成します。「en-US」と「fr-FR」ではなく、「en」と「fr」を使用します。物事を複雑にしないでください。英語の異なる語彙(アメリカ、英語、オーストラリアなど)には、1つだけを使用するのに十分な違いはほとんどありません(フランス語でも同じです)。

20
ThatBloke

最近、ドイツ語と英語の両方をサポートするプログラムを書きました。英語のリソースにLanguageResources.resxとドイツ語のリソースにLanguageResources.de.resxという名前を付けただけで、正しい言語が自動的に選択されたことに驚いた。 ResXFileCodeGeneratorがすべてを処理してくれました。

2つのファイルのフィールドは同じで、まだ入力されていないドイツ語のフィールドはすべて、アプリケーションでは英語として表示されることに注意してください。文字列を検索する場合、最も具体的な(例:.de-DE.resx)から最も特定度の低い(例:.resx)になります。

文字列を取得するには、ResourceManager.GetStringまたはResourceManager.GetObject呼び出しを使用します。アプリケーションは、ResourceManagerを無料で提供する必要があります。

9
Rick Minerich

これに出くわすかもしれない他の人のために(最後の投稿から1年以上)、私はプロのローカリゼーション製品の著者であり、翻訳プロセス全体を非常に簡単にします。任意のソリューションからすべての「.resx」文字列を抽出し、無料のスタンドアロンアプリケーションを使用して翻訳できる単一のファイルにロードするVisual Studioアドインです(翻訳者はこれを私のサイトからダウンロードできます)。次に、同じアドインが翻訳された文字列をソリューションにインポートして戻します。多くの組み込みのセーフガード、多くの付加機能、およびオンラインヘルプを使用すると、非常に使いやすくなります(あまり必要ありません)。 http://www.hexadigm.com を参照してください

5
Larry