2016-04-13 9 views
1

MVVM Light WPFアプリケーションでランタイムローカライズの変更機能を実装する正しい方法は何ですか?私はリソースベースのローカリゼーション(.resxファイル)を使用しています。ほとんどの場合、ロケールを変更するオプションが必要です。 LocalizationChangedイベントにApp.xaml.csにグローバルプロパティをすることについての最初のMVVMライトとランタイムローカライゼーションの変更

私も、すべてのビューに配線さが、これはMVVMの少なくとも2つのルールを違反する:彼らはなりますので、一緒にコードビハインドとカップリングViewクラスのコードを持っていませんアプリケーションクラスに依存

もう一つのアイデアは、その後LocalizationChangedを登録するためのインタフェースを提供(MVVM光の魔法を経由して、実行時に注入された)LocalizableModelクラスによって実装されるグローバル・インタフェースILocalizableModelを作成することでした(それはそれらをテストユニットに難しくなります)新しいローカリゼーションを設定するためのイベントと方法(および使用可能なローカリゼーションを列挙するような他の機能もあります)。このイベントは、ViewModelクラスで発生し、すべてのプロパティを更新するよう要求します。これには別の問題があります。一部のViewデータ(リストなど)は、再作成せずに更新できません。また、ViewModelのView固有のコードを扱うこともちょっと違っているようです。

もう1つのアイデアはObservatorパターンまたはモデル内に配線された自動プロパティを使用することです。

しかし、「正しい」MVVMのやり方は何ですか?

+2

1)MVVMはコードベネンドでコードを持つことを禁じません。コードビハインドでは、ビューロジックに関係しないコードを避けるだけです。 2)ローカリゼーションはビューの責任であり、なぜこれらのすべてをビューモデルに持ち込みたいのですか? – Dennis

+0

@Dennis一部のローカリゼーションはモデル内でも使用されていますが、ローカライズされたバージョンのリソースをデータベースから取得する必要があります – PiotrK

答えて

2

私はこれを研究するのに数週間を費やし、resxファイルはWPF/MVVMにとって最適なソリューションではないという結論に達しました。

<TextBlock Text="{Translate 'Hello World!'}" /> 

これは多くの利点を提供します:私が見つけた最善の解決策は、あなたがこのようなあなたのXAMLを宣言することができますa custom markup extensionを使用していた

  1. あなたはまだあなたの母国語でXAMLを書くことができ、元の文字列は、ローカライゼーションテーブルのインデックスに使用されるキーを形成します。
  2. すべてのXAMLを解析し、キー文字列を1つのテーブルに抽出して翻訳者に提供することができます(また、適切な翻訳が行われるまでGoogle翻訳に貼り付けるのも簡単です)。
  3. 現在の言語をオンザフライで変更でき、すべてのバインディングがすぐに更新されます。
+0

私はこれを使用して終了しました:http://wpflocalizeextension.codeplex.com/ solution。これまでのところ非常にシャープに見えます! :) – PiotrK

関連する問題