テキスト翻訳クラスから翻訳されたテキストを提供するWPFMarkupExtensionクラスを作成しようとしています。翻訳はうまく機能しますが、翻訳されたテキストを返すには、テキストキーを使用した静的メソッド呼び出しが必要です。このような:
ImportLabel.Text = Translator.Translate("import files");
// will be "Dateien importieren" in de or "Import files" in en
その専門は、より良い表現を提供するためにカウント値を受け入れることです。
ImportLabel.Text = Translator.Translate("import n files", FileCount);
// will be "Import 7 files" or "Import 1 file"
別の例:何かがまだ4分かかる場合、それは1分しかかからない場合とは別の言葉です。テキストキー「minutes」が任意の数の「Minuten」および1のカウントの「Minute」として定義されている場合、次のメソッド呼び出しは使用する正しい単語を返します。
Translator.Translate("minutes", numberOfMinutes)
// will be "minute" if it's 1, and "minutes" for anything else
現在、WPFアプリケーションには、多くのXAMLコードがあり、それには多くのリテラルテキストが含まれています。ナッツを使わずに翻訳できるようにするには、テキストキーを渡すことができ、実行時に翻訳されたテキストを返すマークアップ拡張機能が必要です。この部分はかなり簡単です。MarkupExtensionから継承するクラスを作成し、テキストキーを引数として受け入れるコンストラクターを追加し、それをプライベートフィールドに格納し、そのProvideValueメソッドが格納されたキーの翻訳テキストを返すようにします。
私の本当の問題はこれです:マークアップ拡張機能がデータにバインドされ、カウント値が変更されたときにそれに応じて翻訳テキストが更新されるように、カウント値を受け入れるようにするにはどうすればよいですか?
次のように使用する必要があります。
<TextBlock Text="{t:Translate 'import files', {Binding FileCount}}"/>
FileCountのバインディング値が変更されるたびに、TextBlockは変更を反映し、適切な表現を提供するために新しいテキスト値を受け取る必要があります。
私はあそこに似たような解決策を見つけました:http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/10/30/wpf-localization-on-the-fly-language-selection。 aspxしかし、私がそれをフォローしようとすると、それが何をするのか、なぜそれが機能するのかさえ理解できません。すべてがWPF内で発生しているように見えます。提供されたコードは、WPFを正しい方向にプッシュするだけですが、その方法は不明です。私はそれを適応させて何か役に立つことをすることができません。
実行時に翻訳言語を変更することが役立つかどうかはわかりません。そのためには、別のレベルのバインディングが必要だと思います。複雑さを低く抑えるために、基本バージョンが機能するまではそうしようとはしません。
現時点では、お見せできるコードはありません。それは単にひどい状態にあり、それがする唯一のことは例外を投げるか、何も翻訳しないことです。簡単な例は大歓迎です(この場合、そのようなものが存在する場合)。