首页 > 解决方案 > 在 Node.js 模型中使用 i18next

问题描述

我想在基于 Node.js + Mongoose + MongoDB 的 Web API 应用程序中使用i18next来返回本地化错误消息。这是我初始化 i18next 的方法app.js

const i18next = require("i18next");
const i18nextBackend = require("i18next-fs-backend");
const i18nextMiddleware = require("i18next-http-middleware");
const i18nConfig = require("./config/i18nConfig.json");
i18next.use(i18nextBackend).init(i18nConfig, (err, t) => {});
app.use(i18nextMiddleware.handle(i18next, {}));

顾名思义,配置文件./config/i18nConfig.json在哪里。i18next

在此之后,我可以导入i18next并使用它的t()方法来翻译控制器中的错误消息,如下所示:

const i18next = require("i18next");
...
const error = new HttpError(i18next.t("messages.user.emailMissing"), 422);
return next(error);

其中HttpError是 Error 加上 HTTP 错误代码,messages.user.emailMissing 是本地化字符串的键。翻译在这里完美运行。

我也想i18next模型中使用,以返回本地化的验证错误消息。这是这样一个模型:

const mongoose = require("mongoose");
const validator = require("validator");
const userSchema = mongoose.Schema({
  ...
  email: {
    type: String,
    required: [true, i18next.t("messages.user.emailMissing")],
    validate: [validator.isEmail, i18next.t("messages.user.emailInvalid")],
  },
  ...
});
module.exports = mongoose.model("User", userSchema);

但是,我不知道如何在模型中引用 i18next。当我尝试像在控制器中一样简单地导入它时,我会得到undefined. 当我像在 app.js 中一样初始化它时,我会得到密钥messages.user.emailMissing而不是翻译。

到目前为止,我没有找到可以向我展示方法的示例。任何想法,指针等表示赞赏!

标签: node.jsmongoosei18next

解决方案


您可以创建一个类实例

// i18n.js

const i18next = require("i18next");
const Backend = require("i18next-node-fs-backend");
const i18nextMiddleware = require("i18next-http-middleware");

class I18nManager {
  t;
  init = ({ app } = {}) => {
    i18next
      .use(Backend)
      .use(i18nextMiddleware.LanguageDetector)
      .init({
        backend: {
          loadPath: "locales/{{lng}}/{{ns}}.json",
        },
        fallbackLng: "en",
        preload: ["en", "es"],
      })
      .then((_t) => (this.t = _t));

    if (app) app.use(i18nextMiddleware.handle(i18next));
  };
}

const i18n = new I18nManager();

module.exports = {
  i18n,
  t: (...args) => i18n.t(...args),
};

然后在 app.js 中初始化 i18next 实例

//app.js

const app = require("express")();
const { i18n } = require("./i18n");

i18n.init({ app });

然后将翻译功能导入您的模型

// model.js

const { t } = require("./i18n");

t("mykey", { lng: "es" })

推荐阅读