import { createI18n } from 'vue-i18n' import zhCN from './locales/zh-CN.js' // ★ 懒加载设计:创建实例时只同步注入中文(默认语言)。 // 英文 (en.js) 通过 useI18nLazy 中的动态 import() 按需加载, // 被 Vite/Rollup 拆成独立 chunk,只看中文的访客永不下载英文资源。 const i18n = createI18n({ legacy: false, locale: 'zh-CN', fallbackLocale: 'zh-CN', messages: { 'zh-CN': zhCN } }) // 已加载语言集合,避免重复 import const loadedLocales = new Set(['zh-CN']) /** * 懒加载并切换到目标语言。 * 首次切换某语言时才动态 import 其语言包并 mergeLocaleMessage, * 之后切换仅在已加载集合内完成(无网络请求)。 */ export async function loadLocaleAsync(locale) { // composition 模式下响应式 locale 在 i18n.global 上 if (i18n.global.locale.value === locale) return if (loadedLocales.has(locale)) { i18n.global.locale.value = locale document.documentElement.setAttribute('lang', locale) return } let messages if (locale === 'en') { // 动态 import -> 独立 chunk,切换时才下载 messages = (await import('./locales/en.js')).default } else { // 未知语言回退到中文 i18n.global.locale.value = 'zh-CN' document.documentElement.setAttribute('lang', 'zh-CN') return } i18n.global.mergeLocaleMessage(locale, messages) loadedLocales.add(locale) i18n.global.locale.value = locale document.documentElement.setAttribute('lang', locale) } export default i18n