我得到了这段代码来检索用户设置的浏览器语言:
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;
我收到了这些错误:
Culture name 'name' is not supported
:从我们的错误日志中发现该名称为x-ns1xs4m8wixnxg
,x-ns1dfk__jmpnx0
等。我不知道这些语言的来源,或者它们是什么,但我认为从移动设备浏览时会检索这些语言。
The name 'name' contains characters that are not valid for a Culture or Region
:还发现该名称为fr; q=1.0
,en;q=1.0
,en_us
,en;q=0.9
等...我在想我应该为每个字符解析它,看它是否是有效的
我已经修改了我的代码来处理这些错误:
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;
但我想知道这些语言的来源,或者如何复制它们?这是为了验证我的代码是否正常工作。感谢。
答案 0 :(得分:2)
您唯一应该注意的是UserLanguages
只会返回相应的HTTP标头。标头值可能包含由;
分隔的其他属性。因此,您应该将该值拆分为;
并获得第一位。
至于x-ns1dfk__jmpnx0
我会说忽略它。在这种情况下,回归到默认语言是完全有效的。
编辑:我把第一部分拿回来。根据{{3}},q参数是语言首选项的值。所以你真正要做的就是拆分分号,然后解析q属性的值(如果不存在则假设为1),然后对它进行排序并取第一个。