Подтвердить что ты не робот

Как получить значение языка из $_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']?

4b9b3361

Ответ 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
)

Какой массив языков, отсортированный по приоритету, в порядке убывания - что, вероятно, вам нужно.

Ответ 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
    )

)