我可能错了,但语言环境设置不是您在代码中更改的内容。这是由浏览器的用户配置决定的。如果您使用的是 HttpClient,您肯定会将 Accept-Language 标头所需的值发送到服务器,但不要期望从您的代码中更改它并使其在源自浏览器的所有请求中有效。
通常的做法是根据用户的语言偏好设置自定义 cookie。默认情况下,您应该使用 Accept-Language 标头上的值填充此 cookie。在 ASP.NET MVC 中有一个设置,因此Thread.CurrentThread.CurrentCulture和 Thread.CurrentThread.CurrentUICulture 都根据用户的浏览器配置进行设置:
<system.web>
<globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto" />
</system.web>
然后,您可以创建一个 ActionFilter 来检查自定义语言 cookie 并相应地设置Thread.CurrentThread.CurrentUICulture。
Thread.CurrentThread.CurrentUICulture 用于确定代码应该使用哪些资源。而 Thread.CurrentThread.CurrentCulture 用于所有数字和日期处理。
这就是动作过滤器的样子:
public class LanguageActionFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var langCookie = GetOrSetLanguageCookie(filterContext.HttpContext);
var culture = new CultureInfo(langCookie.Value);
Thread.CurrentThread.CurrentUICulture = culture;
}
private HttpCookie GetOrSetLanguageCookie(HttpContextBase context)
{
var cookie = context.Request.Cookies[Constants.LanguageCookieName];
if (cookie == null)
{
//set the cookie for first time
cookie = new HttpCookie(Constants.LanguageCookieName, Thread.CurrentThread.CurrentUICulture.Name)
{
Expires = DateTime.Now.AddYears(1),
Path = "/"
};
context.Response.Cookies.Add(cookie);
}
return cookie;
}
}
请注意:
- 即使您的用户选择,让我们在您的界面中说“es-Ar”,并为该用户相应地设置您的 UICulture,如果用户的浏览器配置了为该用户发布的 en-US 日期,则将使用英语约定进行解析,所以浮点数会。
IE:如果浏览器设置为 en_US 的美国用户选择使用您的应用程序的西班牙语界面,则当此用户将信息发布到服务器时,日期如下:
1/5/2015 将在服务器中解析为 1 月 5 日,而不是 5 月 1 日。
像 1,900 这样的数字将在服务器中被解析为 1900 而不是 1.900。
我经过惨痛的教训才学到这个。我在这里有一个从未回答过的问题。
请让我知道,如果你有任何问题。