ずいぶん久しぶりだけど、WPFの入力値検証ネタ。
以前↓みたいなのをやりましたが、 このDataAnnotationsを使ったバリデーションを行う際に、エラーメッセージのローカライズをしてみました。
アプリのローカライズ
まずは、アプリ自体のローカライズ対応をします。
WPFアプリのローカライズ手順などは、以下の記事を参考に、resxファイルを各言語ごとに用意しておきます。
(今回は、動的な言語切替などはしないので、その辺は省略)
ここでは、デフォルトの英語表示用と、日本語表示用のja-JPのリソースだけこんな風に作成しました。
それぞれ、以下のような内容を設定します。
以前のメッセージ設定方法
以前のサンプルでは、↓のようにErrorMessageプロパティを使って、メッセージを直接設定していました。
privatestring inputString; [Required(ErrorMessage = "何か入力してください")] [StringLength(10, ErrorMessage = "10文字以内で入力してください")] [RegularExpression("[a-z]+", ErrorMessage = "a-zの文字列を入力してください。")] publicstring InputString { get { return inputString; } set { this.SetProperty(refthis.inputString, value); } }
ここに、先ほど作成したローカライズ対応のリソースの内容を設定してみます。
ローカライズに対応したメッセージ設定方法
resxファイルで定義したリソースを使うために、ErrorMessageではなく、ErrorMessageResourceName
とErrorMessageResourceType
プロパティでエラー時のメッセージ設定を行います。
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!!
日本語環境では今まで通り、以下のような表示になります。
別言語での表示確認
これで、OSの表示言語に合わせてローカライズされた文字列が表示されるようになります。
わざわざOSの表示言語切り替えるのメンドイ・・・、って時には、Appクラスのコンストラクタなどで、以下のようにリソースの言語設定を切り替えるコードを追加して確認できます。
public App() { WpfApplication1.Properties.Resources.Culture = CultureInfo.GetCultureInfo("en-US"); }
ただし、この方法で切り替えたときは、テキストのフォントなどまでは切り替わらないので、厳密には別言語OSの環境での表示とは若干異なったものとなるので注意。
ちゃんと別言語OSの環境と同じ表示にしたいときは、OSの設定で表示言語を切り替えましょう。