このブログエントリのコードを使用して、asp.net mvc 5 にローカライズ用のコードを実装しています。
このコードは、私が投稿したものです:
routes.MapRoute(
Constants.ROUTE_NAME, // Route name
string.Format("{{{0}}}/{{controller}}/{{action}}/{{id}}", Constants.ROUTE_PARAMNAME_LANG), // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
: );
これは、通常の Register_Routes メソッドの前に呼び出されるカスタム Register_Routes メソッドにあります。
ドロップダウンを作成してロケールを変更し、現在の URL の上記のルートに一致するように URL を提供するのは簡単です。つまり、/en-US/Admin から /ro-RO/Admin へ。
しかし、私が得られないのは、特定のロケールを使用してこれらの URL を維持する方法です。
したがって、/en-US/Admin に移動し、カルチャをドロップダウンからルーマニア語に切り替えると、ポストバックされ、/ro-RO/Admin になります。素晴らしいですが、管理ページに /Example へのリンクがあるとします。これを /en-US/Example ではなく /ro-RO/Example にしたいので、文化を意識してオンザフライで生成する必要があるリテラル リンクを使用したくないことは明らかです。
例ではこれを使用します。
public class LocalizationControllerHelper
{
public static void OnBeginExecuteCore(Controller controller)
{
if (controller.RouteData.Values[Constants.ROUTE_PARAMNAME_LANG] != null &&
!string.IsNullOrWhiteSpace(controller.RouteData.Values[Constants.ROUTE_PARAMNAME_LANG].ToString()))
{
// set the culture from the route data (url)
var lang = controller.RouteData.Values[Constants.ROUTE_PARAMNAME_LANG].ToString();
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
}
else
{
// load the culture info from the cookie
var cookie = controller.HttpContext.Request.Cookies[Constants.COOKIE_NAME];
var langHeader = string.Empty;
if (cookie != null)
{
// set the culture by the cookie content
langHeader = cookie.Value;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
}
else
{
// set the culture by the location if not speicified
langHeader = controller.HttpContext.Request.UserLanguages[0];
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
}
// set the lang value into route data
controller.RouteData.Values[Constants.ROUTE_PARAMNAME_LANG] = langHeader;
}
// save the location into cookie
HttpCookie _cookie = new HttpCookie(Constants.COOKIE_NAME, Thread.CurrentThread.CurrentUICulture.Name);
_cookie.Expires = DateTime.Now.AddYears(1);
controller.HttpContext.Response.SetCookie(_cookie);
}
}
これは非常に簡単です。特定の URL のロケールを切り替えると、ルートに従って lang パラメータの URL をチェックし、そうでない場合は Cookie に保存されている値を使用します。
他のローカリゼーション ブログ エントリ、つまり {lang} を最初のパラメータとして同様のルート テーブルを見たことがありますが、問題は、それが指定されていない場合、たとえば「ホーム」は既知のカルチャではないため、リクエストがまったくルーティングされないことです。また、Google は文化を Cookie に保存しないようにアドバイスしているようです: re: SEO。
したがって、MSDN と同じように Url に自分のカルチャが必要です。
そのため、Url に文化を注入するという部分が欠けているようです。カスタム html ヘルパー拡張機能を作成して、現在のカルチャが最初のパラメーターとして埋め込まれたアクション リンクを生成する必要がありますか?
それは私がやろうとしていることですが、サンプルコードがここまで来たのにこれをしないのは、私がそれを悪用しているのではないでしょうか? そして、他のブログ投稿が最初のパラメーターとして :re{lang} と同じ/類似したことを行っているのを見ているが、ユーザーがロケールを切り替えた後にリンクを生成する方法を提供していないため、明らかな何かが欠けているのではないかと考えなければなりません。