PrismWPFSample(4)言語設定

Prismを使用したWPFアプリケーション開発で役に立つと思われる項目を一つのアプリケーションにまとめたものを作りました。今回は、言語設定方法について書いています。

動作環境:Win10, Visual Studio Community 2017, Prism V7.1.0.431, .NET4.5.2, Prism Template Pack, TraceListeners, WPFLocalizeExtension, OxyPlot

アプリの外観はこんな感じです。

f:id:feynman911:20190628180802j:plain
 
言語設定方法については 以前も書いているので、簡単に説明します。

feynman.hatenablog.com


言語切り替えのライブラリーとして 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;
}

ViewのXAMLで使用する時には

<Button Content="{lex:Loc TITLE}" />

の様に Resources.resx に設定した名前を記述します。

f:id:feynman911:20190701201009j:plain

f:id:feynman911:20190701201023j:plain

コードで使用する時

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); }
}

f:id:feynman911:20190701220443j:plain

コンボボックスの 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();
    }
}

f:id:feynman911:20190701220726j:plain


次回は、5. アプリの設定 について記述したいと思います。