【问题标题】:Need an example on how to get preferred language from Accept-Language request header需要一个关于如何从 Accept-Language 请求标头中获取首选语言的示例
【发布时间】:2012-04-13 05:55:50
【问题描述】:

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

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

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

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

进一步阅读表明,有太多的“可选”、“应该”、“可能”和其他语言轮转使我无法重新发明轮子——我只想知道用户喜欢什么语言,任何浏览器都会回答这个问题每天问十亿次。

任何语言的任何代码 sn-p(请除了 Lisp 和 Assembler)都会有所帮助。

非常感谢!

【问题讨论】:

  • 嗯!对 Lisp 有意见吗? :)
  • 用逗号分隔(如果可用,前面还有空格),然后询问每个标记。语言是第一部分,然后(如果存在)一个 q-code(优先级)。最后按q值排序(我的理解是没有q的都理解为“1”)。
  • @Anton,我不擅长计算括号:)
  • @Brad,这就是我要避免的,但如果没有现成的答案,肯定会开始这样做。
  • 谁在汇编器中编写网络应用程序? :-)

标签: c# java php .net


【解决方案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));
        }
    }
}

结果:

【讨论】:

【解决方案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_LANGUAGE 标头:en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2

Working example here

【讨论】:

  • 谢谢,你来得正是时候 - 我一直在盯着我的存根方法总是返回 "en" ))
猜你喜欢
  • 2018-11-18
  • 1970-01-01
  • 2020-06-03
  • 2010-12-12
  • 2013-02-10
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多