49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
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<Locale, () => Promise<{ default: Record<string, string> }>>
|
|
|
|
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<Locale> {
|
|
// 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)
|
|
} |