【问题标题】:Automatic language-culture selection and fallback algorithm in ASP.NETASP.NET 中的自动语言文化选择和回退算法
【发布时间】:2013-04-05 21:14:23
【问题描述】:

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

【问题讨论】:

  • “是否在任何地方指定了 ASP.NET 语言匹配算法?” - 是的,在 MSDN 中它声明“要让 ASP.NET 将 UI 文化和文化设置为在当前浏览器设置,将 UICulture 和 Culture 设置为 auto",正是您所看到的 - 请参阅 msdn.microsoft.com/en-us/library/bz9tc508(v=VS.100).aspx

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


【解决方案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;
}

【讨论】:

  • 我想我必须自己写,正如你所建议的,但你的例子基本上是 ASP.NET 正在做的。我需要做的是查看request.UserLanguages 中的所有 语言,解析出每种语言的质量值,并使用RFC 指定的规则找到与我们支持的语言的最佳匹配.这不是火箭科学,只是令人失望的是该框架不支持标准行为。
  • @wrdieter,我更新了我的答案,只搜索接受的语言。
  • 感谢您的帮助,但它比这更复杂。语言可以(并且经常)具有“质量”规范,用户可以指定通配符子标签,语言标签可以请求特定的脚本样式等。RFC2616 列出了 Accept-Language 标头的规则,而 BCP 47(RFC5646 和RFC4647)描述了更多关于语言标签以及如何匹配它们的信息。写一些在很多时候都有效的东西是很容易的,而且总是把它做好是很痛苦的。我希望框架能为我处理它,但乔指出的文档说它没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2017-06-05
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多