useI18n.js 3.67 KB
// store/modules/useI18n.js
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

export const useI18nStore = defineStore('i18n', () => {
  // 状态定义
  const i18nCache = ref({}) // 缓存所有语言包 { 'zh_CN': {...}, 'en_US': {...} }
  const currentLanguage = ref('en_US') // 当前语言
  const isLoading = ref(false) // 加载状态
  
  // Getter
  const getI18nCache = computed(() => i18nCache.value)
  const getCurrentLanguage = computed(() => currentLanguage.value)
  const getIsLoading = computed(() => isLoading.value)
  
  // 获取指定语言的缓存
  const getLanguageCache = (lang) => {
    return i18nCache.value[lang] || null
  }
  
  // 检查语言包是否已缓存
  const isLanguageCached = (lang) => {
    return !!i18nCache.value[lang]
  }
  
  // 更新语言包缓存
  const updateI18nCache = (lang, messages) => {
    i18nCache.value[lang] = messages
    console.log(`语言包 ${lang} 已缓存`, messages)
  }
  
  // 设置当前语言
  const setCurrentLanguage = (lang) => {
    currentLanguage.value = lang
    // 可以同时更新本地存储
    uni.setStorageSync('lang', lang)
    console.log('当前语言设置为:', lang)
  }
  
  // 批量更新缓存(用于初始化多个语言包)
  const batchUpdateCache = (languageMap) => {
    Object.keys(languageMap).forEach(lang => {
      i18nCache.value[lang] = languageMap[lang]
    })
    console.log('批量更新语言包缓存完成')
  }
  
  // 清除指定语言缓存
  const clearLanguageCache = (lang) => {
    if (i18nCache.value[lang]) {
      delete i18nCache.value[lang]
      console.log(`已清除 ${lang} 语言缓存`)
    }
  }
  
  // 清除所有缓存
  const clearAllCache = () => {
    i18nCache.value = {}
    console.log('已清除所有语言缓存')
  }
  
  // 设置加载状态
  const setLoading = (loading) => {
    isLoading.value = loading
  }
  
  // 获取支持的语言列表(从缓存中提取)
  const getSupportedLanguages = computed(() => {
    return Object.keys(i18nCache.value)
  })
  
  // 预加载多个语言包(可选功能)
  const preloadLanguages = async (languages, fetchFunction) => {
    isLoading.value = true
    const results = []
    
    try {
      for (const lang of languages) {
        // 如果已经缓存,跳过
        if (isLanguageCached(lang)) {
          results.push({ lang, status: 'cached', data: getLanguageCache(lang) })
          continue
        }
        
        try {
          // 调用传入的获取函数
          const messages = await fetchFunction(lang)
          updateI18nCache(lang, messages)
          results.push({ lang, status: 'loaded', data: messages })
        } catch (error) {
          results.push({ lang, status: 'error', error: error.message })
        }
      }
      
      return results
    } finally {
      isLoading.value = false
    }
  }

  return {
    // 状态
    i18nCache,
    currentLanguage,
    isLoading,
    
    // Getter
    getI18nCache,
    getCurrentLanguage,
    getIsLoading,
    getSupportedLanguages,
    
    // Actions
    getLanguageCache,
    isLanguageCached,
    updateI18nCache,
    setCurrentLanguage,
    batchUpdateCache,
    clearLanguageCache,
    clearAllCache,
    setLoading,
    preloadLanguages
  }
}
// , {
//   // Pinia持久化配置(如果需要)
//   persist: {
//     key: 'i18n-store',
//     paths: ['i18nCache', 'currentLanguage'], // 持久化缓存和当前语言
//     storage: {
//       getItem: (key) => {
//         return uni.getStorageSync(key)
//       },
//       setItem: (key, value) => {
//         uni.setStorageSync(key, value)
//       },
//       removeItem: (key) => {
//         uni.removeStorageSync(key)
//       }
//     }
//   }
// },
)