2012-08-07 19 views

Respuesta

45

Puede utilizar req.headers [ "accept-language"] para obtener el idioma/locale el usuario ha establecido en su navegador.

Para una compatibilidad más fácil, es posible que desee consultar un locale module.

+1

req.headers ["accept-language"] devuelve: "uk, ru; q = 0.8, en-us; q = 0.5, en; q = 0.3" El idioma seleccionado es "uk". ¿Cómo obtener este idioma de la lista? –

+4

@OlegDats El módulo de configuración regional le ayudará a analizar eso, pero básicamente significa que el usuario desea las configuraciones regionales (en orden de preferencia) uk (UK English), ru (Russian), en-us (US English), en (plain inglés), q es un factor de ponderación, más alto q significa mayor preferencia. –

+9

@JoachimIsaksson uk no es inglés británico, eso sería 'en-gb'. Probablemente uk es ucraniano. Las primeras dos letras son siempre lanuages, no regiones. – UpTheCreek

22

request.acceptsLanguages contendrá una versión analizada de request.headers['accept-language'].

Ver: http://expressjs.com/en/api.html#req.acceptsLanguages

+2

El paquete subyacente es negociador https://github.com/federomero/negotiator –

+5

ya no es cierto en Express 4 – Offirmo

+1

En Express 4 puede utilizar 'req.acceptedLanguages' como una forma de comprobar si el usuario acepta una sola o una lista de idiomas. Échale un vistazo: http://blog.hubii.com/dev-detecting-header-language-on-express-js/ – miduga

15

Con Express 4.x, puede utilizar la estructura en req.acceptsLanguages(lang [, ...]) para comprobar si se aceptan ciertos idiomas.

var express = require('express'); 
app.get('/translation', function(request, response) { 
    var lang = request.acceptsLanguages('fr', 'es', 'en'); 
    if (lang) { 
     console.log('The first accepted of [fr, es, en] is: ' + lang); 
     ... 
    } else { 
     console.log('None of [fr, es, en] is accepted'); 
     ... 
    } 
}); 

Para obtener la lista de todos los idiomas aceptados, utilizando 4.x Express, puede utilizar el módulo accepts.

var express = require('express'), accepts = require('accepts'); 
app.get('/translation', function(request, response) { 
    console.log(accepts(request).languages()); 
    ... 
}); 
+0

En realidad, 'req.acceptsLanguages' solo hace una' apply' usando el módulo accept-the- hood, así que si no le pasa ningún argumento obtendrá la misma lista de idiomas (como una matriz en orden de preferencia).Sin embargo, tenga en cuenta que no se documenta el comportamiento, los documentos Express dicen que se requiere el argumento 'lang'. – Inkling

0

Tendría que analizar la cadena en req.headers["accept-language"]. Lo cual le dará una lista de prioridad de los idiomas preferidos del cliente. También puede marcar req.acceptsLanguages(lang [, ...]) si su idioma es compatible o no.

Recomiendo utilizar express-request-language para hacer cualquier trabajo de búsqueda de idiomas, ya que podría ser muy difícil hacerlo bien desde el principio.

La mayoría de las veces, igualar un idioma no es suficiente. Un usuario puede querer cambiar un idioma preferido. express-request-language le ayudan a almacenar un idioma preferido en una cookie, también le da a su servidor una ruta URL para cambiar un idioma preferido.

Todos arriba funcionalidad se puede hacer con sólo un par de líneas de código:

app.use(requestLanguage({ 
    languages: ['en-US', 'zh-CN'], 
    cookie: { 
    name: 'language', 
    options: { maxAge: 24*3600*1000 }, 
    url: '/languages/{language}' 
    } 
})); 

En caso de no coincidencia, el middleware también coincidirá con un idioma predeterminado (en-US arriba).

Cuestiones relacionadas