-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ASPNETMVCI18N
- 戻る(ASP.NET の 国際化対応)
ASP.NET MVCの国際化対応方法について説明する。
こちらも、ASP.NET Web Formsの国際化対応と同様に、基本は、
リソースファイルや globalize.js などの jQuery プラグインを使用して、
地道に国際化対応を行う。
なので、通常のリソースファイルを使用すると、
インテリセンスを使用でき便利。
- ASP.NET MVC におけるテキストの多言語対応 再考
http://devadjust.exblog.jp/21514252/
補足(この違いは大きい): 原文が指摘する通り、
Razor では C# のコードがそのまま書けるため、
リソースファイル の
Designer.csが生成する型付きプロパティを直接使える。@* Razor:型付き。タイプミスはコンパイル エラーになる *@ <h1>@Resources.Messages.Greeting</h1> @* Web Forms:文字列キー。タイプミスは実行時まで分からない *@ <asp:Label runat="server" Text="<%$ Resources: Messages, Greeting %>" />このため、ASP.NET Web Formsの国際化対応 で述べた
App_GlobalResources/App_LocalResourcesを使う必要が無い。【MVC での推奨】 通常の .resx をプロジェクト内(例: /Resources)に置く → 動的コンパイルされない(起動が速い) → 別アセンブリからも参照できる → インテリセンスが効く → 単体テストからも使える原文が参照している記事の「再考」という表題も、
ASP.NET 固有のリソース フォルダを使わないという
同じ結論に至ったことを示している。
国際化されていない表示名を、
[Display(Name = "表示名")]以下のように国際化する。
[Display(Name = "リソースクラスのプロパティ名", ResourceType = typeof(リソースクラスの型))]- 参考
- ASP.NET MVC 4でViewModelのDisplayName(ラベル)を多言語化する - 虎塚
http://d.hatena.ne.jp/torazuka/20131206/displayname
- ASP.NET MVC 4でViewModelのDisplayName(ラベル)を多言語化する - 虎塚
補足(
DisplayNameではなくDisplayを使う): 似た属性が
2 つあるが、国際化できるのはDisplayの方だけである。
属性 ResourceType備考 [DisplayName("...")]無し 国際化できない [Display(Name = ..., ResourceType = ...)]あり こちらを使う public class UserVm { [Display(Name = "UserName", ResourceType = typeof(Resources.Labels))] public string UserName { get; set; } }@Html.LabelFor(m => m.UserName) @* → リソースから引かれる *@
ResourceTypeに指定するリソースはPublicにする必要がある
(次節の注意点と同じ理由)。
-
標準のエラーメッセージ(明示的にメッセージを指定しない場合)
- → 設定不要
-
カスタムエラーメッセージ(明示的にメッセージを指定する場合)
-
→ アノテーションに、以下のプロパティを設定する。
- ErrorMessageResourceName = "リソースクラスのプロパティ名"
- ErrorMessageResourceType = typeof(リソースクラスの型)
-
注意
- リソースはアクセス修飾子を「Public」にしておかないと、
リソースが見つからないという実行時エラーが発生するので注意。 - これは、当該プロジェクトのアセンブリから直接ではなく、
ValidationAttribute クラスが格納される
System.ComponentModel.DataAnnotations.dll 経由での取得になるため。 - ただ、手動で都度で 'internal' から 'public' へ書き換えるのは大変なので、
カスタムツールを ResXFileCodeGenerator から、
PublicResXFileCodeGenerator に変更すると良い。 - c# - Visual Studio - Resx File default 'internal' to 'public' - Stack Overflow
http://stackoverflow.com/questions/4274311/visual-studio-resx-file-default-internal-to-public
- リソースはアクセス修飾子を「Public」にしておかないと、
-
補足(この注意点は重要): リソースを
Publicにする必要がある
という原文の指摘は、リソースファイル の
「Internal、Public の選定基準」と対応する。検証属性は System.ComponentModel.DataAnnotations.dll の中で リフレクション([.NET の Reflection](MS_DotNetReflection))により リソース クラスのプロパティを取得する → 別アセンブリからのアクセス → internal だと見えない → 実行時エラーカスタム ツールの変更手順(原文の推奨):
.resx のプロパティ ウィンドウ カスタム ツール: ResXFileCodeGenerator → PublicResXFileCodeGeneratorリソース エディター上部の「アクセス修飾子」ドロップダウンで
Publicを選ぶと、同じことが GUI から行える。標準のエラーメッセージが「設定不要」で国際化される理由も
補っておくと、.NET Framework / .NET のリソースが
各言語版を持っているためである
(「The {0} field is required.」→「{0} フィールドが必要です。」)。
CurrentUICultureに従って自動的に切り替わる。
補足(ASP.NET Core での書き方/最新化): 属性の使い方は
そのまま通用するが、
IStringLocalizerを使う方式が追加されている。// Program.cs builder.Services.AddControllersWithViews() .AddViewLocalization() .AddDataAnnotationsLocalization(o => o.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(SharedResource)));// ResourceType を書かなくても、共有リソースから引かれる public class UserVm { [Display(Name = "UserName")] [Required(ErrorMessage = "UserNameRequired")] public string UserName { get; set; } }
ASP.NET MVC 5 ASP.NET Core 指定方法 属性ごとに ResourceTypeを書くDataAnnotationLocalizerProviderで一括アクセス修飾子 Public必須不要( IStringLocalizer経由)キーが無い場合 実行時エラー キー名がそのまま表示される リソースの場所 .resx(型付き).resx(キーは文字列)
ResourceTypeを毎回書かなくてよくなった点、
Public問題が消えた点が実務上の改善である。一方で、型付きプロパティによるコンパイル時チェックは失われる
(キーが文字列になる)ため、
未翻訳キーの検出は別途仕組みを用意する必要がある。
補足(クライアント側検証のメッセージ): サーバ側で
国際化しても、クライアント側検証のメッセージは別である。サーバ側属性(Required 等) → data-val-required 属性としてエラー メッセージが HTML に出力される → クライアント側検証もそのメッセージを使う = サーバ側を国際化すれば、クライアント側も追随する ただし、jquery.validate の「既定メッセージ」 (型不一致など、属性由来でないもの)は英語のまま → jquery.validate の localization ファイルを読み込む<script src="~/lib/jquery-validation/dist/localization/messages_ja.js"></script>詳細は ASP.NET MVCの利用方法 の
「控えめな JavaScript」の節を参照。
Tags: 移行, .NET開発, ASP.NET, 国際化対応
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。