JavaScript para detectar la preferencia de idioma del navegador [duplicado]

Resuelto Annibigi asked hace 15 años • 26 respuestas

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>languagesusar navigator.language.

Usando navigator.userLanguage , detecta la configuración realizada a través de Start>ControlPanel>RegionalandLanguageOptions>Regional Optionsla pestaña.

He probado con navigator.browserLanguagey navigator.systemLanguagepero 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 :(

Annibigi avatar Jun 25 '09 18:06 Annibigi
Aceptado

Creo que el principal problema aquí es que la configuración del navegador en realidad no afecta la navigator.languagepropiedad 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

DanSingerman avatar Jul 26 '2010 13:07 DanSingerman
var language = window.navigator.userLanguage || window.navigator.language;
alert(language); //works IE/SAFARI/CHROME/FF

window.navigator.userLanguagees 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.languagees 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-USincluso si el idioma preferido del usuario es en-GB.

Marco Demaio avatar Nov 02 '2010 16:11 Marco Demaio

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)
Tim Babych avatar Sep 01 '2014 10:09 Tim Babych

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());
Expandir fragmento

Hamid Tavakoli avatar Mar 17 '2015 17:03 Hamid Tavakoli

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);
Expandir fragmento

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+.

Kristian Williams avatar Nov 12 '2014 14:11 Kristian Williams