ASP.NET Core で DataAnnotations の多言語対応を行ってみました。
ASP.NET Core の多言語対応の基本は以下の記事を参考にしてください。
環境
- Visual Studio 2017
- ASP.NET Core 2.0
準備
リソースファイルは ViewModel ごとに作成してもよいですが、ここでは DataAnnotations 共通で1つのものを使います。
Startup.cs
の ConfigureServices
で以下のように 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)