节点js永久区域设置更改

时间:2016-08-09 10:03:16

标签: node.js internationalization

我正在使用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');
});

或者我必须在每个用户的数据库中存储区域设置?

1 个答案:

答案 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-LanguageAccept-Language设置语言,并使用req.acceptsLanguage()获取。