Intereting Posts
Существует ли внедряемый (не теоретический) способ доказать, принадлежит ли адрес электронной почты реальной учетной записи электронной почты? Разбор XML с PHP не работает Symfony2 – Доктрина и FOSUserBundle – неправильные аннотации Symfony на виртуальном хосте (проблема с корневым документом) Попытка вставить текст в файл ВЫШЕ определенную строку Doctrine Paginator выбирает всю таблицу (очень медленно)? Кнопка «Радио» снимите флажок при повторном нажатии Могу ли я запускать php-скрипт под разрешениями пользователя с помощью FastCGI и APACHE? Как изменить макет темы в Opencart? Как разделить кеш APC между несколькими процессами PHP при работе в FastCGI? Почему MAMP не отображает ошибки? post renamed filename из загрузки в базу данных Вызов функции PHP в Javascript Обрезаемая фатальная ошибка: объект класса PDOStatement не может быть преобразован в строку в D PHP Переписать URL и сохранить опубликованные данные

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

Да, значение $_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 ) 

Который представляет собой набор языков, отсортированных по приоритету, в порядке убывания – это, вероятно, то, что вы хотите.

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

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

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

Я просто использую 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 ) )