dfba9908创建于 2024年12月29日历史提交
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)
}