import i18n, { t } from "i18next";
import { initReactI18next } from "react-i18next";
import HttpBackend from "i18next-http-backend";
import { EventType } from "@/types/search";
export const getTranslatedLabel = (
label: string,
type: EventType = "object",
) => {
if (!label) return "";
if (type === "manual") return label;
const normalize = (s: string) =>
s
.trim()
.replace(/[-'\s]+/g, "_")
.replace(/__+/g, "_")
.replace(/^_+|_+$/g, "")
.toLowerCase();
const key = normalize(label);
const ns = type === "audio" ? "audio" : "objects";
return t(key, { ns });
};
i18n
.use(initReactI18next)
.use(HttpBackend)
.init({
fallbackLng: "en",
backend: {
loadPath: `locales/{{lng}}/{{ns}}.json?v=${import.meta.env.VITE_GIT_COMMIT_HASH || "unknown"}`,
},
ns: [
"common",
"objects",
"audio",
"components/auth",
"components/camera",
"components/dialog",
"components/filter",
"components/icons",
"components/input",
"components/player",
"views/chat",
"views/classificationModel",
"views/configEditor",
"views/events",
"views/explore",
"views/exports",
"views/faceLibrary",
"views/live",
"views/motionSearch",
"views/recording",
"views/replay",
"views/search",
"views/settings",
"views/system",
"config/cameras",
"config/global",
"config/groups",
"config/validation",
],
defaultNS: "common",
react: {
transSupportBasicHtmlNodes: true,
transKeepBasicHtmlNodesFor: [
"br",
"strong",
"i",
"em",
"li",
"p",
"code",
"span",
"p",
"ul",
"li",
"ol",
],
},
interpolation: {
escapeValue: false,
},
keySeparator: ".",
parseMissingKeyHandler: (key: string) => {
const parts = key.split(".");
if (parts[0] === "time" && parts[1]?.includes("formattedTimestamp")) {
const formatType = parts[parts.length - 1];
const formatDefaults: Record<string, string> = {
"12hour": "h:mm aaa",
"24hour": "HH:mm",
};
if (formatDefaults[formatType]) {
return formatDefaults[formatType];
}
}
if (parts[0] === "object" || parts[0] === "audio") {
return (
parts[1]
?.split("_")
.map(
(word) =>
word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(),
)
.join(" ") || key
);
}
if (parts.length > 1) {
const lastPart = parts[parts.length - 1];
return lastPart
.split("_")
.map(
(word) =>
word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(),
)
.join(" ");
}
return key
.split("_")
.map(
(word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(),
)
.join(" ");
},
});
export default i18n;