无法从车把助手中检测到当前语言(i18next.language)?
can not detect current language (i18next.language) from handlebar helper?
我正在使用以下包来提供多语言解决方案。
var i18next = require('i18next');
var i18nFsBackend = require('i18next-node-fs-backend');
var i18nMiddleware = require('i18next-express-middleware');
由于我使用 handlebar 作为我的 nodejs 模板引擎,所以我不能在 HTML 中直接使用 i18next t('key')。
所以我创建了一个车把助手,如下所示
```javascript
var i18next = require('i18next');
handlebars.registerHelper('t', function(i18n_key) {
console.log(i18next.language)// always undefined, so i18next.t(i18n_key) always return default translation.
var result = i18next.t(i18n_key);
return new handlebars.SafeString(result);
});
```
但是,问题是该功能无法检测语言更改
我的解决方法
app.js
```javascript
var i18nextInitCallback = function(error, t){
handlebars.registerHelper('t', function(i18n_key) {
if(app.locals.language !== i18next.language){
i18next.changeLanguage(app.locals.language);
}
var result = i18next.t(i18n_key);
return new handlebars.SafeString(result);
});
};
```
路线
```javascript
router.use(function(req, res, next){
res.locals.lng = req.language;
res.app.locals.language = req.language;
next();
});
```
如你所见,我在 Route 上分配 res.app.locals.language = req.language;
然后在车把辅助函数中,我使用 app.locals.language 获取当前语言并使用 i18next.changeLanguage() 更改语言。
它奏效了。
我想知道我这样做对不对?
或者有更好的解决办法
使用中间件的handle函数:
app.use(middleware.handle(i18next, {
// options
}));
res.language 已经为您设置好并且 t 函数已固定为该请求的用户语言。
参见:https://github.com/i18next/i18next-express-middleware/blob/master/src/index.js#L48
查看把手示例:https://github.com/i18next/i18next-express-middleware/tree/master/examples/basic-handlebars
我正在使用以下包来提供多语言解决方案。
var i18next = require('i18next');
var i18nFsBackend = require('i18next-node-fs-backend');
var i18nMiddleware = require('i18next-express-middleware');
由于我使用 handlebar 作为我的 nodejs 模板引擎,所以我不能在 HTML 中直接使用 i18next t('key')。 所以我创建了一个车把助手,如下所示
```javascript
var i18next = require('i18next');
handlebars.registerHelper('t', function(i18n_key) {
console.log(i18next.language)// always undefined, so i18next.t(i18n_key) always return default translation.
var result = i18next.t(i18n_key);
return new handlebars.SafeString(result);
});
```
但是,问题是该功能无法检测语言更改
我的解决方法
app.js
```javascript
var i18nextInitCallback = function(error, t){
handlebars.registerHelper('t', function(i18n_key) {
if(app.locals.language !== i18next.language){
i18next.changeLanguage(app.locals.language);
}
var result = i18next.t(i18n_key);
return new handlebars.SafeString(result);
});
};
```
路线
```javascript
router.use(function(req, res, next){
res.locals.lng = req.language;
res.app.locals.language = req.language;
next();
});
```
如你所见,我在 Route 上分配 res.app.locals.language = req.language; 然后在车把辅助函数中,我使用 app.locals.language 获取当前语言并使用 i18next.changeLanguage() 更改语言。
它奏效了。
我想知道我这样做对不对? 或者有更好的解决办法
使用中间件的handle函数:
app.use(middleware.handle(i18next, {
// options
}));
res.language 已经为您设置好并且 t 函数已固定为该请求的用户语言。
参见:https://github.com/i18next/i18next-express-middleware/blob/master/src/index.js#L48
查看把手示例:https://github.com/i18next/i18next-express-middleware/tree/master/examples/basic-handlebars