---
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) 已考虑