import type { i18n } from 'i18next' import { writable, type Readable, type Writable } from 'svelte/store' export interface TranslationService { i18n: Readable } export const isLoading = writable(true) export class I18NextTranslationStore implements TranslationService { public i18n: Writable public isLoading: Writable constructor(i18n: i18n) { this.i18n = this.createInstance(i18n) this.isLoading = this.createLoadingInstance(i18n) } private createInstance(i18n: i18n): Writable { 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 } private createLoadingInstance(i18n: i18n): Writable { // if loaded resources are empty || {}, set loading to true i18n.on('loaded', (resources) => { if (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 createI18nStore = (i18n: i18n) => { const i18nStore = new I18NextTranslationStore(i18n) return i18nStore.i18n }