Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
674 changes: 674 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

23 changes: 20 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Chrome / Edge / Firefox,Manifest V3,当前 v2.0。

**六个触发入口** —— 悬浮球、工具栏 popup、快捷键、逐段翻译(悬停出现按钮,贴文字末尾、RTL 自适应、翻译/还原双向切换)、划词右键菜单、修饰键拖光标。

**六种译文样式** —— 默认、弱化显示(悬停才显)、实线下划线、加粗、斜体、半透明,另可写自定义 CSS。自定义 CSS 只收声明块并限定在 `.pt-trans` 作用域内,改不动宿主页面,也改不动扩展自身 UI。
**六种译文样式** —— 半透明(默认,压低译文存在感)、弱化显示(悬停才显)、实线下划线、加粗、斜体、左边线,另可写自定义 CSS。自定义 CSS 只收声明块并限定在 `.pt-trans` 作用域内,改不动宿主页面,也改不动扩展自身 UI。

**多引擎与故障切换** —— 免 key 的 Google / Bing 引擎开箱即用;可自带 API key 接入 OpenAI、DeepL、Gemini。引擎优先级可拖拽排序,顺序即故障切换顺序;引擎不支持目标语言时自动跳过,key 无效则直接报错而不是把所有引擎试一遍。

Expand All @@ -24,6 +24,8 @@ Chrome / Edge / Firefox,Manifest V3,当前 v2.0。

**三语界面** —— 简体中文、繁体中文、English,随浏览器界面语言自动切换。

**更新说明与反馈入口** —— 扩展更新到上架版本后,下次打开网页会在页内弹出本版变更说明,看过一次即不再出现;内部修复版静默升级、不打扰。popup 底部可直接跳转 GitHub 提交问题。

**最小权限** —— 只申请 `storage` 与 `contextMenus`;`host_permissions` 仅限七个翻译端点域名(Google/Bing 免 key 端点与 OpenAI/DeepL/Gemini BYOK 端点),不申请任意站点权限,页面数据读取仍由 <all_urls> 内容脚本按翻译功能所需注入。

## 安装与开发
Expand Down Expand Up @@ -60,7 +62,7 @@ pnpm dev

## 项目状态

功能开发完成,已通过测试验收:462 项单元测试(含覆盖率门槛)、32 项核心 E2E,CI 全绿;累计修复 40+ 个 issue(含多轮审计发现的并发竞态、采集盲区、引擎异常路径)。当前 v2.0 为发布就绪版本。
功能开发完成,已通过测试验收:679 项单元测试(含覆盖率门槛)、36 项核心 E2E,CI 全绿;累计修复 40+ 个 issue(含多轮审计发现的并发竞态、采集盲区、引擎异常路径)。当前 v2.0 为发布就绪版本。

## 文档

Expand All @@ -83,4 +85,19 @@ pnpm dev

## 许可

尚未确定。在选定许可证之前,本仓库保留所有权利。
[GNU 通用公共许可证第 3 版](LICENSE)(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 开源其完整源码。
6 changes: 6 additions & 0 deletions entrypoints/background.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 6 — Background service worker。
// 代理翻译请求 + 注册右键菜单 + 转发菜单事件。

Expand Down
6 changes: 6 additions & 0 deletions entrypoints/content.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 4/5/6 — Content script。
// 集成:三模式渲染 + 注入式 UI(悬浮球/段落按钮/toast)+
// 快捷键 + 划词交互。
Expand Down
7 changes: 7 additions & 0 deletions entrypoints/options/index.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
<!DOCTYPE html>
<!--
SPDX-License-Identifier: GPL-3.0-or-later
Copyright (C) 2026 Parallel-Translation contributors

本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
不含任何担保。完整条款见仓库根目录的 LICENSE。
-->
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
Expand Down
6 changes: 6 additions & 0 deletions entrypoints/options/main.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 7 — Options 页主控制器。
// 管理 6 个标签页的切换,统一处理 toast 提示。

Expand Down
8 changes: 8 additions & 0 deletions entrypoints/options/options.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
/*
* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright (C) 2026 Parallel-Translation contributors
*
* 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
* 不含任何担保。完整条款见仓库根目录的 LICENSE。
*/

/* Phase 7 — Options 页完整样式(设置页 + 分区控件) */
@import '../../src/styles/tokens.css';
/* 预设样式必须真的进设置页 —— 预览区靠的就是这份规则,
Expand Down
6 changes: 6 additions & 0 deletions entrypoints/options/sections/advanced.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 7 — 高级分区:并发数、缓存管理、设置导入/导出。

import { DEFAULT_SETTINGS } from '~/src/storage/schema';
Expand Down
6 changes: 6 additions & 0 deletions entrypoints/options/sections/appearance.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 7 — 外观分区:样式预设选择 + 实时预览 + 自定义 CSS。

import type { StyleId } from '~/src/storage/schema';
Expand Down
6 changes: 6 additions & 0 deletions entrypoints/options/sections/engines.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 7 — 引擎分区:优先级拖拽排序 + 启用/停用 + BYOK 密钥与模型名 + 测试连接。

import type { EngineId } from '~/src/storage/schema';
Expand Down
6 changes: 6 additions & 0 deletions entrypoints/options/sections/general.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 7 — 通用设置分区:开关、语言对、显示模式、悬浮 UI。

import { LANG_LIST } from '~/src/storage/schema';
Expand Down
6 changes: 6 additions & 0 deletions entrypoints/options/sections/hotkeys.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 7 — 快捷键分区:动作列表 + 格式化显示 + 录制按钮 + 冲突检测。

import type { HotkeyAction } from '~/src/storage/schema';
Expand Down
6 changes: 6 additions & 0 deletions entrypoints/options/sections/sites.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 7 — 站点分区:黑/白名单模式切换 + 域名列表增删。

import {
Expand Down
7 changes: 7 additions & 0 deletions entrypoints/popup/index.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
<!DOCTYPE html>
<!--
SPDX-License-Identifier: GPL-3.0-or-later
Copyright (C) 2026 Parallel-Translation contributors

本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
不含任何担保。完整条款见仓库根目录的 LICENSE。
-->
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
Expand Down
6 changes: 6 additions & 0 deletions entrypoints/popup/main.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

import '~/src/styles/popup.css';
import {
type EngineId,
Expand Down
7 changes: 7 additions & 0 deletions entrypoints/welcome/index.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
<!DOCTYPE html>
<!--
SPDX-License-Identifier: GPL-3.0-or-later
Copyright (C) 2026 Parallel-Translation contributors

本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
不含任何担保。完整条款见仓库根目录的 LICENSE。
-->
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
Expand Down
6 changes: 6 additions & 0 deletions entrypoints/welcome/main.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

import './welcome.css';
import { applyI18n } from '~/src/i18n';
import { detectOS, formatHotkey } from '~/src/hotkeys/platform';
Expand Down
8 changes: 8 additions & 0 deletions entrypoints/welcome/welcome.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
/*
* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright (C) 2026 Parallel-Translation contributors
*
* 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
* 不含任何担保。完整条款见仓库根目录的 LICENSE。
*/

@import '../../src/styles/tokens.css';

*,
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"name": "parallel-translation",
"version": "2.0.67",
"description": "对照式网页翻译浏览器扩展",
"license": "GPL-3.0-or-later",
"private": true,
"type": "module",
"packageManager": "pnpm@11.18.0",
Expand Down
6 changes: 6 additions & 0 deletions src/changelog/claim.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// 更新提示的显示权仲裁(background 侧)。
//
// 扩展更新后,用户打开的每个新页面都会有一个 content script 启动并来问
Expand Down
6 changes: 6 additions & 0 deletions src/changelog/data.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// 更新提示的变更数据 —— ADR-0002:此文件即上架版本的唯一真相。
//
// 这里写了条目的版本号就是「上架版本」,扩展更新到该版本后会向用户
Expand Down
6 changes: 6 additions & 0 deletions src/changelog/decide.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// 「该不该弹更新提示」的判定 —— 纯函数,输入全部显式传入。
//
// 把判定从 content script 的副作用里摘出来单测,是因为它有五条互相
Expand Down
6 changes: 6 additions & 0 deletions src/changelog/locale.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// 变更条目的语言选择。
//
// 骨架文案(「更新内容」标题、分组名、按钮)走 chrome.i18n,由浏览器按
Expand Down
8 changes: 8 additions & 0 deletions src/changelog/modal.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
/*
* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright (C) 2026 Parallel-Translation contributors
*
* 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
* 不含任何担保。完整条款见仓库根目录的 LICENSE。
*/

/* 更新提示弹窗 —— 经 shadow DOM 注入宿主页面,样式自包含。
色值一律取 tokens.css 的设计令牌(README 全局要求:不得硬编码色值)。
本文件由 modal.ts 以 ?inline 引入,随动态 import 一同分包,
Expand Down
6 changes: 6 additions & 0 deletions src/changelog/modal.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// 更新提示弹窗的渲染。
//
// 由 content.ts 经动态 import() 引入 —— 该形式在 MV3 下并不会真的分包,
Expand Down
6 changes: 6 additions & 0 deletions src/changelog/state.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// 更新提示的已读状态。
//
// 独立 key `pt-changelog`,不并入 `pt-settings`:它不是设置(用户不会
Expand Down
6 changes: 6 additions & 0 deletions src/dom/classify.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 3 — 节点分类三集合 + 判定规则。
//
// 设计原则:
Expand Down
6 changes: 6 additions & 0 deletions src/dom/compat.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 8 — 域名级采集补丁。
// 仅在通用 walker 判断有误时才添加条目 —— 这是兜底层,不是主路径。
// 每加一条都意味着一处通用逻辑的缺陷,先问“能不能改进通用规则”。
Expand Down
6 changes: 6 additions & 0 deletions src/dom/normalize.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 9 — 取文本前的空白归一化(纯函数,无 DOM 依赖)。
//
// Markdown 段落内的软换行会原样保留为文本节点里的 \n(GitHub README 等
Expand Down
6 changes: 6 additions & 0 deletions src/dom/observer.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 3 — MutationObserver 增量补翻 + IntersectionObserver 可见性补翻。
//
// 监听 DOM 变化,对新增节点补翻。
Expand Down
6 changes: 6 additions & 0 deletions src/dom/pre-split.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 11 — 纯文本 <pre> 按空行切块。
//
// #65:大型纯文本文档(如 GitHub README 的 .plain > pre)一次性文本过长,
Expand Down
6 changes: 6 additions & 0 deletions src/dom/renderer.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 4 — 三模式渲染器,替换阶段 2 的 inject.ts。
//
// 三种显示模式共用同一套 DOM 结构 ——
Expand Down
6 changes: 6 additions & 0 deletions src/dom/shadow-walk.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// 统一 shadow 子树遍历模块 —— #220 架构评审候选 4 的核心(#233)。
//
// Shadow-DOM 的递归遍历此前在还原流程、已翻译判定、观察器三处各写一遍,
Expand Down
6 changes: 6 additions & 0 deletions src/dom/site-filter.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 7 — 站点黑白名单判定(#153)。
//
// options 页存的是裸域名(小写、无协议)。运行时按 location.hostname
Expand Down
6 changes: 6 additions & 0 deletions src/dom/text.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 9 — 提取可翻译文本(跳过 .notranslate 与站点元数据子树)。
//
// 单元文本不能直接取 textContent:Google AI 概览的来源角标(chip)是
Expand Down
6 changes: 6 additions & 0 deletions src/dom/walker.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 Parallel-Translation contributors
//
// 本文件是 Parallel-Translation 的一部分,依 GNU GPL v3 或更新版本发布,
// 不含任何担保。完整条款见仓库根目录的 LICENSE。

// Phase 3 / 8 — 采集器:统一遍历模块的一个访问回调。
//
// #320:遍历本身、shadow 下沉、集中式跳过规则(扩展自身 UI)、去重
Expand Down
Loading
Loading