ASP.NET Core

ASP.NET Core Razor Pages データアノテーションのローカライゼーション

2021年3月3日

ASP.NET Core Razor Pages でデータアノテーションのローカライゼーションを行ってみましょう。

ローカライゼーションサービスを登録

データアノテーション用のローカライゼーションサービスを登録します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
        // 追加ここから
        .AddDataAnnotationsLocalization(o =>
        {
            o.DataAnnotationLocalizerProvider = (type, factory) =>
            {
                return factory.Create(typeof(SharedResource));
            };
        });// 追加ここまで
}

リソースファイルの準備

リソースファイル(resx)を束ねるための、ダミークラスを用意します。中身は空のままで大丈夫です。

SharedResource.cs

namespace ASPNET_Core_MVC_Localization.Resources
{
    public class SharedResource
    {
    }
}

続いて、リソースファイル(resx)を用意し、名前(キー名)と値をそれぞれ設定します。

SharedResource.ja-jp.resx

モデルクラスの Display 属性

モデルクラスのプロパティに Display 属性を付与します。Name プロパティにはリソースファイルの名前(キー名)と一致するように記述します。

public class User
{
    [Display(Name="Id")]
    public int Id { get; set; }
    [Display(Name = "Password")]
    public string Password { get; set; }
}

ビューの実装

モデルクラスのインスタンスを作成し、ビューにバインドします。

Index.cshtml.cs

public class IndexModel : PageModel
{
    public User User { get; set; }
    private readonly ILogger<IndexModel> _logger;

    public IndexModel(ILogger<IndexModel> logger)
    {
        _logger = logger;
        
        //ダミーデータ
        this.User = new User { Id = 101, Password = "abcde" };
    }

    ...
}

Index.cshtml

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div>
    @Html.LabelFor(model => model.User.Id)
    @Html.DisplayFor(model => model.User.Id)
</div>
<div>
    @Html.LabelFor(model => model.User.Password)
    @Html.DisplayFor(model => model.User.Password)
</div>

実行結果

リソースファイルの値(文字列)が自動的に反映されていることが確認できました。

今回は日本語リソースを用いてローカライゼーションを行いましたが、他のカルチャに対応するリソースを用意することで、他言語へのローカライゼーションを行うこともできます。

-ASP.NET Core