.NET Frameworkで多言語対応 その2
前回、多言語リソースを作成しましたが、それをどうやって利用するか書いていこうと思います。
Xaml内で使用する
今回はWPFでアプリケーションを作成したので画面はXamlで作成しました。
Xaml内でリソースにアクセスできるようにまずはWindowの属性に名前空間を追加します。
xmlns:prop="clr-namespace:VSS2SVN.Properties"
これでProperties名前空間内のクラスにアクセスできるようになります。
ウィンドウタイトルをリソースを使って表示する場合はこんな書き方になります。
Title="{x:Static prop:Resources.C_WindowTitle}"
言葉にすると「WindowのTitle属性(プロパティ)にpropで定義した名前空間のResourcesクラスのC_WindowTitleプロパティ(スタティック)をセットする」です。
項目のタイトルとかも同じようにリソースを当てはめていきます。
<Label Content="{x:Static prop:Resources.P_WorkingDirectory}" Style="{StaticResource title}" />
あとは実行したときの言語設定にしたがって表示されます、とても簡単です。
モデルの属性(アノテーション)で使用する
WPFで実装しているので画面の項目やボタンに対応するViewModelを作っています。そのプロパティにもリソースを用いて属性を付与しています。
[Display(Name = "P_WorkingDirectory", ResourceType = typeof(Resources))] public ReactiveProperty<string> WorkingDirectory { get; }
言葉にすると「WorkingDirecotryプロパティに表示名属性を付与、その名前はResourcesクラスのP_WorkingDirectoryを当てはめる」です。
メソッド内の記述で使用する
メソッド内部で使用するときは単純に直接記述するのが一番だと思います。
string directory = "c:\users\aaaa\appdata\local\temp"; string message = string.Format(Resources.C_FoundVSSProjectFolder, directory);
リソース文字列に整形が必要ならばFormatメソッドで整形し使う、そうじゃないならそのまま使う。これだけです。
文字列をリソースに追いやると、いろいろな場面で似たような文字列定数を宣言しなくて良くなるのが一番の利点ですね(当たり前)。