3

グローバリゼーション:この質問をする理由はThread.CurrentThread.CurrentUICulture、ViewModel と Controller のプロパティとエラー メッセージに関連してどのように機能するかをよりよく理解するためです。

OnActionExecutingプロジェクトをセットアップし、Cookie に保存されているユーザーの選択に基づいて言語を設定したコントローラーのメソッドをオーバーライドします。

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);
}

この後Accept-Language、ブラウザから送信される http リクエストのヘッダーを確認すると、ユーザーの変更が反映されず、値は「en-US」のままです。この2つは依存していないことを感じさせます。

コードを Global.asax にも移動しましたが、同じ効果です。昨日から続いています。

このThread.CurrentThread.CurrentUICulture設定はページ上のテキストに影響しますが、エラー メッセージや ViewModel 注釈のプロパティには影響しません。ただしAccept-Language、ブラウザから変更すると、エラー メッセージは適切なリソース ファイルから選択されます。

  • Accept-Languageヘッダーを操作することは可能ですか? - これは読み取り専用のようです
  • 主な質問: どのように機能しThread.CurrentThread.CurrentUICultureますか? インターネット上のほとんどの例/記事/ブログなどが使用しているようです。
4

1 に答える 1

3

ASP.NET MVC を使用してパブリック サイトで適切なグローバリゼーションを実現するには、次のことをお勧めします。

  • cookie ではなく、URL (の一部) を使用してカルチャを判断します。そうしないと、事前に定義された言語でページにリンクすることができず、検索エンジンはコンテンツのインデックス作成に問題が発生します。
  • ブラウザーの設定を使用して、最初の訪問時に適切な言語にリダイレクトできます(たとえば、 URL フラグメントなしでホームページを呼び出す場合: www.mysite.com は、en-US のユーザーの場合、www.mysite.com/en-US/ にリダイレクトします)。ブラウザの設定)
  • OnActionExecutingカルチャの初期化には遅すぎます。ASP.NET MVC のローカリゼーションに関するAlex Adamyan の記事を読み、カスタム ルート ハンドラーを実装して UiCulture/Culture を初期化することをお勧めします。これは、Modelbinding でも正しく機能します (たとえば、ビュー モデル クラスでリソースと属性を使用する場合)。

Accept-Language他の質問については、クライアントがヘッダーをサーバーに送信するため、ヘッダーを変更しても意味がありません。それらを変更できたとしても、クライアントはそれを知ることはありません.

于 2013-04-25T15:25:43.857 に答える