如何在Express应用中重用i18next实例

时间:2019-06-24 15:44:49

标签: express i18next

我有一个想要国际化的快速后端。我要:

  • 在一处初始化我的i18next实例
  • 在代码中的多个位置重复使用该实例
  • 我还想在模型代码中使用它们,而不仅仅是在路线中使用

这听起来像是一个原始问题,但是即使阅读了i18next文档,我仍然不知道应该如何重用已初始化的i18next实例。如果使用i18next-express-middleware,则可以在路由中使用t()方法。很好,但是如果我想在模型或其他文件中使用它,例如在模型中,该怎么办?

我不喜欢通过参数将其传递给每个模型方法的想法。我不能简单地在每个文件中执行import i18next from 'i18next',因为它将返回一个新实例。我无法在异步函数中将实例初始化然后返回它的实例中创建js文件,因为我无法通过app.js(我的快速应用程序的根文件)中的await调用异步函数。我是否要在未为其构建用例的情况下强制使用它?

谢谢您的提示。

1 个答案:

答案 0 :(得分:0)

在app.js中:

const express = require('express');
const i18next = require('i18next');
const i18nextMiddleware = require('i18next-express-middleware');
const app = express();

首先配置i18next

i18next
  .use(i18nextMiddleware.LanguageDetector)
  .init({
    preload: ['de', 'en'],
    fallbackLng: 'en',
    resources: {
      en: {
        translation: {
          key: 'hello world'
        }
      }, // ...
    },
    detection: {
      // order and from where user language should be detected
      order: [/*'path', 'session', */ 'querystring', 'cookie', 'header'],

      // keys or params to lookup language from
      lookupQuerystring: 'lng',
      lookupCookie: 'i18next',
      lookupHeader: 'accept-language',
      lookupSession: 'lng',
      lookupPath: 'lng',
      lookupFromPathIndex: 0,

      // cache user language
      caches: false, // ['cookie']

      // optional expire and domain for set cookie
      cookieExpirationDate: new Date(),
      cookieDomain: `${config.Host.hostname.replace(/^https?:\/\//, '')}`,
      cookieSecure: true // if need secure cookie
    }
  });

然后注册中间件:

app.use(
  i18nextMiddleware.handle(i18next, {
    // options
  })
);

并添加用于设置i18next实例的自定义中间件:

app.use((req, res, next) => {
  i18next.changeLanguage(req.language);
});

从文档中收集

expressjs.com/en/guide/using-middleware.html
github.com/i18next/i18next
github.com/i18next/i18next-express-middleware