import i18n, { BackendModule, FallbackLng, FallbackLngObjList } from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import { initReactI18next } from "react-i18next"; export const availableLocales = [ "ar", "de", "en", "en-GB", "es", "fr", "hi", "hr", "hu", "it", "ja", "ko", "nl", "pl", "pt-BR", "ru", "sl", "sv", "tr", "uk", "vi", "zh-Hans", "zh-Hant", ] as const; const fallbacks = { "zh-HK": ["zh-Hant", "en"], "zh-TW": ["zh-Hant", "en"], zh: ["zh-Hans", "en"], } as FallbackLngObjList; const LazyImportPlugin: BackendModule = { type: "backend", init: function () {}, read: function (language, _, callback) { if (fallbacks[language]) { language = fallbacks[language][0]; } import(`./locales/${language}.json`).then((translation: any) => { callback(null, translation); }); }, }; i18n .use(LazyImportPlugin) .use(LanguageDetector) .use(initReactI18next) .init({ detection: { order: ["navigator"], }, fallbackLng: { ...fallbacks, ...{ default: ["en"] }, } as FallbackLng, }); export default i18n; export type TLocale = (typeof availableLocales)[number];