代码之家  ›  专栏  ›  技术社区  ›  Martijn

如何在ASP.NET MVC应用程序中本地化内容?

  •  0
  • Martijn  · 技术社区  · 5 年前

    这是一个关于设置我们网站的语言和文化设置的问题,关于我们从访问该网站的用户那里读取的设置。

    假设我们的网站支持两种语言,英语(en)和德语(de)。我们还假设我们要忽略区域设置(至少在服务器端,所以我们只知道我们支持“en”和“de”,所以我们在应用程序代码、配置文件或某处elese中指定了它)。所以我们不在乎用户是来自美国还是英国。

    我们正在做的是将“en”或“de”与用户浏览器定义的语言/区域性中可能的匹配进行匹配。

    我现在的问题是如果我这样做的话

            /* Gets Languages from Browser */
            IList<string> BrowserLanguages = filterContext.RequestContext
                .HttpContext
                .Request
                .UserLanguages;
    

    我们得到各种各样的结果。

    我们可能会收到这样的清单

    • en(例如firefox有这个),-en-us,-en-uk。

    • 美国,英国。

    • 恩,-德,-它。

    • 德,-恩,我们,-恩。

    我想问的是:

    1. 是否可以在此处使用比较字符串(检查“en”是否作为子字符串存在)?见样本清单2

    2. 我们是必须考虑订单,还是你会无视订单?

    3. 我是不是太复杂了?但问题是,IE和火狐(以及其他浏览器)对于区域设置有不同的字符串(例如,火狐中的“sl”和IE8中的“sl-si”)。

    我只想引导所有语言不存在的访问者使用英语,而所有其他访问者使用适当的语言(忽略他们的位置),您可能会认为,如果我们支持葡萄牙语(pt),并且我们的访问者来自葡萄牙和巴西,我们会将他们重定向到该网站的葡萄牙语版本,即使匹配不是100%的性能。CT(我们更愿意将它们重定向到葡萄牙语版本,而不是英语版本)。

    1 回复  |  直到 13 年前
        1
  •  1
  •   Ahmad    14 年前

    有趣的问题。让我试着回答…

    是否可以在此处使用比较字符串(检查“en”是否作为子字符串存在)?

    你可以这样做。注意,我只是提供了一种不使用字符串的方法,但是,我认为在这种情况下,子字符串方法也可以工作,因为它更简单。

    CultureInfo enCulture = new CultureInfo("en"); // use "de"
    var langPref = Request.UserLanguages[0];
    var userCulture = CultureInfo.GetCultureInfo(langPref);
    var baseCulture = CultureInfo.GetCultureInfo(cult.TwoLetterISOLanguageName); // get the base culture
    var isSame = baseCulture.Equals(enCulture);
    

    用这个怎么样 Headers["Accept-Language"] . Section 14.4 Accept-Language RFC 2616。使用它可能会涉及到更多的工作,但目前看来,它可以保存更多有价值的信息。

    我们是必须考虑订单,还是你会无视订单?

    这个 UserLanguages 数组按首选项排序( MSDN )我已经说过了,我假设每个浏览器都有自己的特定方法来创建语言字符串(我接受纠正,但我认为ff4正在考虑删除用户代理字符串的这一部分)。您可以检查每种语言,并使用上面描述的方法决定何时找到正确的语言。

    我是不是太复杂了?但问题是,IE和火狐(以及其他浏览器)对于区域设置有不同的字符串(例如,火狐中的“sl”和IE8中的“sl-si”)。

    对我来说,本地化很棘手。我建议你通读一下 RFC 1766 RFC 2616 (HTTP Protocol, Section 3.10 .

    我希望这有帮助。