モデルのエラー メッセージをスペイン語で表示したいのですが、それらの文字列をリソース ファイルに定義しました。カミソリ構文を使用してページ上の他の文字列に対して同じことを行いましたが、ViewModel アノテーションからのものは選択されていません。
実際にはデフォルト値の英語を選択しています。だから私の推測では、言語/文化が検出されなかった可能性がありますが、ページ上の他の文字列はスペイン語で表示されます
//Spanish: El campo {0} se requiere
//English: The {0} field is required <--- this comes out always irrespective of set language
[Required(ErrorMessageResourceName = "ErrorMessage_Required",
ErrorMessageResourceType = typeof(GlobalResources.Resources))]
[Display(Name = "CardNumber", ResourceType = typeof(GlobalResources.Resources) )]
public string CardNumber { get; set; }
コントローラーで言語を設定します
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
HttpCookie cookie = Request.Cookies["lang"];
string lang = cookie != null ? cookie.Value : "en-US";
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
}
カルチャ設定を ViewModel に拡張するにはどうすればよいですか?
更新 同様の投稿: MVC3 グローバリゼーション: モデル バインディングの前にグローバル フィルターが必要
更新
ブラウザの設定で優先言語を変更すると、機能しました。これは、モデル アトリビュートが の影響を受けないこの設定を使用していることを意味しますSystem.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
。これを実現する方法はありますか?- まだ探している....
更新:コードを移動するApplication_AcquireRequestState
と解決するようです。
protected void Application_AcquireRequestState()
{
HttpCookie cookie = Request.Cookies["lang"];
string lang = cookie != null ? cookie.Value : "en-US";
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
}
私が得た説明は、この質問に投稿されたリンクにもありますが、メソッドが呼び出される前にバインディングが既に発生していたため、モデルがコントローラーのオーバーライドされたメソッドで設定されているカルチャを利用するには遅すぎたということです。このリンクは役に立ちました