useI18n.js
3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// 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)
// }
// }
// }
// },
)