Самый простой способ определить локализацию клиента в PHP

Я хотел бы иметь возможность определить, в какой стране посетитель находится на моем веб-сайте, используя PHP.

Обратите внимание, что я не пытаюсь использовать это в качестве меры безопасности или для чего-либо важного, просто изменяя написание некоторых слов (американцы, похоже, считают, что слово «зачисление» имеет 2 Ls … сумасшедшие янки) и возможно, предоставить вариант по умолчанию в списке «Выберите свою страну».

Таким образом, использование базы данных Geolocation – это чуть более-топ, и я действительно не хочу гадать с установкой новых библиотек PHP только для этого, так что самый простой / самый простой способ найти, в какой стране посетитель?

Не гарантируется, но большинство браузеров представляют HTTP-заголовок Accept-Language, который указывает en-us, если они из США. Некоторые старые браузеры только сказали, что они en. И не все машины настроены правильно, чтобы указать, какой язык они предпочитают. Но это хорошая первая догадка.

Английские-британские пользователи обычно устанавливают свою систему или пользовательскую локали на английский-британский, что в конфигурациях браузера по умолчанию должно приводить к появлению en-gb в качестве заголовка Accept Language. (Ранняя версия этого сказанного en-uk, это была опечатка, извините). В других странах также есть en locales, такие как en-za (южная африка) и, в основном теоретически, такие комбинации, как en-jp, также возможны.

Однако предположения, основанные на Geo-IP, будут менее корректными на предпочтительном языке / локали. Google считает, что согласование контента на основе геолокации IP-адреса имеет смысл, что меня действительно раздражает, когда я в Японии или Корее …

PHP предоставляет функцию с 5.3.0 для анализа переменной $ _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-адреса США …), это может быть неточно …

С учетом вашей заявленной цели заголовок Accept-Language является более подходящим решением, чем геолокация на основе IP. В самом деле, это точно намеченная цель Accept-Language.

Parse $ _SERVER ["HTTP_ACCEPT_LANGUAGE"], чтобы получить страну и язык браузера

Или вы можете сделать следующее:

скачать 'geoip.dat' и geoip.inc с http://www.maxmind.com/app/geoip_country

в заголовке geoip.inc вы найдете, как его использовать (например, инициализировать и остальное …)

Расширение GeoIP – хороший выбор.

Для определения вашей страны посетителя я использовал расширение GeoIP , очень прост в использовании.

Служба http://countries.nerd.dk – это то, что я использую для сопоставления IP-to-country. Он работает очень хорошо и основывается на DNS, также кэшируется.

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

Одна вещь, которую хочет видеть зритель, вторая – которую вы можете обслуживать:

 $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.

Я использую HTTP_ACCEPT_LANGUAGE

  $localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']); if(is_array($localePreferences) && count($localePreferences) > 0) { $browserLocale = $localePreferences[0]; $_SESSION['browser_locale'] = $browserLocale; }