<?php $language = $_SERVER['HTTP_ACCEPT_LANGUAGE']; echo $language; ?>
Когда я использую Firefox для проверки этого блока кода, я получаю en-us,en;q=0.7,ja;q=0.3
,
когда я использую IE для проверки блока кода, я получаю zh-cn
.
Является ли значение $_SERVER['HTTP_ACCEPT_LANGUAGE']
строкой? Как определить, является ли предпочтительный язык китайским или японским? Как я могу написать регулярное выражение, чтобы получить язык от значения $_SERVER['HTTP_ACCEPT_LANGUAGE']
?
Да, значение $_SERVER['HTTP_ACCEPT_LANGUAGE']
– это строка – см. $_SERVER
.
Его содержимое отправляется браузером, что объясняет, почему вы получаете разные результаты в зависимости от используемого вами браузера: скорее всего, ваш Firefox настроен на запрос страниц на английском (высокий приоритет) или на японском (низкий приоритет) , в то время как ваш IE настроен для запроса страниц на китайском языке.
Это связано с тем, что этот HTTP-заголовок может содержать:
Идея состоит в том, что сервер должен отвечать, используя язык, который соответствует «наилучшему», что запрашивается пользователем.
О разборе этого заголовка этот блог-пост может быть интересным для чтения: Parse Accept-Language для определения языка пользователя
Существует часть кода, предложенная для синтаксического анализа этого HTTP-заголовка – и он генерирует массив, который выглядит так (цитирование) :
Array ( [en-ca] => 1 [en] => 0.8 [en-us] => 0.6 [de-de] => 0.4 [de] => 0.2 )
Который представляет собой набор языков, отсортированных по приоритету, в порядке убывания – это, вероятно, то, что вы хотите.
Начиная с версии 5.3 PHP имеет функцию для этой цели:
$locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
Я просто использую explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE'])
чтобы получить первый возможный язык, который может использовать мой клиент. Он отлично работает на chrome и IE 10. Не уверен, что это было бы неправильно в других браузерах.
попробуй это:
function getUserBaseLanguage() { global $_SERVER; $accept_languages = $_SERVER['HTTP_ACCEPT_LANGUAGE']; $accept_languages_arr = explode(",",$accept_languages); foreach($accept_languages_arr as $accept_language) { preg_match ("/^(([a-zA-Z]+)(-([a-zA-Z]+)){0,1})(;q=([0-9.]+)){0,1}/" , $accept_language, $matches ); if (!$matches[6]) $matches[6]=1; $result[$matches[1]] = array( 'lng_base' => $matches[2], 'lng_ext' => $matches[4], 'lng' => $matches[1], 'priority' => $matches[6], '_str' => $accept_language, ); } return $result; } print_r(getUserBaseLanguage());
вывод:
Array ( [pl] => Array ( [lng_base] => pl [lng_ext] => [lng] => pl [priority] => 1 [_str] => pl ) [en-US] => Array ( [lng_base] => en [lng_ext] => US [lng] => en-US [priority] => 0.7 [_str] => en-US;q=0.7 ) [en] => Array ( [lng_base] => en [lng_ext] => [lng] => en [priority] => 0.3 [_str] => en;q=0.3 ) )