12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import i18next from 'i18next';
- import resourcesToBackend from 'i18next-resources-to-backend';
- import LanguageDetector from 'i18next-browser-languagedetector';
- import type { i18n as i18nType } from 'i18next';
- import { writable } from 'svelte/store';
- const createI18nStore = (i18n: i18nType) => {
- const i18nWritable = writable(i18n);
- i18n.on('initialized', () => {
- i18nWritable.set(i18n);
- });
- i18n.on('loaded', () => {
- i18nWritable.set(i18n);
- });
- i18n.on('added', () => i18nWritable.set(i18n));
- i18n.on('languageChanged', () => {
- i18nWritable.set(i18n);
- });
- return i18nWritable;
- };
- const createIsLoadingStore = (i18n: i18nType) => {
- const isLoading = writable(false);
- // if loaded resources are empty || {}, set loading to true
- i18n.on('loaded', (resources) => {
- // console.log('loaded:', resources);
- Object.keys(resources).length !== 0 && isLoading.set(false);
- });
- // if resources failed loading, set loading to true
- i18n.on('failedLoading', () => {
- isLoading.set(true);
- });
- return isLoading;
- };
- export const initI18n = (defaultLocale: string | undefined) => {
- let detectionOrder = defaultLocale
- ? ['querystring', 'localStorage']
- : ['querystring', 'localStorage', 'navigator'];
- let fallbackDefaultLocale = defaultLocale ? [defaultLocale] : ['en-US'];
- const loadResource = (language: string, namespace: string) =>
- import(`./locales/${language}/${namespace}.json`);
- i18next
- .use(resourcesToBackend(loadResource))
- .use(LanguageDetector)
- .init({
- debug: false,
- detection: {
- order: detectionOrder,
- caches: ['localStorage'],
- lookupQuerystring: 'lang',
- lookupLocalStorage: 'locale'
- },
- fallbackLng: {
- default: fallbackDefaultLocale
- },
- ns: 'translation',
- returnEmptyString: false,
- interpolation: {
- escapeValue: false // not needed for svelte as it escapes by default
- }
- });
- };
- const i18n = createI18nStore(i18next);
- const isLoadingStore = createIsLoadingStore(i18next);
- export const getLanguages = async () => {
- const languages = (await import(`./locales/languages.json`)).default;
- return languages;
- };
- export default i18n;
- export const isLoading = isLoadingStore;
|