refactor: 前端本地偏好统一为公共存储层
- 新增 frontend/src/utils/storageKeys.ts 集中维护存储键常量并登记旧键迁移 - 新增 frontend/src/utils/storage.ts 统一 localStorage/sessionStorage 读写与异常容错 - 新增 frontend/src/composables/usePreference.ts 提供 useStringPreference 响应式字符串偏好 - 新增 frontend/src/utils/transactionFilterPrefs.ts 抽出收支筛选偏好字段定义与共享读写 - 存储键统一以 finance. 前缀命名,locale、emailBill.tab、logs.tab 迁移到新键并自动迁移旧值 - 各页面与组件改用公共层,移除重复的 try/catch 与跨组件重复的序列化逻辑 - 认证凭据 token 属登录状态,保持原键名不纳入 finance. 前缀
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
// 国际化入口:由对照消息构建各语言包,维护当前语言、持久化与 <html lang> 同步
|
||||
import { createI18n } from 'vue-i18n'
|
||||
import messages from './messages'
|
||||
import { migrateKey, readString, writeString } from '../utils/storage'
|
||||
import { LEGACY_STORAGE_KEYS, STORAGE_KEYS } from '../utils/storageKeys'
|
||||
|
||||
/** 支持的语言标识 */
|
||||
export type LocaleKey = 'zh-CN' | 'en-US' | 'ja-JP'
|
||||
@@ -13,7 +15,7 @@ interface MessageLeaf {
|
||||
}
|
||||
|
||||
// 语言偏好存储键
|
||||
const STORAGE_KEY = 'locale'
|
||||
const STORAGE_KEY = STORAGE_KEYS.locale
|
||||
// 支持的语言列表
|
||||
const SUPPORTED: LocaleKey[] = ['zh-CN', 'en-US', 'ja-JP']
|
||||
|
||||
@@ -40,7 +42,9 @@ function buildLocaleMessages(node: unknown, lang: 'zh' | 'en' | 'ja'): any {
|
||||
|
||||
/** 解析初始语言:localStorage > 浏览器语言 > 简体中文 */
|
||||
function resolveInitialLocale(): LocaleKey {
|
||||
const saved = localStorage.getItem(STORAGE_KEY)
|
||||
// 读取前迁移旧键 locale,保证老用户语言偏好不丢失
|
||||
migrateKey(LEGACY_STORAGE_KEYS.locale, STORAGE_KEY)
|
||||
const saved = readString(STORAGE_KEY)
|
||||
if (saved && SUPPORTED.includes(saved as LocaleKey)) {
|
||||
return saved as LocaleKey
|
||||
}
|
||||
@@ -74,7 +78,7 @@ export function getLocale(): LocaleKey {
|
||||
/** 切换语言:更新 i18n、持久化到 localStorage,并同步 <html lang> */
|
||||
export function setLocale(locale: LocaleKey) {
|
||||
i18n.global.locale.value = locale
|
||||
localStorage.setItem(STORAGE_KEY, locale)
|
||||
writeString(STORAGE_KEY, locale)
|
||||
document.documentElement.lang = locale
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user