MVC 4 で現在のカルチャまたはブラウザー ロケールを取得するにはどうすればよいですか。
HttpContext と HttpRequest から取得するサンプルをいくつか見つけましたが、これは MVC 4 では機能しません。
MVC 4でどのようにしますか?
MVC 4 で現在のカルチャまたはブラウザー ロケールを取得するにはどうすればよいですか。
HttpContext と HttpRequest から取得するサンプルをいくつか見つけましたが、これは MVC 4 では機能しません。
MVC 4でどのようにしますか?
HttpContext と HttpRequest から取得するサンプルをいくつか見つけましたが、これは MVC 4 では機能しません。
問題の説明が機能しないのが大好きです!!! 仕事にお金を払いたくない整備士に、「私の車は動かない。自分で修理できるようにどこが悪いのか教えてくれ」と言うようなものだ。
とにかく、コントローラー アクションで HttpRequest をまだ取得しています。UserLanguages
プロパティを見てください:
public ActionResult SomeAction()
{
string[] userLanguages = Request.UserLanguages;
...
}
Accept-Languages
注意: ユーザー エージェントがリクエスト ヘッダーを送信しなかった場合、このプロパティの値は null になります。そのため、値にアクセスする前に null でないかどうかを確認して、NRE を取得しないようにしてください。
NuGetGallery で次のコードを使用します
/// <summary>
/// Extensions on <see cref="HttpRequest"/> and <see cref="HttpRequestBase"/>
/// </summary>
public static class HttpRequestExtensions
{
/// <summary>
/// Retrieve culture of client.
/// </summary>
/// <param name="request">Current request.</param>
/// <returns><c>null</c> if not to be determined.</returns>
public static CultureInfo DetermineClientCulture(this HttpRequest request)
{
return DetermineClientCulture(new HttpRequestWrapper(request));
}
/// <summary>
/// Retrieve culture of client.
/// </summary>
/// <param name="request">Current request.</param>
/// <returns><c>null</c> if not to be determined.</returns>
public static CultureInfo DetermineClientCulture(this HttpRequestBase request)
{
if (request == null)
{
return null;
}
string[] languages = request.UserLanguages;
if (languages == null)
{
return null;
}
//first try parse of full langcodes. Stop with first success.
foreach (string language in languages)
{
string lang = language.ToLowerInvariant().Trim();
try
{
return CultureInfo.GetCultureInfo(lang);
}
catch (CultureNotFoundException)
{
}
}
//try parse again with first 2 chars. Stop with first success.
foreach (string language in languages)
{
string lang = language.ToLowerInvariant().Trim();
if (lang.Length > 2)
{
string lang2 = lang.Substring(0, 2);
try
{
return CultureInfo.GetCultureInfo(lang2);
}
catch (CultureNotFoundException)
{
}
}
}
return null;
}
}
利用方法:
/// <summary>
/// Called before the action method is invoked.
/// </summary>
/// <param name="filterContext">Information about the current request and action.</param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.IsChildAction)
{
//no need to do the hassle for a child action
//set the culture from the request headers
var clientCulture = Request.DetermineClientCulture();
if (clientCulture != null)
{
//and/or CurrentUICulture
Thread.CurrentThread.CurrentCulture = clientCulture;
}
}
base.OnActionExecuting(filterContext);
}