3

全球化:问这个问题的原因是为了更好地理解Thread.CurrentThread.CurrentUICultureViewModels 和 Controllers 中的属性和错误消息是如何工作的

我已经设置了我的项目并覆盖OnActionExecuting了我的控制器的方法我已经根据存储在 cookie 中的用户选择设置了语言。

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);

    HttpCookie cookie = Request.Cookies["lang"];

    string lang = cookie != null ? cookie.Value : "en-US";
    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
}

现在,在此之后,检查Accept-Language浏览器发送的 http 请求中的标头,用户更改没有反映 - 值仍然是“en-US”。这让我觉得这两者并不依赖。

我也将代码移至 Global.asax,但效果相同。从昨天就开始了。

Thread.CurrentThread.CurrentUICulture设置会影响页面上的文本,但不会影响 ViewModel 注释中的错误消息或属性。但是当Accept-Language从浏览器更改时,错误消息会从正确的资源文件中挑选出来。

  • 是否可以操纵Accept-Language标题?- 这似乎是只读的
  • 主要问题:如何Thread.CurrentThread.CurrentUICulture工作?这似乎是互联网上大多数示例/文章/博客等使用的。
4

1 回答 1

3

为了使用 ASP.NET MVC 在公共站点上正确实现全球化,我建议以下内容:

  • 使用 URL 的(片段)来确定文化,而不是 cookie。否则将无法链接到预定义语言的页面,搜索引擎将无法索引您的内容。
  • 浏览器首选项可用于在首次访问时重定向到适当的语言(例如,在没有任何 URL 片段的情况下调用主页时:www.mysite.com 重定向到 www.mysite.com/en-US/ 对于具有 en-US 的用户浏览器中的首选项)
  • OnActionExecuting文化初始化为时已。我建议阅读Alex Adamyan关于 ASP.NET MVC 本地化的文章,并实现自定义路由处理程序来初始化 UiCulture/Culture。这也适用于模型绑定(例如,在视图模型类上使用资源和属性时)。

至于您的其他问题:修改标头实际上没有意义,Accept-Language因为客户端将它们发送到服务器。即使您可以修改它们,客户也永远不会知道。

于 2013-04-25T15:25:43.857 回答