本地化nodejs(i18n)

我的代码:

var i18n = require("i18n"); i18n.configure({ locales: ['en', 'ru'], defaultLocale: 'en', directory: __dirname + '/locales', cookiename: 'locale' }); app.configure(function () { app.use(i18n.init); }) app.get('/:locale', function (req, res) { res.cookie('locale', req.params.locale); i18n.setLocale(req.params.locale); res.redirect('/'); }); 

问题是两个:

  1. 在模板不能输出通过

    __(“名称密钥”)

  2. 当转移不是直接通过价值,不要改变文字。 有所有的语言文件

    res.render('index',{name:res .__('name')});

  3. 但是不要切换语言

/ * —– * /

由此产生的代码:

 var i18n = require("i18n"); i18n.configure({ locales: ['en', 'ru'], defaultLocale: 'ru', directory: __dirname + '/locales'//, cookiename: 'locale' }); app.use(function (req, res, next) { res.locals.__ = res.__ = function() { return i18n.__.apply(req, arguments); }; next(); }); app.get('/i18n/:locale', function (req, res) { res.cookie('locale', req.params.locale); i18n.setLocale(req.params.locale); if (req.headers.referer) res.redirect(req.headers.referer); else res.redirect("/"); }); 

这工作

在你的模板中,假设你正在使用JADE,你必须拥有#{} ,就像#{__("Your key")}

我不明白你的第二个问题,头脑改写?

无论如何,如果你想从控制器使用i18n,你必须这样做: res.render('index', {name: res.i18n.__('name') });


切换语言时,您必须:
1-在任何地方保存用户首选项(例如会话或cookie)

 app.get("/i18n/:locale", setLocale); function setLocale(req, res, next){ req.session.locale = req.params.locale; if(req.headers.referer) res.redirect(req.headers.referer); else res.redirect("/"); } 

2-在每次请求时重新应用此更改(仅使用中间件):

 var app = require("express")(); app.use(function(req, res, next){ if(req.session.locale) //check if user has changed i18n settings req.i18n.setLocale(req.session.locale); }) app.get("/", function(req, res, next){ res.render('index', {name: res.i18n.__('name') }); }); app.listen(8000); 

基于@renatoargh的回答,我不得不作出一些修改,但这是最后一块,似乎让事情为我工作。

 // configure i18n i18n.configure({ locales : [ 'en', 'zh' ], directory : __dirname + '/locales' }); // configure app app.configure(function () { // initialize session support app.use(express.cookieParser()); app.use(express.cookieSession({secret: uuid.v4()})); // initialize i18n app.use(i18n.init); // set locale (on every request), if session locale exists // otherwise use default browser setting app.use(function (req, res, next) { // check if user has changed i18n settings if (req.session.locale) { i18n.setLocale(req, req.session.locale); } next(); }); }); // allow MANUAL locale selection app.get("/i18n/:locale", function (req, res) { req.session.locale = req.params.locale; // go back to referrer OR root (/) res.redirect('back'); }); 

注意在configuration中,我已经设置了directory 。 出于某种原因,这是必要的,尽pipe文档声明它是默认的。

另外请注意,我使用的是secret: uuid.v4() ,但是您可以对此值进行硬编码,以便在服务器重新启动时保持持久性。