| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- 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
|