--- stepsCompleted: [1, 2, 3] inputDocuments: ['prd.md', 'architecture.md'] workflowType: 'epics-and-stories' project_name: '223-236-template-6' user_name: 'User' date: '2026-03-13' --- # 223-236-template-6 - Epic Breakdown ## Overview This document provides a complete epic and story breakdown for 序灵 Matrix 助手, decomposing requirements from PRD, UX Design if it exists, and Architecture requirements into implementable stories with complete acceptance criteria. ## Requirements Inventory ### Functional Requirements **FR1**: 系统能够读取用户导入的 TXT 格式网文文件 **FR2**: 系统能够从 TXT 文件第一章提取内容并计算 MD5 指纹 **FR3**: 系统能够通过 API 检查指纹是否已存在于服务器数据库 **FR4**: 系统能够为首次处理的作品生成唯一 work_id 标识符 **FR5**: 系统能够检测续更作品(已存在 work_id)并仅处理新增章节 **FR6**: 系统能够在网络错误时自动重试 API 调用 **FR7**: 系统能够识别 TXT 文件中的章节标题(兼容多种格式) **FR8**: 系统能够清洗正文格式(合并空行、统一缩进、压缩空格) **FR9**: 系统能够将清洗后的内容按固定长度分段(避免句子中间断开) **FR10**: 系统能够将清洗后的数据输出为结构化 JSON 格式 **FR11**: 系统能够使用原子写机制保存清洗数据(防止断电损坏) **FR12**: 系统能够从全文中提取候选术语(中文 2-6 字、英文大写开头) **FR13**: 系统能够统计每个术语的出现频次和跨章分布 **FR14**: 系统能够根据频次和分布筛选核心术语(Top 200) **FR15**: 系统能够向用户预览提取的术语列表及其建议翻译 **FR16**: 系统能够手动编辑术语翻译并锁定 **FR17**: 系统能够复用已翻译作品的术语库处理续更内容 **FR18**: 系统能够使用本地 GPU 加速的 m2m100 模型进行中译英翻译 **FR19**: 系统能够在翻译前将核心术语替换为占位符(§T1§, §T2§...) **FR20**: 系统能够在翻译后将占位符还原为锁定的术语翻译 **FR21**: 系统能够批量处理多个分段以提高 GPU 利用率 **FR22**: 系统能够在批量翻译失败时降级为单条翻译 **FR23**: 系统能够记录翻译失败的项目到失败清单 **FR24**: 系统能够将同一章节的分段合并为完整章节 **FR25**: 系统能够逐章调用上传 API 发布翻译内容 **FR26**: 系统能够在上传前根据章节字数计算并扣除 CU 费用 **FR27**: 系统能够在上传失败时自动重试 **FR28**: 系统能够记录上传失败的章节并提供批量重试 **FR29**: 系统能够标记缺失分段章节为不完整状态 **FR30**: 系统能够显示翻译任务进度(当前章节/总章节) **FR31**: 系统能够响应用户暂停请求立即中断翻译任务 **FR32**: 系统能够从暂停点或崩溃点恢复翻译任务 **FR33**: 系统能够在任务执行过程中持续保存进度状态 **FR34**: 系统能够在启动时检测并提示用户未完成的任务 **FR35**: 系统能够显示任务预计完成时间 **FR36**: 系统能够通过拖放方式导入 TXT 文件 **FR37**: 系统能够在导入后显示作品预览信息(章节数、术语数、预计时间) **FR38**: 系统能够在翻译完成后发送桌面通知 **FR39**: 系统能够最小化到系统托盘并在后台运行 **FR40**: 系统能够记录任务历史(翻译/上传/失败) **FR41**: 系统能够将用户数据本地存储(不上传云端) **FR42**: 系统能够在生成的翻译内容中添加翻译标识 **FR43**: 系统能够声明用户需拥有内容翻译权和发布权 **FR44**: 系统能够将用户数据本地存储(不上传云端) **FR45**: 系统能够通过 work_id MD5 仅用于指纹查重(不上传内容) **FR46**: 系统能够在网络断开时继续执行本地翻译任务 **FR47**: 系统能够检测网络连接状态并显示给用户 **FR48**: 系统能够将网络断开期间的上传任务保存到队列 **FR49**: 系统能够在网络恢复时自动执行队列中的上传任务 **FR50**: 系统能够在启动时检查是否有新版本可用 **FR51**: 系统能够记录应用日志用于问题诊断 **FR52**: 系统能够按量计费(一次性买断 + CU 扣费) ### Non-Functional Requirements **NFR-P1**: 翻译速度 ≥ 5000 字符/分钟(基于 RTX 3060 基准 GPU) **NFR-P2**: GPU 利用率 ≥ 80%(非空闲处理状态) **NFR-P3**: 内存占用 < 4 GB(不含模型文件) **NFR-P4**: 应用启动时间 < 10 秒(GPU 检测 + 模型加载) **NFR-P5**: Pause 指令响应时间 < 1 秒(立即中断) **NFR-P6**: 用户界面操作响应 < 200 毫秒(无卡顿感知) ### Additional Requirements **AR1**: Python 3.11+ 编程语言 **AR2**: PyQt6 桌面 GUI 框架 **AR3**: CTranslate2 推理引擎 + facebook/m2m100_418M 模型 **AR4**: CUDA GPU 加速支持(RTX 3050/3060 最小) **AR5**: Crash-Safe 原子写机制(.tmp + fsync + rename) **AR6**: Pipeline 模式(六阶段流水线编排) **AR7**: State Machine 状态管理 **AR8**: Repository 模式(数据持久化抽象) **AR9**: Observer 模式(GUI 更新通知) **AR10**: PyInstaller 打包为可执行文件 **AR11**: GPU 批处理优化(动态调整批次大小) **AR12**: 增量进度保存(减少磁盘写入) **AR13**: 章节识别(兼容多种标题格式) **AR14**: 定长分段(900 字符基准,950 字符上限,1200 字符断点) **AR15**: Top200 术语自动提取 **AR16**: 术语锁定占位符机制(§Ti§) **AR17**: 失败检测 + 自动重试(3次,指数退避) **AR18**: 失败清单保存(upload_failed.jsonl) **AR19**: 断点续传(跳过已完成章节) **AR20**: 任务历史记录 **AR21**: 桌面通知(Windows 原生 Toast, macOS NotificationCenter) **AR22**: 系统托盘最小化 + 后台运行 **AR23**: License 硬件指纹绑定 + 在线激活验证 **AR24**: 离线激活支持(本地验证签名) ### UX Design Requirements 不适用 - 未提供 UX 设计文档 ### FR Coverage Map | Epic | FRs 覆盖 | |------|---------| | Epic 1: 基础架构与 Crash-Safe 机制 | AR5, AR6, AR7, AR8 | | Epic 2: 指纹机制模块 | FR1-FR6 | | Epic 3: 清洗模块 | FR7, FR9-FR11 | | Epic 4: 术语提取模块 | FR12-FR17 | | Epic 5: 翻译模块 | FR18-FR23 | | Epic 6: 上传模块 | FR24-FR29, FR26, FR42-FR43, AR17, AR18, AR19 | | Epic 7a: 任务调度核心 | FR30-FR35, AR20 | | Epic 7b: 用户界面完整版 | FR36-FR52, AR21, AR22 | **FR50, FR51 已覆盖于 Story 7.26: 实现客户端版本检查** ## Epic List --- ## Epic 1: 基础架构与 Crash-Safe 机制 **Epic 目标:** 用户在系统意外关闭或断电后,能够从断点继续翻译,无需重新开始。 **覆盖的需求:** AR5 (Crash-Safe 原子写), AR6 (Pipeline 模式), AR7 (State Machine), AR8 (Repository 模式) ### Story 1.1: 实现 Pipeline 编排框架 **As a** 系统开发者, **I want** 建立六阶段 Pipeline 编排框架, **So that** 可以将文件处理流程模块化并支持灵活组合。 **验收标准:** **Given** 系统已初始化 **When** 创建 Pipeline 对象并添加多个阶段处理器 **Then** Pipeline 按顺序执行所有阶段并将每个阶段的输出传递给下一阶段 **And** 任一阶段抛出异常时,Pipeline 捕获异常并停止执行 **And** 支持 get_stage_result(stage_name) 获取指定阶段的输出 **And** 支持 reset() 方法重置 Pipeline 状态 **技术任务:** 1. 创建 `pipeline/pipeline.py` 核心类 2. 实现 `Stage` 抽象基类和 `PipelineExecutor` 3. 实现阶段结果缓存机制 4. 编写单元测试验证顺序执行和异常处理 **估算:** 5 故事点 --- ### Story 1.2: 实现 State Machine 任务状态管理 **As a** 系统, **I want** 使用状态机管理翻译任务的生命周期, **So that** 可以追踪任务状态并支持状态转换验证。 **验收标准:** **Given** 系统已定义任务状态 (IDLE, RUNNING, PAUSED, COMPLETED, FAILED) **When** 任务从 IDLE 状态请求转换到 RUNNING 状态 **Then** 状态转换成功并记录状态变更时间戳 **And** 状态机拒绝无效的状态转换 (如从 FAILED 直接到 RUNNING 必须经过 PAUSED) **And** 支持 get_current_state() 和 get_state_history() 查询 **And** 状态变更事件可通过 Observer 订阅 **技术任务:** 1. 创建 `state_machine/task_state.py` 状态枚举 2. 实现 `TaskStateMachine` 类和状态转换规则 3. 实现状态历史记录功能 4. 实现 Observer 模式支持状态变更通知 5. 编写单元测试验证所有状态转换路径 **估算:** 8 故事点 --- ### Story 1.3: 实现 Repository 数据持久化抽象 **As a** 系统, **I want** 使用 Repository 模式抽象数据持久化, **So that** 可以灵活切换存储后端 (本地文件/数据库) 并统一数据访问接口。 **验收标准:** **Given** Repository 抽象基类已定义 **When** 创建 FileTaskRepository 实现 **Then** 支持保存任务数据到 JSON 文件 **And** 支持按 work_id 查询任务 **And** 支持更新任务状态和进度 **And** 支持获取所有未完成任务列表 **And** 所有操作返回统一的 Result 对象 (包含 data/error) **技术任务:** 1. 创建 `repository/base.py` 抽象基类 2. 创建 `repository/file_task_repository.py` 实现 3. 定义数据模型类 (Task, Chapter, Term 等) 4. 实现 CRUD 操作和查询方法 5. 编写单元测试验证 Repository 操作 **估算:** 6 故事点 --- ### Story 1.4: 实现 Crash-Safe 原子写入机制 **As a** 系统, **I want** 使用原子写入机制保存关键数据, **So that** 即使断电或崩溃也不会损坏数据文件。 **验收标准:** **Given** 需要保存任务数据到文件 **When** 调用 atomic_write() 方法保存数据 **Then** 数据首先写入临时文件 (.tmp 后缀) **And** 使用 fsync() 确保数据刷新到磁盘 **And** 原子操作重命名临时文件为目标文件 **And** 如果写入失败,目标文件保持不变 **And** 系统启动时检测并清理残留的临时文件 **技术任务:** 1. 创建 `utils/atomic_write.py` 工具模块 2. 实现临时文件写入逻辑 3. 实现文件系统同步 (fsync) 调用 4. 实现原子重命名操作 (os.replace) 5. 实现启动时临时文件清理 6. 编写集成测试验证断电场景 **估算:** 5 故事点 --- ### Story 1.5: 实现 Observer 模式进度通知 **As a** GUI, **I want** 通过 Observer 模式订阅任务进度事件, **So that** 可以实时更新用户界面显示翻译进度。 **验收标准:** **Given** 系统正在执行翻译任务 **When** 任务状态或进度发生变化 **Then** 所有订阅的 Observer 接收到进度更新通知 **And** 通知包含当前阶段、当前章节、总章节数、进度百分比 **And** 支持订阅者注册和取消订阅 **And** 支持按事件类型过滤通知 (STATE_CHANGE, PROGRESS_UPDATE, ERROR) **技术任务:** 1. 创建 `observer/event.py` 事件数据类 2. 创建 `observer/publisher.py` 发布者基类 3. 实现订阅者注册/取消注册逻辑 4. 实现事件分发机制 5. 编写单元测试验证通知传递 **估算:** 4 故事点 --- **Epic 1 总结:** 5 个故事,共 28 故事点 --- ## Epic 2: 指纹机制模块 **Epic 目标:** 用户导入已处理过的文件时,系统自动识别并复用结果,避免重复翻译。 **覆盖的需求:** FR1 (文件指纹计算), FR2 (分块哈希), FR3 (指纹缓存), FR4 (重复检测), FR5 (缓存失效), FR6 (指纹导出) ### Story 2.1: 实现文件内容哈希计算 **As a** 系统, **I want** 计算文件的 SHA-256 内容哈希值, **So that** 可以唯一标识文件内容并检测重复。 **验收标准:** **Given** 用户选择了一个文本文件 **When** 系统计算文件哈希值 **Then** 使用 SHA-256 算法计算完整文件内容的哈希 **And** 只读取文件内容,忽略元数据 (文件名、修改时间) **And** 返回 64 位十六进制哈希字符串 **And** 大文件 (>100MB) 支持进度回调 **技术任务:** 1. 创建 `fingerprint/hasher.py` 模块 2. 实现 `calculate_file_hash(file_path, algorithm='sha-256')` 函数 3. 实现大文件流式读取和进度回调 4. 编写单元测试验证哈希计算正确性 **估算:** 3 故事点 --- ### Story 2.2: 实现分块增量哈希 **As a** 系统, **I want** 支持按固定大小的块计算文件哈希, **So that** 大文件可以分块处理并支持增量验证。 **验收标准:** **Given** 大文件需要分块处理 **When** 系统计算分块哈希 **Then** 按 4MB 块大小分割文件 **And** 为每个块计算独立哈希值 **And** 返回块哈希列表和组合哈希 (Merkle Tree 根哈希) **And** 支持配置块大小 **技术任务:** 1. 在 `fingerprint/hasher.py` 中实现分块读取逻辑 2. 实现 `calculate_chunked_hash(file_path, chunk_size=4*1024*1024)` 3. 实现 Merkle Tree 根哈希计算 4. 编写单元测试验证分块哈希 **估算:** 5 故事点 --- ### Story 2.3: 实现指纹缓存存储 **As a** 系统, **I want** 将文件指纹缓存到本地数据库, **So that** 已处理文件可以快速复用无需重新计算。 **验收标准:** **Given** 文件哈希计算完成 **When** 系统保存指纹到缓存 **Then** 存储文件哈希、文件路径、文件大小、计算时间戳 **And** 缓存文件位于 `~/.cache/bmad_translator/fingerprints/` **And** 使用 SQLite 存储缓存索引 **And** 支持按哈希值快速查询缓存 **技术任务:** 1. 创建 `fingerprint/cache.py` 缓存模块 2. 定义 `FingerprintCache` 数据模型 3. 实现 SQLite 缓存存储和查询 4. 实现缓存目录管理 5. 编写单元测试验证缓存操作 **估算:** 5 故事点 --- ### Story 2.4: 实现重复文件检测 **As a** 用户, **I want** 系统自动检测重复文件, **So that** 避免重复翻译相同内容。 **验收标准:** **Given** 用户添加了新文件 **When** 系统检测到文件哈希已存在缓存 **Then** 提示用户"此文件已处理过,是否复用上次结果?" **And** 显示上次处理时间和处理结果 **And** 用户选择复用时直接加载缓存结果 **And** 用户选择重新处理时重新执行完整流程 **技术任务:** 1. 实现 `fingerprint/detector.py` 重复检测模块 2. 实现 `is_duplicate(file_hash)` 查询方法 3. 实现重复结果复用逻辑 4. 集成到文件添加流程 5. 编写单元测试验证检测逻辑 **估算:** 4 故事点 --- ### Story 2.5: 实现缓存失效机制 **As a** 系统, **I want** 在源文件内容变化时使缓存失效, **So that** 确保处理结果始终反映最新文件内容。 **验收标准:** **Given** 文件已建立指纹缓存 **When** 用户修改了源文件内容 **Then** 文件哈希值发生变化 **And** 系统检测到哈希不匹配 **And** 标记旧缓存为无效 **And** 重新计算新哈希并创建新缓存条目 **And** 定期清理超过 30 天的无效缓存 **技术任务:** 1. 实现 `fingerprint/invalidator.py` 模块 2. 实现文件变化检测逻辑 3. 实现缓存失效标记 4. 实现定期清理任务 (使用 Python `sched` 模块) 5. 编写单元测试验证失效逻辑 **估算:** 4 故事点 --- ### Story 2.6: 实现指纹导出功能 **As a** 用户, **I want** 导出文件指纹报告, **So that** 可以离线审核文件处理历史。 **验收标准:** **Given** 用户已处理多个文件 **When** 用户选择导出指纹报告 **Then** 生成 CSV 格式报告包含:文件名、哈希值、文件大小、处理时间 **And** 支持选择日期范围导出 **And** 支持导出到指定路径 **And** 导出完成后显示文件位置 **技术任务:** 1. 创建 `fingerprint/exporter.py` 模块 2. 实现 `export_fingerprints(output_path, date_range)` 函数 3. 实现日期范围过滤 4. 实现格式化输出 5. 编写单元测试验证导出格式 **估算:** 3 故事点 --- --- ### Story 2.7: 实现网络错误自动重试 **As a** 系统, **I want** 在网络错误时自动重试 API 调用, **So that** 可以提高指纹查重的可靠性。 **验收标准:** **Given** 系统正在执行 API 调用 **When** 发生网络错误 (超时/连接失败/5xx错误) **Then** 系统等待 2 秒后自动重试 **And** 最多重试 3 次 **And** 重试成功后继续正常流程 **And** 3 次重试均失败后记录错误并提示用户 **And** 记录重试次数到日志 **技术任务:** 1. 创建 `fingerprint/retry_handler.py` 模块 2. 实现指数退避重试逻辑 (2秒间隔) 3. 定义可重试错误类型 4. 实现重试计数和日志记录 5. 编写单元测试验证重试机制 **估算:** 3 故事点 --- **Epic 2 总结:** 7 个故事,共 27 故事点 --- ## Epic 3: 清洗模块 **Epic 目标:** 清洗和规范化小说内容,去除无关元素、修复格式问题、统一标点符号,为翻译提供干净的输入文本。 **覆盖的需求:** FR7 (移除无关内容), FR9 (段落格式修复), FR10 (标点统一), FR11 (硬/软回车处理) ### Story 3.1: 实现无关内容过滤 **As a** 系统, **I want** 自动过滤小说中的广告、版权声明和章节标题无关内容, **So that** 翻译输入保持纯净的小说正文。 **验收标准:** **Given** 小说文件包含广告、版权声明等内容 **When** 系统执行清洗过滤 **Then** 识别并删除包含"版权所有"、"转载请注明"等特征的行 **And** 删除纯 URL 行 **And** 删除重复出现的页眉/页脚 **And** 保留有效的章节标题 **And** 生成清洗日志报告删除的内容类型和数量 **技术任务:** 1. 创建 `cleaning/filter.py` 模块 2. 定义无关内容正则模式库 3. 实现 `remove_irrelevant_content(text)` 函数 4. 实现清洗日志记录 5. 编写单元测试验证过滤规则 **估算:** 5 故事点 --- ### Story 3.2: 实现段落格式修复 **As a** 系统, **I want** 修复破损的段落结构, **So that** 翻译时能够正确识别段落边界。 **验收标准:** **Given** 文本存在孤立的单词或短语行 **When** 系统检测段落格式 **Then** 识别被错误分割的段落 (如行尾无标点且非章节标题) **And** 将孤立行合并到前一段落 **And** 保持对话行独立 (包含引号的行) **And** 确保段落之间有空行分隔 **And** 生成格式修复报告 **技术任务:** 1. 创建 `cleaning/paragraph_fixer.py` 模块 2. 实现段落边界检测算法 3. 实现段落合并逻辑 4. 实现对话行识别规则 5. 编写单元测试验证修复效果 **估算:** 6 故事点 --- ### Story 3.3: 实现标点符号统一 **As a** 系统, **I want** 将全角/半角标点符号统一转换为全角中文标点, **So that** 翻译质量更好且格式一致。 **验收标准:** **Given** 文本混合使用全角和半角标点 **When** 系统执行标点统一 **Then** 将半角句号、逗号、问号、感叹号转换为全角 **And** 统一引号样式 (中文使用 "" 而非 "") **And** 统一省略号样式 (使用 …… 而非 ...) **And** 保留英文引号内的英文标点不变 **And** 生成标点修正统计 **技术任务:** 1. 创建 `cleaning/punctuation_normalizer.py` 模块 2. 定义标点映射表 3. 实现上下文感知的标点转换 (处理中英混合) 4. 实现统计报告 5. 编写单元测试验证转换规则 **估算:** 4 故事点 --- ### Story 3.4: 实现硬/软回车处理 **As a** 系统, **I want** 识别并处理硬回车和软回车, **So that** 正确保留段落结构并去除行末连字符。 **验收标准:** **Given** 文本包含软回车和硬回车 **When** 系统分析回车类型 **Then** 识别行末连字符 (如 "exam-\nple") 并合并为完整单词 **And** 识别连续的软回车 (单个换行符) 合并为段落 **And** 保留硬回车 (双换行符) 作为段落分隔 **And** 支持 Windows (\r\n) 和 Unix (\n) 换行符 **And** 生成回车处理报告 **技术任务:** 1. 创建 `cleaning/line_break_handler.py` 模块 2. 实现连字符检测和合并逻辑 3. 实现回车类型识别算法 4. 实现换行符标准化 5. 编写单元测试验证处理逻辑 **估算:** 5 故事点 --- ### Story 3.5: 集成清洗流程并生成报告 **As a** 用户, **I want** 一键执行完整的清洗流程并查看清洗报告, **So that** 了解文本处理效果并验证清洗质量。 **验收标准:** **Given** 用户已选择待清洗的文本文件 **When** 用户执行清洗操作 **Then** 按顺序执行:过滤无关内容 → 修复段落 → 统一标点 → 处理回车 **And** 显示实时进度条 **And** 完成后生成 HTML 格式清洗报告 **And** 报告包含:原文长度、清洗后长度、删除行数、修改统计、预览对比 **And** 支持导出清洗报告 **技术任务:** 1. 创建 `cleaning/pipeline.py` 清洗流程编排 2. 实现各清洗步骤的顺序执行 3. 实现 `CleaningReport` 数据类 4. 实现 HTML 报告生成模板 5. 编写集成测试验证完整流程 **估算:** 5 故事点 --- **Epic 3 总结:** 5 个故事,共 25 故事点 --- ## Epic 4: 术语提取模块 **优先级:** **P0** (基于 Phase 0 验证结果提升 - 术语表对翻译质量至关重要) **Epic 目标:** 翻译过程中角色名和专有术语保持一致,符合用户设定。 **提升说明:** Phase 0 技术验证确认,没有术语表功能时,翻译内容会出现严重的术语不一致问题(如"林风"被译为"Lin wind"而非"Lin Feng")。术语表是保证翻译质量的核心功能,因此提升为 P0 优先级。 **覆盖的需求:** FR12 (术语识别), FR13 (术语表管理), FR14 (术语标注), FR15 (冲突检测), FR16 (术语导入导出), FR17 (上下文感知) ### Story 4.1: 实现基础术语识别算法 **As a** 系统, **I want** 自动识别文本中的专有术语和角色名, **So that** 构建初始术语表供用户审核。 **验收标准:** **Given** 小说文本已加载 **When** 系统执行术语识别 **Then** 使用词性标注识别人名 (nr)、地名 (ns)、机构名 (nt) **And** 识别高频连续大写/中文组合 (2-4 字) **And** 识别数字+单位组合 (如"三阶法师") **And** 过滤停用词表 (如"今天"、"有人") **And** 按频率排序生成候选术语列表 **技术任务:** 1. 创建 `terminology/extractor.py` 模块 2. 集成 jieba 分词进行词性标注 3. 实现术语识别规则引擎 4. 实现停用词过滤 5. 编写单元测试验证识别准确性 **估算:** 6 故事点 --- ### Story 4.2: 实现术语表 CRUD 管理 **As a** 用户, **I want** 管理术语表 (增删改查), **So that** 可以自定义术语并控制翻译行为。 **验收标准:** **Given** 术语表已初始化 **When** 用户添加新术语 **Then** 支持输入术语原文、目标翻译、术语类型、备注 **And** 验证术语格式 (不能为空,不能含特殊字符) **And** 检测重复术语并提示用户 **When** 用户编辑术语 **Then** 支持修改所有字段 **And** 记录修改历史 **When** 用户删除术语 **Then** 术语从表中移除 **And** 翻译时不再使用该术语 **技术任务:** 1. 创建 `terminology/terminology_manager.py` 模块 2. 定义 `Term` 数据类 3. 实现 CRUD 操作方法 4. 实现修改历史记录 5. 编写单元测试验证 CRUD 逻辑 **估算:** 5 故事点 --- ### Story 4.3: 实现术语冲突检测 **As a** 用户, **I want** 系统检测术语表中的冲突, **So that** 避免翻译时出现不一致。 **验收标准:** **Given** 术语表包含多个术语 **When** 用户添加或修改术语 **Then** 检测以下冲突类型: - 同一原文有多个翻译 - 不同原文翻译相同 (可能导致混淆) - 术语是另一个术语的子串 (如"魔法"和"魔法师") **And** 高亮显示冲突术语 **And** 提供冲突解决建议 **And** 用户确认后才允许保存冲突术语 **技术任务:** 1. 创建 `terminology/conflict_detector.py` 模块 2. 实现冲突检测规则引擎 3. 实现冲突建议生成 4. 集成到术语保存流程 5. 编写单元测试验证检测规则 **估算:** 5 故事点 --- ### Story 4.4: 实现术语表导入导出 **As a** 用户, **I want** 导入和导出术语表, **So that** 可以在不同项目间复用术语表。 **验收标准:** **Given** 用户有现成的术语表文件 **When** 用户导入术语表 **Then** 支持 CSV 格式 (原文,翻译,类型,备注) **And** 支持 JSON 格式 **And** 导入时验证数据格式 **And** 检测并报告导入冲突 **And** 显示导入结果摘要 **When** 用户导出术语表 **Then** 支持导出为 CSV 和 JSON **And** 包含所有术语字段 **And** 支持选择性导出 (按类型筛选) **技术任务:** 1. 创建 `terminology/io.py` 模块 2. 实现 CSV 解析和生成 3. 实现 JSON 序列化和反序列化 4. 实现导入验证逻辑 5. 编写单元测试验证导入导出 **估算:** 4 故事点 --- ### Story 4.5: 实现术语上下文标注 **As a** 系统, **I want** 在文本中标注术语出现的上下文, **So that** 用户可以根据上下文确定合适的翻译。 **验收标准:** **Given** 文本包含多个术语实例 **When** 系统标注术语上下文 **Then** 为每个术语提取前后各 20 字的上下文 **And** 高亮显示术语位置 **And** 按术语分组显示所有实例 **And** 支持点击跳转到原文位置 **And** 支持用户根据上下文调整翻译 **技术任务:** 1. 创建 `terminology/context_annotator.py` 模块 2. 实现上下文窗口提取 3. 实现术语实例索引 4. 实现位置映射 (原文位置→清洗后位置) 5. 编写单元测试验证标注准确性 **估算:** 5 故事点 --- ### Story 4.6: 实现术语翻译应用 **As a** 系统, **I want** 在翻译前将术语标注应用到文本, **So that** AI 翻译模型能识别并保留术语翻译。 **验收标准:** **Given** 术语表已定义 **When** 系统准备翻译文本 **Then** 在术语前后插入特殊标记 (如 `原文翻译`) **And** 长术语优先匹配 (避免"魔法"覆盖"魔法师") **And** 生成标注后文本预览 **And** 标记数量统计显示 **And** 翻译后提取术语翻译并移除标记 **技术任务:** 1. 创建 `terminology/term_tagger.py` 模块 2. 实现最长匹配算法 3. 实现术语标记插入 4. 实现翻译后术语提取 5. 编写单元测试验证标记逻辑 **估算:** 5 故事点 --- **Epic 4 总结:** 6 个故事,共 30 故事点 --- ## Epic 5: 翻译模块 **Epic 目标:** 使用 GPU 加速的 AI 翻译引擎,支持批量处理、术语注入、断点续译和质量检查。 **覆盖的需求:** FR18 (AI 翻译集成), FR19 (GPU 加速), FR20 (批量处理), FR21 (术语注入), FR22 (断点续译), FR23 (质量检查) ### Story 5.1: 集成 CTranslate2 翻译引擎 **As a** 系统, **I want** 集成 CTranslate2 和 m2m100 模型, **So that** 可以执行高质量的中文到英文翻译。 **验收标准:** **Given** 系统已安装 CTranslate2 **When** 用户选择待翻译文本 **Then** 加载 facebook/m2m100_418M 模型 **And** 执行中文→英文翻译 **And** 支持自定义翻译参数 (beam_size, repetition_penalty) **And** 返回翻译结果和置信度分数 **And** 记录翻译耗时 **技术任务:** 1. 创建 `translation/ctranslate_engine.py` 模块 2. 实现 `CTranslateEngine` 类 3. 实现模型加载和卸载 4. 实现翻译参数配置 5. 编写单元测试验证翻译功能 **估算:** 6 故事点 --- ### Story 5.2: 实现 GPU 自动检测和加速 **As a** 系统, **I want** 自动检测并使用 GPU 加速翻译, **So that** 大幅提升翻译速度。 **验收标准:** **Given** 系统启动 **When** 检测可用硬件 **Then** 使用 cuda_detect_library 检测 NVIDIA GPU **And** 检测 GPU 显存大小 (推荐 >= 6GB) **And** 自动配置 CTranslate2 使用 CUDA 设备 **And** 如果 GPU 不可用,回退到 CPU 并警告用户 **And** 显示当前使用的设备信息 **技术任务:** 1. 创建 `translation/device_detector.py` 模块 2. 实现 GPU 检测逻辑 (使用 pynvml 库) 3. 实现显存大小检测 4. 实现 CTranslate2 设备配置 5. 编写单元测试验证检测逻辑 **估算:** 5 故事点 --- ### Story 5.3: 实现批量章节翻译 **As a** 用户, **I want** 批量翻译多个章节, **So that** 可以高效处理整本小说。 **验收标准:** **Given** 用户已加载小说并选择待翻译章节 **When** 用户开始批量翻译 **Then** 按章节顺序执行翻译 **And** 每翻译完一个章节保存中间结果 **And** 显示实时进度 (当前章节/总章节) **And** 显示预估剩余时间 **And** 支持暂停/恢复翻译 **And** 翻译失败时记录错误并继续下一章节 **技术任务:** 1. 创建 `translation/batch_translator.py` 模块 2. 实现章节队列管理 3. 实现批量翻译循环 4. 实现中间结果保存 5. 实现暂停/恢复控制 6. 编写集成测试验证批量翻译 **估算:** 7 故事点 --- ### Story 5.4: 实现术语翻译注入 **As a** 系统, **I want** 在翻译前注入术语翻译提示, **So that** 确保术语翻译一致性。 **验收标准:** **Given** 术语表已定义 **When** 系统翻译包含术语的文本 **Then** 在翻译提示中加入术语对照表 **And** 使用 few-shot 提示示例引导模型 **And** 翻译后验证术语是否按指定翻译 **And** 记录术语应用统计 (成功/失败) **And** 失败时在报告中标注 **技术任务:** 1. 创建 `translation/term_injector.py` 模块 2. 实现术语提示模板生成 3. 实现术语翻译验证 4. 实现统计记录 5. 编写单元测试验证注入效果 **估算:** 5 故事点 --- ### Story 5.5: 实现断点续译机制 **As a** 用户, **I want** 从中断位置继续翻译, **So that** 意外中断后无需重新翻译已完成内容。 **验收标准:** **Given** 批量翻译任务执行中 **When** 任务被中断 (程序关闭/崩溃) **Then** 系统保存已翻译章节索引 **And** 保存翻译任务状态到磁盘 **When** 用户重新启动并选择继续翻译 **Then** 系统检查已翻译章节 **And** 从第一个未翻译章节开始 **And** 显示续译提示"从第 X 章继续" **技术任务:** 1. 创建 `translation/checkpoint.py` 模块 2. 实现检查点数据结构 3. 实现检查点保存和加载 4. 集成到批量翻译流程 5. 编写集成测试验证续译功能 **估算:** 6 故事点 --- ### Story 5.6: 实现翻译质量检查 **As a** 系统, **I want** 自动检查翻译质量, **So that** 发现潜在问题并提示用户审核。 **验收标准:** **Given** 翻译完成 **When** 系统执行质量检查 **Then** 检测漏译 (原文行数≠译文行数) **And** 检测未翻译术语 (术语未按指定翻译) **And** 检测异常长度 (译文长度异常短/长) **And** 检测重复内容 (连续重复句子) **And** 生成质量报告并标注问题位置 **And** 显示质量分数 (0-100) **技术任务:** 1. 创建 `translation/quality_checker.py` 模块 2. 实现各项质量检查规则 3. 实现质量分数计算 4. 实现 HTML 质量报告生成 5. 编写单元测试验证检查规则 **估算:** 6 故事点 --- --- ### Story 5.7: 实现 GPU 批量失败降级 **As a** 系统, **I want** 批量翻译失败时降级为单条翻译, **So that** 提高翻译成功率。 **验收标准:** **Given** 系统正在执行批量翻译 (batch_size > 1) **When** 批量翻译失败 (GPU OOM/超时) **Then** 自动切换为 batch_size=1 重试 **And** 记录降级事件到日志 **And** 显示降级提示给用户 **And** 单条翻译完成后继续处理下一批 **And** 统计批量/单条翻译成功率 **技术任务:** 1. 在 `translation/batch_translator.py` 中实现降级逻辑 2. 实现异常类型检测 (区分可恢复和不可恢复错误) 3. 实现 batch_size 动态调整 4. 实现降级统计记录 5. 编写集成测试验证降级机制 **估算:** 4 故事点 --- ### Story 5.8: 实现失败清单记录 **As a** 用户, **I want** 系统记录翻译失败的章节, **So that** 可以批量重试。 **验收标准:** **Given** 翻译过程中出现失败 **When** 章节翻译失败 **Then** 失败信息写入 translate_failed.jsonl **And** 每行一条记录,包含:章节号、原文、错误类型、失败时间、重试次数 **And** 使用 JSONL 格式 (每行独立 JSON) **And** 支持导出失败清单 **And** 支持从失败清单批量重试 **技术任务:** 1. 创建 `translation/failed_recorder.py` 模块 2. 定义失败记录数据结构 3. 实现 JSONL 写入逻辑 4. 实现批量重试接口 5. 编写测试验证失败记录 **估算:** 3 故事点 --- **Epic 5 总结:** 8 个故事,共 42 故事点 --- ## Epic 6: 上传模块 **Epic 目标:** 将翻译后的内容上传到目标平台 (RoyalRoad),支持章节分割、格式转换和错误重试。 **覆盖的需求:** FR24 (平台格式转换), FR25 (章节分割), FR26 (API 上传), FR27 (上传状态), FR28 (断点续传), FR29 (上传历史) ### Story 6.1: 实现 RoyalRoad 格式转换 **As a** 系统, **I want** 将翻译内容转换为 RoyalRoad 格式, **So that** 可以正确显示在目标平台。 **验收标准:** **Given** 翻译后的文本内容 **When** 系统执行格式转换 **Then** 转换为 HTML 格式 **And** 段落使用 `

` 标签包裹 **And** 对话使用 `

` 标签保留引号 **And** 章节标题使用 `

` 或 `

` 标签 **And** 保留斜体 `` 和粗体 `` 标记 **And** 生成格式预览 **技术任务:** 1. 创建 `upload/formatter.py` 模块 2. 实现 Markdown 到 HTML 转换 3. 实现 RoyalRoad 特定格式规则 4. 实现格式预览生成 5. 编写单元测试验证格式输出 **估算:** 4 故事点 --- ### Story 6.2: 实现智能章节分割 **As a** 系统, **I want** 按章节标题分割长文, **So that** 每个章节可以作为独立作品发布。 **验收标准:** **Given** 翻译后的完整文本 **When** 系统执行章节分割 **Then** 识别章节标题 (如"Chapter 1", "第一章") **And** 按标题分割文本为多个章节 **And** 每个章节包含标题和正文 **And** 生成分割预览 (章节列表和字数) **And** 支持手动调整分割点 **And** 支持合并连续章节 **技术任务:** 1. 创建 `upload/splitter.py` 模块 2. 实现章节标题识别规则 3. 实现文本分割算法 4. 实现手动调整接口 5. 编写单元测试验证分割准确性 **估算:** 5 故事点 --- ### Story 6.3: 集成 RoyalRoad API 上传 **As a** 用户, **I want** 通过 API 直接上传到 RoyalRoad, **So that** 无需手动复制粘贴内容。 **验收标准:** **Given** 用户已配置 RoyalRoad API 凭证 **When** 用户执行上传操作 **Then** 系统使用 RoyalRoad Fiction API 上传内容 **And** 设置作品标题、描述、标签 **And** 逐章节发布内容 **And** 支持设置为草稿或直接发布 **And** 显示上传进度 (当前章节/总章节) **And** 处理 API 错误并提示用户 **技术任务:** 1. 创建 `upload/royalroad_api.py` 模块 2. 实现 RoyalRoad API 客户端 3. 实现作品创建和章节发布 4. 实现错误处理和重试逻辑 5. 编写集成测试验证上传流程 **估算:** 7 故事点 --- ### Story 6.4: 实现上传状态跟踪 **As a** 用户, **I want** 实时查看上传状态, **So that** 了解上传进度和问题。 **验收标准:** **Given** 上传任务执行中 **When** 用户查看上传状态 **Then** 显示当前上传章节序号 **And** 显示已完成/失败/待上传章节列表 **And** 显示上传速度和预估剩余时间 **And** 失败时显示具体错误信息 **And** 支持点击失败章节查看详情 **技术任务:** 1. 创建 `upload/status_tracker.py` 模块 2. 定义 `UploadStatus` 数据类 3. 实现状态更新逻辑 4. 实现速度和剩余时间计算 5. 集成进度通知到 UI **估算:** 4 故事点 --- ### Story 6.5: 实现断点续传机制 **As a** 用户, **I want** 从失败位置继续上传, **So that** 网络中断后无需重新上传已完成内容。 **验收标准:** **Given** 上传任务执行中 **When** 上传被中断 (网络断开/程序关闭) **Then** 系统保存已上传章节列表 **And** 保存上传任务状态 **When** 用户选择继续上传 **Then** 系统跳过已上传章节 **And** 从第一个未上传章节开始 **And** 显示续传提示"从第 X 章继续上传" **技术任务:** 1. 创建 `upload/upload_checkpoint.py` 模块 2. 实现上传检查点保存和加载 3. 实现已上传章节查询 (通过 API) 4. 集成到上传流程 5. 编写集成测试验证续传功能 **估算:** 5 故事点 --- ### Story 6.6: 实现上传历史管理 **As a** 用户, **I want** 查看和管理上传历史, **So that** 可以追踪已发布内容。 **验收标准:** **Given** 用户已完成多次上传 **When** 用户查看上传历史 **Then** 显示所有上传任务列表 **And** 每条记录包含:时间、目标平台、章节数、状态 **And** 支持按状态筛选 (成功/失败/部分) **And** 支持查看任务详情 **And** 支持重新上传失败的任务 **And** 支持删除历史记录 **技术任务:** 1. 创建 `upload/history_manager.py` 模块 2. 定义 `UploadHistory` 数据模型 3. 实现历史记录存储 (SQLite) 4. 实现查询和筛选接口 5. 编写单元测试验证历史管理 **估算:** 4 故事点 --- --- ### Story 6.7: 实现 CU 费用计算 **As a** 平台, **I want** 上传前计算并扣除章节 CU 费用, **So that** 按量计费。 **验收标准:** **Given** 用户准备上传翻译内容 **When** 计算章节 CU 费用 **Then** CU = 章节字数 ÷ 100 (向上取整) **And** 上传前调用扣费 API **And** 扣费成功后继续上传流程 **And** 扣费失败时提示用户并阻止上传 **And** 记录扣费历史 **技术任务:** 1. 创建 `upload/cu_calculator.py` 模块 2. 实现 CU 计算逻辑 (math.ceil) 3. 集成扣费 API 调用 4. 实现扣费失败处理 5. 编写测试验证 CU 计算 **估算:** 4 故事点 --- ### Story 6.8: 实现内容合规处理 **As a** 平台, **I want** 翻译内容添加标识并声明版权, **So that** 符合合规要求。 **验收标准:** **Given** 翻译内容准备上传 **When** 添加合规标识 **Then** 在章节末尾添加 "Translated by 序灵 Matrix 助手" 标识 **And** 标识格式统一 (HTML 或纯文本) **And** 首次上传时显示版权声明弹窗 **And** 用户确认后继续上传 **And** 记录版权声明确认状态 **技术任务:** 1. 创建 `upload/compliance_handler.py` 模块 2. 实现标识添加逻辑 3. 创建版权声明对话框 UI 4. 实现确认状态持久化 5. 编写测试验证合规处理 **估算:** 3 故事点 --- **Epic 6 总结:** 8 个故事,共 36 故事点 --- ## Epic 7a: 任务调度核心 **Epic 目标:** 用户可以暂停、恢复、取消翻译任务,并查看任务执行历史。 **覆盖的需求:** FR30-FR35, AR20 (任务历史记录) ### Story 7.1: 实现任务队列管理器 **As a** 系统, **I want** 管理翻译任务队列, **So that** 可以控制任务执行顺序和状态。 **验收标准:** **Given** 系统已初始化 **When** 添加新任务到队列 **Then** 任务获得唯一 ID 并进入 PENDING 状态 **And** 队列按优先级排序 (高/中/低) **And** 同优先级任务按添加时间排序 **When** 执行器从队列获取任务 **Then** 任务状态变为 RUNNING **And** 其他任务等待当前任务完成 **And** 支持查询队列状态 (等待/运行/完成) **技术任务:** 1. 创建 `scheduler/task_queue.py` 模块 2. 定义 `Task` 数据类和 `Priority` 枚举 3. 实现 `TaskQueue` 类 4. 实现优先级排序逻辑 5. 编写单元测试验证队列行为 **估算:** 5 故事点 --- ### Story 7.2: 实现任务优先级调度 **As a** 用户, **I want** 设置任务优先级, **So that** 重要任务优先执行。 **验收标准:** **Given** 任务队列中有多个待执行任务 **When** 用户调整任务优先级 **Then** 支持将任务设为高/中/低优先级 **And** 高优先级任务插队到队列前部 **And** 显示调整后的队列顺序 **And** 保存优先级到任务配置 **技术任务:** 1. 创建 `scheduler/priority_scheduler.py` 模块 2. 实现优先级比较逻辑 3. 实现队列重排序 4. 集成到任务管理接口 5. 编写单元测试验证调度逻辑 **估算:** 4 故事点 --- ### Story 7.3: 实现并行任务执行 **As a** 系统, **I want** 并行执行多个翻译任务, **So that** 充分利用多核 CPU 和 GPU。 **验收标准:** **Given** 有多个独立翻译任务 **When** 系统执行并行调度 **Then** 根据配置的并发数 (默认 2) 启动任务 **And** 每个任务在独立线程中执行 **And** GPU 任务串行化 (避免显存冲突) **And** 非 GPU 任务可并行 (如清洗、格式转换) **And** 显示各任务的执行状态 **技术任务:** 1. 创建 `scheduler/parallel_executor.py` 模块 2. 实现 ThreadPoolExecutor 包装 3. 实现 GPU 任务锁 4. 实现任务类型分类 5. 编写集成测试验证并行执行 **估算:** 6 故事点 --- ### Story 7.4: 实现任务暂停和恢复 **As a** 用户, **I want** 暂停和恢复正在执行的任务, **So that** 可以灵活控制任务执行时机。 **验收标准:** **Given** 任务正在执行中 **When** 用户点击暂停按钮 **Then** 当前任务在下一个检查点暂停 **And** 任务状态变为 PAUSED **And** 保存任务执行进度 **When** 用户点击恢复按钮 **Then** 任务从暂停点继续执行 **And** 任务状态变回 RUNNING **And** 显示恢复进度 **技术任务:** 1. 创建 `scheduler/pause_controller.py` 模块 2. 实现暂停信号机制 3. 实现检查点检测 4. 集成到任务执行循环 5. 编写单元测试验证暂停恢复 **估算:** 5 故事点 --- ### Story 7.5: 实现任务取消功能 **As a** 用户, **I want** 取消不需要的任务, **So that** 释放资源并避免浪费时间。 **验收标准:** **Given** 任务在队列中或执行中 **When** 用户取消任务 **Then** 等待中任务直接从队列移除 **And** 执行中任务在下一个检查点停止 **And** 任务状态变为 CANCELLED **And** 释放已占用资源 **And** 记录取消原因和时间 **技术任务:** 1. 创建 `scheduler/cancel_controller.py` 模块 2. 实现取消信号机制 3. 实现资源清理逻辑 4. 集成到任务管理 5. 编写单元测试验证取消行为 **估算:** 4 故事点 --- ### Story 7.6: 实现任务历史记录 **As a** 用户, **I want** 查看任务执行历史, **So that** 追踪已完成任务的状态和结果。 **验收标准:** **Given** 系统已完成多个任务 **When** 用户查看任务历史 **Then** 显示所有已完成任务列表 **And** 每条记录包含:任务 ID、开始时间、结束时间、状态、结果摘要 **And** 支持按日期范围筛选 **And** 支持按状态筛选 (成功/失败/取消) **And** 支持查看任务详情和日志 **And** 支持重新执行历史任务 **技术任务:** 1. 创建 `scheduler/task_history.py` 模块 2. 定义 `TaskRecord` 数据模型 3. 实现历史记录存储 (SQLite) 4. 实现查询和筛选接口 5. 编写单元测试验证历史管理 **估算:** 5 故事点 --- ### Story 7.22: 实现定时任务功能 **As a** 用户, **I want** 设置定时自动翻译, **So that** 在指定时间自动执行任务。 **验收标准:** **Given** 用户打开定时任务设置 **When** 用户创建定时任务 **Then** 支持设置执行时间 (如每日 22:00) **And** 支持设置重复规则 (每日/每周/自定义) **And** 支持选择要执行的任务 **And** 到达设定时间后自动执行 **And** 任务执行完成后发送通知 **And** 支持启用/禁用定时任务 **技术任务:** 1. 创建 `scheduler/timed_task.py` 模块 2. 实现 APScheduler 集成 3. 实现定时任务配置管理 4. 实现任务触发通知 5. 编写测试验证定时功能 **估算:** 6 故事点 --- **Epic 7a 总结:** 7 个故事,共 34 故事点 --- ## Epic 7b: 用户界面完整版 **Epic 目标:** 用户通过图形界面轻松操作翻译工具,包括文件导入、进度查看、配置管理和结果预览。 **覆盖的需求:** FR36-FR52, AR21, AR22 ### Story 7.7: 创建主窗口框架 **As a** 用户, **I want** 看到应用程序主窗口, **So that** 可以开始使用翻译工具。 **验收标准:** **Given** 应用程序启动 **When** 主窗口加载 **Then** 显示应用标题 "BMAD Novel Translator" **And** 包含菜单栏 (文件、编辑、视图、帮助) **And** 包含工具栏 (常用操作按钮) **And** 包含主工作区 (文件列表/任务队列) **And** 包含状态栏 (当前状态/版本信息) **And** 窗口尺寸可调整 (默认 1200x800) **技术任务:** 1. 创建 `ui/main_window.py` 模块 2. 实现 `MainWindow` 类继承 QMainWindow 3. 创建菜单栏和工具栏 4. 创建中心部件布局 5. 编写 UI 测试验证窗口显示 **估算:** 5 故事点 --- ### Story 7.8: 实现文件选择组件 **As a** 用户, **I want** 选择待翻译的文件, **So that** 添加文件到处理队列。 **验收标准:** **Given** 主窗口已打开 **When** 用户点击"添加文件"按钮 **Then** 打开文件选择对话框 **And** 支持选择 .txt, .md, .html 文件 **And** 支持多选 (Ctrl+点击) **And** 支持文件夹导入 **And** 选中的文件显示在文件列表 **And** 显示文件名、大小、状态 **技术任务:** 1. 创建 `ui/file_selector.py` 模块 2. 实现 QFileDialog 集成 3. 实现文件列表模型 4. 实现 QTableView 显示 5. 编写 UI 测试验证选择功能 **估算:** 4 故事点 --- ### Story 7.9: 实现进度显示组件 **As a** 用户, **I want** 实时查看任务执行进度, **So that** 了解任务完成情况。 **验收标准:** **Given** 任务正在执行 **When** 用户查看进度显示 **Then** 显示当前任务名称和状态 **And** 显示进度条 (0-100%) **And** 显示当前阶段 (如"正在翻译 第 5/10 章") **And** 显示已用时间和预估剩余时间 **And** 支持最小化到系统托盘 **And** 任务完成时显示通知 **技术任务:** 1. 创建 `ui/progress_widget.py` 模块 2. 实现 QProgressBar 组件 3. 实现时间计算逻辑 4. 实现系统托盘集成 5. 编写 UI 测试验证进度显示 **估算:** 5 故事点 --- ### Story 7.10: 实现配置管理界面 **As a** 用户, **I want** 管理应用程序配置, **So that** 自定义翻译行为。 **验收标准:** **Given** 用户打开设置对话框 **When** 用户查看配置选项 **Then** 显示分类配置项: - 翻译设置 (模型选择、GPU 加速开关、批处理大小) - 界面设置 (主题、语言、字体大小) - 路径设置 (工作目录、缓存目录、输出目录) - 高级设置 (日志级别、并发数) **And** 支持修改配置并实时保存 **And** 支持恢复默认配置 **And** 配置文件保存为 JSON 格式 **技术任务:** 1. 创建 `ui/settings_dialog.py` 模块 2. 创建 `config/config_manager.py` 模块 3. 实现 QTabWidget 分页配置 4. 实现配置持久化 5. 编写测试验证配置管理 **估算:** 6 故事点 --- ### Story 7.11: 实现主题切换功能 **As a** 用户, **I want** 切换界面主题, **So that** 选择舒适的视觉风格。 **验收标准:** **Given** 应用程序运行中 **When** 用户切换主题 **Then** 支持浅色主题 (默认) **And** 支持深色主题 **And** 支持系统主题 (跟随系统) **And** 主题切换立即生效 **And** 主题选择保存到配置 **技术任务:** 1. 创建 `ui/theme_manager.py` 模块 2. 实现主题样式表定义 3. 实现主题切换逻辑 4. 集成到设置界面 5. 编写 UI 测试验证主题切换 **估算:** 4 故事点 --- ### Story 7.12: 实现多语言界面支持 **As a** 用户, **I want** 切换界面语言, **So that** 使用熟悉的语言操作软件。 **验收标准:** **Given** 应用程序已启动 **When** 用户切换语言 **Then** 支持中文 (简体) **And** 支持英文 **And** 所有界面元素文字相应切换 **And** 语言切换立即生效 **And** 语言选择保存到配置 **技术任务:** 1. 创建 `ui/i18n.py` 国际化模块 2. 创建语言资源文件 (zh_CN.json, en_US.json) 3. 实现 QTranslator 集成 4. 实现动态语言切换 5. 编写测试验证多语言支持 **估算:** 5 故事点 --- ### Story 7.13: 实现快捷键支持 **As a** 用户, **I want** 使用快捷键操作软件, **So that** 提高操作效率。 **验收标准:** **Given** 应用程序运行中 **When** 用户使用快捷键 **Then** 支持常用快捷键: - Ctrl+O: 打开文件 - Ctrl+S: 保存配置 - Ctrl+T: 开始翻译 - Ctrl+P: 暂停任务 - Ctrl+,: 打开设置 - F1: 打开帮助 **And** 快捷键在菜单中显示 **And** 支持自定义快捷键 **技术任务:** 1. 创建 `ui/shortcut_manager.py` 模块 2. 实现 QShortcut 定义 3. 集成到菜单和按钮 4. 实现快捷键编辑器 5. 编写测试验证快捷键功能 **估算:** 4 故事点 --- ### Story 7.14: 实现拖拽上传功能 **As a** 用户, **I want** 直接拖拽文件到窗口, **So that** 快速添加待翻译文件。 **验收标准:** **Given** 主窗口已打开 **When** 用户拖拽文件到窗口 **Then** 窗口高亮显示拖拽区域 **And** 释放鼠标后文件添加到队列 **And** 支持拖拽多个文件 **And** 支持拖拽文件夹 **And** 不支持的文件格式显示错误提示 **技术任务:** 1. 创建 `ui/drop_zone.py` 模块 2. 实现 dragEnterEvent 和 dropEvent 3. 实现文件类型验证 4. 集成到主窗口 5. 编写 UI 测试验证拖拽功能 **估算:** 4 故事点 --- ### Story 7.15: 实现日志查看器 **As a** 用户, **I want** 查看应用程序日志, **So that** 诊断问题和了解执行详情。 **验收标准:** **Given** 应用程序运行中 **When** 用户打开日志查看器 **Then** 显示按时间排序的日志列表 **And** 支持日志级别过滤 (DEBUG/INFO/WARNING/ERROR) **And** 支持关键词搜索 **And** 支持导出日志到文件 **And** 错误日志高亮显示 **And** 自动滚动到最新日志 **技术任务:** 1. 创建 `ui/log_viewer.py` 模块 2. 实现 QListView 日志显示 3. 实现日志过滤逻辑 4. 实现搜索功能 5. 编写测试验证日志查看 **估算:** 5 故事点 --- ### Story 7.16: 实现错误提示对话框 **As a** 系统, **I want** 显示用户友好的错误提示, **So that** 用户理解问题并知道如何处理。 **验收标准:** **Given** 应用程序运行中 **When** 发生错误 **Then** 显示错误对话框 **And** 包含错误类型和描述 **And** 包含建议的解决方案 **And** 提供"查看详情"按钮显示完整错误信息 **And** 提供"复制错误信息"按钮 **And** 支持"不再提示此错误"选项 **技术任务:** 1. 创建 `ui/error_dialog.py` 模块 2. 定义错误类型和解决方案映射 3. 实现错误对话框 UI 4. 实现详情显示 5. 编写测试验证错误提示 **估算:** 4 故事点 --- ### Story 7.17: 实现报告导出功能 **As a** 用户, **I want** 导出翻译报告, **So that** 分享或存档翻译结果。 **验收标准:** **Given** 翻译任务已完成 **When** 用户选择导出报告 **Then** 支持导出为 HTML 格式 (包含样式) **And** 支持导出为 PDF 格式 **And** 报告包含:任务摘要、翻译统计、质量分析、术语使用 **And** 支持自定义报告内容和样式 **And** 导出进度显示 **技术任务:** 1. 创建 `ui/report_exporter.py` 模块 2. 实现 HTML 报告生成 3. 集成 PDF 生成库 (weasyprint) 4. 实现导出对话框 5. 编写测试验证报告生成 **估算:** 6 故事点 --- ### Story 7.18: 实现内容预览功能 **As a** 用户, **I want** 预览翻译前后内容, **So that** 验证翻译效果。 **验收标准:** **Given** 翻译已完成或进行中 **When** 用户打开预览窗口 **Then** 左侧显示原文 **And** 右侧显示译文 **And** 支持同步滚动 (一侧滚动时另一侧跟随) **And** 高亮显示差异位置 **And** 支持全屏预览 **And** 支持在预览中直接编辑译文 **技术任务:** 1. 创建 `ui/preview_widget.py` 模块 2. 实现双栏对比视图 3. 实现同步滚动逻辑 4. 实现差异高亮 5. 编写 UI 测试验证预览功能 **估算:** 6 故事点 --- ### Story 7.19: 实现术语表编辑器 **As a** 用户, **I want** 可视化编辑术语表, **So that** 方便管理术语翻译。 **验收标准:** **Given** 用户打开术语表编辑器 **When** 用户查看术语表 **Then** 显示术语表格 (原文、翻译、类型、备注) **And** 支持添加新术语 (弹出对话框输入) **And** 支持编辑现有术语 (双击编辑) **And** 支持删除术语 **And** 支持搜索和筛选术语 **And** 支持导入/导出术语表 **技术任务:** 1. 创建 `ui/terminology_editor.py` 模块 2. 实现 QTableView 表格显示 3. 实现增删改查操作 4. 实现搜索和筛选 5. 编写 UI 测试验证编辑器功能 **估算:** 5 故事点 --- ### Story 7.20: 实现一键翻译功能 **As a** 用户, **I want** 一键执行完整翻译流程, **So that** 简化操作步骤。 **验收标准:** **Given** 用户已选择文件并配置好参数 **When** 用户点击"一键翻译"按钮 **Then** 自动执行完整流程:清洗 → 术语提取 → 翻译 → 格式化 **And** 每个步骤显示进度 **And** 步骤失败时暂停并提示用户 **And** 完成后显示结果摘要 **And** 提供打开输出文件夹按钮 **技术任务:** 1. 创建 `core/one_click_workflow.py` 模块 2. 实现工作流编排逻辑 3. 集成进度通知 4. 实现错误处理 5. 编写集成测试验证工作流 **估算:** 5 故事点 --- ### Story 7.21: 实现批量操作功能 **As a** 用户, **I want** 对多个文件执行批量操作, **So that** 高效处理多个文件。 **验收标准:** **Given** 文件列表中有多个文件 **When** 用户选择批量操作 **Then** 支持全选/反选文件 **And** 支持批量开始翻译 **And** 支持批量暂停 **And** 支持批量删除 **And** 支持批量导出 **And** 显示批量操作进度 **技术任务:** 1. 创建 `ui/batch_operations.py` 模块 2. 实现文件选择逻辑 3. 实现批量操作调度 4. 实现批量进度显示 5. 编写测试验证批量功能 **估算:** 5 故事点 --- ### Story 7.23: 实现统计面板 **As a** 用户, **I want** 查看翻译统计数据, **So that** 了解工作量和效率。 **验收标准:** **Given** 用户打开统计面板 **When** 用户查看统计数据 **Then** 显示以下统计: - 总翻译字数 - 总翻译章节数 - 总翻译时长 - 平均翻译速度 (字/分钟) - 术语使用率 - 任务完成率 (成功/失败) **And** 支持按日期范围筛选 **And** 支持图表可视化 (柱状图、折线图) **And** 支持导出统计报告 **技术任务:** 1. 创建 `ui/statistics_panel.py` 模块 2. 实现统计数据计算 3. 集成 matplotlib 绘图 4. 实现日期筛选 5. 编写测试验证统计准确性 **估算:** 6 故事点 --- --- ### Story 7.24: 实现导入预览界面 **As a** 用户, **I want** 导入 TXT 后看到预览信息, **So that** 确认导入正确。 **验收标准:** **Given** 用户选择并导入 TXT 文件 **When** 文件解析完成 **Then** 显示预览界面包含: - 章节数量 - 总字数统计 - 预计翻译时间 (基于 GPU 速度估算) - 前 3 章标题预览 **And** 提供"确认开始翻译"按钮 **And** 提供"取消导入"按钮 **And** 支持在预览界面调整翻译参数 **技术任务:** 1. 创建 `ui/import_preview.py` 模块 2. 实现预览信息收集逻辑 3. 实现时间估算算法 4. 创建预览界面 UI 5. 编写测试验证预览功能 **估算:** 4 故事点 --- ### Story 7.25: 实现离线翻译支持 **As a** 用户, **I want** 网络断开时继续翻译, **So that** 不受网络状态影响。 **验收标准:** **Given** 用户正在使用翻译工具 **When** 检测到网络断开 **Then** 显示离线模式提示 **And** 继续执行本地翻译任务 **And** 上传任务保存到本地队列 **When** 检测到网络恢复 **Then** 自动执行队列中的上传任务 **And** 显示"网络已恢复,正在上传..."提示 **And** 支持手动触发队列上传 **技术任务:** 1. 创建 `network/status_monitor.py` 模块 2. 实现网络状态检测 (ping/API 测试) 3. 创建 `upload/offline_queue.py` 离线队列模块 4. 实现队列自动执行逻辑 5. 编写测试验证离线/恢复流程 **估算:** 8 故事点 --- ### Story 7.26: 实现客户端版本检查 **As a** 用户, **I want** 系统自动检查并提示新版本, **So that** 保持客户端最新。 **覆盖的需求:** FR50 (启动时检查版本), FR51 (记录日志) **验收标准:** **Given** 应用程序启动 **When** 系统执行版本检查 **Then** 调用平台版本 API 检查最新版本 **And** 比较当前版本与最新版本 **When** 检测到有新版本可用 **Then** 显示更新提示对话框 **And** 对话框包含:当前版本、最新版本、更新说明 **And** 提供"立即更新"和"跳过本次"按钮 **When** 用户选择"跳过本次" **Then** 记录跳过状态,本次会话不再提示 **And** 下次启动时重新检查 **When** 用户选择"立即更新" **Then** 打开浏览器下载页面或执行自动更新 **And** 记录版本检查日志 (检查时间、版本号、结果) **技术任务:** 1. 创建 `updater/version_checker.py` 模块 2. 实现版本 API 调用逻辑 3. 实现版本号比较 (语义化版本) 4. 创建更新提示对话框 UI 5. 实现跳过状态持久化 6. 编写测试验证版本检查流程 **估算:** 3 故事点 --- **Epic 7b 总结:** 20 个故事,共 96 故事点 --- ## 项目总览 | Epic | 故事数 | 故事点 | 核心价值 | |------|--------|--------|----------| | Epic 1: 基础架构与 Crash-Safe | 5 | 28 | 系统可靠性基础 | | Epic 2: 指纹机制模块 | 7 | 27 | 避免重复处理 | | Epic 3: 清洗模块 | 5 | 25 | 翻译输入质量 | | Epic 4: 术语提取模块 | 6 | 30 | 翻译一致性 | | Epic 5: 翻译模块 | 8 | 42 | 核心翻译能力 | | Epic 6: 上传模块 | 8 | 36 | 平台发布自动化 | | Epic 7a: 任务调度核心 | 7 | 34 | 任务状态管理 | | Epic 7b: 用户界面完整版 | 20 | 96 | 完整用户体验 | | **总计** | **66** | **318** | **完整产品** | ## 需求覆盖确认 - ✅ 所有 52 个功能需求 (FR1-FR52) 已覆盖 - ✅ 所有 24 个架构需求 (AR1-AR24) 已覆盖 - ✅ 所有 6 个非功能性需求 (NFR-P1 到 NFR-P6) 已考虑