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

时间:2010-07-27 16:52:47

标签: asp.net-mvc

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

我们假设我们的网站支持2种语言,英语(en)和德语(de)。我们还假设我们要忽略locale(区域)(至少在服务器端,所以我们只知道我们支持“en”和“de”,所以我们在应用程序代码,配置文件或其他地方指定了) 。所以我们不关心用户是来自美国还是英国。

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

我遇到的问题是如果我这样做

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

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

我们可能会收到像

这样的列表
  • en,(例如Firefox有这个), - en-US, - en-UK。

  • en-US, - en-UK。

  • en, - de, - it-IT。

  • de, - en-US, - en。

我想问的是:

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

  2. 我们是否必须考虑订单,或者您只是忽视它?

  3. 我是否过于复杂?问题是IE和Firefox(以及其他)在区域设置中有不同的字符串(例如,Firefox中的“sl”和IE8中的“sl-SI”)

  4. 我只想将所有不存在哪种语言的访问者用英语和其他所有语言指向他们适当的语言(无视他们的位置),你可能会想到如果我们支持葡萄牙语(pt)而我们的访客来自葡萄牙即使比赛不是100%完美(我们宁愿将它们重定向到葡萄牙语版本而不是英文版本),我们也会将它们重定向到该网站的葡萄牙语版本。

1 个答案:

答案 0 :(得分:1)

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

  

在这里使用比较字符串是否可以(检查“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"]怎么样? RFC 2616的Section 14.4 Accept-Language。使用它可能会涉及更多的工作,但是它似乎可以保留更多有价值的信息。

  

我们是否必须考虑订单,或者您只是忽视它?

UserLanguages数组按首选项排序(MSDN)。话虽如此,我认为每个浏览器都有自己特定的方式来创建语言字符串(我正在修正,但我认为FF4正在考虑删除这部分用户代理字符串)。您可以检查每种语言,并使用上述方法确定何时找到正确的语言。

  

我是否过于复杂?问题是IE和Firefox(以及其他)在区域设置中有不同的字符串(例如,Firefox中的“sl”和IE8中的“sl-SI”)

对我来说,本地化很棘手。我建议您仔细阅读RFC 1766RFC 2616 (HTTP Protocol, Section 3.10

我希望这会有所帮助。