Как получить значение языка из $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] с использованием PHP? - PullRequest
14 голосов
/ 23 февраля 2010
<?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']?

Ответы [ 4 ]

28 голосов
/ 23 февраля 2010

Да, значение $_SERVER['HTTP_ACCEPT_LANGUAGE'] является строкой - см. $_SERVER.

Его содержимое отправляется браузером - что объясняет, почему вы получаете разные результаты в зависимости от браузера, который вы используете: скорее всего, ваш Firefox настроен для запроса страниц на английском языке (высокий приоритет) или japanese (низкий приоритет) , в то время как ваш IE настроен на запрос страниц на китайском языке.

Это потому, что заголовок HTTP может содержать:

  • список языков
  • опционально, с кодами регионов
  • с соответствующими приоритетами.

Идея заключается в том, что сервер должен отвечать, используя язык, который "лучше" соответствует тому, что запрашивает пользователь.


Что касается разбора этого заголовка, этот пост может быть интересным: Разобрать Accept-Language для определения языка пользователя

Существует часть кода, предложенная для анализа этого HTTP-заголовка - и он генерирует массив, который выглядит следующим образом (цитирование) :

Array
(
    [en-ca] => 1
    [en] => 0.8
    [en-us] => 0.6
    [de-de] => 0.4
    [de] => 0.2
)

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

6 голосов
/ 15 марта 2016

Начиная с версии 5.3 PHP имеет функцию для этой цели:

$locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);

См .: http://php.net/manual/en/locale.acceptfromhttp.php

4 голосов
/ 23 декабря 2013

Я просто использую explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']) чтобы получить первый возможный язык, который мог бы использовать мой клиент. Он отлично работает на Chrome и IE 10. Не уверен, что это будет неправильно в других браузерах.

2 голосов
/ 15 июня 2014

попробуйте это:

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
    )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...