从车把助手无法检测当前语言(i18next.language)?

时间:2017-05-24 02:53:28

标签: javascript node.js express i18next express-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();
    });

    ```

你可以看到在路由I上分配res.app.locals.language = req.language; 然后在Handlebar helper函数中,我使用app.locals.language获取当前语言并使用i18next.changeLanguage()来更改语言。

它有效。

我想知道我做得对吗? 或者如果有更好的解决方案

1 个答案:

答案 0 :(得分:0)

使用中间件的句柄功能:

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