import { createI18n } from 'vue-i18n' import { Locale } from 'vant' // 1. 静态引入:确保路径正确 (根据你的截图 ./lang/ 是对的) import userZhCN from './lang/zh-CN.js' import vantZhCN from 'vant/es/locale/lang/zh-CN' // 2. 数据清洗:确保拿到的是纯净的对象,而不是 Module const userData = userZhCN.default || userZhCN const vantData = vantZhCN.default || vantZhCN // 3. 深度合并:将 Vant 和 User 数据合并 // ⚠️ 注意顺序:userData 在后,确保用户自定义的优先级更高 const finalZhCN = { ...vantData, ...userData } // 🔍 再次确认日志 console.log('🚀 i18n Data Ready:', { hasCommon: !!finalZhCN.common, switchLang: finalZhCN.common?.switchLang }) const savedLang = localStorage.getItem('app-lang') || 'zh-CN' const i18n = createI18n({ legacy: false, locale: savedLang, fallbackLocale: 'zh-CN', globalInjection: true, // 4. 初始化消息:这里是关键,确保 zh-CN 永远有值 messages: { 'zh-CN': finalZhCN } }) // 记录已加载语言 const loadedLanguages = ['zh-CN'] // 5. 设置 Vant 语言的辅助函数 function setVantLanguage(lang, messages) { if (lang === 'zh-CN') { Locale.use('zh-CN', vantData) } else { Locale.use(lang, messages) } } export async function loadLanguageAsync(lang) { // 空值检查 if (!lang || lang === 'undefined' || lang === 'null') { return loadLanguageAsync('zh-CN') } // A. 如果是中文:直接切过去,千万不要重新加载,防止覆盖 if (lang === 'zh-CN') { i18n.global.locale.value = 'zh-CN' setVantLanguage('zh-CN') document.querySelector('html').setAttribute('lang', 'zh-CN') localStorage.setItem('app-lang', 'zh-CN') return 'zh-CN' } // B. 如果已加载:直接切 if (loadedLanguages.includes(lang)) { i18n.global.locale.value = lang setVantLanguage(lang, i18n.global.getLocaleMessage(lang)) // 尝试从 i18n 实例获取 vant 数据有点难,这里简化处理 document.querySelector('html').setAttribute('lang', lang) localStorage.setItem('app-lang', lang) return lang } // C. 动态加载新语言 try { // 动态导入映射 // ⚠️ 确保这些文件在 src/locales/lang/ 目录下存在 const userImport = import(`./lang/${lang}.js`) // Vant 映射 let vantImportPromise = Promise.resolve({ default: {} }) if (lang === 'en-US') vantImportPromise = import('vant/es/locale/lang/en-US') // ... 可以按需添加其他 Vant 语言 ... const [userMod, vantMod] = await Promise.all([userImport, vantImportPromise]) const userMsg = userMod.default || userMod const vantMsg = vantMod.default || vantMod const finalMsg = { ...vantMsg, ...userMsg } i18n.global.setLocaleMessage(lang, finalMsg) loadedLanguages.push(lang) // 切换 i18n.global.locale.value = lang setVantLanguage(lang, vantMsg) document.querySelector('html').setAttribute('lang', lang) localStorage.setItem('app-lang', lang) return lang } catch (e) { console.error(`❌ Load lang ${lang} failed:`, e) // 失败回退到中文 return loadLanguageAsync('zh-CN') } } export default i18n