import i18n, { BackendModule, ResourceKey } from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import { initReactI18next } from "react-i18next"; const backend: BackendModule = { type: "backend", async read(language, namespace, callback) { function error(message: string): void { callback(new Error(message), false); } function success(result: ResourceKey): void { callback(null, result); } if (namespace !== "translation") { error("Namespace must be 'translation'."); } if (language === "en") { const res = ( await import( /* webpackChunkName: "locales-en" */ "./locales/en/translation" ) ).default; success(res); } else if (language === "zh-cn" || language === "zh") { const res = ( await import( /* webpackChunkName: "locales-zh" */ "./locales/zh/translation" ) ).default; success(res); } else { error(`Language ${language} is not supported.`); } }, init() {}, // eslint-disable-line @typescript-eslint/no-empty-function create() {}, // eslint-disable-line @typescript-eslint/no-empty-function }; export const i18nPromise = i18n .use(LanguageDetector) .use(backend) .use(initReactI18next) // bind react-i18next to the instance .init({ fallbackLng: false, lowerCaseLng: true, debug: process.env.NODE_ENV === "development", interpolation: { escapeValue: false, // not needed for react!! }, // react i18next special options (optional) // override if needed - omit if ok with defaults /* react: { bindI18n: 'languageChanged', bindI18nStore: '', transEmptyNodeValue: '', transSupportBasicHtmlNodes: true, transKeepBasicHtmlNodesFor: ['br', 'strong', 'i'], useSuspense: true, } */ }); if (module.hot) { module.hot.accept( ["./locales/en/translation", "./locales/zh/translation"], () => { void i18n.reloadResources(); } ); } export default i18n;