全球化:提出此问题的原因是为了更好地了解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
如何运作?它似乎是互联网上大多数示例/文章/博客等使用的内容。答案 0 :(得分:3)
为了使用ASP.NET MVC在公共站点上获得全球化,我建议如下:
OnActionExecuting
太晚了。我建议阅读Alex Adamyan's article关于ASP.NET MVC中的本地化,并实现自定义路由处理程序来初始化UiCulture / Culture。这也适用于Modelbinding(例如,在视图模型类上使用资源和属性时)。关于您的其他问题:由于客户端将它们发送到服务器,因此修改Accept-Language
标头并没有多大意义。即使您可以修改它们,客户也永远不会知道它。