diff --git a/src/stores/knowledge.ts b/src/stores/knowledge.ts index 040a19c..535e05e 100644 --- a/src/stores/knowledge.ts +++ b/src/stores/knowledge.ts @@ -1,5 +1,6 @@ import { reactive, computed } from 'vue' import { knowledgeApi } from '../api' +import i18n from '@/i18n' import type { KnowledgeRecord, KnowledgeDetailPayload, @@ -9,6 +10,9 @@ import type { KnowledgeConfig, } from '../api/types' +// composable 外全局 i18n 实例(非 setup 上下文) +const t = ((i18n as any).global.t as (k: string) => string).bind((i18n as any).global) + // ── 全局响应式状态(单例) ── const state = reactive({ @@ -62,7 +66,7 @@ export function useKnowledgeStore() { state.items = result } catch (e: any) { if (seq !== _itemsReqSeq) return // 旧请求的失败不污染当前视图 - state.error = e?.toString() ?? '加载知识库失败' + state.error = e?.toString() ?? t('knowledge.err.loadFailed') } finally { if (seq === _itemsReqSeq) state.loading = false } @@ -77,7 +81,7 @@ export function useKnowledgeStore() { state.candidates = result } catch (e: any) { if (seq !== _itemsReqSeq) return - state.error = e?.toString() ?? '加载收件箱失败' + state.error = e?.toString() ?? t('knowledge.err.loadInboxFailed') } } @@ -91,7 +95,7 @@ export function useKnowledgeStore() { state.items = result } catch (e: any) { if (seq !== _itemsReqSeq) return - state.error = e?.toString() ?? '检索失败' + state.error = e?.toString() ?? t('knowledge.err.searchFailed') } finally { if (seq === _itemsReqSeq) state.loading = false } @@ -110,7 +114,7 @@ export function useKnowledgeStore() { } return record } catch (e: any) { - state.error = e?.toString() ?? '创建知识失败' + state.error = e?.toString() ?? t('knowledge.err.createFailed') return null } } @@ -122,7 +126,7 @@ export function useKnowledgeStore() { state.items = state.items.filter(k => k.id !== id) state.candidates = state.candidates.filter(k => k.id !== id) } catch (e: any) { - state.error = e?.toString() ?? '更新状态失败' + state.error = e?.toString() ?? t('knowledge.err.updateStatusFailed') } } @@ -132,7 +136,7 @@ export function useKnowledgeStore() { state.items = state.items.filter(k => k.id !== id) state.candidates = state.candidates.filter(k => k.id !== id) } catch (e: any) { - state.error = e?.toString() ?? '归档失败' + state.error = e?.toString() ?? t('knowledge.err.archiveFailed') } } @@ -145,7 +149,7 @@ export function useKnowledgeStore() { state.config = result } catch (e: any) { if (seq !== _configReqSeq) return - state.error = e?.toString() ?? '加载配置失败' + state.error = e?.toString() ?? t('knowledge.err.loadConfigFailed') } } @@ -154,7 +158,7 @@ export function useKnowledgeStore() { await knowledgeApi.saveConfig(config) state.config = config } catch (e: any) { - state.error = e?.toString() ?? '保存配置失败' + state.error = e?.toString() ?? t('knowledge.err.saveConfigFailed') } } @@ -163,7 +167,7 @@ export function useKnowledgeStore() { await knowledgeApi.extractNow() await loadCandidates() } catch (e: any) { - state.error = e?.toString() ?? '立即抽取失败' + state.error = e?.toString() ?? t('knowledge.err.extractFailed') } } diff --git a/src/stores/project/ideas.ts b/src/stores/project/ideas.ts index 8f1e1de..3a121a3 100644 --- a/src/stores/project/ideas.ts +++ b/src/stores/project/ideas.ts @@ -1,13 +1,17 @@ import { ideaApi } from '../../api' +import i18n from '@/i18n' import { state } from './state' +// composable 外全局 i18n 实例(非 setup 上下文) +const t = ((i18n as any).global.t as (k: string) => string).bind((i18n as any).global) + /** 灵感 CRUD 子 store(共享全局 state) */ export function createIdeasStore() { async function loadIdeas() { try { state.ideas = await ideaApi.list() } catch (e: any) { - state.error = e?.toString() ?? '加载灵感失败' + state.error = e?.toString() ?? t('ideas.err.loadFailed') } } @@ -17,7 +21,7 @@ export function createIdeasStore() { state.ideas.push(record) return record } catch (e: any) { - state.error = e?.toString() ?? '创建灵感失败' + state.error = e?.toString() ?? t('ideas.err.createFailed') return null } } @@ -35,7 +39,7 @@ export function createIdeasStore() { await ideaApi.delete(id) state.ideas = state.ideas.filter(i => i.id !== id) } catch (e: any) { - state.error = e?.toString() ?? '删除灵感失败' + state.error = e?.toString() ?? t('ideas.err.deleteFailed') } } diff --git a/src/stores/project/projects.ts b/src/stores/project/projects.ts index 32b6143..1180a6e 100644 --- a/src/stores/project/projects.ts +++ b/src/stores/project/projects.ts @@ -1,7 +1,11 @@ import { projectApi } from '../../api' import type { ImportProjectInput } from '../../api/project' +import i18n from '@/i18n' import { state, clearError } from './state' +// composable 外全局 i18n 实例(非 setup 上下文) +const t = ((i18n as any).global.t as (k: string) => string).bind((i18n as any).global) + /** 项目 CRUD 子 store(共享全局 state) */ export function createProjectsStore() { async function loadProjects() { @@ -10,7 +14,7 @@ export function createProjectsStore() { try { state.projects = await projectApi.list() } catch (e: any) { - state.error = e?.toString() ?? '加载项目失败' + state.error = e?.toString() ?? t('projects.err.loadFailed') } finally { state.loading = false } @@ -22,7 +26,7 @@ export function createProjectsStore() { state.projects.push(record) return record } catch (e: any) { - state.error = e?.toString() ?? '创建项目失败' + state.error = e?.toString() ?? t('projects.err.createFailed') return null } } @@ -34,7 +38,7 @@ export function createProjectsStore() { await loadProjects() // 刷新列表(后端已 insert,统一走 load 避免本地数组与后端不一致) return record } catch (e: any) { - state.error = e?.toString() ?? '导入项目失败' + state.error = e?.toString() ?? t('projects.err.importFailed') return null } } @@ -60,7 +64,7 @@ export function createProjectsStore() { await projectApi.delete(id) // 软删 → 回收站(可恢复) state.projects = state.projects.filter(p => p.id !== id) } catch (e: any) { - state.error = e?.toString() ?? '删除项目失败' + state.error = e?.toString() ?? t('projects.err.deleteFailed') } } @@ -68,7 +72,7 @@ export function createProjectsStore() { try { state.deletedProjects = await projectApi.listDeleted() } catch (e: any) { - state.error = e?.toString() ?? '加载回收站失败' + state.error = e?.toString() ?? t('projects.err.loadTrashFailed') } } @@ -78,7 +82,7 @@ export function createProjectsStore() { state.deletedProjects = state.deletedProjects.filter(p => p.id !== id) await loadProjects() // 恢复后刷新活跃列表 } catch (e: any) { - state.error = e?.toString() ?? '恢复项目失败' + state.error = e?.toString() ?? t('projects.err.restoreFailed') } } @@ -87,7 +91,7 @@ export function createProjectsStore() { await projectApi.purge(id) // 彻底删(级联物理删,不可恢复) state.deletedProjects = state.deletedProjects.filter(p => p.id !== id) } catch (e: any) { - state.error = e?.toString() ?? '彻底删除失败' + state.error = e?.toString() ?? t('projects.err.purgeFailed') } } diff --git a/src/stores/project/tasks.ts b/src/stores/project/tasks.ts index df07889..72bde2a 100644 --- a/src/stores/project/tasks.ts +++ b/src/stores/project/tasks.ts @@ -1,13 +1,17 @@ import { taskApi } from '../../api' +import i18n from '@/i18n' import { state } from './state' +// composable 外全局 i18n 实例(非 setup 上下文) +const t = ((i18n as any).global.t as (k: string) => string).bind((i18n as any).global) + /** 任务 CRUD 子 store(共享全局 state) */ export function createTasksStore() { async function loadTasks(projectId?: string) { try { state.tasks = await taskApi.list(projectId) } catch (e: any) { - state.error = e?.toString() ?? '加载任务失败' + state.error = e?.toString() ?? t('tasks.err.loadFailed') } } @@ -17,7 +21,7 @@ export function createTasksStore() { state.tasks.push(record) return record } catch (e: any) { - state.error = e?.toString() ?? '创建任务失败' + state.error = e?.toString() ?? t('tasks.err.createFailed') return null } } @@ -35,7 +39,7 @@ export function createTasksStore() { await taskApi.delete(id) state.tasks = state.tasks.filter(t => t.id !== id) } catch (e: any) { - state.error = e?.toString() ?? '删除任务失败' + state.error = e?.toString() ?? t('tasks.err.deleteFailed') } } diff --git a/src/stores/project/workflow.ts b/src/stores/project/workflow.ts index 6ce8cfd..da47a0e 100644 --- a/src/stores/project/workflow.ts +++ b/src/stores/project/workflow.ts @@ -1,6 +1,10 @@ import { workflowApi } from '../../api' +import i18n from '@/i18n' import { state, _eventUnlisten, setEventUnlisten } from './state' +// composable 外全局 i18n 实例(非 setup 上下文) +const t = ((i18n as any).global.t as (k: string) => string).bind((i18n as any).global) + /** * 工作流 + 审批子 store(共享全局 state)。 * @@ -16,7 +20,7 @@ export function createWorkflowStore() { try { state.workflowExecutions = await workflowApi.listExecutions() } catch (e: any) { - state.error = e?.toString() ?? '加载工作流记录失败' + state.error = e?.toString() ?? t('projects.err.loadWorkflowFailed') } } diff --git a/vite.config.ts b/vite.config.ts index 6513dd2..5b9d305 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,6 +4,11 @@ import vue from "@vitejs/plugin-vue"; const host = process.env.TAURI_DEV_HOST; export default defineConfig(async () => ({ + resolve: { + alias: { + '@': '/src', + }, + }, plugins: [vue()], clearScreen: false, server: {