Проверять язык браузера с помощью PHP? - PullRequest
9 голосов
/ 06 марта 2009

Как я могу проверить язык браузера пользователя по PHP?

Мне нужно показать другую страницу для людей в США и в Великобритании.

Я безуспешно пробовал следующий код

<?php
if(ereg("us", $_SERVER["HTTP_ACCEPT_LANGUAGE"]))
   include('http://page.com/us.txt');
else
   include('http://page.com/uk.txt');
?>

Я запускаю специальный код для людей в США и для них в Великобритании.

Ответы [ 4 ]

8 голосов
/ 07 марта 2009

Скорее всего, проблема чувствительности к регистру; eregi ('en-us') или preg_match ('/ en-us / i') должны были его поднять.

Тем не менее, просто поиск «en-us» в заголовке может иногда привести к ошибкам, особенно когда в списке указаны языки США и Великобритании. «Accept-Language» на самом деле довольно сложный заголовок, для которого действительно нужен правильный синтаксический анализатор.

Если у вас есть PECL, вся работа для вас уже выполнена: http://www.php.net/manual/en/function.http-negotiate-language.php

Я не знаю, почему другие ответы идут для заголовка User-Agent; это совершенно фальшиво User-Agent не обязан хранить значение языка в каком-либо конкретном месте, и для некоторых браузеров (например, Opera и некоторых второстепенных браузеров, о которых я никогда не слышал, называемых «Internet Explorer»), это вообще не будет. Где содержит язык, это будет язык, на котором была установлена ​​сборка браузера, а не язык пользователя, на который вы должны смотреть. (Этот параметр будет по умолчанию установлен на языке сборки, но может быть изменен пользователем в пользовательском интерфейсе настроек.)

3 голосов
/ 06 марта 2009

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

<?
if(preg_match('/en-us/i', $_SERVER['HTTP_USER_AGENT']))
    include('http://page.com/us.txt');
else
    include('http://page.com/uk.txt');
?>
2 голосов
/ 06 марта 2009

A вероятно более надежный способ сделать это - выполнить регулярное выражение для строки $_SERVER['HTTP_USER_AGENT'].

<?php
  if(preg_match('/en-US/', $_SERVER['HTTP_USER_AGENT']))
    include('http://page.com/us.txt');
  else
    include('http://page.com/uk.txt');
?>

Вы не гарантированно получите правильную и полезную строку user-agent, поэтому убедитесь, что оператор else содержит разумную альтернативу.

1 голос
/ 22 августа 2012

Это решение на основе Zend. Это также будет работать при добавлении других языков.

<?php

include_once "Zend/Locale.php";

$zend_locale = new Zend_Locale(Zend_Locale::BROWSER);

// returns en for English, de for German etc.
echo $browser_language = $zend_locale->getLanguage();
echo "<br />\n";
// returns en_US for American English, en_GB for British English etc.
echo $browser_locale = $zend_locale->toString();
echo "<br />\n";

Решение видно по:

http://www.mpopp.net/2010/07/how-to-detect-the-users-preferred-language-smarter-than-google/

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