Keystone.js + i18n。 在渲染视图之前获取当前语言环境

我正在尝试将i18n包含在keystone.js应用程序中。 我这样做像这个例子https://gist.github.com/JedWatson/9191081 ,它的工作原理,但我的问题是获取当前的区域设置。 我正在使用中间件通过url param设置区域设置:

// middleware.js exports.setLocale = function (req, res, next) { if (req.params.lang) { req.setLocale(req.params.lang); } else res.redirect('/ru/'); next(); }; // index.js keystone.pre('render', middleware.setLocale); 

和路由

 app.get('/:lang/', routes.views.index); app.get('/:lang/blog/:category?', routes.views.blog); app.get('/:lang/blog/post/:post', routes.views.post); ... 

默认语言环境是'ru'。 但在我看来

 view.on('render', function (next) { console.log('on render', req.getLocale()); next(); }); console.log('before render', req.getLocale()); view.render('blog'); 

在路线/en/blog输出

 ------------------------------------------------ KeystoneJS Started: qalqan is ready on default port 3000 ------------------------------------------------ before render ru on render en GET /en/blog 304 373ms 

所以,据我所知,语言环境更改后,varibales发送查看。 是否有任何方式来设置它之前呈现? 我知道,我可以通过在每个视图url param lang req.params得到它,但我想通过所有视图的中间件做到这一点。

更新:由于i18n版本0.7.0你的代码应该工作。

这似乎有点反直觉,但我认为你不应该触摸路由,以避免重复的lang参数。

尽pipe你正走在正确的道路上,我也是这样做的:

 // routes/middleware.js exports.detectLang = function(req, res, next) { var match = req.url.match(/^\/(de|en)([\/\?].*)?$/i); if (match) { req.setLocale(match[1]); // Make locale available in template // (necessary until i18n 0.6.x) res.locals.locale = req.getLocale(); // reset the URL for routing req.url = match[2] || '/'; } (else) { // Here you can redirect to default locale if you want } next(); } 

在定义所有其他res.locals之前,先使用中间件:

 // routes/index.js keystone.pre('routes', i18n.init); keystone.pre('routes', middleware.detectLang); 

现在你可以用'/' + res.locals.locale预先指定所有的URL,并且用户将在你的应用程序周围的任何位置保持它们的语言环境。