Files
his/healthlink-his-ui/src/i18n/index.js

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)
}