2011-10-10 57 views
0

检测我得到这个代码,获取由用户设置的浏览器语言:无效的语言名称上的浏览器

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-ns1xs4m8wixnxg,x-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,等等......我想,我应该分析它每个字符,看它是否是一个有效的

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

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; 

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

回答

2

你应该知道的那个UserLanguages只会返回相应的HTTP头。标题值可能具有由;分隔的其他属性。所以你应该在;上分割这个值并得到第一个位。

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

编辑:我拿回第一部分。根据this q参数是语言首选项的值。所以你真正应该做的是分割分号,然后解析q属性的值(如果不存在则假设为1),然后对其进行排序并取第一个。

+0

感谢您的回答,我会在这一个上注明。顺便说一句,除了'fr; q = 1.0'语言,有时我会检索像'en_us'这样的语言,它会生成'error 2',看起来像解析';'不是我的选项 – KaeL

+0

只是为了验证这个:“所以,你应该把这个值分割成_';'_and得到第一个bit._“,我知道这种方式会起作用,但我们有多确定,'language'将始终在第一位?并考虑格式,我会总是检索'头值'''''作为属性分隔符?谢谢:) – KaeL

+1

我们绝对乐观。第一位是实际的标题值。之后的一切都是属性。 –