ab4f40ba5d
- 克隆 art-design-pro v3.0.2(GitHub depth1),rm .git,pnpm clean:dev 精简演示页(92 文件) - .env.development/.env.production 均设 VITE_API_URL=/api,代理目标 127.0.0.1:8000(移除 Apifox Mock) - http 封装信封适配:code===200 解包 data;msg/message 字段兼容(拦截器/error/类型) - /api/admin/auth/token 登录适配(access->Bearer token, refresh->refreshToken);/api/admin/auth/me 映射 UserInfo(userName/roles/is_admin) - 登录页演示账号替换为真实 admin;logOut 按路由名判登录页修复 redirect 嵌套 - 根 .gitignore 补 !admin/.env(模板公共 env 非密钥,需入库) - 验证:Playwright 全链路(错误密码 401 留登页/正确登录进工作台/登出/受保护路由重定向/redirect 回跳)+ pnpm build(vue-tsc 通过,产物无 mock 域名) Co-Authored-By: Claude Code <noreply@anthropic.com>
124 lines
2.9 KiB
TypeScript
124 lines
2.9 KiB
TypeScript
/**
|
|
* 国际化配置
|
|
*
|
|
* 基于 vue-i18n 实现的多语言国际化解决方案。
|
|
* 支持中文和英文切换,自动从本地存储恢复用户的语言偏好。
|
|
*
|
|
* ## 主要功能
|
|
*
|
|
* - 多语言支持 - 支持中文(简体)和英文两种语言
|
|
* - 语言切换 - 运行时动态切换语言,无需刷新页面
|
|
* - 持久化存储 - 自动保存和恢复用户的语言偏好
|
|
* - 全局注入 - 在任何组件中都可以使用 $t 函数进行翻译
|
|
* - 类型安全 - 提供 TypeScript 类型支持
|
|
*
|
|
* ## 支持的语言
|
|
*
|
|
* - zh: 简体中文
|
|
* - en: English
|
|
*
|
|
* @module locales
|
|
* @author Art Design Pro Team
|
|
*/
|
|
|
|
import { createI18n } from 'vue-i18n'
|
|
import type { I18n, I18nOptions } from 'vue-i18n'
|
|
import { LanguageEnum } from '@/enums/appEnum'
|
|
import { getSystemStorage } from '@/utils/storage'
|
|
import { StorageKeyManager } from '@/utils/storage/storage-key-manager'
|
|
|
|
// 同步导入语言文件
|
|
import enMessages from './langs/en.json'
|
|
import zhMessages from './langs/zh.json'
|
|
|
|
/**
|
|
* 存储键管理器实例
|
|
*/
|
|
const storageKeyManager = new StorageKeyManager()
|
|
|
|
/**
|
|
* 语言消息对象
|
|
*/
|
|
const messages = {
|
|
[LanguageEnum.EN]: enMessages,
|
|
[LanguageEnum.ZH]: zhMessages
|
|
}
|
|
|
|
/**
|
|
* 语言选项列表
|
|
* 用于语言切换下拉框
|
|
*/
|
|
export const languageOptions = [
|
|
{ value: LanguageEnum.ZH, label: '简体中文' },
|
|
{ value: LanguageEnum.EN, label: 'English' }
|
|
]
|
|
|
|
/**
|
|
* 从存储中获取语言设置
|
|
* @returns 语言设置,如果获取失败则返回默认语言
|
|
*/
|
|
const getDefaultLanguage = (): LanguageEnum => {
|
|
// 尝试从版本化的存储中获取语言设置
|
|
try {
|
|
const storageKey = storageKeyManager.getStorageKey('user')
|
|
const userStore = localStorage.getItem(storageKey)
|
|
|
|
if (userStore) {
|
|
const { language } = JSON.parse(userStore)
|
|
if (language && Object.values(LanguageEnum).includes(language)) {
|
|
return language
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.warn('[i18n] 从版本化存储获取语言设置失败:', error)
|
|
}
|
|
|
|
// 尝试从系统存储中获取语言设置
|
|
try {
|
|
const sys = getSystemStorage()
|
|
if (sys) {
|
|
const { user } = JSON.parse(sys)
|
|
if (user?.language && Object.values(LanguageEnum).includes(user.language)) {
|
|
return user.language
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.warn('[i18n] 从系统存储获取语言设置失败:', error)
|
|
}
|
|
|
|
// 返回默认语言
|
|
console.debug('[i18n] 使用默认语言:', LanguageEnum.ZH)
|
|
return LanguageEnum.ZH
|
|
}
|
|
|
|
/**
|
|
* i18n 配置选项
|
|
*/
|
|
const i18nOptions: I18nOptions = {
|
|
locale: getDefaultLanguage(),
|
|
legacy: false,
|
|
globalInjection: true,
|
|
fallbackLocale: LanguageEnum.ZH,
|
|
messages
|
|
}
|
|
|
|
/**
|
|
* i18n 实例
|
|
*/
|
|
const i18n: I18n = createI18n(i18nOptions)
|
|
|
|
/**
|
|
* 翻译函数类型
|
|
*/
|
|
interface Translation {
|
|
(key: string): string
|
|
}
|
|
|
|
/**
|
|
* 全局翻译函数
|
|
* 可在任何地方使用,无需导入 useI18n
|
|
*/
|
|
export const $t = i18n.global.t as Translation
|
|
|
|
export default i18n
|