69 lines
1.7 KiB
JavaScript
69 lines
1.7 KiB
JavaScript
import { createI18n } from 'vue-i18n'
|
|
import Cookies from 'js-cookie'
|
|
import { ElMessageBox } from 'element-plus'
|
|
|
|
const messages = {
|
|
'zh-CN': {},
|
|
'en': {},
|
|
'vi': {}
|
|
}
|
|
|
|
// Lazy load locale messages
|
|
const loadLocaleMessages = async () => {
|
|
const localeFiles = import.meta.glob('./locales/*.json', { eager: true })
|
|
for (const path in localeFiles) {
|
|
const localeName = path.match(/\.\/locales\/(.+)\.json$/)?.[1]
|
|
if (!localeName) continue
|
|
|
|
let isoCode
|
|
if (localeName === 'zhCN') isoCode = 'zh-CN'
|
|
else if (localeName === 'enUS') isoCode = 'en'
|
|
else if (localeName === 'viVN') isoCode = 'vi'
|
|
else {
|
|
isoCode = localeName.replace(/([A-Z])/g, '-$1').toLowerCase()
|
|
}
|
|
|
|
if (!messages[isoCode]) messages[isoCode] = {}
|
|
messages[isoCode] = { ...messages[isoCode], ...localeFiles[path].default }
|
|
}
|
|
}
|
|
|
|
const getSavedLocale = () => {
|
|
return Cookies.get('lang') || localStorage.getItem('lang') || 'zh-CN'
|
|
}
|
|
|
|
let i18nInstance = null
|
|
|
|
export const initI18n = async () => {
|
|
await loadLocaleMessages()
|
|
const locale = getSavedLocale()
|
|
|
|
i18nInstance = createI18n({
|
|
legacy: false,
|
|
locale: locale,
|
|
fallbackLocale: 'zh-CN',
|
|
messages,
|
|
silentFallbackWarn: true,
|
|
silentTranslationWarn: true
|
|
})
|
|
|
|
return i18nInstance
|
|
}
|
|
|
|
export const getI18nInstance = () => i18nInstance
|
|
|
|
export const changeLocale = async (newLocale) => {
|
|
if (!i18nInstance) return
|
|
|
|
i18nInstance.global.locale.value = newLocale
|
|
|
|
Cookies.set('lang', newLocale, { expires: 365 })
|
|
localStorage.setItem('lang', newLocale)
|
|
}
|
|
|
|
export const t = (key, ...params) => {
|
|
if (!i18nInstance) return key
|
|
const { t: tFunc } = i18nInstance.global
|
|
return tFunc(key, ...params)
|
|
}
|