【发布时间】:2012-08-04 10:31:50
【问题描述】:
用户请求某个页面,我想知道(在服务器端)他/她的浏览器中的语言是什么。所以我可以用正确的消息渲染模板。
在客户端这很简单:
var language = window.navigator.userLanguage || window.navigator.language
【问题讨论】:
标签: javascript node.js express
用户请求某个页面,我想知道(在服务器端)他/她的浏览器中的语言是什么。所以我可以用正确的消息渲染模板。
在客户端这很简单:
var language = window.navigator.userLanguage || window.navigator.language
【问题讨论】:
标签: javascript node.js express
您可以使用 req.headers["accept-language"] 来获取用户在其浏览器中设置的语言/区域设置。
为了更容易获得支持,您可能需要查看locale module。
【讨论】:
request.acceptsLanguages 将包含request.headers['accept-language'] 的解析版本。
【讨论】:
req.acceptedLanguages 来检查用户是否接受单一语言或语言列表。看看:blog.hubii.com/dev-detecting-header-language-on-express-js
使用 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,您可以使用模块 accepts。
var express = require('express'), accepts = require('accepts');
app.get('/translation', function(request, response) {
console.log(accepts(request).languages());
...
});
【讨论】:
req.acceptsLanguages 只是在后台使用接受模块执行 apply,因此如果您不传递任何参数,您将获得相同的语言列表(作为按优先顺序排列)。请注意,虽然没有记录在案的行为,但 Express 文档说 lang 参数是必需的。
您需要解析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 以上)。
【讨论】:
设置请求语言并全局使用的中间件:
// 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)
})
【讨论】: