我使用代碼從這個博客條目維護本地化使用自定義的MVC路線
這個代碼是實現一些代碼本地化在asp.net mvc的5什麼IM張貼有關:
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方法中。
它很容易創建一個下拉菜單來更改區域設置,以便爲當前網址匹配以上路徑:即從/ en-US/Admin到/ ro-RO/Admin。
但我沒有得到的是如何保持這些Url曾經使用給定的語言環境。
因此,如果我導航到/ en-US/Admin,然後將文化從我的下拉列表切換到羅馬尼亞語,它會回發,我將在/ RO-RO/Admin。很棒,但是說Admin頁面上有一個鏈接到/ Example。我現在希望這是/ ro-RO/Example而不是/ en-US/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);
}
}
這是非常簡單的:一旦切換區域設置爲某個網址,它會檢查根據路線郎PARAM鏈接,如果不是有它使用存儲在cookie中的值。
我在其他本地化博客條目中看到了類似的路由表,即{lang}作爲第一個參數,但問題是如果它沒有提供,那麼請求根本沒有路由,因爲例如「Home」不是已知的文化。此外谷歌似乎建議反對將文化存儲在cookie中:搜索引擎優化。
所以我希望我的文化在Url就像MSDN一樣。
所以它似乎我錯過了一件重新:注入文化到Url。我是否應該創建一個自定義html助手擴展來生成嵌入爲第一參數的當前文化的操作鏈接?
那我要做什麼,但對於示例代碼來到目前爲止,然後不這樣做,我不知道我是否濫用它?因爲我看到其他博客文章做相同/類似的事情:re {lang}作爲第一param,但他們都沒有提供任何方式來在用戶切換語言環境後生成鏈接,我不知道我是否缺少明顯的東西。