1

可能重复:
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}

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

多谢。

4

5 回答 5

5

来自HTTP/1.1 标头字段定义

每个语言范围可以被赋予一个相关的质量值,该值表示用户对该范围指定的语言的偏好的估计。质量值默认为“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不发送标头,则所有语言都同样可以接受。

于 2012-12-12T21:25:56.353 回答
1

If you prefer to assume that the string is not always ordered before it is sent by the browser then the following code will parse and sort it. Note that I've changed French's q to 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);

Output:

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)
  }
}
于 2012-12-12T22:06:04.327 回答
1

怎么样explode()

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

给定您的示例字符串,您应该得到以下值

  • $array[0]=“nl”
  • $array[1]=“en-gb;q=0.8”
  • $array[2]=“en;q=0.6”
  • 等等
于 2012-12-12T20:51:06.450 回答
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);
}
于 2012-12-12T20:51:41.317 回答
0

语言按用户喜欢的顺序排列。您所要做的就是在,符号和部分中拆分字符串,摆脱从;到 结尾的所有内容(包括;),并且您拥有用户喜欢的语言顺序。

于 2012-12-12T20:52:01.980 回答