|
|
|
@ -4,22 +4,28 @@ import React, { useEffect } from 'react'; |
|
|
|
|
|
|
|
|
|
import config from 'app/core/config'; |
|
|
|
|
|
|
|
|
|
import { messages } from '../../../locales/en/messages'; |
|
|
|
|
import { messages as fallbackMessages } from '../../../locales/en-US/messages'; |
|
|
|
|
|
|
|
|
|
import { DEFAULT_LOCALE, FRENCH_FRANCE, SPANISH_SPAIN, VALID_LOCALES } from './constants'; |
|
|
|
|
|
|
|
|
|
let i18nInstance: I18n; |
|
|
|
|
|
|
|
|
|
export async function getI18n(locale = 'en') { |
|
|
|
|
export async function getI18n(localInput = DEFAULT_LOCALE) { |
|
|
|
|
if (i18nInstance) { |
|
|
|
|
return i18nInstance; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const validatedLocale = VALID_LOCALES.includes(localInput) ? localInput : DEFAULT_LOCALE; |
|
|
|
|
|
|
|
|
|
// Dynamically load the messages for the user's locale
|
|
|
|
|
const imp = |
|
|
|
|
config.featureToggles.internationalization && |
|
|
|
|
(await import(`../../../locales/${locale}/messages`).catch((err) => { |
|
|
|
|
(await import(`../../../locales/${validatedLocale}/messages`).catch((err) => { |
|
|
|
|
// TODO: Properly return an error if we can't find the messages for a locale
|
|
|
|
|
return err; |
|
|
|
|
})); |
|
|
|
|
i18n.load(locale, imp?.messages || messages); |
|
|
|
|
|
|
|
|
|
i18n.load(validatedLocale, imp?.messages || fallbackMessages); |
|
|
|
|
|
|
|
|
|
// Browser support for Intl.PluralRules is good and covers what we support in .browserlistrc,
|
|
|
|
|
// but because this could potentially be in a the critical path of loading the frontend lets
|
|
|
|
@ -27,16 +33,16 @@ export async function getI18n(locale = 'en') { |
|
|
|
|
// If this isnt loaded, Lingui will log a warning and plurals will not be translated correctly.
|
|
|
|
|
const supportsPluralRules = 'Intl' in window && 'PluralRules' in Intl; |
|
|
|
|
if (supportsPluralRules) { |
|
|
|
|
const pluralsOrdinal = new Intl.PluralRules(locale, { type: 'ordinal' }); |
|
|
|
|
const pluralsCardinal = new Intl.PluralRules(locale, { type: 'cardinal' }); |
|
|
|
|
i18n.loadLocaleData(locale, { |
|
|
|
|
const pluralsOrdinal = new Intl.PluralRules(validatedLocale, { type: 'ordinal' }); |
|
|
|
|
const pluralsCardinal = new Intl.PluralRules(validatedLocale, { type: 'cardinal' }); |
|
|
|
|
i18n.loadLocaleData(validatedLocale, { |
|
|
|
|
plurals(count: number, ordinal: boolean) { |
|
|
|
|
return (ordinal ? pluralsOrdinal : pluralsCardinal).select(count); |
|
|
|
|
}, |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
i18n.activate(locale); |
|
|
|
|
i18n.activate(validatedLocale); |
|
|
|
|
i18nInstance = i18n; |
|
|
|
|
|
|
|
|
|
return i18nInstance; |
|
|
|
@ -52,13 +58,13 @@ export function I18nProvider({ children }: I18nProviderProps) { |
|
|
|
|
// TODO: Use locale preference instead of weekStart
|
|
|
|
|
switch (config.bootData.user.weekStart) { |
|
|
|
|
case 'saturday': |
|
|
|
|
loc = 'es'; |
|
|
|
|
loc = SPANISH_SPAIN; |
|
|
|
|
break; |
|
|
|
|
case 'sunday': |
|
|
|
|
loc = 'fr'; |
|
|
|
|
loc = FRENCH_FRANCE; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
loc = 'en'; |
|
|
|
|
loc = DEFAULT_LOCALE; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|