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 { 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;