2009-03-06 18 views
9

¿Cómo puedo verificar el idioma del navegador del usuario mediante PHP?Comprobando el idioma del navegador por PHP?

tengo que mostrar una página diferente para las personas en Estados Unidos y en Reino Unido.

He probado el siguiente código sin éxito

<?php 
if(ereg("us", $_SERVER["HTTP_ACCEPT_LANGUAGE"])) 
    include('http://page.com/us.txt'); 
else 
    include('http://page.com/uk.txt'); 
?> 

Tengo un código específico para las personas en Estados Unidos y en el Reino Unido para ellos.

+0

Qué quiere decir "gente en los Estados Unidos" o "personas con el lenguaje: en-us"? ¿Qué sucede cuando llevo mi cuaderno en-uk a los Estados Unidos de América? – Piskvor

+0

Me refiero solo a personas que tienen la configuración de idioma como en-us. –

Respuesta

8

probablemente sólo una cuestión de mayúsculas y minúsculas; eregi ('en-us') o preg_match ('/ en-us/i') debería haberlo recogido.

Sin embargo, simplemente buscar 'en-us' en el encabezado puede ser incorrecto a veces, en particular cuando se enumeran los idiomas de EE. UU. Y RU. "Accept-Language" es en realidad un encabezado bastante complicado, en el que realmente querrías un analizador apropiado.

Si tiene PECL todo el trabajo ya está hecho para usted: http://www.php.net/manual/en/function.http-negotiate-language.php

no sé por qué las otras respuestas van para la cabecera User-Agent; esto es completamente falso. User-Agent no tiene el mandato de mantener un valor de idioma en ningún lugar en particular, y para algunos navegadores (por ejemplo, Opera y algunos navegadores menores de los que nunca antes había escuchado llamar 'Internet Explorer'), no lo hará en absoluto. Donde tiene contiene un idioma, ese será el idioma en el que se instaló la compilación del navegador, no el idioma preferido del usuario, que es lo que debería estar mirando. (Esta configuración se establecerá de forma predeterminada en el idioma de compilación, pero puede personalizarla el usuario desde la interfaz de usuario de preferencias).

+0

¿Pretende sustituir HTTP_USER_AGENT por HTTP_ACCEPT_LANGUAGE en el código anterior? –

+0

Funciona mejor con su sugerencia. ¡Gracias! –

2

A Probablemente manera más confiable de hacer esto es realizar una expresión regular en la cadena $_SERVER['HTTP_USER_AGENT'].

<?php 
    if(preg_match('/en-US/', $_SERVER['HTTP_USER_AGENT'])) 
    include('http://page.com/us.txt'); 
    else 
    include('http://page.com/uk.txt'); 
?> 

No están garantizados para obtener una cadena de agente de usuario válido y útil, así que asegúrese de que la sentencia else contiene una alternativa razonable.

+0

Recibo el siguiente error http://dpaste.com/8204/ –

+0

ah, dispara. Vi que aceptaste y luego decepté la respuesta. Parece que olvidé las barras diagonales (como se encuentra el caos). – jonstjohn

3

Prueba esto:

<? 
if(preg_match('/en-us/i', $_SERVER['HTTP_USER_AGENT'])) 
    include('http://page.com/us.txt'); 
else 
    include('http://page.com/uk.txt'); 
?> 
+0

¡Funciona ahora! ¿Tiene su comando hacer en-us mayúsculas y minúsculas? –

+0

HTTP_USER_AGENT coincidirá con la mayoría de los que tienen la versión en-us del * navegador *. Debería comprobar HTTP_ACCEPT_LANGUAGE – Piskvor

+0

Piskvor: No sé, la descarga general de Firefox se muestra como en-GB para mí. – Ross

1

Esta es una solución basada en zend. También funcionará cuando agregue otros idiomas.

<?php 

include_once "Zend/Locale.php"; 

$zend_locale = new Zend_Locale(Zend_Locale::BROWSER); 

// returns en for English, de for German etc. 
echo $browser_language = $zend_locale->getLanguage(); 
echo "<br />\n"; 
// returns en_US for American English, en_GB for British English etc. 
echo $browser_locale = $zend_locale->toString(); 
echo "<br />\n"; 

Solución visto en:

http://www.mpopp.net/2010/07/how-to-detect-the-users-preferred-language-smarter-than-google/

Cuestiones relacionadas