feat: 语言切换
This commit is contained in:
@@ -1,4 +1,16 @@
|
||||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
import { useUserInfoStore } from '@/stores/userInfo'
|
||||
import { getUserLanguage } from '@/api/user'
|
||||
import i18n from '@/lang/index'
|
||||
|
||||
// 语言映射:后端格式 -> i18n 格式
|
||||
const backendToI18nLanguage: Record<string, string> = {
|
||||
'en': 'ENGLISH',
|
||||
'zh-CN': 'CHINESE_SIMPLIFIED'
|
||||
}
|
||||
|
||||
// 语言同步状态缓存(避免每次路由切换都请求)
|
||||
let languageSynced = false
|
||||
|
||||
/**
|
||||
* 路由缓存机制:
|
||||
@@ -83,6 +95,52 @@ router.beforeEach((to, from, next) => {
|
||||
next()
|
||||
})
|
||||
|
||||
router.afterEach(() => {})
|
||||
router.afterEach(async () => {
|
||||
// 检查用户是否已登录
|
||||
const userInfoStore = useUserInfoStore()
|
||||
const token = userInfoStore.state.token
|
||||
|
||||
if (!token) {
|
||||
languageSynced = false // 未登录时重置同步状态
|
||||
return
|
||||
}
|
||||
|
||||
// 如果已经同步过,跳过
|
||||
if (languageSynced) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
// 获取用户语言设置
|
||||
const response = await getUserLanguage()
|
||||
const userLanguage = (response as any)?.language // 后端返回 'en' 或 'zh-CN'
|
||||
|
||||
if (!userLanguage) {
|
||||
return
|
||||
}
|
||||
|
||||
// 转换为 i18n 格式
|
||||
const i18nLanguage = backendToI18nLanguage[userLanguage]
|
||||
|
||||
if (!i18nLanguage) {
|
||||
return
|
||||
}
|
||||
|
||||
// 获取当前 i18n 语言
|
||||
const currentLocale = i18n.global.locale.value
|
||||
|
||||
// 如果用户语言和本地 i18n 不一致,更新 i18n
|
||||
if (i18nLanguage !== currentLocale) {
|
||||
i18n.global.locale.value = i18nLanguage as 'ENGLISH' | 'CHINESE_SIMPLIFIED'
|
||||
localStorage.setItem('language', i18nLanguage)
|
||||
}
|
||||
|
||||
// 标记已同步
|
||||
languageSynced = true
|
||||
} catch (error) {
|
||||
// 静默失败,不影响页面正常加载
|
||||
console.warn('Failed to sync user language:', error)
|
||||
}
|
||||
})
|
||||
|
||||
export default router
|
||||
|
||||
Reference in New Issue
Block a user