ASP.NETMVCアプリケーションのローカライズを始めたばかりです。ほとんどの文字列はリソースファイルで定義され、 Matt's Localization Helpers を介して取得されます。その他の文字列はデータベースに保存する必要があります。
私の質問:リクエストパイプラインの早い段階でCurrentUICulture
を設定してアプリケーション全体で使用するか、Request.UserLanguages[0]
を直接使用する必要があります。必要なときはいつでも?
今Application_BeginRequestにCurrentUICulture
を設定する必要があると考えています。実装は次のようになります。
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"/>
HttpModuleを使用したサンプルを次に示します。
http://weblogs.manas.com.ar/smedina/2008/12/17/internationalization-in-aspnet-mvc/
その他のオプションとして、基本Controllerクラスを作成し、そこにローカリゼーションロジックを実装します。または、アクションフィルター属性を使用しますが、すべてのコントローラーに追加するか、このアプローチを基本コントローラークラスと組み合わせる必要があります。
Request.UserLanguages [0]は、ユーザーが見たい言語のヒントにすぎません。ほとんどのユーザーは、ブラウザの言語をどこで変更するかを知りません。
別のポイント:Request.UserLanguages [0]が有効な言語であることを確認しないでください。 nullにすることもできます。 (どのボットがそこにあるのかわからない)
通常、ページには言語チューザーがあります。ユーザーがそこで言語を選択すると、Cookie、セッション、またはURLに保存されます。見た目がきれいだと思うので、URLを使うのが好きです。
ユーザーがページに言語を設定せずにページを表示する場合は、Request.UserLanguages [0]がサポートする言語であるかどうかを確認し、Thread.CurrentThread.CurrentUICultureを設定する必要があります。
フィルタを使用してThread.CurrentThread.CurrentUICultureを設定します。他のフィルターがThread.CurrentThread.CurrentUICultureを使用していない限り、これで問題ありません。それ以外の場合は、フィルターの正しい実行順序を設定する必要があります。
Mattsヘルパーも使用していますが、これまでのところ非常にうまく機能しました。