需要一个关于如何从Accept-Language请求标头中获取首选语言的示例

我需要一个代码示例或库来解析Accept-Language标头并返回我的首选语言。 RFC2616声明:

Accept-Language请求标头字段类似于Accept,但限制首选的自然语言集作为对请求的响应。 语言标签在3.10节中定义。

  Accept-Language = "Accept-Language" ":" 1#( language-range [ ";" "q" "=" qvalue ] ) language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" ) 

可以给每个语言范围赋予相关的质量值,该值表示用户对该范围指定的语言的偏好的估计。 质量值默认为“q = 1”。

进一步的阅读表明,有太多的“可选”,“应该”,“可能”和其他转动的言论阻止我重新发明轮子 – 我想知道的是用户喜欢的语言,任何浏览器都会回答这个问题十亿次一天。

任何语言的任何代码片段(请使用Lisp和Assembler除外)都会有所帮助。

提前谢谢了!

尝试这个,它在PHP中,但使用相同的正则表达式,我敢肯定它适用于任何语言:

 $langs = array(); // used to store values if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // break up string into pieces (languages and q factors) preg_match_all('/([az]{1,8}(-[az]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); if (count($lang_parse[1])) { // create a list like "en" => 0.8 $langs = array_combine($lang_parse[1], $lang_parse[4]); // set default to 1 for any without q factor foreach ($langs as $lang => $val) { if ($val === '') $langs[$lang] = 1; } // sort list based on value arsort($langs, SORT_NUMERIC); } } 

首先使用首选语言生成排序数组:

 Array ( [en-ca] => 1 [en] => 0.8 [en-us] => 0.6 [de-de] => 0.4 [de] => 0.2 ) 

例如ACCEPT_LANGUAGE标题: en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2

这里的工作示例

解:

 namespace ConsoleApplication { using System; using System.Linq; using System.Net.Http.Headers; class Program { static void Main(string[] args) { string header = "en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2"; var languages = header.Split(',') .Select(StringWithQualityHeaderValue.Parse) .OrderByDescending(s => s.Quality.GetValueOrDefault(1)); } } } 

结果:

在此处输入图像描述