import type { Locale } from 'vue-i18n' import { createI18n } from 'vue-i18n' // Import i18n resources // https://vitejs.dev/guide/features.html#glob-import export const i18n = createI18n({ legacy: false, locale: '', fallbackLocale: '', messages: {}, }) const localesMap = Object.fromEntries( Object.entries(import.meta.glob('../../locales/*.yml')) .map(([path, loadLocale]) => [path.match(/([\w-]*)\.yml$/)?.[1], loadLocale]), ) as Record Promise<{ default: Record }>> export const availableLocales = Object.keys(localesMap) const loadedLanguages: string[] = [] function setI18nLanguage(lang: Locale) { i18n.global.locale.value = lang as any localStorage.setItem("locale", lang); return lang } export async function loadLanguageAsync(lang: string): Promise { // If the same language if (i18n.global.locale.value === lang) return setI18nLanguage(lang) // If the language was already loaded if (loadedLanguages.includes(lang)) return setI18nLanguage(lang) // If the language hasn't been loaded yet let messages; try { messages = await localesMap[lang]() } catch { messages = await localesMap['en']() } i18n.global.setLocaleMessage(lang, messages.default) loadedLanguages.push(lang) return setI18nLanguage(lang) }