import type { App } from 'vue'
import { createI18n } from 'vue-i18n'
import { useLocaleStoreWithOut } from '@/store/modules/locale'
import type { I18n, I18nOptions } from 'vue-i18n'
import { setHtmlPageLang } from './helper'
export let i18n: ReturnType<typeof createI18n>
import { PATH_URL } from '@/config/axios/service'
const createI18nOptions = async (): Promise<I18nOptions> => {
const localeStore = useLocaleStoreWithOut()
let locale = localeStore.getCurrentLocale
const localeMap = await localeStore.getLocaleMap
const cMap: any = localeMap.find(item => {
return item.lang === locale.lang
})
let defaultLocal = null
if (cMap) {
if (cMap['custom']) {
defaultLocal = await loadRemoteI18n(cMap)
} else {
defaultLocal = await import(`../../locales/${locale.lang}.ts`)
}
} else {
const item = localeMap[0]
localeStore.setLang(item.lang)
locale = localeStore.getCurrentLocale
defaultLocal = await import(`../../locales/${locale.lang}.ts`)
}
const message = defaultLocal.default ?? {}
setHtmlPageLang(locale.lang)
localeStore.setCurrentLocale({
lang: locale.lang
})
return {
legacy: false,
locale: locale.lang,
fallbackLocale: locale.lang,
messages: {
[locale.lang]: message
},
availableLocales: localeMap.map(v => v.lang),
sync: true,
silentTranslationWarn: true,
missingWarn: false,
silentFallbackWarn: true
}
}
const loadRemoteI18n = async (option: any) => {
const name = option.lang.replace('-', '_')
const path =
PATH_URL.startsWith('./') && PATH_URL.length > 2
? window.location.pathname + PATH_URL.substring(2)
: PATH_URL
const url = `${path}/i18n/custom_${name}_front_${option.name}.js`
return await import(url)
}
export const setupI18n = async (app: App<Element>) => {
const options = await createI18nOptions()
i18n = createI18n(options) as I18n
app.use(i18n)
}