From d09a463e07ac605928565d7103c18d624557479e Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Sun, 18 Dec 2022 07:53:22 +0800 Subject: [PATCH] feat: add i18n entry script --- packages/app/src/libs/i18n/index.ts | 63 +++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 packages/app/src/libs/i18n/index.ts diff --git a/packages/app/src/libs/i18n/index.ts b/packages/app/src/libs/i18n/index.ts new file mode 100644 index 0000000000..f4428a9b09 --- /dev/null +++ b/packages/app/src/libs/i18n/index.ts @@ -0,0 +1,63 @@ +import i18next, { Resource } from 'i18next'; +import { + I18nextProvider, + initReactI18next, + useTranslation, +} from 'react-i18next'; +import { LOCALES } from './resources'; +import type en_US from './resources/en.json'; + +// See https://react.i18next.com/latest/typescript +declare module 'react-i18next' { + interface CustomTypeOptions { + // custom namespace type if you changed it + // defaultNS: 'ns1'; + // custom resources type + resources: { + en: typeof en_US; + }; + } +} + +const STORAGE_KEY = 'i18n_lng'; + +export { i18n, useTranslation, I18nProvider, LOCALES }; + +const resources = LOCALES.reduce( + (acc, { tag, res }) => ({ ...acc, [tag]: { translation: res } }), + {} +); + +const fallbackLng = LOCALES[0].tag; +const standardizeLocale = (language: string) => { + if (LOCALES.find(locale => locale.tag === language)) return language; + if ( + LOCALES.find( + locale => locale.tag === language.slice(0, 2).toLowerCase() + ) + ) + return language; + return fallbackLng; +}; + +const language = standardizeLocale( + localStorage.getItem(STORAGE_KEY) ?? navigator.language +); + +const i18n = i18next.createInstance(); +i18n.use(initReactI18next).init({ + lng: language, + fallbackLng, + debug: process.env['NODE_ENV'] === 'development', + + resources, + interpolation: { + escapeValue: false, // not needed for react as it escapes by default + }, +}); + +i18n.on('languageChanged', lng => { + localStorage.setItem(STORAGE_KEY, lng); +}); + +const I18nProvider = I18nextProvider;