2.9 KiB
2.9 KiB
国际化系统重构说明
概述
本项目已重构国际化系统,采用更简洁、稳定的架构,解决了原有的语言切换逻辑混乱问题。
新架构特点
1. 统一的状态管理
- 使用 Pinia store (
src/stores/language.js) 统一管理语言状态 - 支持 localStorage 持久化用户语言选择
- 自动检测浏览器语言偏好
2. 简化的语言切换
- 使用
useLanguageSwitchcomposable 处理语言切换 - 自动处理路由前缀(中文页面添加
/cn前缀) - 无需强制页面刷新,提供流畅的用户体验
3. 清晰的职责分离
- 语言状态管理:
useLanguageStore - 语言切换逻辑:
useLanguageSwitch - 路由导航:
useNavigation - 初始化:
language-init.client.js插件
核心文件
语言状态管理
// src/stores/language.js
export const useLanguageStore = defineStore('language', () => {
const currentLocale = ref('en')
const availableLocales = [
{ code: 'en', name: 'English' },
{ code: 'cn', name: '简体中文' }
]
// 设置语言、初始化、切换等方法
})
语言切换逻辑
// src/composables/useLanguageSwitch.js
export const useLanguageSwitch = () => {
const switchLanguage = async (newLocale) => {
// 更新状态并处理路由跳转
}
const initLanguage = () => {
// 初始化语言状态
}
})
使用方法
在组件中切换语言
<script setup>
import { useLanguageSwitch } from '@/composables/useLanguageSwitch.js'
const { switchLanguage, currentLocale } = useLanguageSwitch()
const changeToChinese = () => {
switchLanguage('cn')
}
const changeToEnglish = () => {
switchLanguage('en')
}
</script>
在组件中使用翻译
<template>
<h1>{{ $t('page.home') }}</h1>
<p>{{ $t('nav.about') }}</p>
</template>
路由策略
- 默认语言: 英文 (en)
- 策略:
prefix_except_default - 中文页面: 自动添加
/cn前缀 - 英文页面: 无前缀
路由示例
- 英文首页:
/ - 中文首页:
/cn - 英文关于我们:
/about-us - 中文关于我们:
/cn/about-us
语言检测逻辑
- 优先使用: 用户手动选择的语言(localStorage)
- 其次使用: 浏览器语言检测
- 默认语言: 英文
测试
访问 /test-language 页面可以测试语言切换功能。
移除的旧文件
src/composables/useLanguageDetection.js- 被新的useLanguageSwitch替代src/hook/lang.js- 功能整合到 store 中
优势
- 代码简洁: 移除了重复和冲突的逻辑
- 状态一致: 统一的状态管理确保服务端和客户端一致
- 用户体验: 无需页面刷新,流畅的语言切换
- 可维护性: 清晰的职责分离,易于维护和扩展
- 性能优化: 减少了不必要的 Cookie 操作和页面刷新