не может определить текущий язык (i18next.language) из помощника по рулю?

Я использую следующие пакеты для многоязычных решений.

var i18next = require ('i18next');

var i18nFsBackend = require ('i18next-node-fs-backend');

var i18nMiddleware = require ('i18next-express-middleware');

Поскольку я использую handlebar в качестве механизма шаблонов nodejs, я не могу использовать i18next t ('key') непосредственно в HTML. поэтому я создал помощника для руля, например,

     ```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 () для изменения языка.

и это сработало.

Хотелось бы знать, правильно я это делаю или нет? или если есть лучшее решение


person Kongfupanda    schedule 24.05.2017    source источник


Ответы (1)


Используя функцию дескриптора промежуточного программного обеспечения:

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.

person jamuhl    schedule 24.05.2017