我正在使用此博客条目中的代码在 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 的链接。我现在希望它是 /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} 作为第一个参数,但它们都没有提供在用户切换语言环境后生成链接的任何方法,我不得不怀疑我是否遗漏了一些明显的东西。