ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

FluentRead 文档翻译实战指南:从本地文件批量导入到双语对照、校订与保真导出

FluentRead 文档翻译实战指南:从本地文件批量导入到双语对照、校订与保真导出 前端AI 应用本地部署【免费下载链接】FluentReadAn open-source browser extension for bilingual translation. 一款开源的浏览器双语翻译插件。项目地址https://gitcode.com/gh_mirrors/fl/FluentRead点击查看免费下载导读本文以 FluentRead 的文档翻译Document translation独立工作台为主题系统讲解其完整的用户流程从扩展菜单导入 PDF、ePub、DOCX 与各类文本/字幕文件到批量排队翻译、暂停续译、校订译文再到按原格式导出双语或纯译文文件。读者读完本文不仅能掌握该功能的所有操作细节与限制还能从源码层面理解各格式解析、批量调度与下载产物是如何实现的。文档翻译是 FluentRead 中独立于网页翻译的一个完整功能模块其入口页面、领域模型、批量翻译编排与二进制文档解析分别位于 src/app/document-translation、src/features/document-translation/core 与 src/features/document-translation/services。本文所有操作说明以 docs/en/guide/document-translation.md 为准原理细节以仓库源码为准中文版说明见 docs/guide/document-translation.md。打开文件入口与支持格式如何进入文档翻译从扩展菜单选择Document translation文档翻译会打开一个独立的翻译工作台页面。导入文件有两种方式将文件直接拖放到页面中央的拖放区点击页面上的文件选择按钮或队列中的Add files / 添加文件使用系统文件选择器支持一次选择多个文件。导入的文件会立即在浏览器本地解析解析完成后页面会显示可翻译片段数量与文件大小之后才进入翻译确认环节。支持的格式与大小限制源码 src/features/document-translation/core/document.ts 中的SUPPORTED_DOCUMENT_EXTENSIONS定义了完整支持列表共 14 种扩展名类别扩展名说明文档pdf需含可选中文本文本层电子书epubZIP 容器格式按章节解析Worddocx旧版.doc需先另存为.docx网页html、htm保留标签结构纯文本txt保留换行结构Markdownmd、markdown保护代码块与行内语法字幕srt、vtt、ass、ssa保留时间轴与标签歌词lrc保留时间标签数据json只翻译字符串叶节点保持 JSON 合法每个文件的上限为 10 MiB定义于 core/document.ts 的DOCUMENT_MAX_BYTES10 * 1024 * 1024。文件类型由扩展名识别getDocumentFormat与 MIME 类型一一对应getDocumentMimeType。仓库的 examples/document-translation 目录提供了上述各类格式的样例文件如sample.pdf、sample.epub、sample.srt、sample.json等可用于快速验证功能。文本格式与二进制格式的解析分界从源码结构看解析被清晰地划分为两条路径文本格式txt/markdown/html/srt/vtt/ass/lrc/json由 core/document.ts 的parseDocument统一处理纯同步、不依赖外部库二进制格式pdf/epub/docx由 services/binary.ts 的parseBinaryDocument处理按需动态加载pdfjs-distPDF.js、jszip、pdf-lib等库。每种格式解析后会生成统一的ParsedDocument模型包含可翻译的segments片段列表、用于无损还原的parts结构以及二进制格式特有的版面/章节/段落元数据。各格式解析的底层原理PDF文本原子 → 行 → 段落块services/binary.ts 的parsePdf使用 PDF.js 逐页提取文本经过三段式重建pdfTextAtoms将 PDF.js 的文本项含仿射变换坐标过滤旋转过大的项转换为带 x/y/宽高/字体的文本原子pdfTextLines按 y 坐标聚类成行、按 x 坐标排序拼接处理字间距与行内断点pdfTextBlocks依据行高标题判定阈值bodyHeight * 1.32、垂直间距、重叠率与对齐关系把行合并为段落块并推断fontWeight标题 700、短句 600、正文 400与居中对齐。每个段落块对应一个翻译片段并记录其在页面上的位置x/y/width/height/fontSize/lineHeight等PdfDocumentBlock字段这些坐标正是后续译文写回文本框、版面保持原位的依据。若 PDF 没有任何可提取文字会明确报错扫描版 PDF 暂不支持 OCR请上传包含文本层的 PDF。ePub读取 OPF 清单按阅读顺序取章ePub 本质是 ZIP 容器。services/binary.ts 的parseEpub依次校验mimetype条目必须为application/epubzip、META-INF/container.xml中指向的 OPF 内容清单再解析 OPF 的manifest与spineitemref顺序只取 XHTML/HTML 章节每章复用parseDocument(chapter.html, source)走 HTML 解析并记录章节标题与片段偏移EpubDocumentChapter供阅读时按章节导航。DOCX正文、页眉页脚、脚注尾注分别处理services/binary.ts 的parseDocx校验[Content_Types].xml与word/document.xml后按word/document.xml、header*.xml、footer*.xml、footnotes.xml、endnotes.xml的优先级扫描w:p段落提取w:t文本、w:tab制表符与w:br/换行并根据段落样式w:pStyle中的 title/heading、w:numPr列表标记标注title/heading/list-item/paragraph/header/footer/note角色。JSON只翻译字符串叶节点core/document.ts 的parseJsonDocument深度遍历 JSON只把字符串叶节点送入翻译队列并记录其在结构中的JSONPath如$.items[0].label渲染时在深拷贝上按路径回填译文再用JSON.stringify(output, null, 2)输出保证导出结果始终是合法 JSON。字幕与歌词时间轴与标签不参与翻译SRT/VTT 的时间戳行TIMED_SUBTITLE_PATTERN与 ASS 的Dialogue:行按规则切分ASS 在第 9 个逗号后取正文字段LRC 只把[mm:ss.xx]时间标签之后的内容作为片段。SegmentPart会携带timeStart/timeEnd元数据并在预览表格中展示翻译结果通过preserveSubtitleMarkup保留开头的 ASS 覆盖代码{...}或行内 HTML 标签如i…/i。归档安全上限为避免畸形压缩包导致资源耗尽services/binary.ts 对 ePub/DOCX 设定了三层上限条目数不超过 4000、单个条目解压后不超过 24 MiB、解压总量不超过 96 MiBassertArchiveSafety。超限会停止解析并提示。批量翻译队列、暂停与断点续译文件队列与独立进度进入工作台后所有导入的文件会出现在顶部文件队列中。可以随时点击Add files / 添加文件追加文件。每份文件独立显示翻译进度已完成片段数 / 总片段数导入或翻译失败不影响其他文件——失败项在队列中标记错误其余文件继续处理未解析成功的文件不会阻塞后续文件见 DocumentApp.vue 的loadFiles逐文件 try/catch。开始批量翻译确认语言、翻译服务与模型后点击Translate remaining files / 翻译剩余文件队列会按顺序处理所有尚未完成的文档。页面会先校验凭据credentialWarning与设置一致性再逐个文档执行翻译DocumentApp.vue 的startBatch。暂停全部与续译点击Pause all / 暂停全部会通过AbortController中止当前翻译任务但已完成并提交的片段会保留translations数组中已写入的译文不回退。再次开始时单文件场景通过initialTranslations把已有译文作为已完成片段传入只翻译剩余空白片段批量场景会逐文件继续未完成的部分。这一行为在 services/translation.ts 的createDocumentSegmentTranslator中体现pending只取!translations[id].trim()的片段也由 DocumentApp.vue 的startTranslationinitialTranslations: [...translatedSegments.value]驱动。暂停或单段请求失败后已完成片段可立即在校订视图中查看。设置变更需要确认重译翻译开始时会为当前设置生成指纹currentFingerprint包含源语言、目标语言、服务、模型、术语库 ID 与修订号。若之后更改了这些设置页面会提示设置已更改。现有译文仍保留按新设置翻译会从头开始并要求逐份确认重新翻译settingsChanged判断 确认对话框避免静默覆盖已校订的译文。批量翻译过程中检测到设置被外部修改也会暂停并提示DocumentApp.vue。批量下载 ZIP队列停止后可以点击队列中的任意文件单独阅读、校订或下载。批量导出流程DocumentApp.vue 的downloadBatch选择输出模式bilingual双语对照或translated仅译文点击Download completed files (ZIP) / 下载已完成文件ZIP只有翻译完成的文件会进入压缩包未完成文件被排除同名文件放入不同编号目录zip.file(${index 1}/${name})避免覆盖下载成功后记录已下载修订号移除未下载的译文时会弹出确认。会话隔离与离开保护文件和译文只保存在当前页面内存中刷新、关闭页面或打开其他文档前必须下载。页面注册了beforeunload与pagehide监听DocumentApp.vue存在未下载译文editRevision downloadedRevision时会拦截关闭并提醒切换队列文件会先saveActiveDocument()保存当前文件状态保证切换不丢工作。翻译与对照阅读翻译设置与开始在左侧设置面板依次确认源语言——可选自动检测auto目标语言翻译服务——列表来自可用服务目录使用 AI 服务含自定义 OpenAI 兼容服务时还需确认模型术语库Glossary——可继承全局设置、关闭或按需选择术语库仅当当前服务支持时才可启用。若服务凭据缺失、模型未配置或服务不可用面板会显示警告并引导去设置页配置。确认设置后先在右侧预览原文再点击Start translation / 开始翻译。三种阅读方式预览区提供原文 / 双语 / 译文三种视图切换previewMode。没有译文时预览强制停留在原文视图。文本格式HTML/Markdown/TXT的预览由 core/preview.ts 的createDocumentPreviewHtml生成HTML 与 ePub 章节走readerShell沙箱外壳注入严格的 CSPdefault-src none等并通过stripActiveHtml剥离script/iframe/object/embed/form/base、meta refresh与on*事件属性防止脚本执行Markdown 按源行渲染标题、列表、引用、代码围栏与分割线双语模式逐行配对pairedUnitTXT 按段落块配对渲染。PDF 使用专用连续阅读视图DocumentApp.vue逐页渲染原页与译页并排显示支持 100% / 125% / 150% 缩放ePub 提供章节导航DOCX 提供正文/页眉/页脚/脚注/尾注分区字幕以时间轴表格展示JSON 以 JSONPath 对照表展示。长文档的暂停与恢复较长文档可随时暂停暂停或请求失败后已完成片段保留继续翻译时只处理剩余部分。更换语言、服务、模型或术语设置后需要按新设置重新翻译页面会先提示见上文设置变更。底层批量调度机制翻译编排集中在 services/translation.ts通过DocumentTranslationGateway端口注入翻译能力不直接绑定具体 provider。两个关键机制批处理拆分BATCH_ITEM_LIMIT 16、BATCH_CHARACTER_LIMIT 3_500translation.tssplitBatches按最多 16 段且不超过 3500 字符拆批单批提交给支持批量的服务顺序兜底不支持批量的服务按每段请求并发 worker 数Math.min(3, pending.length)translation.ts。任务开始时会固定语言对快照sourceLanguage/targetLanguage防止设置页同步更新污染后续批次每次提交前检查AbortSignal批量结果会校验长度与空值翻译服务返回的片段不完整请重试并阻止取消或失败后的迟到提交stopped标志与提交代次校验。文档级上下文buildDocumentContext截取前 24 段预览、上限 4000 字符会随每个请求发送帮助模型保持术语一致。校订与下载校订译文点击工具栏的Edit translation / 校订译文进入校订视图DocumentSegmentEditor.vue支持搜索要修改的句子支持筛选尚未翻译的片段直接在编辑框中修改译文修改立即生效并计入editRevision。校订结果同时应用于预览和下载产物——renderDocument/createDocumentDownload都读取同一个translatedSegments数组且译文替换的是片段对应的翻译槽位不会动原文结构。下载文件点击Download file / 下载文件选择双语对照或仅译文按原文件格式保存。翻译未完成时可以勾选我已了解下载当前结果确认部分下载缺少译文的片段保留原文。导出由 services/binary.ts 的createDocumentDownload统一实现各格式行为如下格式双语产物仅译文产物PDF原页 译页左右并排的整页 PDFpdf-lib生成仅含译页图像的 PDFePub回写 ZIP 中各章节 XHTML双语时原段落后追加译文段落替换为纯译文章节DOCX原段落后追加粉色#E83B6B译文段落原位替换w:t文本文本类双语时原文下附译文HTML 用span>赞分享前端AI 应用本地部署【免费下载链接】FluentReadAn open-source browser extension for bilingual translation. 一款开源的浏览器双语翻译插件。项目地址https://gitcode.com/gh_mirrors/fl/FluentRead点击查看免费下载相关推荐Grafana Pyroscope 磁盘存储配置指南从 head block 写盘到高磁盘利用率保护Grafana Pyroscope 磁盘存储配置指南从 head block 写盘到高磁盘利用率保护 本指南以 Grafana Pyroscope 的 ing前端AI 应用本地部署语雀文档批量导出完整指南从本地存储到多平台发布语雀文档批量导出完整指南从本地存储到多平台发布 你是否遇到过语雀文档无法自由迁移的困扰随着语雀定位从内容社区转向创作工具许多用户发现免费版本的功能限制让文CLI文档MiroFish API接口文档开发者必备的调用指南与示例MiroFish API接口文档开发者必备的调用指南与示例 MiroFish是一款简洁通用的群体智能引擎能够预测万物。本文档将详细介绍MiroFish的AP人工智能大模型AI Agent多智能体Agent 编排上一篇深入解析 lib/pqKubeEdge 项目中使用的纯 Go PostgreSQL 驱动下一篇终极指南如何在Windows上零重启实现键盘鼠标游戏手柄全面映射创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表