Как получить значение языка из $_SERVER ['HTTP_ACCEPT_LANGUAGE'] с помощью PHP?
<?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']
?
Ответы
Ответ 1
Да, значение $_SERVER['HTTP_ACCEPT_LANGUAGE']
- это строка - см. $_SERVER
.
Его содержимое отправляется браузером, что объясняет, почему вы получаете разные результаты в зависимости от используемого вами браузера: скорее всего, ваш Firefox настроен на запрос страниц на английском (высокий приоритет) или японском (низкий приоритет), в то время как ваш IE настроен на запрос страниц на китайском языке.
Это связано с тем, что этот HTTP-заголовок может содержать:
- список языков
- optionnaly, с региональными кодами
- с соответствующими приоритетами.
Идея состоит в том, что сервер должен отвечать, используя язык, который соответствует "наилучшему", что запрашивается пользователем.
О разборе этого заголовка этот блог-пост может быть интересным: Parse Accept-Language для обнаружения пользовательского языка
Существует часть кода, предлагаемая для разбора этого HTTP-заголовка - и он генерирует массив, который выглядит так (цитирование):
Array
(
[en-ca] => 1
[en] => 0.8
[en-us] => 0.6
[de-de] => 0.4
[de] => 0.2
)
Какой массив языков, отсортированный по приоритету, в порядке убывания - что, вероятно, вам нужно.
Ответ 2
Начиная с v5.3 PHP имеет функцию для этой цели:
$locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
Смотрите: http://php.net/manual/en/locale.acceptfromhttp.php
Ответ 3
Я просто использую explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE'])
, чтобы получить первый возможный язык, который может использовать мой клиент. Он отлично работает на chrome и IE 10. Не уверен, что это было бы неправильно в других браузерах.
Ответ 4
попробуйте следующее:
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
)
)