私はテキスト変換クラスから翻訳されたテキストを提供するWPF MarkupExtensionクラスを作成しようとしています。翻訳はうまくいきますが、翻訳されたテキストを返すためにテキストキーを使用した静的メソッド呼び出しが必要です。このように:DataBinding値を使用するMarkupExtension
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"
もう1つの例:4分以上かかる場合は、1分かかる場合とは異なる単語です。 WPFで今
Translator.Translate("minutes", numberOfMinutes)
// will be "minute" if it's 1, and "minutes" for anything else
:テキストキー「分」場合は、任意の数の1のカウントのための「分」として「Minuten」と定義され、以下のメソッド呼び出しが使用する権利の単語を返します。 XAMLコードがたくさんあり、多くのリテラルテキストが含まれています。ナッツを取得せずに翻訳できるようにするには、テキストキーを渡すことができるマークアップ拡張機能が必要で、実行時に翻訳されたテキストが返されます。この部分はかなり簡単です。 MarkupExtensionを継承するクラスを作成し、テキストキーを引数として受け入れるコンストラクターを追加し、それをプライベートフィールドに格納し、そのProvideValueメソッドが格納されたキーの変換テキストを返すようにします。
実際の問題は次のとおりです。マークアップ拡張がデータバインドされ、カウント値が変更されたときに翻訳テキストが更新されるようにカウント値を受け入れるにはどうすればよいですか?
それはこのように使用する必要がありますてFileCount変更の
<TextBlock Text="{t:Translate 'import files', {Binding FileCount}}"/>
たび結合値、のTextBlockは、変更を反映し、まだ良い文言を提供するために、新しいテキスト値を受け取る必要があります。
私はそこに似たような解決策を見つけました:http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/10/30/wpf-localization-on-the-fly-language-selection.aspx私はそれを追いかけようとするほど難しいですが、それが何であるか、それがなぜ機能するのか理解できません。すべてがWPF内部で起こっているようですが、提供されたコードは正しい方向にプッシュするだけですが、その方法は不明です。私は何か有用なことをするための私の適応を得ることができません。
実行時に翻訳言語を変更することが有用かどうかはわかりません。私はそれのために別のレベルのバインディングが必要だと思います。複雑さを低く抑えるために、私は基本バージョンが動作するまでこれを行うつもりはありません。
現時点ではコードは表示されません。単に恐ろしい状態にあり、例外を投げたり、何かを翻訳したりしていない唯一のことです。単純な例は非常に歓迎されます(このようなことが存在する場合)。
私はこのシナリオで 'IValueConverter'が' MarkupExtension'よりもうまくいくと思います。 –
どのように見えますか? ' '?後方に少しタイプします。実行時に言語辞書を変更できるようにしたいのであれば、バインディングも必要でしょうか? –
ygoe