diff options
author | Samuel <34555296+Flam3rboy@users.noreply.github.com> | 2023-03-17 17:49:12 +0100 |
---|---|---|
committer | Samuel <34555296+Flam3rboy@users.noreply.github.com> | 2023-03-17 17:50:59 +0100 |
commit | d086c053bbfb50a24403a270ce8d45f04ef000b7 (patch) | |
tree | 5b180ba118860cda558bf3e76e9075783f674fef | |
parent | perf: cache jwt secret as key (diff) | |
download | server-d086c053bbfb50a24403a270ce8d45f04ef000b7.tar.xz |
perf: custom i18next middleware that only initializes when needed
-rw-r--r-- | package.json | 1 | ||||
-rw-r--r-- | src/api/middlewares/Translation.ts | 56 |
2 files changed, 38 insertions, 19 deletions
diff --git a/package.json b/package.json index 5578849a..03cc7981 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,6 @@ "form-data": "^4.0.0", "i18next": "^22.4.12", "i18next-fs-backend": "^2.1.1", - "i18next-http-middleware": "^3.2.1", "image-size": "^1.0.2", "json-bigint": "^1.0.0", "jsonwebtoken": "^9.0.0", diff --git a/src/api/middlewares/Translation.ts b/src/api/middlewares/Translation.ts index 999d42a3..bf6ea034 100644 --- a/src/api/middlewares/Translation.ts +++ b/src/api/middlewares/Translation.ts @@ -18,11 +18,20 @@ import fs from "fs"; import path from "path"; -import i18next from "i18next"; -import i18nextMiddleware from "i18next-http-middleware"; +import i18next, { TFunction } from "i18next"; import i18nextBackend from "i18next-fs-backend"; import { Router } from "express"; +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Express { + interface Request { + t: TFunction; + language?: string; + } + } +} + const ASSET_FOLDER_PATH = path.join(__dirname, "..", "..", "..", "assets"); export async function initTranslation(router: Router) { @@ -34,21 +43,32 @@ export async function initTranslation(router: Router) { .filter((x) => x.endsWith(".json")) .map((x) => x.slice(0, x.length - 5)); - await i18next - .use(i18nextBackend) - .use(i18nextMiddleware.LanguageDetector) - .init({ - preload: languages, - // debug: true, - fallbackLng: "en", - ns, - backend: { - loadPath: - path.join(ASSET_FOLDER_PATH, "locales") + - "/{{lng}}/{{ns}}.json", - }, - load: "all", - }); + await i18next.use(i18nextBackend).init({ + preload: languages, + // debug: true, + fallbackLng: "en", + ns, + backend: { + loadPath: + path.join(ASSET_FOLDER_PATH, "locales") + + "/{{lng}}/{{ns}}.json", + }, + load: "all", + }); - router.use(i18nextMiddleware.handle(i18next, {})); + router.use((req, res, next) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + req.t = (key: string | string[], options?: any) => { + let lng = "en"; + if (req.headers["accept-language"]) { + lng = req.headers["accept-language"].split(",")[0]; + } + req.language = lng; + return i18next.t(key, { + ...options, + lng, + }); + }; + next(); + }); } |