読者です 読者をやめる 読者になる 読者になる

SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

WPFでの入力値検証・その9 ~エラー表示のローカライズ~

WPF C#

ずいぶん久しぶりだけど、WPFの入力値検証ネタ。

以前↓みたいなのをやりましたが、 このDataAnnotationsを使ったバリデーションを行う際に、エラーメッセージのローカライズをしてみました。

アプリのローカライズ

まずは、アプリ自体のローカライズ対応をします。
WPFアプリのローカライズ手順などは、以下の記事を参考に、resxファイルを各言語ごとに用意しておきます。
(今回は、動的な言語切替などはしないので、その辺は省略)

ここでは、デフォルトの英語表示用と、日本語表示用のja-JPのリソースだけこんな風に作成しました。
f:id:minami_SC:20160612144943p:plain

それぞれ、以下のような内容を設定します。
f:id:minami_SC:20160612144951p:plain
f:id:minami_SC:20160612144958p:plain

以前のメッセージ設定方法

以前のサンプルでは、↓のようにErrorMessageプロパティを使って、メッセージを直接設定していました。

        private string inputString;
        [Required(ErrorMessage = "何か入力してください")]
        [StringLength(10, ErrorMessage = "10文字以内で入力してください")]
        [RegularExpression("[a-z]+", ErrorMessage = "a-zの文字列を入力してください。")]
        public string InputString
        {
            get { return inputString; }
            set { this.SetProperty(ref this.inputString, value); }
        }

ここに、先ほど作成したローカライズ対応のリソースの内容を設定してみます。

ローカライズに対応したメッセージ設定方法

resxファイルで定義したリソースを使うために、ErrorMessageではなく、
ErrorMessageResourceNameErrorMessageResourceTypeプロパティでエラー時のメッセージ設定を行います。

    class MainWindowViewModel : ValidateableBase
    {
        private string inputString;
        [Required(                   ErrorMessageResourceName = "EmptyMessage",           ErrorMessageResourceType = typeof(Properties.Resources))]
        [StringLength(10,            ErrorMessageResourceName = "LengthOverMessage",      ErrorMessageResourceType = typeof(Properties.Resources))]
        [RegularExpression("[a-z]+", ErrorMessageResourceName = "TextTypeInvalidMessage", ErrorMessageResourceType = typeof(Properties.Resources))]
        public string InputString
        {
            get { return inputString; }
            set { this.SetProperty(ref this.inputString, value); }
        }

        public MainWindowViewModel()
        {
            this.InputString = string.Empty;
        }
    }

これだけでOK!!

日本語環境では今まで通り、以下のような表示になります。
f:id:minami_SC:20160612145008p:plain

別言語での表示確認

これで、OSの表示言語に合わせてローカライズされた文字列が表示されるようになります。
わざわざOSの表示言語切り替えるのメンドイ・・・、って時には、Appクラスのコンストラクタなどで、以下のようにリソースの言語設定を切り替えるコードを追加して確認できます。

        public App()
        {
            WpfApplication1.Properties.Resources.Culture = CultureInfo.GetCultureInfo("en-US");
        }

f:id:minami_SC:20160612145017p:plain

ただし、この方法で切り替えたときは、テキストのフォントなどまでは切り替わらないので、厳密には別言語OSの環境での表示とは若干異なったものとなるので注意。
ちゃんと別言語OSの環境と同じ表示にしたいときは、OSの設定で表示言語を切り替えましょう。