私はwpfアプリケーションを持っていて、それをローカライズし始めています。私が選択したローカリゼーションの戦略は、カスタムMarkupExtensionクラスを作成することでした。
私の会社には、すべての文字列を使用して暗号化されたマップを作成するソリューションがすでに作成されており、各文字列を参照するにはintキーが必要なため、.resファイルは使用しません。そこで、すべての「int」キーを使用して列挙型を作成するカスタムジェネレーターを作成しました(intを使用した静的クラスの場合もありますが、実際には問題ではありません)。
したがって、XAMLファイルでこれらの列挙型キーのそれぞれを参照したいと思います。
<Label Content="{l:Translator {x:Static l:TranslatedEnums.MainWindow_WelcomeMessage}}" />
作成された列挙型はTranslatedEnums
であり、私のトランスレータクラスはTranslator
(dhu)と呼ばれます。
しかし、x:Staticのドキュメントとタイプコンバータのドキュメントを読んだ後、次の質問が頭に浮かびました。
「コンパイル済みxaml」(baml)は、実行時またはコンパイル時に(x:Staticを介して)これらの各タイプを実際に評価しますか?
列挙型の値を静的に参照している理由の1つは、正確な列挙型の文字列キーではなく、その値であるため、アプリケーションのハッキングが少し難しくなるためです。
実行時に解決が行われる場合は、以前のコードを次のように絞り込むことができます。
<Label Content="{l:Translator MainWindow_WelcomeMessage}" />
これには、自分で列挙値を検索する必要がありますが、これはワンライナーです。
TranslatedEnums result;
Enum.TryParse(key, out result);
これによりXamlコードは小さくなりますが(これは良いことです)、キーが存在しない場合はコンパイル時に失敗します(これは問題ではありません)。