Как я могу проверить язык браузера пользователя PHP?
Мне нужно показать другую страницу для людей в США и Великобритании.
Я безуспешно пробовал следующий код
<?php if(ereg("us", $_SERVER["HTTP_ACCEPT_LANGUAGE"])) include('http://page.com/us.txt'); else include('http://page.com/uk.txt'); ?>
Я запускаю специальный код для людей в США и для них в Великобритании.
Вероятно, просто проблема чувствительности к регистру; 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; это совершенно фиктивный. Пользователь-агент не имеет права удерживать языковое значение в любом конкретном месте, а для некоторых браузеров (например, Opera и некоторых второстепенных браузеров, о которых я никогда не слышал, называется «Internet Explorer»), это совсем не будет. Там, где он содержит язык, это будет язык, на котором была установлена сборка браузера, а не предпочтительный язык пользователя, на который вы должны смотреть. (Этот параметр будет использоваться по умолчанию для языка сборки, но может быть настроен пользователем из пользовательского интерфейса предпочтений.)
Попробуй это:
<? if(preg_match('/en-us/i', $_SERVER['HTTP_USER_AGENT'])) include('http://page.com/us.txt'); else include('http://page.com/uk.txt'); ?>
в<? if(preg_match('/en-us/i', $_SERVER['HTTP_USER_AGENT'])) include('http://page.com/us.txt'); else include('http://page.com/uk.txt'); ?>
в<? if(preg_match('/en-us/i', $_SERVER['HTTP_USER_AGENT'])) include('http://page.com/us.txt'); else include('http://page.com/uk.txt'); ?>
Вероятнее всего, более надежный способ сделать это – выполнить регулярное выражение в строке $_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'); ?>
в<?php if(preg_match('/en-US/', $_SERVER['HTTP_USER_AGENT'])) include('http://page.com/us.txt'); else include('http://page.com/uk.txt'); ?>
в<?php if(preg_match('/en-US/', $_SERVER['HTTP_USER_AGENT'])) include('http://page.com/us.txt'); else include('http://page.com/uk.txt'); ?>
Вам не гарантируется получение правильной и полезной строки пользовательского агента, поэтому убедитесь, что оператор else содержит разумную альтернативу.
Это решение на основе 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/