我们正在构建支持多种语言的网站。我们创建了支持fr,de和en-US的资源,默认使用en-US。我添加了:
<system.web>
<globalization
uiCulture="auto" culture="auto"
requestEncoding="utf-8"
responseEncoding="utf-8"
enableClientBasedCulture="true" />
...
</system.web>
到我的web.config
文件。如果我在IE或Chrome中将语言设置为fr,de或en-US,我会得到预期的语言。如果我将语言设置为ar-EG,我也会按照预期获得en-US。
如果我将我的语言设置为fr-FR,但是在接受的语言列表中不包含fr,则网站会返回fr页面,即使我告诉浏览器我更喜欢接受de to generalized fr(而不是FR-FR)。这似乎与RFC相反,但并不奇怪,因为IE默认使用法国的fr-FR和德国的de-DE,并且不适用于不会自动推广文化的网站。
但是,如果我告诉浏览器我接受ar-EG和fr,则网站默认为en-US - 即使Accept-Language标头指定我将接受具有更高优先级的fr。我在浏览器中捕获了请求标题,以确保我要求的所有语言都以正确的优先级发送。
似乎ASP.NET只查看Accept-Language标头中指定的第一种语言。是否在任何地方指定了ASP.NET语言匹配算法?有没有办法指定ASP.NET / MVC应该检查Accept-Language列表中的所有语言以确定最佳语言?或者我是否必须编写自己的语言匹配代码?
答案 0 :(得分:1)
好吧,正如其他人没有回答的那样,我提出了我的建议。肯定有一个更好或至少更美丽的解决方案,但对我的需求来说已经足够了。只需在Application_AcquireRequestState()
事件中设置文化:
protected void Application_AcquireRequestState()
{
var language = "whatever"; // default fall back
if (request.UserLanguages.Length > 0)
{
var acceptedLangs = new List<string> {"de", "en"};
var langs = request.UserLanguages.Where(l => acceptedLangs.Any(al => al.Equals(l.Substring(0, 2))));
language = langs.FirstOrDefault();
}
// TODO: may be better inside a try..catch block
var culture = new CultureInfo(language);
Thread.CurrentThread.CurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = culture;
}