web-dev-qa-db-ja.com

WinFormsアプリケーションの適切なローカリゼーション

複数の言語に翻訳したいWinFormsアプリケーションがあります。しかし、私はWinFormsアプリのローカライズの経験がなく、この件に関して非常に矛盾する情報を見つけました。

基本的に、私が欲しいのは:

  • ソースコードでは、言語ごとに1つのファイルのみが必要です
  • このファイルはコンパイル時にメインアプリケーションにコンパイルされます-アプリケーションのビルド後にサテライトアセンブリまたは外部データファイルはありません
  • ユーザーは言語を選択できます。オペレーティングシステムに基づく自動検出は必要ありません。
  • これには主にstringsintsが含まれている必要がありますが、CultureInfo

私が見たほとんどのソリューションには、1つの_.resx_ファイルperFormまたは外部サテライトアセンブリ、あるいはその両方があります。

  • 自分でロールする必要がありますか?
  • または、フレームワークにはすでに何かありますか?

_.net Framework 3.5 SP1_必要な場合。

編集:

ほとんどの場合、Visual Studioはすでに私が欲しいものをサポートしていますが、2つの問題があります。 _Form.Localizable_をtrueに設定すると、この素敵なDesignerサポートがありますが、resxごとにFormが1つ生成されます。 InitializeComponentで手動でオーバーライドするという考えは、定期的に上書きされるデザイナー作成のコードであるため失敗します。

理論的には、次のことだけを行います。

  • a)ComponentResourceManagerの作成をオーバーライドして、自分のグローバルresxを指すようにし、
  • b)ApplyResourcesの呼び出しを、CultureInfoを3番目のパラメータとして受け取るオーバーロードに変更します。

InitializeComponent()の後に呼び出され、その動作をオーバーライドする関数呼び出しをコンストラクターに追加する必要があるようです。それはひどく非効率的に思えますが、Visual StudioはInitializeComponent()へのタッチについて警告するときに適切です。

現時点では、確かに自分の_WinForms localization Framework_を転がしています...

36
Michael Stum

同様の問題でC#.Net 3.5プロジェクトを完了しました。私たちは8つの言語(英語を含む)を持つ既存の多言語アプリケーション用のWinFormsプラグインを作成していました。

これが私たちのやり方です:

  1. すべてのフォームとUIをデフォルトの言語である英語で作成します。

  2. すべての内部文字列をリソースファイルに入れます(カスタムエラーメッセージやダイアログボックスのタイトルなど、フォームに直接結び付けられていないもの)

ほとんどの作業とテストが完了したら、ローカライズしました。

  1. 各フォームにはすでに.resxファイルがありましたが、これは空でした。プロパティ 'Localizable'をtrueに設定します。resxファイルには、ボタンのサイズや文字列などが含まれています。

  2. 他の各言語では、フォームの「Language」プロパティを変更しました。たとえば、「スペイン語(チリ)」ではなく「スペイン語」などの各言語の基本バージョンを選択したので、すべての「スペイン語」方言で機能するようになりました。

  3. 次に、各コントロールを調べ、そのテキストを翻訳し、必要に応じてサイズを変更しました。これにより、言語とフォームの組み合わせごとに.resxが作成されました。

次に、8つの言語について、フォームごとに8つの.resxと、一般的な文字列用に8つの.resxが残されました。コンパイルすると、出力フォルダーには作成した.dllが含まれ、次に.resources.dllが含まれる各言語のサブフォルダーが含まれます。

言語プロパティを変更して、文字列とレイアウトが正しいことを確認するだけで、デザイナーでUIのバージョンをテストできました。

結局のところ、私たちが頭を抱えたとたん、それは非常に簡単で無痛でした。

フォームの読み込みにカスタム調整を書き込む必要はありませんでした

18
Charlie A

私はASP.NETについて同様の質問をしていて、最初の答えを得ました-このツールとそのワークフローもあなたに役立つかもしれません-見てください: Lingobit Localizer

それはあなたのWinformsアプリをロードすることができるようで、あなたがそれをしている間あなたがあなたのラベル等を翻訳し始めて、そしてフォームを見ることを可能にします。増分翻訳や翻訳メモリなど、他の多くの機能(同じ用語を繰り返し使用する場合)。

(Winformsの場合)かなり有望に見えますが、自分では使用していません。

潜在的な.NETローカリゼーションツール(---)の 広範なリストを次に示します -よくわかりません。どのように機能し、何がカバーされているかを確認してください。探しているものが見つかるかもしれません。 。

マーク

4
marc_s

これは大きなテーマであり、あなたが望むものを達成するための多くの方法があります。フレームワークは基本を提供しますが、完全なソリューションでは、特定の要素を自分で実装する必要があります。

たとえば、デフォルトのフレームワーク実装では、すべてのリソースに対して.resxファイルを作成します。 ASP.Netでは、これは各ユーザー/サーバーコントロールまたはページを意味します。これは簡単なメンテナンスには向いておらず、リソースをデータベースに移動する場合は、独自のプロバイダーを実装する必要があります。

Winformsの知識は限られていますが、SilverlightまたはWPFを使用している場合は、次のURLでGuy Smith-Ferrierのこの件に関する記事を読んでください。 http://www.guysmithferrier.com/category/Internationalization.aspx =。彼はまたあなたの人生を楽にすることができるいくつかのツールセットを持っています: http://www.dotneti18n.com/Downloads.aspx

私は以前彼と一緒に仕事をしたことがあり、その主題をより深く理解している人に出会ったことはありません。

3
grenade

最初と2番目の要件に対する解決策はありませんが、フォームのローカライズは各Wordを翻訳するほど簡単ではないことに注意してください。翻訳された各テキストがそれぞれのコントロールに収まることを確認する必要があります。また、別の文化で変更する必要があるアイコンや画像があるかもしれません。

3つ目のポイントとして、次の行を使用して手動で言語を変更できます。

CultureInfo ci = new CultureInfo("fr");
Thread.CurrentThread.CurrentUICulture = ci; 
3
Francis B.

あなたが求めているもの:

  1. サテライトリソースファイルがありません
  2. フォームごとに1つのサイズとコントロールの配置のみ。
  3. 実行可能ファイルに埋め込まれた多くの言語。

Vanilla Visual StudioのIDEでは実行できません。

それが必要とするのは、基本的にこれらのすべてのステップを実行するいくつかのカスタム作業です:

  • TMXリソースファイルを処理するカスタムリソースマネージャーを取得します。
  • ローカライズ可能なすべての文字列をTMXファイルに入れます。
    • このTMXファイルをプロジェクトのembeddedリソースにします。
  • フォームコンストラクターでTMX ResourceManagerを作成し、埋め込みリソースからTMXファイルをロードします。
  • コードでは、ローカライズされた文字列を取得するために、デフォルトのResourceManagerの代わりにtmx ResourceManagerを使用します。
    • フォームがデフォルトのResourceManagerを使用して、文字列を除くすべてのデザイナーのものを取得できるようにします。
  • 新しい言語翻訳でTMXファイルを具体化します。
    • コンパイルする前にこのTMXファイルに追加するだけで、プロジェクトの次のリリースでさらに追加できます。

リソース:(決して完全なリストではありません)

1
Jesse Chisholm