我正在使用Expressjs和i18n来管理多语言。
这是我的i18n配置:
i18n.js
var i18n = require('i18n');
i18n.configure({
locales:['en', 'fr'],
directory: __dirname + '/../locales',
defaultLocale: 'en',
cookie: 'lang',
});
module.exports = function(req, res, next) {
i18n.init(req, res);
res.locals.__= res.__;
var current_locale = i18n.getLocale();
return next();
};
server.js
var i18n = require('./configs/i18n');
...
app.use(i18n);
实际上,如果我想更改区域设置,我必须为每条路线执行此操作:
app.get('/index', function(req, res){
res.setLocale('fr')
res.render('pages/index');
});
可以使用setLocale()
一次,它会永久更改区域设置吗?
最佳做法是什么?我应该每次都在路线中指定语言吗?例如:
app.get('/:locale/index', function(req, res){
res.setLocale(req.params.locale)
res.render('pages/index');
});
app.get('/:locale/anotherroute', function(req, res){
res.setLocale(req.params.locale)
res.render('pages/anotherroute');
});
或者我必须在每个用户的数据库中存储区域设置?
答案 0 :(得分:2)
您可以使用middlewares来避免重复(将此代码放在路由器之前):
// Fixed locale
app.use(function (req, res, next) {
res.setLocale('fr');
next();
});
// Locale get by URL parameters
app.use(function (req, res, next) {
if (req.params && req.params.locale){
res.setLocale(req.params.locale);
}
next();
});
就个人而言,我更喜欢将本地设置存储在数据库中,它避免了在没有必要数据的情况下权衡请求。
另一种解决方案是使用HTTP标头Content-Language
和Accept-Language
设置语言,并使用req.acceptsLanguage()
获取。