La forma más sencilla de detectar la configuración regional del cliente en PHP

StackOverflow https://stackoverflow.com/questions/297542

  •  08-07-2019
  •  | 
  •  

Pregunta

Me gustaría poder detectar de qué país es un visitante en mi sitio web, usando PHP.

Tenga en cuenta que no estoy tratando de usar esto como una medida de seguridad o para nada importante, solo cambiando la ortografía de algunas palabras (los estadounidenses parecen creer que la palabra "inscripción" tiene 2 Ls. ... yanks locos) , y quizás para dar una opción predeterminada en " Seleccione su país " lista.

Como tal, el uso de una base de datos de geolocalización es un poco exagerado y realmente no quiero molestarme con la instalación de nuevas bibliotecas PHP solo para esto, así que cuál es la forma más fácil / simple de encontrar qué ¿De qué país es un visitante?

¿Fue útil?

Solución

No está garantizado, pero la mayoría de los navegadores envían un encabezado HTTP Accept-Language que especifica en-us si son de los EE. UU. Sin embargo, algunos navegadores más antiguos solo dijeron que están en. Y no todas las máquinas están configuradas correctamente para indicar qué configuración regional prefieren. Pero es una buena primera suposición.

Los usuarios basados ??en inglés-Reino Unido generalmente establecen su sistema o configuración regional de usuario en inglés-Reino Unido, lo que en las configuraciones predeterminadas del navegador debería dar como resultado en-gb como el encabezado Aceptar idioma. (Una versión anterior de esto decía en-uk; eso fue un error tipográfico, lo siento). Otros países también tienen en locales, como en-za (Sudáfrica), y, principalmente teóricamente, también son posibles combinaciones como en-jp.

Sin embargo, es menos probable que las suposiciones basadas en Geo-IP sean correctas en el idioma / localidad preferido. Google cree que la negociación de contenido basada en la geolocalización de direcciones IP tiene sentido, lo que realmente me molesta cuando estoy en Japón o Corea ...

Otros consejos

PHP proporciona una función desde 5.3.0 para analizar la variable $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] en un entorno local.

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

$locale = Locale::acceptFromHttp(

PHP proporciona una función desde 5.3.0 para analizar la variable $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] en un entorno local.

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

<*>SERVER['HTTP_ACCEPT_LANGUAGE']); echo $locale; // returns "en_US"

Puede consultar el encabezado HTTP_ACCEPT_LANGUAGE (desde $ _SERVER) que la mayoría de los navegadores enviarán.

Eche un vistazo a Zend_Locale por ejemplo, o tal vez incluso quieras usar la lib.

Puede hacer una comparación de IP sin tener una biblioteca completa para hacerlo.

Solución # 1

Use una API, de esta manera no se necesita nada de su parte. Esta es una API web que le permite conocer el país:

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

Solución # 2

Pero, ¿ha pensado utilizar el idioma del agente del navegador? Es posible que pueda saber el tipo de inglés de él.

Solución # 3

Este sitio web llamado BlockCountry le permite tener una lista de IP por país. Por supuesto, no desea bloquear, pero puede usar la lista de IP y compararlas (obtener toda la IP de EE. UU. ...) esto podría no ser exacto ...

Dado su propósito declarado, el encabezado Accept-Language es una solución más adecuada que la geolocalización basada en IP. De hecho, es precisamente el propósito de Accept-Language.

Analiza $ _SERVER [" HTTP_ACCEPT_LANGUAGE "] para obtener el país y la ubicación del navegador

Para identificar el país de sus visitantes he usado la extensión GeoIP , muy simple de usar.

Uso el HTTP_ACCEPT_LANGUAGE

    $localePreferences = explode(",",

Uso el HTTP_ACCEPT_LANGUAGE

<*>SERVER['HTTP_ACCEPT_LANGUAGE']); if(is_array($localePreferences) && count($localePreferences) > 0) { $browserLocale = $localePreferences[0];

Uso el HTTP_ACCEPT_LANGUAGE

<*>SESSION['browser_locale'] = $browserLocale; }

El servicio http://countries.nerd.dk es lo que uso para IP-to-country cartografía. Funciona muy bien y, al estar basado en DNS, también se almacena en caché.

También puede descargar la base de datos para uso local si no desea confiar en un servicio externo.

O puede hacer lo siguiente:

descargue 'geoip.dat' y geoip.inc desde http://www.maxmind.com/app / geoip_country

en el encabezado geoip.inc encontrará cómo usarlo (por ejemplo, inicializar y el resto ...)

La extensión GeoIP es una buena opción.

Una cosa es lo que quiere el visor de idiomas, en segundo lugar, lo que puede servir:

$SystemLocales = explode("\n", shell_exec('locale -a'));
$BrowserLocales = explode(",",str_replace("-","_",

Una cosa es lo que quiere el visor de idiomas, en segundo lugar, lo que puede servir:

<*>

por ejemplo, el sistema de minas solo sirve:

  • C
  • POSIX
  • pl_PL.UTF-8

y los idiomas de mi navegador son: pl, en-US, en = > entonces la única configuración regional correcta es pl_PL.UTF-8.

Cuando no se encuentra una comparación exitosa, no hay setlocale en absoluto.

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

por ejemplo, el sistema de minas solo sirve:

  • C
  • POSIX
  • pl_PL.UTF-8

y los idiomas de mi navegador son: pl, en-US, en = > entonces la única configuración regional correcta es pl_PL.UTF-8.

Cuando no se encuentra una comparación exitosa, no hay setlocale en absoluto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top