Files
nanobot/webui/src/i18n/index.ts
T

80 lines
2.4 KiB
TypeScript
Raw Normal View History

import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import {
channelLocaleNamespaces,
channelLocaleResources,
} from "@/channel-plugins/locale-registry";
import {
applyDocumentLocale,
defaultLocale,
fallbackLocale,
LOCALE_STORAGE_KEY,
normalizeLocale,
persistLocale,
resolveInitialLocale,
type SupportedLocale,
} from "./config";
import enCommon from "./locales/en/common.json";
import zhCNCommon from "./locales/zh-CN/common.json";
import zhTWCommon from "./locales/zh-TW/common.json";
import frCommon from "./locales/fr/common.json";
import jaCommon from "./locales/ja/common.json";
import koCommon from "./locales/ko/common.json";
import esCommon from "./locales/es/common.json";
import ptBRCommon from "./locales/pt-BR/common.json";
import viCommon from "./locales/vi/common.json";
import idCommon from "./locales/id/common.json";
export const resources = {
en: { common: enCommon, ...channelLocaleResources("en") },
"zh-CN": { common: zhCNCommon, ...channelLocaleResources("zh-CN") },
"zh-TW": { common: zhTWCommon, ...channelLocaleResources("zh-TW") },
fr: { common: frCommon, ...channelLocaleResources("fr") },
ja: { common: jaCommon, ...channelLocaleResources("ja") },
ko: { common: koCommon, ...channelLocaleResources("ko") },
es: { common: esCommon, ...channelLocaleResources("es") },
"pt-BR": { common: ptBRCommon, ...channelLocaleResources("pt-BR") },
vi: { common: viCommon, ...channelLocaleResources("vi") },
id: { common: idCommon, ...channelLocaleResources("id") },
} as const;
export function currentLocale(): SupportedLocale {
return normalizeLocale(i18n.resolvedLanguage ?? i18n.language ?? defaultLocale);
}
export async function setAppLanguage(locale: SupportedLocale): Promise<void> {
await i18n.changeLanguage(locale);
}
if (!i18n.isInitialized) {
void i18n
.use(initReactI18next)
.init({
resources,
lng: resolveInitialLocale(),
fallbackLng: fallbackLocale,
defaultNS: "common",
ns: ["common", ...channelLocaleNamespaces()],
interpolation: {
escapeValue: false,
},
returnNull: false,
supportedLngs: Object.keys(resources),
});
}
const syncLocaleSideEffects = (language: string) => {
const locale = normalizeLocale(language);
applyDocumentLocale(locale);
persistLocale(locale);
};
syncLocaleSideEffects(currentLocale());
i18n.on("languageChanged", syncLocaleSideEffects);
export { LOCALE_STORAGE_KEY };
export default i18n;