Я использую следующие пакеты для многоязычных решений.
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 () для изменения языка.
и это сработало.
Хотелось бы знать, правильно я это делаю или нет? или если есть лучшее решение