Spaces:
Sleeping
Sleeping
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; | |