Files
photo-live/apps/admin/src/locales/index.ts
T
浅念 a6cc190751 feat(admin): art-design-pro integration with local session auth
P1b Task 9: apps/admin based on art-design-pro v3.0.2 (tag, commit
d224dd4; source recorded in apps/admin/SOURCE.md), trimmed to
layout/login/i18n/request/table-form core. Login wired to real
POST /v1/auth/password (single-token session), Bearer header on all
requests, 401 interceptor logout+redirect, request-driven sliding
renewal (refresh at ~80% TTL, single-flight), best-effort
POST /v1/auth/logout on user-menu logout. One protected stub page
(相册管理). Dev port 5176 strictPort + /v1 proxy to 8080. Admin keeps
its own eslint9 flat config; root eslint ignores apps/admin/**.
vitest unit tests for renewal pacing + Playwright e2e (guard redirect,
localized wrong-password error, login lands on stub, token persists
across reload, logout clears session).

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-18 11:47:32 +08:00

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