LanguageProvider.tsx
1 // src/index.js 2 import { i18n } from '@lingui/core'; 3 import { I18nProvider } from '@lingui/react'; 4 import React, { PropsWithChildren, useEffect } from 'react'; 5 6 import { messages } from '../locales/en/messages.js'; 7 8 i18n.load('en', messages); 9 i18n.activate('en'); 10 11 export const DEFAULT_LOCALE = 'en'; 12 13 export const SUPPORTED_LANGUAGES = ['en', 'es', 'fr', 'el']; 14 export const LANG_MAP = { 15 en: 'English', 16 es: 'Spanish', 17 fr: 'French', 18 el: 'Greek', 19 }; 20 21 /** 22 * We do a dynamic import of just the catalog that we need 23 * @param locale any locale string 24 */ 25 export async function dynamicActivateLanguage(locale: string) { 26 const { messages } = await import(`../locales/${locale}/messages.js`); 27 i18n.load(locale, messages); 28 i18n.activate(locale); 29 localStorage.setItem('LOCALE', locale); 30 } 31 32 export const LanguageProvider: React.FC<PropsWithChildren> = ({ children }) => { 33 useEffect(() => { 34 // With this method we dynamically load the catalogs 35 const savedLocale = localStorage.getItem('LOCALE') || DEFAULT_LOCALE; 36 if (i18n.locale !== savedLocale) dynamicActivateLanguage(savedLocale); 37 }, []); 38 39 return <I18nProvider i18n={i18n}>{children}</I18nProvider>; 40 };