Skip to content

实现智能翻译,支持书名简介、全书翻译及独立听书 - #25

Merged
zilorn merged 14 commits into
mainfrom
codex/smart-translation
Oct 17, 2026
Merged

zilorn merged 14 commits into
mainfrom
codex/smart-translation

Conversation

@zilorn

@zilorn zilorn commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner

解决的问题 / Problem

阅读外文书籍时需要划词翻译、双语对照、可复用的译文和一致的术语。本 PR 同时修复生成术语表期间换章后新章无法翻译、德语被英文常见词误判,以及显示模式与听书文本相互覆盖的问题。

Fixes #21

改动后的行为 / Resulting behavior

  • 发现页的搜索结果、浏览列表和在线书预览抽屉新增「翻译书名和简介」,支持重新翻译、取消和查看原文。完整简介到达后只补译未命中的字段;已完成的重译操作绕过当前缓存。未入架译文使用至多 256 个字段的会话缓存,不创建书库记录;搜索、入架和换源继续使用原始书名及简介。
  • 设置页新增「自动翻译发现页书名和简介」开关,默认关闭;开启后自动处理活动发现页及已加载详情的预览。切走保活页、关闭预览或关闭开关取消在飞/排队任务;书籍信息与章节/选区共用并发预算,自动失败逐项提供重试。
  • 书籍详情页直接支持手动翻译、重新翻译书名及简介和切换原文;自动发现开关不会在详情页发起请求。简介译文独立持久化并按原文/服务配置失效,失败或取消保留上次成功结果,不改写原始元数据。
  • 管理页新增「翻译书名」手动开关:首次打开调用当前翻译服务,成功后在书架、封面、详情、阅读器等处显示译名;关闭恢复原名,再次打开复用匹配缓存,另提供「重新翻译书名」。失败或取消保留上次成功结果;原始元数据不变,在线搜索和换源继续使用原书名。
  • 管理页新增「翻译书籍正文」按钮:按用户要求处理所有已下载的文字章节,跳过未下载及纯图片章节,显示进度并支持取消。再次点击复用已完成缓存、继续剩余或新下载正文,不受折叠、显示模式或预翻译章数限制;保留单章强制重译。
  • 智能翻译默认关闭;支持全局配置及本书独立覆盖。提供选区翻译、双语内嵌/折叠、仅译文、原文显示,支持 Google 公开端点及 OpenAI、DeepSeek、自定义 AI 的 Chat Completions/Responses。
  • 显示模式仅控制页面排版。「阅读文本」独立保存为 readingText,选择听书使用原文或译文,在双语模式下也可切换。原生与 HTTP 听书、播放预取及用户主动触发的音频预热共用该选择,保留原文高亮/跟读坐标、切换位置和暂停状态。更改听书文本不重启显示翻译。
  • 折叠译文开关只在双语模式显示。折叠时展开前不翻译当前章或后续章、不自动生成术语表,展开后仅翻译对应段落;切回内嵌双语或仅译文恢复已保存的预翻译配置。
  • 阅读设置直接提供「翻译前生成 AI 术语表」开关,以及本书「翻译管理」入口;书籍详情也可进入管理页。管理页支持章节搜索、分批显示、单章重译、取消与失败重试,并复用术语表编辑/重新生成界面。
  • 手动重译绕过该章当前配置的缓存,不启动后续章翻译;先推进该章租约,再按原文校验写入。保留其他章和其他服务的有效缓存,失败/取消后可重试。
  • 共享术语表任务排除已取消请求;旧任务的收尾不会删除新任务。取消期间换章,新章直接开始翻译,无需手动重试。共享键包括服务、协议、模型、地址、目标语言、思考强度和密钥哈希。
  • 删除基于单个常见英文词的整段跳过规则。德语 Das war alles, was er wusste. 会翻译,在折叠模式也有展开按钮。拉丁语种缺少可靠检测时交给服务自动判断,可能多请求已是目标语言的文本,以避免漏译。
  • 每批最多 15 段,共享 1–8 并发预算,自动翻译只限当前章及可选后续 1–5 章。按书采样生成术语表,最多约 18,000 字符、200 条、每条备注最多 29 字符。
  • SQLite 保存原文、来源类型和译文,正文编辑只清理不再匹配原文的缓存;重取、重排、图片更新保留有效缓存,租约拒绝迟到响应。双语重排保持实际正在阅读的原文/译文一侧和原文坐标。
  • 修正旧版 v1/v2 快照没有翻译表时的兼容处理,并修复 v1 迁移测试夹具。
  • 经用户授权重写本 PR 分支历史,从所有 10 个提交中移除四张 docs/images/translation-*.png;逐提交检查无新增二进制文件。中英文文案、使用文档及技能参考已更新。

截图只保存在仓库外:/tmp/readerx-pr25-improved-{390,1280}-{scroll,paged}.png(管理页)及 /tmp/readerx-pr25-reading-{390,1280}-{scroll,paged}.png(阅读设置)。已检查手机与桌面图。当前工具无法上传 GitHub 附件,截图通过本地任务交付,不提供失效的仓库图片链接。

  • 自定义 AI 的 Base URL 为空或纯空白时,在发送任何 HTTP 请求前报错;只有 OpenAI 与 DeepSeek 可使用各自默认地址,自定义地址不会回退到 OpenAI。
  • 术语表保存成功显示「已保存术语表」并关闭抽屉;失败保留草稿且不显示成功提示。

验证 / Validation

  • 本次书名/简介增量:类型检查、i18n、生产构建通过;translation-manual-test.mjs 新增实际元数据模块回归,覆盖成对翻译、空简介、部分命中补译、完整强制重译、简介持久化/失效、失败/取消保留旧结果、自动开关、保活页暂停、原文切换、共享并发与排队取消。既有 translation-test、translation-storage-test、translation-position-test、glossary-test 均通过;Rust book_store 32 项、data_transfer 38 项通过。
  • 本次 Chromium 界面验证通过:390px / 1280px,覆盖详情页手动翻译/重译/失败重试/原文切换/离页后恢复、发现列表及完整简介预览、设置自动开关和浏览结果自动翻译;无横向溢出或页面脚本错误。翻译服务和书源返回值使用模拟响应,书库使用浏览器内存后端;不代表真实提供商或原生设备验证。截图仅在仓库外 /tmp/readerx-pr25-metadata-{390,1280}-{detail,discovery,sheet,settings}.png,未提交二进制图片。
  • 书名与全书手动翻译回归:node scripts/translation-manual-test.mjs 通过。使用实际提供商/引擎/配置/浏览器内存后端,覆盖两种 AI 协议、书名开关/缓存/持久化/配置隔离、失败与取消后迟到结果不覆盖、术语表更新不隐藏书名、仅处理已下载正文、15 段分批与取消后继续;原书名与正文保持不变。
  • 新增控件在 Chromium 390px / 1280px 验证通过:打开管理页不请求翻译;书名开启/关闭/缓存/强制重译/失败恢复;正文进度、取消、继续与缓存复用;详情及书架显示译名,未出现横向溢出或页面脚本错误。服务使用模拟响应,截图保存在仓库外 /tmp/readerx-pr25-manual-*.png。
  • 本次增量重新通过类型检查、i18n、生产构建、translation-test / translation-storage-test / translation-position-test / glossary-test / tts-replacements-test、阅读位置切换/翻页/选区/注释/章节编辑回归;Rust book_store 32 项及 data_transfer 38 项均通过。
  • 类型检查:pnpm exec tsc --noEmit 通过。
  • 文案检查:pnpm run i18n:check 通过,无缺失 key。未引用扫描排除整个词典目录后,报告 20 个既有未引用 key(提示,不失败);翻译选项及章节状态改用完整 key 映射,避免动态拼接导致误报。
  • 生产构建:pnpm build 通过。
  • 地址与保存回归:node scripts/translation-test.mjs、node scripts/glossary-test.mjs 通过。覆盖 Chat Completions / Responses 两种协议、空值与纯空白的自定义地址,翻译及术语表均不触发 HTTP 请求;内置默认地址与完整自定义路径保持可用。保存失败保留草稿且无成功提示,重试成功后确认提示与关闭均正常。
  • 扫描器回归:node scripts/i18n-check-test.mjs 通过。在隔离的最小项目中执行真实扫描器,确认词典定义不计作引用、未使用的 translation.saved 会报告、加入 UI 引用后不再报告,并覆盖删除引用、标签映射及英语复数变体。
  • 保存反馈界面:真实 GlossarySheet 与 Toasts 组件在独立本地验证页、浏览器内存后端下检查 390px / 1280px,均确认保存后关闭抽屉并出现成功提示。截图在仓库外通过本地任务交付;未连接真实 AI 服务或原生宿主。
  • 翻译回归:node scripts/translation-test.mjs、translation-storage-test.mjs、translation-position-test.mjs 通过。覆盖取消的术语表与新任务收尾竞争、真实阅读调度换章、德语误判、强制重译、取消、缓存复用、全局/本书听书偏好独立合并及旧配置默认值。
  • 听书回归:node scripts/tts-replacements-test.mjs、tts-follow-recovery-test.mjs 通过。覆盖实际 Reader 接线、原生/HTTP 合成文本、三种显示模式、窗口/整本音频预热、原文坐标、暂停和取消后迟到译文不出声。
  • 阅读回归:reader-position-transition、reader-page-turn、selection-menu-position、annotations、chapter-editing 五组脚本通过。
  • Rust:在 src-tauri 执行 cargo test --locked -p readerx --lib book_store(32 项)和 cargo test --locked -p readerx --lib data_transfer(38 项),共 70 项通过,包括真实 SQLite 迁移、原文关联缓存、租约、快照与备份往返。
  • Chromium + 模拟 AI 服务:390px/1280px × 滚动/分页四组通过。验证德语折叠入口、双语模式独立切换听书文本、本书覆盖与全局默认隔离、术语表开关、管理入口、缓存章节重新请求、失败/取消、术语表生成和编辑保存、章节搜索,以及非双语模式隐藏折叠开关。四组均无页面脚本错误。
  • 未验证:真实翻译/语音服务、真实设备音频输出及 Android/Linux/Windows 原生应用运行。浏览器和听书宿主测试使用模拟响应,不代表真实提供商或设备保证。

手动复现:开启智能翻译并配置 AI 服务 → 打开外文书 → 在双语模式下独立切换阅读文本,确认页面排版不变、听书使用所选文本 → 切换显示模式,确认听书偏好不变 → 阅读设置进入翻译管理 → 单章重译、取消/重试 → 编辑或重新生成术语表。

取消回归:清空本书术语表并开启自动生成 → 开始翻译后在术语表响应前换章 → 新章应自动翻译,无需重试。语种回归:目标英语、双语折叠,德语示例段落应提供展开翻译按钮。

数据与兼容性 / Data and compatibility

简介新增可选 introEnabled / introTranslation(source/key/text),继续复用 translation_books.state JSON;全局新增 autoTranslateMetadata,旧配置缺省 false。无需数据库迁移,原始书名/简介不变;发现页未入架译文仅保留会话缓存,全部沿用翻译数据不参与同步/备份的约束。

数据库保持 user_version=4。书名显示开关 titleEnabled 与 titleTranslation(source/key/text)作为可选字段保存在既有 translation_books.state JSON 中,旧书缺省关闭,无需新增迁移;沿用翻译数据不参与同步/备份的约束。v1/v2 自动新增翻译表,v3 仅重建缺少可追溯原文的旧译文缓存,保留书籍、局部设置及术语表。此次不新增数据库迁移。

全局设置和本书覆盖项增加 readingText,缺省为 original;已有 mode 仅用于显示,原有书籍与进度不变。译文听书仅转换合成文本,原文正文和阅读坐标不被改写。手动重译复用现有缓存和租约命令。

翻译数据、本书配置、术语表及全局翻译配置暂不参与同步/备份。快照清空翻译表并 VACUUM,避免凭据残留;v1/v2 快照跳过不存在的翻译表。服务请求、响应正文和凭据不进入日志。

提交前检查 / Checklist

  • 已阅读 CONTRIBUTING.md 与 AGENTS.md。
  • 仅包含本次任务相关文件。
  • 已更新相关文档与中英文文案。
  • 已完成适用检查,并说明未验证的部分。

@zilorn zilorn self-assigned this Oct 16, 2026
@zilorn
zilorn force-pushed the codex/smart-translation branch from 3cc81f9 to 9a76695 Compare October 17, 2026 10:41
@zilorn zilorn changed the title 实现智能翻译:划词与双语阅读、AI 术语表及 SQLite 缓存 实现智能翻译与本书翻译管理,支持独立原译文听书 Oct 17, 2026
@zilorn zilorn added the enhancement New feature or request label Oct 17, 2026
@zilorn zilorn changed the title 实现智能翻译与本书翻译管理,支持独立原译文听书 实现智能翻译,支持书名和全书手动翻译及独立听书 Oct 17, 2026
@zilorn zilorn changed the title 实现智能翻译,支持书名和全书手动翻译及独立听书 实现智能翻译,支持书名简介、全书翻译及独立听书 Oct 17, 2026
@zilorn
zilorn merged commit 0346d70 into main Oct 17, 2026
3 checks passed
@zilorn
zilorn deleted the codex/smart-translation branch October 17, 2026 14:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

1 participant