在浏览器上检测到无效的语言名称

时间:2011-10-10 03:25:59

标签: c# browser cultureinfo

我得到了这段代码来检索用户设置的浏览器语言:

string cultureName = string.Empty;

try
{
    string[] languages = HttpContext.Current.Request.UserLanguages;
    cultureName = languages[0].ToLowerInvariant().Trim();
}
catch
{
    cultureName = "en-US";
}

System.Globalization.CultureInfo browserCulture = CultureInfo.CreateSpecificCulture(cultureName);
System.Threading.Thread.CurrentThread.CurrentCulture = browserCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = browserCulture;

我收到了这些错误:

  1. Culture name 'name' is not supported:从我们的错误日志中发现该名称为x-ns1xs4m8wixnxgx-ns1dfk__jmpnx0等。我不知道这些语言的来源,或者它们是什么,但我认为从移动设备浏览时会检索这些语言。

  2. The name 'name' contains characters that are not valid for a Culture or Region:还发现该名称为fr; q=1.0en;q=1.0en_usen;q=0.9等...我在想我应该为每个字符解析它,看它是否是有效的

  3. 我已经修改了我的代码来处理这些错误:

    CultureInfo cultureInfo;
    
    try
    {
        string[] languages = HttpContext.Current.Request.UserLanguages;
        string cultureName = languages[0].ToLowerInvariant().Trim();
        cultureInfo = CultureInfo.CreateSpecificCulture(cultureName);
    }
    catch
    {
        cultureInfo = CultureInfo.CreateSpecificCulture("en-US");
    }
    
    System.Globalization.CultureInfo browserCulture = cultureInfo;
    System.Threading.Thread.CurrentThread.CurrentCulture = browserCulture;
    System.Threading.Thread.CurrentThread.CurrentUICulture = browserCulture;
    

    但我想知道这些语言的来源,或者如何复制它们?这是为了验证我的代码是否正常工作。感谢。

1 个答案:

答案 0 :(得分:2)

您唯一应该注意的是UserLanguages只会返回相应的HTTP标头。标头值可能包含由;分隔的其他属性。因此,您应该将该值拆分为;并获得第一位。

至于x-ns1dfk__jmpnx0我会说忽略它。在这种情况下,回归到默认语​​言是完全有效的。

编辑:我把第一部分拿回来。根据{{​​3}},q参数是语言首选项的值。所以你真正要做的就是拆分分号,然后解析q属性的值(如果不存在则假设为1),然后对它进行排序并取第一个。