2009-03-23 20 views
101

Tengo un sitio web (Flash) localizado en una docena de idiomas y quiero definir automáticamente un valor predeterminado según la configuración del navegador del usuario para minimizar los pasos para acceder al contenido .La mejor manera de determinar la configuración regional del usuario dentro del navegador

FYI, no puedo usar scripts de servidor debido a restricciones de proxy, así que supongo que JavaScript o ActionScript serían apropiados para resolver el problema.

Preguntas:

  1. lo que sería el mejor método para 'adivinar' configuración regional del usuario?

  2. ¿Existen clases/funciones simples que puedan ayudarme (sin complejos paquetes de localización)? Especialmente para descomponer todos los idiomas posibles en un número más pequeño (las traducciones que tengo) de una manera inteligente.

  3. ¿Hasta qué punto puedo confiar en tal solución?

  4. ¿Alguna otra solución alternativa o sugerencia?

+0

la única forma en que una el navegador puede compartir metadatos sobre su usuario y la solicitud se realiza a través de URL y encabezados. Toma Firefox y echa un vistazo a los encabezados que se envían cuando se realiza una solicitud. Es bastante interesante examinar los encabezados típicos de solicitud y respuesta. –

Respuesta

115

La forma correcta es mirar el encabezado HTTP Accept-Language enviado al servidor. Contiene la lista pedida y ponderada de idiomas que el usuario ha configurado su navegador para preferir.

Desafortunadamente este encabezado no está disponible para leer dentro de JavaScript; todo lo que obtienes es navigator.language, que te dice qué versión localizada del navegador web se instaló. Esto no es necesariamente lo mismo que el idioma (s) preferido (s) del usuario.En IE, en su lugar, obtiene systemLanguage (idioma instalado en el sistema operativo), browserLanguage (igual que language) y userLanguage (región de sistema operativo configurada por el usuario), que son igualmente inútiles.

Si tuviera que elegir entre esas propiedades, me olfatear para userLanguage primero, cayendo de nuevo a language y sólo después de eso (si los no encontró ningún idioma disponible) en busca de browserLanguage y finalmente systemLanguage.

Si usted puede poner un script del lado del servidor en otro lugar en la red que simplemente lee el encabezado Accept-Language y escupe de nuevo como un archivo JavaScript con el valor de encabezado en la cadena, por ejemplo .:

var acceptLanguage= 'en-gb,en;q=0.7,de;q=0.3'; 

, entonces podría incluir un script < src> apuntando a ese servicio externo en el HTML, y usar JavaScript para analizar el encabezado del idioma. Sin embargo, no conozco ningún código de biblioteca existente para hacer esto, ya que el análisis Accept-Language casi siempre se realiza en el lado del servidor.

Independientemente de lo que termine haciendo, sin duda necesita una anulación del usuario, ya que siempre adivinará mal para algunas personas. A menudo es más fácil poner la configuración de idioma en la URL (por ejemplo, http: //www.example.com/en/site vs http: //www.example.com/de/site), y dejar que el usuario haga clic en enlaces entre los dos. A veces desea una URL única para ambas versiones de idioma, en cuyo caso debe almacenar la configuración en las cookies, pero esto puede confundir a los agentes de usuario sin compatibilidad con cookies y motores de búsqueda.

+0

¡Gracias! Todo tiene mucho sentido. –

31

This article sugiere las siguientes propiedades del navegador objeto del navegador:

  • navigator.language (Netscape - Navegador de localización)
  • navigator.browserLanguage (IE-Específica - Navegador de idioma localizado)
  • navigator.systemLanguage (Específico de IE - Sistema operativo Windows - Idioma traducido)
  • navi gator.userLanguage

Desplázalas en una función javascript y podrás adivinar el idioma correcto, en la mayoría de los casos. Asegúrate de degradar con elegancia, por lo que debes tener un div que contenga tus enlaces de elección de idioma, de modo que si no hay javascript o si el método no funciona, el usuario aún puede decidir. Si funciona, solo oculta el div.

El único problema de hacer esto en el lado del cliente es que, o bien servir hasta todos los idiomas para el cliente, o si tiene que esperar hasta que el script se ejecute y se detecta el idioma antes de solicitar la versión correcta. Quizás servir la versión de idioma más popular como predeterminado irritaría a la menor cantidad de personas.

Editar: Recomendaría la sugerencia de cookie de Ivan, pero asegúrese de que el usuario siempre pueda cambiar el idioma más tarde; no todos prefieren el idioma predeterminado de su navegador.

+0

Gracias Phil por tus sugerencias. En cuanto al artículo, tiene 6 años ... ¿no estoy seguro de poder confiar en él? –

+1

Sospecho que los navegadores modernos son compatibles con navigator.language. Mi navegador (FF3 en Ubuntu 8.10) informa 'en-GB'. Si alguien todavía está utilizando IE6 - alrededor del 20% de las personas - entonces vale la pena permitir eso. IE6 apareció hace 8 años. –

+0

IE 8 no es compatible con navigator.language. Quizás IE 9 lo hará? – spig

-4

Para Flash que tiene flash.system.Capabilities.language — consideran el OS language detection a suposición local approprieate.

31

En Chrome y Firefox 32+, navigator.languages ​​contiene una matriz de configuraciones regionales en orden de preferencia del usuario, y es más preciso que navigator.language, sin embargo, para hacerlo compatible con versiones anteriores (Chrome/IE/Firefox/Safari probado)), a continuación, utilizar esto:

function getLang() 
{ 
if (navigator.languages != undefined) 
return navigator.languages[0]; 
else 
return navigator.language; 
} 
+1

Esto no funciona para IE9 e IE10. Para ellos, debes examinar navigator.browserLanguage en su lugar. – user393274

+0

OneLiner: 'function getLang() {return (navigator.language || navigator.languages ​​[0]); } ' – JorgeGarza

+3

@ChStark ¿No debería ser' return navigator.languages ​​[0] || navigator.language; '? –

Cuestiones relacionadas