Я использовал регулярное выражение из @GabrielAnderson и разработал эту функцию, которая работает в соответствии с RFC 2616 (если для языка не задано значение качества, по умолчанию используется значение 1).
Когда несколько языков имеют одинаковое качествозначение, наиболее конкретным, имеют приоритет над менее конкретными.(это поведение не является частью RFC, который не дает рекомендаций для этого конкретного случая)
function Get_Client_Prefered_Language ($getSortedList = false, $acceptedLanguages = false)
{
if (empty($acceptedLanguages))
$acceptedLanguages = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
// regex inspired from @GabrielAnderson on /5753133/ispolzovanie-servernoi-peremennoi-php-httpacceptlanguage
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];
// (create an associative array 'language' => 'preference')
$lang2pref = array();
for($i=0; $i<count($langs); $i++)
$lang2pref[$langs[$i]] = (float) (!empty($ranks[$i]) ? $ranks[$i] : 1);
// (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);
}
Пример:
print_r(Get_Client_Prefered_Language(true, 'en,en-US,en-AU;q=0.8,fr;q=0.6,en-GB;q=0.4'));
Выходы:
Array
(
[en-US] => 1
[en] => 1
[en-AU] => 0.8
[fr] => 0.6
[en-GB] => 0.4
)
КакВы можете заметить, что «en-US» появляется в первой позиции, несмотря на то, что «en» был первым в данной строке.
Таким образом, вы можете использовать эту функцию и просто заменить свою первую строку кода на:
$http_lang = substr(Get_Client_Prefered_Language(),0,2);