node.js - 在 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
而不是翻译。
到目前为止,我没有找到可以向我展示方法的示例。任何想法,指针等表示赞赏!
解决方案
您可以创建一个类实例
// 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" })
推荐阅读
- c++ - 轮询 recvfrom(), sendto()
- ignite - 点燃:在缓存中放置 10 次操作时从缓存中删除数据
- python - 为什么一个功能起作用而另一个不起作用?可变性或不变性在这里如何工作?
- c++ - 除法函数返回错误值
- sqlite - 连接到 SQlite 数据库并每天提取信息
- virtualhost - 设置 cloudflare 虚拟主机后 Cloudant 基本身份验证不起作用
- php - Laravel 从数据库中动态填充复选框列表
- jquery - 如何在 th 标签内的 div 标签中垂直对齐文本?
- sql - 查找前一个值的 SQL 脚本,不一定是前一行
- swift - Swift 从类型引用中获取结构属性