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>
実行結果
リソースファイルの値(文字列)が自動的に反映されていることが確認できました。
今回は日本語リソースを用いてローカライゼーションを行いましたが、他のカルチャに対応するリソースを用意することで、他言語へのローカライゼーションを行うこともできます。