使用自定义mvc路由维护本地化

时间:2013-11-02 03:19:23

标签: asp.net asp.net-mvc localization asp.net-mvc-routing

我正在使用此博客条目中的代码

在asp.net mvc 5中实现一些本地化代码

localization-in-asp.net-mvc

此代码是我发布的:

     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。

但我得到的是如何使用给定的语言环境维护这些Urls。

因此,如果我导航到/ 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);
       }
   }

这非常简单:一旦你切换给定网址的区域设置,它就会根据路由检查lang param的网址,如果没有,则使用存储在cookie中的值。

我在其他本地化博客条目中看到了类似的路由表,即{lang}作为第一个参数但问题是如果没有提供那么请求根本不路由,因为例如“Home”不是已知的文化。此外,Google似乎建议不要将文化存储在cookie中:SEO。

所以我希望我的文化在Url中就像MSDN一样。

所以我似乎错过了一篇文章:将文化注入到Urls中。我应该创建一个自定义的html帮助扩展来生成与作为第一个参数嵌入的当前文化的动作链接吗?

那就是我要做的事情,但是对于示例代码已经到目前为止然后没有这样做,我想知道我是否滥用它?而且因为我看到其他博客文章做了相同/相似的事情:re {lang}作为第一个参数,但是在用户切换区域设置之后没有提供任何生成链接的方法,我不得不怀疑我是否遗漏了一些明显的东西。

1 个答案:

答案 0 :(得分: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会在控制器之前保留当前值(之前为lang)。