1

重複の可能性:
HTTP_ACCEPT_LANGUAGE

言語オプションツールをコーディングしようとしています。そのため私は使用します

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

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

今、私はエコーするときに文字列を注文したいと思います:

$_SERVER["HTTP_ACCEPT_LANGUAGE"]

たとえば、ユーザーがいくつかの言語を指定しました。

異なる言語のクロムの例:

 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

どう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 に答える
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)
  }
}
于 2012-12-12T22:06:04.327 に答える
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 に答える