JavaScript para detectar la preferencia de idioma del navegador [duplicado]
He estado intentando detectar la preferencia de idioma del navegador usando JavaScript.
Si configuro el idioma del navegador en IE en Tools>Internet Options>General>Languages
, ¿cómo leo este valor usando JavaScript?
El mismo problema para Firefox. No puedo detectar la configuración para tools>options>content>languages
usar navigator.language
.
Usando navigator.userLanguage
, detecta la configuración realizada a través de
Start>ControlPanel>RegionalandLanguageOptions>Regional Options
la pestaña.
He probado con navigator.browserLanguage
y navigator.systemLanguage
pero ninguno devuelve el valor de la primera configuración ( Tools>InternetOptions>General>Languages
)
Encontré un enlace que analiza esto en detalle, pero la pregunta sigue sin respuesta :(
Creo que el principal problema aquí es que la configuración del navegador en realidad no afecta la navigator.language
propiedad que se obtiene mediante javascript.
Lo que sí afectan es el encabezado HTTP 'Accept-Language', pero parece que este valor no está disponible en absoluto a través de JavaScript. (Probablemente por qué @anddoutoi afirma que no puede encontrar una referencia que no involucre el lado del servidor).
He codificado una solución alternativa: he creado un script del motor de aplicaciones de Google en http://ajaxhttpheaders.appspot.com que le devolverá los encabezados de solicitud HTTP a través de JSONP.
(Nota: este es un truco que solo debe usarse si no tiene un servidor disponible que pueda hacer esto por usted. En general, no debe realizar llamadas a archivos javascript alojados por terceros en sus páginas a menos que tenga un nivel muy alto nivel de confianza en el anfitrión.)
Tengo la intención de dejarlo allí a perpetuidad, así que siéntete libre de usarlo en tu código.
Aquí hay un código de ejemplo (en jQuery) sobre cómo podría usarlo
$.ajax({
url: "http://ajaxhttpheaders.appspot.com",
dataType: 'jsonp',
success: function(headers) {
language = headers['Accept-Language'];
nowDoSomethingWithIt(language);
}
});
Espero que alguien encuentre esto útil.
Editar: he escrito un pequeño complemento jQuery en github que incluye esta funcionalidad: https://github.com/dansingerman/jQuery-Browser-Language
Edición 2: como se solicitó aquí está el código que se ejecuta en AppEngine (realmente súper trivial):
class MainPage(webapp.RequestHandler):
def get(self):
headers = self.request.headers
callback = self.request.get('callback')
if callback:
self.response.headers['Content-Type'] = 'application/javascript'
self.response.out.write(callback + "(")
self.response.out.write(headers)
self.response.out.write(")")
else:
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("I need a callback=")
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=False)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
Edit3: abra el código del motor de la aplicación aquí: https://github.com/dansingerman/app-engine-headers
var language = window.navigator.userLanguage || window.navigator.language;
alert(language); //works IE/SAFARI/CHROME/FF
window.navigator.userLanguage
es solo IE y es el idioma configurado en el Panel de control de Windows - Opciones regionales y NO el idioma del navegador, pero se podría suponer que un usuario que usa una máquina con la configuración regional de Windows configurada en Francia es probablemente un usuario francés.
navigator.language
es Firefox y todos los demás navegadores.
Algún código de idioma: 'it'
= italia, 'en-US'
= inglés EE. UU., etc.
Como lo señalaron rcoup y The WebMacheter en los comentarios a continuación, esta solución no le permitirá discriminar entre dialectos del inglés cuando los usuarios ven un sitio web en navegadores distintos a IE.
window.navigator.language
(Chrome/FF/Safari) siempre devuelve el idioma del navegador y no el idioma preferido del navegador, pero: "es bastante común que los angloparlantes (gb, au, nz, etc.) tengan una versión en-us de Firefox/Chrome/Safari". Por lo tanto window.navigator.language
, seguirá regresando en-US
incluso si el idioma preferido del usuario es en-GB
.
Actualización del año 2014.
Ahora hay una manera de obtener Accept-Languages en Firefox y Chrome usando navigator.languages (funciona en Chrome >= 32 y Firefox >= 32)
Además, navigator.language en Firefox estos años refleja el idioma de contenido más preferido, no el idioma de la interfaz de usuario. Pero como esta noción aún no es compatible con otros navegadores, no es muy útil.
Por lo tanto, para obtener el idioma de contenido preferido cuando sea posible y utilizar el idioma de la interfaz de usuario como alternativa:
navigator.languages
? navigator.languages[0]
: (navigator.language || navigator.userLanguage)
Encontré este fragmento de código para detectar el idioma del navegador en el módulo Angular Translate , cuya fuente puede encontrar aquí . Modifiqué ligeramente el código reemplazando angular.isArray con Array.isArray para hacerlo independiente de la biblioteca Angular.
var getFirstBrowserLanguage = function () {
var nav = window.navigator,
browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],
i,
language;
// support for HTML 5.1 "navigator.languages"
if (Array.isArray(nav.languages)) {
for (i = 0; i < nav.languages.length; i++) {
language = nav.languages[i];
if (language && language.length) {
return language;
}
}
}
// support for other well known properties in browsers
for (i = 0; i < browserLanguagePropertyKeys.length; i++) {
language = nav[browserLanguagePropertyKeys[i]];
if (language && language.length) {
return language;
}
}
return null;
};
console.log(getFirstBrowserLanguage());
let lang = window.navigator.languages ? window.navigator.languages[0] : null;
lang = lang || window.navigator.language || window.navigator.browserLanguage || window.navigator.userLanguage;
let shortLang = lang;
if (shortLang.indexOf('-') !== -1)
shortLang = shortLang.split('-')[0];
if (shortLang.indexOf('_') !== -1)
shortLang = shortLang.split('_')[0];
console.log(lang, shortLang);
Solo necesitaba el componente principal para mis necesidades, pero puedes usar fácilmente la cadena completa. Funciona con los últimos Chrome, Firefox, Safari e IE10+.