Escribo este post, después de estar varios días pegándome, intentando que una aplicación flex reconociera el idioma de mi navegador.
En el 90% de las páginas, recomiendan hacerlo de manera rápida y sencilla usando javascript, utilizando las siguientes propiedades del objeto navigator:
navigator.browserLanguage;(IE)
navigator.language (Mozilla)
Mi sorpresa fue que en el IE8 en que probaba, cuando cambiaba el idioma(Herramientas->Opciones de Internet ->Idioma), siempre me devolvía los mismos valores “es”, … Desesperado por el error, y por no encontrar información sobre sucesos parecidos en la red, decidí buscar alternativas.
Investigando, descubrí que en el navegador al realizar una petición http, existía una cabecera que tenía la información que buscaba, “Accept-Language”. (No sólo te da el valor del idioma por defecto, sino el listado de idiomas por orden de preferencia, por lo que si no tienes un idioma para la aplicación en concreto, puedes seguir buscando en la lista de idiomas del usuario). Así que busqué, de que manera podía recuperar ese valor.
En Javascript, existe el objeto XMLHttpRequest , que es una interfaz empleada para realizar peticiones HTTP y HTTPS a servidores Web. Como la cabecera que me interesaba, iba en la Request y no en el Response, no la podía obtener de manera directa. Por este motivo, utilizamos un servlet, que recibiría mi petición http, recogería mi cabecera Accept-Language, y me la insertará en el response del XMLHttpRequest, que posteriormente recogería en Javascript, para enviarlo a mi aplicación Flex.
Javascript:
var xhr = new XMLHttpRequest();
…
xhr.open(“POST”, urlServlet, false);
/*
Internet Explorer caches the results of HTTP GET requests in the Temporary Internet Files (TIF) folder. In most cases, caching improves performance for data that will not change frequently. To guarantee that the results are not cached, use POST.(Fuente. http://msdn.microsoft.com/en-us/library/ms536648%28VS.85%29.aspx)
*/
xhr.onreadystatechange = updatePage; // Lanzala funcion si el estado cambia
xhr.send(null);
…
function updatePage() {
language = xhr.getResponseHeader(“Accept-Language”);
}
Java Servlet:
String clientLanguage = request.getHeader(“Accept-Language”);
request.setHeader(“Accept-Language”, clientLanguage);
Flex:
Desde Flex, simplemente invocaremos la función Javascript, al iniciar la aplicación usando ExternalInterface.call(‘getLanguage’); // Siendo getLanguage la función JS
Espero que os sirva de ayuda y si alguien sabe a que se debe que la propiedad navigator, no detecte el cambio de idioma en IE-7-8 que no dude en comentármelo.
Un saludo
Comentarios recientes