Prismを使用したWPFアプリケーション開発で役に立つと思われる項目を一つのアプリケーションにまとめたものを作りました。今回は、言語設定方法について書いています。
動作環境:Win10, Visual Studio Community 2017, Prism V7.1.0.431, .NET4.5.2, Prism Template Pack, TraceListeners, WPFLocalizeExtension, OxyPlot
- ViewのXAMLにwpflocalizeextensionを追加
- コードでの多言語対応
- ViewのXAMLで使用する時には
- コードで使用する時
- 初期言語をOSの言語にする
- コンボボックスでの言語切り替え
アプリの外観はこんな感じです。

言語設定方法については 以前も書いているので、簡単に説明します。
言語切り替えのライブラリーとして WPFLocalizeExtension をNuGetで組み込みます。
Properties に Resources.resx を作成するのに ResX Manager を機能拡張からインストールして使います。
下記ではCommonModelsプロジェクトのProperties に Resources.ja-JP.resx と Resources.en-US.resx を追加しています。
ViewのXAMLにwpflocalizeextensionを追加
XAML上での多言語テキストの設定に必要です。
xmlns:lex="http://wpflocalizeextension.codeplex.com" lex:LocalizeDictionary.DesignCulture="en-US" lex:ResxLocalizationProvider.DefaultAssembly="CommonModels" lex:ResxLocalizationProvider.DefaultDictionary="Resources"
コードでの多言語対応
CommonModels にコードで多言語文字列を抜き出すメソッドを記述してあります。
public static T GetLocalizedValue<T>(string key)
{
//自プロジェクトのリソースを使う時
//var temp = Assembly.GetCallingAssembly().GetName().Name + ":Resources:" + key;
//任意のプロジェクトのリソースを固定して使う時は直接書けばいい
var temp = "CommonModels:Resources:" + key;
var ret = LocExtension.GetLocalizedValue<T>(temp);
return ret;
}
コードで使用する時
string temp = CommonModules.GetLocalizedValue<string>("TITLE");の様に使用します。
初期言語をOSの言語にする
ViewModel のコンストラクターに以下を記述します。
LocalizeDictionary.Instance.SetCurrentThreadCulture = true;
LocalizeDictionary.Instance.Culture =
new CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name);
//OSの言語ではなく決め打ちしたい時には次のように直接設定
//LocalizeDictionary.Instance.Culture = CultureInfo.GetCultureInfo("ja-JP");
コンボボックスでの言語切り替え
下記のような ObservableCollection を設定して、コンボボックスにバインドします。
private ObservableCollection<CultureInfo> _LangList =
LocalizeDictionary.Instance.MergedAvailableCultures;
/// <summary>
/// コンボボックス用設定されている言語リスト
/// </summary>
public ObservableCollection<CultureInfo> LangList
{
get { return _LangList; }
set { SetProperty(ref _LangList, value); }
}
コンボボックスの SelectedItem に下記のプロパティをバインドします。
言語が選択されると、モジュールのCultureを代えるとともに、
イベントを発行して他のモジュールへ伝えます。
private CultureInfo selectedCulture = LocalizeDictionary.Instance.Culture;
/// <summary>
/// コンボボックスの選択言語
/// 変更された時に言語設定変更とその通知イベントを送る
/// </summary>
public CultureInfo SelectedCulture
{
get { return selectedCulture; }
set { SetProperty(ref selectedCulture, value);
LocalizeDictionary.Instance.Culture = (value);
//他のモジュールに言語が変わったことを通知
_ea.GetEvent<LanguageChangeEvent>().Publish();
}
}
次回は、5. アプリの設定 について記述したいと思います。

