web-dev-qa-db-fra.com

Moyen le plus simple de détecter les paramètres régionaux du client dans PHP

J'aimerais pouvoir détecter de quel pays provient un visiteur sur mon site Web, en utilisant PHP.

Veuillez noter que je n'essaie pas d'utiliser cela comme mesure de sécurité ou pour quelque chose d'important, juste en changeant l'orthographe de certains mots (les Américains semblent croire que le mot "inscription" a 2 Ls .... yanks fous) , et peut-être pour donner une option par défaut dans une liste "Sélectionnez votre pays".

En tant que tel, l'utilisation d'une base de données de géolocalisation est un peu exagérée et je ne veux vraiment pas me moquer de l'installation de nouvelles bibliothèques PHP juste pour cela, alors quel est le moyen le plus simple/le plus simple de trouver de quel pays vient un visiteur?

32
nickf

Non garanti, mais la plupart des navigateurs soumettent un en-tête HTTP Accept-Language qui spécifie en-us s'ils proviennent des États-Unis. Certains navigateurs plus anciens ont seulement dit qu'ils le faisaient, cependant. Et toutes les machines ne sont pas configurées correctement pour indiquer les paramètres régionaux qu'elles préfèrent. Mais c'est une bonne première supposition.

Les utilisateurs basés au Royaume-Uni définissent généralement leur système ou les paramètres régionaux de l'utilisateur sur Anglais-Royaume-Uni, ce qui, dans les configurations de navigateur par défaut, devrait entraîner l'en-gb comme en-tête Accept Language. (Une version antérieure de cela disait en-uk; c'était une faute de frappe, désolé.) D'autres pays ont également des locales, comme en-za (afrique du sud), et, principalement en théorie, des combinaisons comme en-jp sont également possibles.

Cependant, les suppositions basées sur la géo-IP seront moins probablement correctes sur la langue/l'environnement local préféré. Google pense que la négociation de contenu basée sur la géolocalisation d'adresses IP a du sens, ce qui m'énerve vraiment quand je suis au Japon ou en Corée ...

21
JasonTrue

PHP fournit une fonction depuis 5.3.0 pour analyser la variable $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] dans un environnement local.

http://www.php.net/manual/en/locale.acceptfromhttp.php

$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale; // returns "en_US"
25
Trevor Goodyear

Vous pouvez consulter le HTTP_ACCEPT_LANGUAGE en-tête (de $ _SERVER) que la plupart des navigateurs enverront.

Jetez un œil à Zend_Locale pour un exemple, ou peut-être pourriez-vous même vouloir utiliser la lib.

13
chroder

Vous pouvez faire une comparaison IP sans avoir une bibliothèque entière pour le faire.

Solution n ° 1

Utilisez une API, de cette façon, rien n'est nécessaire de votre côté. Il s'agit d'une API Web qui vous permet de connaître le pays:

 Example: http://api.hostip.info/get_html.php?ip=12.215.42.19
 Return : Country: UNITED STATES (US)

Solution n ° 2

Mais, avez-vous pensé à utiliser la langue de l'agent de navigateur? Vous pourrez peut-être en connaître le type d'anglais.

Solution n ° 3

Ce site Web appelé BlockCountry vous permet d'avoir une liste d'IP par pays. Bien sûr, vous ne voulez pas bloquer, mais vous pouvez utiliser la liste des IP et les comparer (obtenir tous les IP américains ...) cela peut ne pas être précis ...

6
Patrick Desjardins

Compte tenu de votre objectif déclaré, l'en-tête Accept-Language est une solution plus appropriée que la géolocalisation basée sur IP. En effet, c'est précisément l'objectif visé par Accept-Language.

2
Dave Sherohman

Analyser $ _SERVER ["HTTP_ACCEPT_LANGUAGE"] pour obtenir le pays et les paramètres régionaux du navigateur

2
Slipo

J'utilise HTTP_ACCEPT_LANGUAGE

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

Pour identifier votre pays de visiteurs, j'ai utilisé l'extension GeoIP , très simple à utiliser.

1
CMS

Ou vous pouvez effectuer les opérations suivantes:

téléchargez 'geoip.dat' et geoip.inc depuis http://www.maxmind.com/app/geoip_country

dans l'en-tête geoip.inc, vous trouverez comment l'utiliser (par exemple, initialiser et le reste ...)

0
zale

Une chose est la langue que le visualiseur veut, deuxièmement - que vous pouvez servir:

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

par exemple, le système minier ne sert que:

  • C
  • POSIX
  • pl_PL.UTF-8

et les langues de mon navigateur sont: pl, en-US, en => donc la seule locale correcte est pl_PL.UTF-8.

Lorsqu'aucune comparaison réussie n'est trouvée - il n'y a pas du tout de setlocale.

0
Tomasz Brzezina

L'extension GeoIP est un bon choix.

0
pakaian bayi

Le service http://countries.nerd.dk est ce que j'utilise pour la cartographie IP-pays. Cela fonctionne très bien et étant basé sur DNS, il est également bien mis en cache.

Vous pouvez également télécharger la base de données pour une utilisation locale si vous ne souhaitez pas compter sur un service externe.

0
Greg Hewgill