2010-02-23 24 views
5

He desarrollado un sitio web www.tenxian.com.Cómo detectar el idioma de un usuario a través de su dirección IP

Tiene tres versiones de idioma, inglés, japonés y chino. ¿Cómo puedo escribir un programa PHP efectivo que pueda elegir automáticamente una versión de idioma basada en la dirección IP del visitante?

Si uso "if-else", el código sería muy complicado; Si uso Switch-Case, cómo escribirlo ya que los datos que se deben tratar son rangos de IP, no números particulares. Además, no sé estos rangos de IP

¿Cuál es la forma más fácil de hacerlo?

+0

Creo que está preguntando dos cosas: cómo asignar una dirección IP a uno de sus idiomas (¿o de qué país es el usuario)?¿Y cómo mostrar todos los mensajes en la aplicación en ese idioma correcto? ¿Es esto correcto? – Aishwar

+0

Solo tres idiomas, inglés, chino y japonés. Si sé que el visitante proviene de Japón, lo redireccionaré a la versión japonesa, si el visitante proviene de la Gran China, lo redireccionaré a la versión china; de lo contrario, lo redirigiré a la versión en inglés. – Steven

+0

es muy obvio que desea la manera más fácil de hacerlo ... no tiene sentido agregarlo a la pregunta. –

Respuesta

21

Por favor, POR FAVOR, no cometa el error de pensar que IP == idioma. Mire en primer lugar el encabezado de idioma de aceptación de los navegadores, luego la cadena de identificación del navegador que puede contener el idioma del sistema operativo, y solo luego tome en cuenta la dirección IP. En casi el 100% de todos los casos, el encabezado de aceptación del idioma del navegador estará presente y será suficiente.

Y siempre le da al usuario la opción de cambiar a otro idioma.

Al margen del caso simple de un extranjero en el extranjero, ¿cómo se determina el idioma para Bélgica, donde hablan francés, holandés y alemán? (Tal vez eso no se aplica a su caso, pero solo filosóficamente :)).

+0

+1 para siempre dar al usuario la opción de cambiar a otro idioma ... esta es la mejor manera .. :) – RameshVel

+0

Lo mismo en Suiza (alemán, francés, italiano) – Benjol

+0

¿Qué pasa si realmente quiero encontrar el idioma hablado en un área basada en la dirección IP? Digamos que tengo tal requisito. –

0

echar un vistazo al módulo de MaxMind GeoIP para PHP (http://www.maxmind.com/app/php), en cuanto a la estructura de datos tal vez tecléelo a el código de país ISO-3166-1 que devuelve apache_note("GEOIP_COUNTRY_CODE");.

+0

Un código de país no es suficiente: países como Bélgica y Suiza tienen más de un idioma oficial. – bart

0

Es probable que desee utilizar algún tipo de base de datos de geocodificación de IP (example).

0

Suponiendo que puede convertir rangos de IP a una de sus opciones de idioma, puede hacerlo (todas las respuestas anteriores): tener todos sus mensajes en las aplicaciones almacenados en una matriz asociativa de este formulario.

$MESSAGES[$USER_LANGUAGE][$msgId]

donde $USER_LANGUAGE puede ser chino, japonés, o Inglés (o cualquier otro enum equivalente). $msgId pueden ser cosas como "login.successful", "login.fail" etc. Siempre que muestre mensajes al usuario no muestre cadenas codificadas, haga una referencia a la variable usando el $msgId.

Puede acceder a ella como una variable global O puede crear una función que tome el $ msgId como parámetro y devuelva el mensaje, $USER_LANGUAGE también puede ser una variable global (que se configura la primera vez que el usuario viene en).

2

Sí, por favor no lo hagas ... Google hace esto y suena molesto ... Siempre obtengo la versión tailandesa en lugar del inglés de mi navegador.

Utilice los encabezados http del navegador.

+0

Google es horrible en este sentido. Incluso si logró cambiar la interfaz a un idioma diferente, volverá a la configuración regional de su IP cuando haga clic en un servicio diferente (como la página principal de Google -> Mapas). – deceze

2
<?php 
$ln = split(",",$_SERVER["HTTP_ACCEPT_LANGUAGE"]); 
print_r($ln[0]); 
?> 
+2

Para aquellos que llegaron aquí ahora (como yo), 'split()' ahora está en desuso (PHP 5.3.0). 'explde()' funciona bien. –

Cuestiones relacionadas