nodejs i18n __ не проблема с функцией ejs, экспресс - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу реализовать многоязычность в моем экспрессе (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 values.

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

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

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

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

Как правило, 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');
})
0 голосов
/ 26 апреля 2019

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

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();
};

Другие файлы у вас такие же.

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

...