nodejs i18n __ не является функциональной проблемой с ejs, экспресс

#node.js #express #internationalization #underscore.js #ejs

#node.js #экспресс #интернационализация #underscore.js #ejs

Вопрос:

Я хочу реализовать многоязычность в моем express (nodejs) Однако я не могу понять, почему мои ejs не понимают подчеркивания «__».

app.js

 var i18n = require('./i18n');
app.use(i18n);
  

i18n.js

 var i18n = require('i18n');

i18n.configure({
  locales:['fr', 'en'], 
  directory: __dirname   '/locales', 
  defaultLocale: 'en',
  cookie: 'lang'
});

module.exports = function(req, res, next) {
  i18n.init(req, res);
  res.locals.__ = res.__;
  var current_locale = i18n.getLocale();
  return next();
};
  

router.js

 console.log(res.__('hello'));    // print ok
console.log(res.__('helloWithHTML')); // print ok

req.app.render('index', context, function(err, html) {
  res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});  
  res.end(html);
});
  

/locales/en.json

 {
  "hello": "Hello.",
  "helloWithHTML": "helloWithHTML."
}
  

index.ejs

 <%= __("hello")%>
  

Я получил сообщение об ошибке для этого:

 __ is not defined at eval (eval at compile (/home/nodejs/node_modules/ejs/lib/ejs.js:618:12), :41:7) at returnedFn 
  

Однако я вижу сообщение журнала от маршрутизатора:

 console.log(res.__('hello'));  // print out Hello
console.log(res.__('helloWithHTML')); // print out helloWithHTML
  

Он работает нормально, я вижу оба hello и helloWithHTML значения.

Но ejs вообще не распознает i18n переменную.

Как я могу решить мою проблему?

Комментарии:

1. Для меня похоже, что ваше промежуточное программное обеспечение не требуется. Вы можете переписать его следующим образом module.export = i18n , а затем в app.js напишите app.use(i18n.init); , это просто для упрощения, я не знаю, в чем проблема с текущим кодом.

2. @Starke Если я добавлю app.use (i18n.init), результат будет тот же: ( мне нужно выяснить, почему эта проблема произошла со мной. Как ни странно, console.log (res.__(‘hello’)) работает нормально, поэтому я думаю, что это связано с ejs или любым другим..

3. да, я тоже так думаю, req.app.render('index') выглядит немного странно для меня, обычно это просто res.render('index');

4. Обычно я использовал для рендеринга промежуточное программное обеспечение. Я также установил свое приложение, подобное этому app.set (‘view engine’, ‘ejs’);

Ответ №1:

Из документов:

В общем случае i18n должен быть присоединен к объекту ответа, чтобы его общедоступный API был доступен в ваших шаблонах и методах. Начиная с версии 0.4.0 i18n пытается сделать это внутренне через i18n.init, как если бы вы делали это в app.configure самостоятельно

Итак, самый простой способ, который вы могли бы использовать, это:

 // i18nHelper.js file <-- you may want to rename the file so it's different from node_modules file
var i18n = require('i18n');

i18n.configure({
  locales:['fr', 'en'], 
  directory: __dirname   '/locales', 
  defaultLocale: 'en',
  cookie: 'lang'
});
module.export = i18n

// app.js
const i18n = require('./i18nHelper.js');
app.use(i18n.init);
  

Или, если вы действительно хотите привязать (самостоятельно):

 // somei18n.js
module.exports = function(req, res, next) {
  res.locals.__ = i18n.__;
  return next();
};

// app.js
const i18nHelper = require('./somei18n.js')
app.use(i18nHelper);

app.get('/somepath', (req, res) => {
  res.render('index');
})
  

Комментарии:

1. Спасибо, но если я объявлю module.export = i18n напрямую, я только что увидел сообщение об ошибке о «TypeError: app.use () требуется функция промежуточного программного обеспечения», поэтому мне нужно написать app.use(function (req, res, next) { i18n.init (req, res); next(); });

2. не напрямую, я обновил ответ, чтобы отразить и ваш пример

3. Наконец-то я решил свой случай. Я меняю набор символов с ms949 на utf-8 en.json, fr.json, тогда результат в порядке. Поэтому я предполагаю, что i18n чувствительно относится к файлам локализации. В любом случае, моя проблема просто исчезнет. Большое вам спасибо 🙂

Ответ №2:

Вот мое решение.

i18n.js

 var i18n = require('i18n');

i18n.configure({
  locales: ['zh_CN', 'en'],
  directory: __dirname '/locales'
});

module.exports = function(req, res, next) {
  let {lang} = req.query;
  i18n.init(req, res);
  lang = lang ? lang : 'zh_CN';
  i18n.setLocale(req, lang);
  return next();
};
  

Другие файлы у вас одинаковые.

Надеюсь быть полезным.