2013-11-02 68 views
0

我使用代碼從這個博客條目維護本地化使用自定義的MVC路線

localization-in-asp.net-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,但他們都沒有提供任何方式來在用戶切換語言環境後生成鏈接,我不知道我是否缺少明顯的東西。

回答

0

只需使用ActionLink助手,並自動包含URL中的當前語言。

實例:

Current URL: http://localhost/en-US 
ActionLink: @Html.ActionLink("Create Account", "Register", "Account") 
Generated link: http://localhost/en-US/Account/Register 

Current URL: http://localhost:12751/es-MX/Account/Login 
ActionLink: @Html.ActionLink("Create Account", "Register", "Account") 
Generated link: http://localhost/es-MX/Account/Register 

ActionLink的控制器之前保持(在此之前郎)的當前值。