Самый простой способ определить локали клиента в PHP
Я хотел бы иметь возможность определять, из какой страны посетитель на моем сайте, используя PHP.
Обратите внимание, что я не пытаюсь использовать это в качестве меры безопасности или для чего-то важного, просто меняю написание некоторых слов (американцы, похоже, считают, что слово "зачисление" имеет 2 Ls… сумасшедшие сноски), и возможно, чтобы дать вариант по умолчанию в списке "Выберите свою страну".
Таким образом, использование базы данных Geolocation является слишком сложным, и я действительно не хочу возиться с установкой новых библиотек PHP только для этого, так каков самый простой / простой способ выяснить, из какой страны посетитель?
12 ответов
Не гарантируется, но большинство браузеров отправляют HTTP-заголовок Accept-Language, который указывает en-us, если они из США. Некоторые старые браузеры говорят только, что они en. И не все машины настроены правильно, чтобы указать, какой язык они предпочитают. Но это хорошее первое предположение.
Пользователи, базирующиеся на английском и британском языках, обычно устанавливают для своей системы или языкового стандарта пользователя английский-британский, что в настройках браузера по умолчанию должно приводить к en-gb в качестве заголовка языка принятия. (Более ранняя версия этого слова en-uk; это опечатка, извините.) В других странах также есть en-locales, такие как en-za (Южная Африка), и, в первую очередь теоретически, также возможны такие комбинации, как en-jp.
Однако предположения, основанные на гео-IP, с меньшей вероятностью будут правильными на предпочтительном языке / локали. Google считает, что согласование контента, основанное на геолокации IP-адресов, имеет смысл, что меня раздражает, когда я в Японии или Корее...
Начиная с версии 5.3.0 PHP предоставляет функцию для анализа переменной $_SERVER['HTTP_ACCEPT_LANGUAGE'] в локали.
http://www.php.net/manual/en/locale.acceptfromhttp.php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale; // returns "en_US"
Вы можете проверить HTTP_ACCEPT_LANGUAGE
заголовок (от $_SERVER), который отправит большинство браузеров.
Взгляните на Zend_Locale для примера, или, может быть, вы даже захотите использовать lib.
Вы можете сделать некоторое сравнение IP, не имея для этого целой библиотеки.
Решение № 1
Используйте API, таким образом, ничего не нужно с вашей стороны. Это веб-API, который позволит вам узнать страну:
Example: http://api.hostip.info/get_html.php?ip=12.215.42.19
Return : Country: UNITED STATES (US)
Решение № 2
Но, вы думаете, использовать язык агента браузера? Вы можете быть в состоянии узнать тип английского языка из него.
Решение № 3
Этот сайт под названием BlockCountry позволяет вам получить список IP-адресов по странам. Конечно, вы не хотите блокировать, но вы можете использовать список IP-адресов и сравнивать их (получить все IP-адреса США...), это может быть неточным...
Я использую HTTP_ACCEPT_LANGUAGE
$localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
if(is_array($localePreferences) && count($localePreferences) > 0) {
$browserLocale = $localePreferences[0];
$_SESSION['browser_locale'] = $browserLocale;
}
Проанализируйте $_SERVER["HTTP_ACCEPT_LANGUAGE"], чтобы узнать страну и локаль браузера
Учитывая вашу заявленную цель, заголовок Accept-Language является более подходящим решением, чем геолокация на основе IP. На самом деле, это именно то, для чего предназначен Accept-Language.
Для определения страны посетителей я использовал расширение GeoIP, очень простое в использовании.
Служба http://countries.nerd.dk/ - это то, что я использую для сопоставления IP-адресов между странами. Он работает очень хорошо и, основываясь на DNS, тоже хорошо кэшируется.
Вы также можете загрузить базу данных для локального использования, если вы не хотите полагаться на внешнюю службу.
Или вы можете сделать следующее:
загрузите geoip.dat и geoip.inc с http://www.maxmind.com/app/geoip_country
в заголовке geoip.inc вы найдете, как его использовать (например, initialize и все остальное...)
Одно - какой язык хочет зритель, второе - что вы можете служить:
$SystemLocales = explode("\n", shell_exec('locale -a'));
$BrowserLocales = explode(",",str_replace("-","_",$_SERVER["HTTP_ACCEPT_LANGUAGE"])); // brosers use en-US, Linux uses en_US
for($i=0;$i<count($BrowserLocales);$i++) {
list($BrowserLocales[$i])=explode(";",$BrowserLocales[$i]); //trick for "en;q=0.8"
for($j=0;$j<count($SystemLocales);$j++) {
if ($BrowserLocales[$i]==substr($SystemLocales[$j],0,strlen($BrowserLocales[$i]))){
setlocale(LC_ALL, $SystemLocales[$j]);
break 2; // found and set, so no more check is needed
}
}
}
например, моя система обслуживает только:
- С
- POSIX
- pl_PL.UTF-8
и языки моего браузера: pl, en-US, en =>, поэтому единственная правильная локаль - pl_PL.UTF-8.
Когда не найдено ни одного успешного сравнения - вообще нет setlocale.