2009-08-25 10 views
8

実行時に言語を変更できるMVVMベースのWPFアライメントをローカライズするにはどうすればよいですか?もちろん、ビューのどこかに表示されている各文字列のViewModelに文字列プロパティを作成することはできますが、それはかなり面倒です。これには共通のアプローチ/ベストプラクティスがありますか?MVVMベースのWPFアプリケーションのローカライズ

答えて

9

WPF has a lot of support for localization。おそらくあなたはそれを活用することができますか?残念ながら、実行時にユーザーインターフェイスの言語を変更することはやや難しく、おそらく自分のスキームを考え出す必要があると思います。

また、ビューモデルはUIに依存しないため、ビューモデルにユーザーインターフェイス文字列を格納することは良い解決策だとは思いません。これらはビューに属します。

+3

ビュー・モデルは、ビューのモデルであることを考えると、私は個人的にこれがローカライズを置くのに最適な場所だと思います。これにより、同じビューモデルからのローカライズされたSilverlightとWPF UIも使用できます。 –

+5

私はピート・デイビスに同意しなければなりません。ローカリゼーションはビューに属し、ビューモデルには属しません。ビューモデルは、ビューがどのように表示されるかについて心配する必要はありません。また、ローカリゼーションは、ビューが別の言語で表示できる単なる方法です。 –

6

代わりに、あなたのビューモデルでは、ユーザーインターフェイスの文字列を有するので、あなたはx:Staticを使用して、アセンブリのリソースに保存し、XAMLから直接アクセスすることができます。

<TextBlock Text="{x:Static props:Resources.MyLabel}"/> 

props名前空間は、アセンブリのProperties名前空間を参照する必要があります:

xmlns:props="clr-namespace:My.Assembly.Properties" 
+0

リソースのアクセスが変更されていないことを確認してください。 – midspace

9

ここexcellent article about WPF localizationです。マイクロソフトがサポートするローカリゼーションテクニックやいくつかの代替テクニックを扱います

ローカリゼーションのための「公式」ソリューションはお勧めできません...本当に使用するのは苦痛です.XAMLを変更します(x:Uidローカライズできるすべての要素への属性)、MSからの簡単な解決策となる優れたツールはありません。古いレックスのローカリゼーションははるかに使いやすく、WPFにほんの数回のトリック(マークアップの拡張機能やアタッチされたプロパティ)で非常によく統合されています。また、バインディングシステムのおかげで、実行時にインターフェイス言語を簡単に変更できます。

+0

+1リック・ストラウルの記事。これは良いです。実際、バインディングシステムは現在のUIスレッドのカルチャにネイティブでは準拠していませんが、この記事ではこの問題を他のものの中から解決する方法について説明します。良い選択。 –

+0

+1非常に便利な答えです。記事ありがとう – gyurisc

1

カスタムマークアップ拡張を使用して、ローカライズされた値を検索し、UIカルチャが変更されたときにそれらを更新することができます。 http://wpflocalization.codeplex.com/:この例では、リック・シュトラールとここミケーレルルーブスタマンテが執筆優れたWPFのローカライズ指針から取られ

<Label x:Name="lblResxHelloWorldMarkupExtension1Value" 
Content="{res:Res Id=HelloWorld,Default=Hello#}" 
Margin="{res:Res Id=HelloWorldMargin,Default=10}" 
Width="{res:Res Id=HelloWorldWidth, 
ResourceSet=WpfClickOnce.MyFormRes, Default=50}" /> 

はここで、これはうまくいくかもしれない方法の例です。このテクニックについては、ドキュメントフォームとサンプルアプリケーションで詳しく説明しているこのサイトからガイドをダウンロードしてください。

このアプローチのもう1つの利点は、デザイナーで機能することです。