используйте i18n-2 в файле node.js вне области видимости - PullRequest
5 голосов
/ 03 апреля 2019

Я пытаюсь прицелиться, чтобы я мог использовать i18n в вызываемых функциях.

У меня ошибка:

(node:15696) UnhandledPromiseRejectionWarning: TypeError: i18n.__ is not a function

Как мне сделать так, чтобы i18n работал внутри функций и не нуждался в требовании?

Server.js:

var    i18n = require('i18n-2');

global.i18n = i18n;
i18n.expressBind(app, {
    // setup some locales - other locales default to en silently
    locales: ['en', 'no'],
    // change the cookie name from 'lang' to 'locale'
    cookieName: 'locale'
});

app.use(function(req, res, next) {
    req.i18n.setLocaleFromCookie();
    next();
});

//CALL another file with some something here.

otherfile.js:

somefunction() {
               message = i18n.__("no_user_to_select") + "???";

}

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

1 Ответ

4 голосов
/ 12 апреля 2019

Если вы внимательно прочитаете документы в разделе Использование с Express.js , это четко документирует, как оно используется.После привязки i18n к экспресс-приложению через i18n.expressBind, i18n становится доступным через объект req, доступный для всех промежуточных программных продуктов экспрессии, таких как:

req.i18n.__("My Site Title")

Так что somefunction должен быть либо промежуточным ПОнапример:

function somefunction(req, res, next) {
  // notice how its invoked through the req object
  const message = req.i18n.__("no_user_to_select") + "???";
  // outputs -> no_user_to_select???
}

Или вам нужно явно передать объект req через промежуточное ПО, например:

function somefunction(req) {
  const message = req.i18n.__("no_user_to_select") + "???";
  // outputs -> no_user_to_select???
}

app.use((req, res, next) => {
  somefunction(req);
});

Если вы хотите использовать i18n напрямую, вам нужно instantiate это как документировано, как

const I18n = require('i18n-2');

// make an instance with options
var i18n = new I18n({
    // setup some locales - other locales default to the first locale
    locales: ['en', 'de']
});

// set it to global as in your question
// but many advise not to use global
global.i18n = i18n;

// use anywhere
somefunction() {
  const message = i18n.__("no_user_to_select") + "???";
  // outputs -> no_user_to_select???
}

Многие препятствуют использованию глобальных.

// international.js
// you can also export and import
const I18n = require('i18n-2');

// make an instance with options
var i18n = new I18n({
    // setup some locales - other locales default to the first locale
    locales: ['en', 'de']
});

module.exports = i18n;

// import wherever necessary
const { i18n } = require('./international');
...