import { nextTick } from 'vue' class Language { private i18n: any; private loadLocale: Array<string> = []; //已加载的语言 public file: string = ''; constructor(i18n: any) { this.i18n = i18n } /** * * @param locale 设置语言 */ public setI18nLanguage(locale: string) { if (this.i18n.mode === 'legacy') { this.i18n.global.locale = locale } else { this.i18n.global.locale = locale } let html = document.querySelector('html') html && html.setAttribute('lang', locale) } /** * 加载语言包 * @param path * @param locale * @returns */ public async loadLocaleMessages(app: string, path: string, locale: string) { try { const file = path == '/' ? 'index' : path.replace('/', '').replaceAll('/', '.') if (this.loadLocale.includes(`${app}/${locale}/${file}`)) { return nextTick() } this.loadLocale.push(`${app}/${locale}/${file}`) if (app != 'app' && !this.loadLocale.includes(`${app}/${locale}/pages`)) { const pagesMessages = await import(`~/addon/${app}/lang/${locale}/pages.json`) this.i18n.global.mergeLocaleMessage(locale, pagesMessages) this.loadLocale.push(`${app}/${locale}/pages`) } // 引入语言包文件 const messages = await import(app == 'app' ? `~/app/lang/${locale}/${file}.json` : `~/addon/${app}/lang/${locale}/${file}.json`) const prefix = this.getFileKey(app, path) let data: Record<string, string> = {} Object.keys(messages.default).forEach(key => { data[`${prefix}.${key}`] = messages.default[key] }) this.i18n.global.mergeLocaleMessage(locale, data) this.setI18nLanguage(locale) return nextTick() } catch { this.setI18nLanguage(locale) return nextTick() } } /** * @param app * @param path */ public getFileKey = (app: string, path: string) => { const file = path == '/' ? 'index' : path.replace('/', '').replaceAll('/', '.') return `${app}.${file}` } } export default Language