web-dev-qa-db-ja.com

ASP.NET MVC:Thread.CurrentThread.CurrentUICultureをいつ設定するか?

ASP.NETMVCアプリケーションのローカライズを始めたばかりです。ほとんどの文字列はリソースファイルで定義され、 Matt's Localization Helpers を介して取得されます。その他の文字列はデータベースに保存する必要があります。

私の質問:リクエストパイプラインの早い段階でCurrentUICultureを設定してアプリケーション全体で使用するか、Request.UserLanguages[0]を直接使用する必要があります。必要なときはいつでも?

Application_BeginRequestCurrentUICultureを設定する必要があると考えています。実装は次のようになります。

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var cultureName = HttpContext.Current.Request.UserLanguages[0];
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName);
}

これはCurrentUICultureを設定するのに最適な場所であり、Request.UserLanguages[0]はその情報を取得するのに最適な場所ですか?


更新:

Ariel's 投稿は、これがweb.configを使用してコードなしで定義できることを示しています

<system.web>
  <!--If enableClientBasedCulture is true, ASP.NET can set the UI culture and culture for a Web page automatically, based on the values that are sent by a browser.-->
  <globalization enableClientBasedCulture="true" culture="auto:en-US" uiCulture="auto:en"/>
28
Robert Claypool

HttpModuleを使用したサンプルを次に示します。

http://weblogs.manas.com.ar/smedina/2008/12/17/internationalization-in-aspnet-mvc/

その他のオプションとして、基本Controllerクラスを作成し、そこにローカリゼーションロジックを実装します。または、アクションフィルター属性を使用しますが、すべてのコントローラーに追加するか、このアプローチを基本コントローラークラスと組み合わせる必要があります。

13
Ariel Popovsky

Request.UserLanguages [0]は、ユーザーが見たい言語のヒントにすぎません。ほとんどのユーザーは、ブラウザの言語をどこで変更するかを知りません。

別のポイント:Request.UserLanguages [0]が有効な言語であることを確認しないでください。 nullにすることもできます。 (どのボットがそこにあるのかわからない)

通常、ページには言語チューザーがあります。ユーザーがそこで言語を選択すると、Cookie、セッション、またはURLに保存されます。見た目がきれいだと思うので、URLを使うのが好きです。

ユーザーがページに言語を設定せずにページを表示する場合は、Request.UserLanguages [0]がサポートする言語であるかどうかを確認し、Thread.CurrentThread.CurrentUICultureを設定する必要があります。

フィルタを使用してThread.CurrentThread.CurrentUICultureを設定します。他のフィルターがThread.CurrentThread.CurrentUICultureを使用していない限り、これで問題ありません。それ以外の場合は、フィルターの正しい実行順序を設定する必要があります。

Mattsヘルパーも使用していますが、これまでのところ非常にうまく機能しました。

6
Mathias F