Самый простой способ определить локализацию клиента в PHP
Я хотел бы иметь возможность определять, в какой стране посетитель, с моего сайта, используя PHP.
Обратите внимание, что я не пытаюсь использовать это в качестве меры безопасности или для чего-либо важного, просто изменяя написание некоторых слов (американцы, кажется, считают, что слово "зачисление" имеет 2 Ls.... сумасшедшие янки ) и, возможно, указать параметр по умолчанию в списке "Выберите свою страну".
Таким образом, использование базы данных Geolocation - это чуть-чуть сверху, и я действительно не хочу гадать с установкой новых библиотек PHP только для этого, поэтому , что самый простой/самый простой способ найти то, что страна посетитель от?
Ответы
Ответ 1
Не гарантируется, но большинство браузеров представляют HTTP-заголовок Accept-Language, который указывает en-us, если они из США. Некоторые старые браузеры только сказали, что они en. И не все машины настроены правильно, чтобы указать, какой язык они предпочитают. Но это хорошая первая догадка.
Английские пользователи, основанные на Великобритании и Великобритании, обычно устанавливают свою систему или пользовательскую локаль на английский-британский, что в конфигурациях браузера по умолчанию должно приводить к появлению en-gb в качестве заголовка Accept Language. (Ранняя версия этого сказанного en-uk, это была опечатка, извините). В других странах также есть en locales, такие как en-za (южная африка) и, в основном теоретически, такие комбинации, как en-jp, также возможны.
Предположения на основе Geo-IP будут, скорее всего, правильными на предпочтительном языке/локали. Google считает, что согласование контента на основе геолокации IP-адреса имеет смысл, что меня действительно раздражает, когда я нахожусь в Японии или Корее...
Ответ 2
Начиная с версии 5.3.0, PHP предоставляет функцию для анализа переменной $_SERVER['HTTP_ACCEPT_LANGUAGE']
в локали.
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale; // returns "en_US"
Документация: https://www.php.net/manual/en/locale.acceptfromhttp.php
Ответ 3
Вы можете проверить заголовок HTTP_ACCEPT_LANGUAGE
(из $_SERVER
), который отправит большинство браузеров.
Взгляните на Zend_Locale для примера, или, может быть, вы даже захотите использовать lib.
Ответ 4
Вы можете сделать IP comparaison без, имея для этого всю библиотеку.
Решение №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-адреса US...), это может быть неточно...
Ответ 5
Учитывая указанную цель, заголовок Accept-Language является более подходящим решением, чем геолокация на основе IP. Действительно, это точно намеченная цель Accept-Language.
Ответ 6
Выполните анализ $_SERVER["HTTP_ACCEPT_LANGUAGE"]
, чтобы узнать страну и локаль браузера.
Ответ 7
Для определения вашей страны посетителя я использовал GeoIP расширение, очень прост в использовании.
Ответ 8
Я использую HTTP_ACCEPT_LANGUAGE
$localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
if(is_array($localePreferences) && count($localePreferences) > 0) {
$browserLocale = $localePreferences[0];
$_SESSION['browser_locale'] = $browserLocale;
}
Ответ 9
Служба http://countries.nerd.dk - это то, что я использую для сопоставления IP-to-country. Он работает очень хорошо и основывается на DNS, также хорошо кэшируется.
Вы также можете загрузить базу данных для локального использования, если не хотите полагаться на внешнюю службу.
Ответ 10
Расширение GeoIP - хороший выбор.
Ответ 11
Или вы можете сделать следующее:
скачать 'geoip.dat' и geoip.inc из http://www.maxmind.com/app/geoip_country
в заголовке geoip.inc вы найдете, как его использовать (например, инициализировать и остальное...)
Ответ 12
Одна вещь, которую хочет видеть зритель, вторая - которую вы можете обслуживать:
$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
}
}
}
например, моя система обслуживает только:
и мои языки браузера: pl, en-US, en = > , поэтому единственной правильной локалью является pl_PL.UTF-8.
Если успешное сравнение не найдено, то не существует setlocale вообще.