Thread.CurrentThread.CurrentUICulture与ViewModels中的Accept-Language

时间:2013-04-25 15:07:08

标签: asp.net asp.net-mvc globalization

全球化:提出此问题的原因是为了更好地了解Thread.CurrentThread.CurrentUICulture在ViewModels和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);
}

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

我还将代码移动到Global.asax,但效果相同。从昨天开始。

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

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

1 个答案:

答案 0 :(得分:3)

为了使用ASP.NET MVC在公共站点上获得全球化,我建议如下:

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

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