Skip to content

MS_ASPNETMVCI18N

nishi_74322014 edited this page Aug 21, 2026 · 1 revision

ASP.NET MVCの国際化対応

概要

ASP.NET MVCの国際化対応方法について説明する。

詳細

こちらも、ASP.NET Web Formsの国際化対応と同様に、基本は、
リソースファイルや globalize.js などの jQuery プラグインを使用して、
地道に国際化対応を行う。

MVC では Razor が使える。

なので、通常のリソースファイルを使用すると、
インテリセンスを使用でき便利。

補足(この違いは大きい): 原文が指摘する通り、
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 固有のリソース フォルダを使わないという
同じ結論に至ったことを示している。

Model Binding 時

表示名

国際化されていない表示名を、

[Display(Name = "表示名")]

以下のように国際化する。

[Display(Name = "リソースクラスのプロパティ名", ResourceType = typeof(リソースクラスの型))]

補足(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 にする必要がある
という原文の指摘は、リソースファイル
「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, 国際化対応

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally