需要有关如何从接受语言请求标头获取首选语言的示例

2022-09-03 16:46:51

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

“接受语言请求标头”字段类似于“接受”,但限制首选作为请求响应的自然语言集。语言标记在第 3.10 节中定义。

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

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

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

任何语言的任何代码片段(Lisp和汇编程序除外)都会有所帮助。

提前非常感谢!


答案 1

溶液:

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));
        }
    }
}

结果:

enter image description here


答案 2

试试这个,它在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('/([a-z]{1,8}(-[a-z]{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_LANGUAGEen-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2

此处的工作示例


推荐