プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2017/12/14

ASP.NET Core で DataAnnotations の多言語対応を行う

event_note2017/12/14 0:22

ASP.NET Core で DataAnnotations の多言語対応を行ってみました。

ASP.NET Core の多言語対応の基本は以下の記事を参考にしてください。

環境

  • Visual Studio 2017
  • ASP.NET Core 2.0

準備

リソースファイルは ViewModel ごとに作成してもよいですが、ここでは DataAnnotations 共通で1つのものを使います。

Startup.csConfigureServices で以下のように AddDataAnnotationsLocalization を追加します。

services.AddMvc(opts =>
    .AddViewLocalization(
        LanguageViewLocationExpanderFormat.Suffix,
        opts => { opts.ResourcesPath = "Resources"; })
    .AddDataAnnotationsLocalization(options =>
    {
        // DataAnnotation を使ったときのメッセージは SharedResource に集約する
        options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(SharedResource));
    });

ここでは DataAnnotations は SharedResource という共通のリソースファイルを使用するように設定しています。

Attributes の追加

ViewModel に対して以下のように Attribute を追加します。

public class Account
{
    [Required(ErrorMessage = "RequiredUsername")]
    [Display(Name = "Username")]
    public string Username { get; set; }

    [Required(ErrorMessage = "RequiredPassword")]
    [Display(Name = "Password")]
    public string Password { get; set; }
}

リソースファイル

共通で使用するリソースファイル SharedResource を作成します。
リソースファイルの作成自体は以下を参考にしてください。

リソースファイルを作成したら、以下のような感じで名前と値をリソースファイルに定義します。

SharedResource.resx

名前
RequiredUsername The Username field is required.
RequiredPassword The Passowrd field is required.
Username Username
Password Password

SharedResource.ja.resx

名前
RequiredUsername ユーザー名を入力してください。
RequiredPassword パスワードを入力してください。
Username ユーザー名
Password パスワード

以上で DataAnnotations による Validation を行うと、Required 属性の ErrorMessage で指定した名前をキーとして、ローカライズされたメッセージが表示されます。
Display 属性で指定した値は、例えば HTML ヘルパーを使い、View で以下のように記述すると、ローカライズされたメッセージが表示されます。

@Html.DisplayNameFor(model => model.Username)

参考 URL