Самый простой способ определить локаль клиента в PHP - PullRequest
32 голосов
/ 18 ноября 2008

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

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

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

Ответы [ 12 ]

25 голосов
/ 11 марта 2014

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"
21 голосов
/ 18 ноября 2008

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

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

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

13 голосов
/ 18 ноября 2008

Вы можете проверить заголовок HTTP_ACCEPT_LANGUAGE (от $ _SERVER), который отправит большинство браузеров.

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

6 голосов
/ 18 ноября 2008

Вы можете сделать некоторое сравнение 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-адреса США ...), это может быть неточным ...

2 голосов
/ 18 ноября 2008

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

2 голосов
/ 18 ноября 2008

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

1 голос
/ 01 марта 2017

Я использую HTTP_ACCEPT_LANGUAGE

    $localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
    if(is_array($localePreferences) && count($localePreferences) > 0) {
       $browserLocale = $localePreferences[0];
       $_SESSION['browser_locale'] = $browserLocale;
    }
1 голос
/ 18 ноября 2008

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

0 голосов
/ 13 апреля 2013

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

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

например, шахтная система обслуживает только:

  • C
  • 1009 * POSIX *
  • pl_PL.UTF-8

и языки моего браузера: pl, en-US, en =>, поэтому единственная правильная локаль - pl_PL.UTF-8.

Когда успешное сравнение не найдено - вообще не существует setlocale.

0 голосов
/ 15 мая 2011

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

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

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

...