如何从HTTP_ACCEPT_LANGUAGE订购字符串

时间:2012-12-12 20:45:54

标签: php html arrays string http-headers

  

可能重复:
  HTTP_ACCEPT_LANGUAGE

我尝试编写语言选项工具。因此我使用

$default_language = (strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]));

if (eregi('af', $default_language)) {do something}

现在我想在我回复时订购字符串:

$_SERVER["HTTP_ACCEPT_LANGUAGE"]

例如,用户指定了多种语言。

使用不同语言的chrome示例:

 nl,en-gb;q=0.8,en;q=0.6,fr;q=0.4,fr-ca;q=0.2

所以我怎样才能读出字符串以使其按照特定的顺序排列,我可以看到nl是第一种首选的语言。

代码应该是这样的:

if ('nl'== array[0]) {do something}

所以,如果有人可以帮助我,我真的很感激。

非常感谢。

5 个答案:

答案 0 :(得分:4)

来自HTTP/1.1 Header Field Definitions

  

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

您必须循环使用语言并选择质量最高的语言(首选);像这样:

$preferred = "en"; // default
if(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]))
{
    $max   = 0.0;
    $langs = explode(",", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
    foreach($langs as $lang)
    {
        $lang = explode(';', $lang);
        $q    = (isset($lang[1])) ? ((float) $lang[1]) : 1.0;
        if ($q > $max)
        {
            $max = $q;
            $preferred = $lang[0];
        }
    }
    $preferred = trim($preferred);
}
// now $preferred is user's preferred language

如果未发送Accept-Language标题,则所有语言均可接受。

答案 1 :(得分:1)

explode()怎么样?

$array = explode(",",$_SERVER["HTTP_ACCEPT_LANGUAGE"]);

根据您的示例字符串,您应该得到以下值

  • $array[0] =“nl”
  • $array[1] =“en-gb; q = 0.8”
  • $array[2] =“en; q = 0.6”

答案 2 :(得分:1)

如果您希望在浏览器发送字符串之前不总是对字符串进行排序,则以下代码将对其进行解析和排序。请注意,我已将法语的q更改为0.9

<?php
$lang = 'nl,en-gb;q=0.8,en;q=0.6,fr;q=0.9,fr-ca;q=0.2';

$langs = array();

foreach(explode(',', $lang) as $entry) {
    $t1 = explode(';', $entry);
    switch( count($t1) ) {
        case 1:
            $langs[] = array($t1[0], 1.0);
            break;
        case 2:
            $t2 = explode('=', $t1[1]);
            $langs[] = array($t1[0], floatval($t2[1]));
            break;
        default:
            echo("what is this I don't even");
            break;
    }
}

function mysort($a, $b) {
    if( $a[1] == $b[1] ) { return 0; }
    elseif( $a[1] > $b[1] ) { return -1; }
    else { return 1; }
}
usort($langs, 'mysort');

var_dump($langs);

输出:

array(5) {
  [0]=>
  array(2) {
    [0]=>
    string(2) "nl"
    [1]=>
    float(1)
  }
  [1]=>
  array(2) {
    [0]=>
    string(2) "fr"
    [1]=>
    float(0.9)
  }
  [2]=>
  array(2) {
    [0]=>
    string(5) "en-gb"
    [1]=>
    float(0.8)
  }
  [3]=>
  array(2) {
    [0]=>
    string(2) "en"
    [1]=>
    float(0.6)
  }
  [4]=>
  array(2) {
    [0]=>
    string(5) "fr-ca"
    [1]=>
    float(0.2)
  }
}

答案 3 :(得分:0)

试试这个:

<?php
print_r(Get_Client_Prefered_Language(true, $_SERVER['HTTP_ACCEPT_LANGUAGE']));
function Get_Client_Prefered_Language ($getSortedList = false, $acceptedLanguages = false)
{

    if (empty($acceptedLanguages))
        $acceptedLanguages = $_SERVER["HTTP_ACCEPT_LANGUAGE"];

        // regex borrowed from Gabriel Anderson on http://stackoverflow.com/questions/6038236/http-accept-language
    preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $acceptedLanguages, $lang_parse);
    $langs = $lang_parse[1];
    $ranks = $lang_parse[4];

        // (recursive anonymous function)
    $getRank = function ($j)use(&$getRank, &$ranks)
    {
        while (isset($ranks[$j]))
            if (!$ranks[$j])
                return $getRank($j + 1);
            else
                return $ranks[$j];
    };

        // (create an associative array 'language' => 'preference')
    $lang2pref = array();
    for($i=0; $i<count($langs); $i++)
        $lang2pref[$langs[$i]] = (float) $getRank($i);

        // (comparison function for uksort)
    $cmpLangs = function ($a, $b) use ($lang2pref) {
        if ($lang2pref[$a] > $lang2pref[$b])
            return -1;
        elseif ($lang2pref[$a] < $lang2pref[$b])
            return 1;
        elseif (strlen($a) > strlen($b))
            return -1;
        elseif (strlen($a) < strlen($b))
            return 1;
        else
            return 0;
    };

        // sort the languages by prefered language and by the most specific region
    uksort($lang2pref, $cmpLangs);


    if ($getSortedList)
        return $lang2pref;

        // return the first value's key
    reset($lang2pref);
    return key($lang2pref);
}

答案 4 :(得分:0)

语言按照用户的喜好排序。您所要做的就是将字符串拆分为,符号和部分,删除从;到结尾的所有内容(包括;)并且您拥有用户首选订单中的语言。