#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();
};
Другие файлы у вас одинаковые.
Надеюсь быть полезным.