1

我们正在建立一个支持多种语言的网站。我们创建了支持 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 而不是通用 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 列表中的所有语言以确定最佳语言?还是我必须编写自己的语言匹配代码?

4

1 回答 1

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;
}
于 2013-04-04T21:47:12.573 回答