Skip to content

Repository files navigation

简体中文 · English

Parallel-Translation

Parallel-Translation

读外语网页,直接全部翻译固然方便,但是原文替换后译错了你也看不出来。而且总有想看原文的时候,这时候还得关掉翻译就很烦。而且总会遇上专业名词被翻得乱七八糟,网页控件翻完整个页面乱成一团的破事。

所以我想做这个扩展的原因,就是能让我比较舒服地,不用太动脑地看东西。我相信不止我一个人有这种需求,所以发出来给有需要的人用。

安装

1. 装上扩展

首选:到 Releases 下载打包好的 zip。 新版本最先发在这里。

  • Chrome / Edge:下载 parallel-translation-<版本号>-chrome.zip(Edge 用 -edge.zip)并解压。打开 chrome://extensions/(Edge 是 edge://extensions/),开启“开发者模式”,点“加载已解压的扩展程序”,选解压出的目录。
  • Firefox:下载 parallel-translation-<版本号>-firefox.zip,打开 about:debugging#/runtime/this-firefox,点“临时载入附加组件”,选这个 zip。临时载入的扩展在浏览器重启后失效。

-sources.zip 是给 Firefox 审核用的源码包,不用下载。

Chrome 用户也可以从 Chrome 网上应用店 安装。 商店版会自动更新,但每个新版本都要等商店审核,会比 Releases 晚一些。

从源码构建:Chrome / Edge
pnpm install
pnpm build          # Edge 用 pnpm build:edge
  1. 打开 chrome://extensions/(Edge 是 edge://extensions/),开启“开发者模式”
  2. 点“加载已解压的扩展程序”,选 .output/chrome-mv3/(Edge 选 .output/edge-mv3/)

注意选构建产物目录,不是项目根目录。.output 是隐藏目录,在选择框里按 Cmd+Shift+. 显示。

从源码构建:Firefox
pnpm install
pnpm build:firefox

打开 about:debugging#/runtime/this-firefox,点“临时载入附加组件”,选 .output/firefox-mv2/manifest.json。

想改代码的人
pnpm install
pnpm dev            # Firefox 用 pnpm dev:firefox

带热重载。包管理器锁定为 pnpm(packageManager 字段),不要用 npm 或 yarn。

2. 选一个引擎

什么都不填也能用:Google、Bing 免 key,开箱即用。想要更好的译文,到设置页“引擎”分区填自己的 key,点“测试连接”,成功后保存。

3. 开翻

点页面右下角的悬浮球,或按 ⇧⌘Y(Windows 是 Ctrl+Shift+Y)。再按一次还原。

为什么做这个扩展

读外语网页时,谷歌翻译总会给我搞出来一些无伤大雅但是又很难受的问题。之前我改用了一个类似的插件,但是先是要登录才有更多额度,后面登陆完又总是用完,我很不爽,所以自己做了一个。那现在这个扩展能做到什么呢?

#1:留下原文给你看

译事三难:信、达、雅。

严复,《天演论·译例言》

问题:像谷歌翻译这种替换式翻译会把原文整段换成译文。没有说不好的意思,但是这个时候看不见原文,怎么知道对不对?反正我自己就被坑过好几次,真是没招。

解决:所以扩展默认用对照模式,原文在上、译文在下,一段对一段。三种显示方式随时切换:

  • 对照:看到译文有冲突的地方可以直接看原文,不用来回切换
  • 仅译文:传统的替换式,毕竟留着原文有时候会让页面太繁杂
  • 单段翻译:只翻光标所在的那段,毕竟有时候只是某一段没看懂,也没必要完全翻译

译文样式有六种(半透明、弱化显示、下划线、加粗、斜体、左边线),也可以自己写 CSS。切换模式和样式只改 <html> 上的类名,不动 DOM,不发请求。

#2:专业词被翻得面目全非

问题:在 GitHub 上,PR 被翻成“公关”,fork 被翻成“叉子”。通用引擎不知道你在读什么。

解决:领域与术语。领域是一组术语加一组适用网址,打开网页时自动取第一个网址命中的领域。术语可以指定译法,也可以标记“不翻译”,原词原样留在译文里。

例子

内置的“软件开发(简体中文)”领域适用于 github.com、gitlab.com 等站点。读一段 issue:

  • 没有领域:“请在合并公关之前更新叉子。”
  • 有领域:“请在合并 PR 之前更新 fork。”

原词按整词匹配,不区分大小写:PR 不会命中 price,“打开PR页面”里的 PR 照样命中。

PS:虽然理论上是能用了但是我不确定还有没有bug存在来的,欢迎反馈

术语在全页、逐段、划词翻译里都生效。AI 引擎把本批命中的术语写进请求;机翻引擎用占位符落实“不翻译”术语,打开开关后指定的译法也生效。

术语可以导出成 CSV,也可以从 CSV 导入(UTF-8 或 GBK,逗号、分号或制表符分隔,可带表头),还能直接用一份 CSV 新建领域。popup 里可以临时切换领域,或者勾选“以后在此站点都使用”。

Tip

一个领域只服务一种目标语言。要翻成别的语言,就另建一个领域。

#3:不该翻的也翻了

问题:整页翻译把导航栏、代码、文件名、@用户名一起翻了,然后整个页面乱七八糟,我#@&%¥......

解决:两层过滤。

  • 采集阶段:数字、非正文区域、不可见元素、读屏专用文字,在发请求前就被滤掉
  • 站点页面规则:按站点声明三类元素,用 CSS 选择器填写
    • 限定范围:只翻译这些
    • 排除:整块不翻译
    • 保留原文:不翻译,但原文留在译文句子里,例如 @用户名

GitHub、YouTube 有内置规则,例如不翻贡献图和文件名,仓库名、用户名保留原文。你的规则叠加在内置规则之上,也可以停用某个站点的内置规则。无效选择器会标红并提示行号;规则可以导出、导入 JSON。

#4:引擎挂了,或者额度用完了

问题:翻译服务总有哪天会抽风一下,单引擎的话......万一急着用那不完蛋了......

解决:多引擎故障切换。

  • 免 key:Google、Bing
  • 自带 key:OpenAI、DeepL、Gemini、DeepSeek、Grok

优先级可以拖拽排序,顺序就是切换顺序。某个引擎临时失败就换下一个;不支持目标语言的自动跳过;key 无效或配额用完时直接告诉你真实原因,不把所有引擎试一遍。

AI 引擎按编号整批请求、按编号回填。模型漏了一行,那一段留空,不会让整页译文错位一行、挂到别的原文上。

#5:“你好我不想被你莫名其妙要一堆权限”

问题:很多扩展要“读取和更改所有网站上的数据”。你不知道它拿你的页面做了什么,虽然我真的已经习惯在互联网时代没有隐私但是emmmmm......

解决:最小权限。

  • 只要三项基本能力:保存设置(术语再多也存得下)、不限存储空间、在右键菜单里加“翻译选中文本”。
  • 只能连 7 个翻译网址:Google、Bing、OpenAI、DeepL、Gemini 的接口,连不了别的网站。
  • DeepSeek、Grok 要先经你同意:安装、升级时不会问;你填好密钥、点“测试连接”时,浏览器才问你是否允许它访问 api.deepseek.com 或 api.x.ai。不同意就不保存密钥,也不会连过去。
  • 你点翻译之前,它不读也不发网页内容。
  • 不收集你的信息:没有统计、没有追踪、没有日志。要翻译的文字只发给你选的翻译服务。
  • 设置会随浏览器账号同步到你的其他设备。
  • 密钥、术语、站点规则、翻过的译文(30 天后自动删除)只存在这台电脑上。密钥不会同步,导出设置时也不带密钥。

完整隐私政策

碎碎念

翻译这种东西吧,每个人有自己的习惯,所以我想尽量让每个人都能按照自己的想法来。

功能参考

触发入口

  • 悬浮球:点一下翻译整页,再点一下还原。当然是可拖动的,随便爱放哪放哪
  • 工具栏按钮:总开关、翻译本页、当前领域、引擎、源语言与目标语言、显示模式、样式
  • 快捷键:全页翻译 ⇧⌘Y、切换对照与仅译文 ⇧⌘M、翻译光标所在段 ⇧⌘D、扩展总开关 ⇧⌘E,Windows用户把 ⌘ 换成 Ctrl就好。全部可以自定义,录制时会提示浏览器保留的组合与重复绑定(但是真的有人会用扩展的快捷键吗?我自己其实就不用嘻嘻嘻)
  • 逐段翻译:光标停在文字上时出现按钮,贴在文字末尾,点一下就可以翻译或还原这段
  • 划词翻译:选中文字后用右键菜单翻译(虽然我觉得这个功能没人用,毕竟一般情况下浏览器自带的就够用了,但做都做了)

页面兼容

  • 藏在网页里的内容也能翻:网页把文字放在独立的小区块或者嵌在同一网站的内嵌窗口里,都能找到并翻译。
  • 新出现的内容自动翻:往下滚动加载出的新内容、不刷新页面就切换的新页面、原地变化的文字,都会自动补上译文。
  • 不受网页样式干扰:悬浮球、按钮这些扩展自己的界面和网页互不影响,网页样式再特殊也不会变形,扩展也不会把自己的按钮文字拿去翻译。

设置页

我是觉得好像没什么介绍的必要了,不过万一有人真需要呢,so:

设置页
  • 通用:扩展开关、语言、默认显示模式、悬浮 UI
  • 引擎:优先级拖拽排序、启用与停用、自带 key、模型名、测试连接
  • 外观:译文样式、自定义 CSS 与实时预览
  • 快捷键、站点(黑名单或白名单)、高级(并发数、缓存、导出与导入设置、恢复默认)
  • 翻译领域、站点规则:见上文 #2、#3

其他乱七八糟的

  • 三语界面:简体中文、繁体中文、English,跟随浏览器界面语言
  • 反馈:popup 底部一键跳到 GitHub 提交问题

开发

技术栈:WXT + TypeScript + Vite。

命令 说明
pnpm dev / pnpm dev:firefox 开发模式,带热重载
pnpm build / build:firefox / build:edge 生产构建
pnpm zip / zip:firefox / zip:edge 打包上架用的 zip
pnpm typecheck TypeScript 类型检查
pnpm test 单元测试
pnpm test:coverage 单元测试 + 覆盖率门槛
pnpm test:e2e / test:e2e:core E2E 测试(先跑 pnpm build)

项目状态:v2.0 发布就绪,仍在持续迭代。1300 余项单元测试(含覆盖率门槛),60 余项核心 E2E,CI 每次 push 必跑;累计完成 300 余个 issue。

约定:

  • main 要求线性历史,所有改动通过 PR 合入(squash 或 rebase),不留 merge commit
  • CSS 类、DOM data- 属性、storage key 一律用 pt- / pt 前缀
  • 颜色与排版一律引用 src/styles/tokens.css 里的设计令牌,不在组件里写死色值

完整要求见 阶段索引的全局要求。

文档 内容
CONTEXT.md 术语表:逐段翻译、领域、术语、站点页面规则等叫法的定义
docs/adr/ 架构决策记录:难以逆转、不写下来会被当成随手之举的取舍
docs/phases/README.md 分阶段实施索引与依赖图
docs/phases/ 9 份阶段实施手册:代码骨架、取舍理由、验收标准
docs/DoD-report/ 各阶段 DoD 验收报告
docs/TESTING.md 自动化测试体系:分层策略、性能与内存、异常与边界、隐私与合规
store/ 上架材料

许可

GNU 通用公共许可证第 3 版(GPL-3.0-or-later)。

Parallel-Translation —— 对照式网页翻译浏览器扩展
Copyright (C) 2026 Parallel-Translation contributors

本程序是自由软件:你可以依据自由软件基金会发布的 GNU 通用公共许可证
第 3 版,或(由你选择)任何更新的版本,重新发布和/或修改它。

发布本程序是希望它能有用,但不作任何担保;甚至不含对适销性或
特定用途适用性的默示担保。详见 GNU 通用公共许可证。

你应当已随本程序收到一份 GNU 通用公共许可证副本。若没有,
请见 <https://www.gnu.org/licenses/>。

也就是说:可以自由使用、修改、再分发,但分发衍生作品(包括上架商店的改版)时,必须同样以 GPL-3.0 开源完整源码。

About

Parallel translation browser extension — displays the source text and translation side by side. MV3 / WXT / TypeScript, supports multiple engines and failover. 对照式网页翻译浏览器扩展 —— 原文与译文并排呈现。MV3 / WXT / TypeScript,支持多引擎与故障切换。

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages