0

我正在使用此博客条目中的代码在 asp.net mvc 5 中实现一些本地化代码

本地化-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 方法中。

它很容易创建一个下拉列表来更改区域设置以提供 url 以匹配当前 url 的上述路由:即从 /en-US/Admin 到 /ro-RO/Admin。

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

因此,如果我导航到 /en-US/Admin,然后将文化从我的下拉菜单切换到罗马尼亚语,它将回发,我将在 /ro-RO/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);
       }
   }

这非常简单:一旦您切换给定 url 的语言环境,它会根据路由检查 url 的 lang 参数,如果没有,它会使用存储在 cookie 中的值。

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

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

因此,我似乎错过了一篇关于:将文化注入 Urls。我是否应该创建一个自定义 html 帮助程序扩展来生成将当前文化嵌入为第一个参数的操作链接?

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

4

1 回答 1

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 在控制器之前保存当前值(在此之前的语言)。

于 2013-11-03T07:11:55.977 回答