57

用户请求一些页面,我想知道(在服务器端)他/她的浏览器中的语言是什么。所以我可以用正确的消息渲染模板。

在客户端很容易:

var language = window.navigator.userLanguage || window.navigator.language
4

5 回答 5

92

您可以使用req.headers["accept-language"]来获取用户在其浏览器中设置的语言/区域设置。

为了更容易获得支持,您可能需要查看locale module

于 2012-08-07T12:05:38.190 回答
34

request.acceptsLanguages将包含request.headers['accept-language'].

请参阅:http ://expressjs.com/en/api.html#req.acceptsLanguages

于 2013-11-12T08:38:26.307 回答
32

使用 Express 4.x,您可以使用req.acceptsLanguages(lang [, ...])中的构建来检查某些语言是否被接受。

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');
        ...
    }
});

要使用 Express 4.x 获取所有接受语言的列表,您可以使用模块accept

var express = require('express'), accepts = require('accepts');
app.get('/translation', function(request, response) {
    console.log(accepts(request).languages());
    ...
});
于 2015-11-15T17:53:38.377 回答
3

设置请求语言并在全局范围内使用的中间件:

// place this middleware before declaring any routes
app.use((req, res, next) => {
    // This reads the accept-language header
    // and returns the language if found or false if not
    const lang = req.acceptsLanguages('bg', 'en')
    
    if (lang) { // if found, attach it as property to the request
        req.lang = lang
    } else { // else set the default language
        req.lang = 'en'
    }

    next()
})

现在您可以访问“req.lang”

app.get('/', (req, res) => {
    res.send(`The request language is '${req.lang}'`)
})

使用翻译的示例

const translate = {
    en: {
        helloWorld: "Hello World!"
    },
    bg: {
        helloWorld: "Здравей Свят!"
    }
}
app.get('/hello-world', (req, res) => {
    res.send(translate[req.lang].helloWorld)
})
于 2020-12-26T11:54:17.903 回答
0

您需要解析req.headers["accept-language"]. 这将为您提供客户首选语言的优先列表。您还可以检查req.acceptsLanguages(lang [, ...])您的语言是否受支持。

我强烈建议使用express-request-language进行任何语言匹配工作,因为第一次就很难做到。

大多数时候,匹配一种语言是不够的。用户可能想要更改首选语言。express-request-language帮助您将首选语言存储在 cookie 中,它还为您的服务器提供 URL 路径以更改首选语言。

只需几行代码即可完成上述所有功能:

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

如果不匹配,中间件也将匹配默认语言(en-US如上)。

于 2016-09-15T15:55:44.160 回答