英汉命令行翻译工具
Project description
cli-trans
英汉命令行翻译工具。
项目简介
一个简洁高效的命令行翻译工具,支持多词典源并行查询、交互式 REPL 模式、生词本管理、缓存历史记录和彩色词性显示。
业务价值
解决的问题
- 终端用户查词效率低 — 查一个单词需要打开浏览器、访问词典网站、输入单词,至少 5 步操作。
cli-trans一步完成。 - 单一词典源不全面 — 有道的中文释义适合入门,牛津的英英释义更精准,柯林斯的例句更丰富。多源合并覆盖不同学习阶段的需求。
- 重复查询浪费网络 — SQLite 缓存避免同一个词的重复网络请求,离线可查历史记录。
目标用户
- 程序员(终端高频使用者,不想离开命令行)
- 英语学习者(需要多词典交叉验证释义)
- 学生/研究者(快速查词,积累生词本)
核心差异化
| 对比项 | 浏览器查词 | 有道桌面端 | GPT 翻译 | cli-trans |
|---|---|---|---|---|
| 操作步骤 | 5+ 步 | 3 步 | 2 步 | 1 条命令 |
| 响应速度 | 3-8s | 2-5s | 5-15s | 0.3-1.5s |
| 词典源 | 1 个 | 1 个 | 1 个 | 5 个并查 |
| 生词管理 | 无 | 有 | 无 | 有 |
| 离线缓存 | 无 | 部分 | 无 | 本地 SQLite |
| 终端集成 | 无 | 无 | 无 | 原生支持 |
技术实现
数据流
请求 → cache lookup → 命中 → 缓存返回
→ 未命中 → ThreadPoolExecutor 并发抓取 5 个源
→ as_completed 逐条 yield (name, result)
→ 到达即 print + 缓存第一个有结果的源
架构总览
用户输入 (CLI 参数 / REPL 输入流)
│
▼
┌─────────────┐ ┌──────────────────┐
│ __init__.py │────▶│ translator.py │─── 并行 HTTP 请求 ──▶ 有道/牛津/柯林斯/剑桥/FreeDict
│ (CLI 入口) │ │ (翻译引擎+适配器) │◀── 0.6s 超时静默跳过 ──┘
└──────┬──────┘ └────────┬─────────┘
│ │ yield (name, result) 逐条流式输出
│ ▼
│ ┌────────────┐
│ │ formatter.py│─── colorama 着色输出(词性/词典源双色)
│ └────────────┘
│
├──▶ storage.py ─── SQLite ─── history 表 + vocab 表
│ (缓存层) │
│ └── ~/.cli-translate.db
│
└──▶ repl.py ─── readline ─── 交互循环 + 命令解析
(REPL 模式) │
└── ~/.cli-trans-repl-history
项目结构
cliTranslate/
├── cli_trans/ # 主包目录
│ ├── __init__.py # CLI 入口和参数解析(145 行)
│ ├── __main__.py # 入口点
│ ├── formatter.py # 格式化输出,词性/词典源双色区分(129 行)
│ ├── translator.py # 翻译引擎:统一接口 + 5 个词典适配器(251 行)
│ ├── storage.py # 数据库层:缓存 + 生词本 CRUD(98 行)
│ └── repl.py # REPL 交互模式(190 行)
├── tests/ # 5 个测试文件,51 个测试用例
├── pyproject.toml # 项目配置
└── README.md # 说明文档
技术栈
| 技术 | 用途 |
|---|---|
| Python 3.8+ | 编程语言 |
| requests + Session | HTTP 连接复用,并行抓取 5 个词典 |
| beautifulsoup4 | HTML 解析,提取翻译结果 |
| colorama | 终端 ANSI 彩色输出 |
| sqlite3 | 本地数据库,缓存历史记录和生词本 |
| readline | REPL 交互模式的历史和行编辑 |
| ThreadPoolExecutor | 并发请求 5 个词典源 |
| pytest | 单元测试(51 个测试用例) |
核心模块设计
translator.py — 翻译引擎
BaseTranslator 抽象基类定义了统一接口,5 个子类各自实现具体的 HTML 解析逻辑:
YoudaoTranslator— 解析有道词典的.trans-container/.simple容器OxfordTranslator— 解析牛津词典的.entry .def结构CollinsTranslator— 解析柯林斯词典的.hom .def结构CambridgeTranslator— 解析剑桥词典的.pr.entry-body__el .def结构FreeDictionaryTranslator— 解析 FreeDict 的.pseg .dsingle结构
MultiTranslator.translate() 是一个生成器,用 ThreadPoolExecutor 并发发起请求,通过 as_completed 逐条 yield 完成的结果。
def translate(self, word, sources=None):
sources = sources or self.available_sources
with ThreadPoolExecutor(max_workers=5) as executor:
futures = {
executor.submit(self._sources[name].translate, word): name
for name in sources if name in self._sources
}
for future in as_completed(futures):
try:
result = future.result()
if result.meanings:
yield name, result
except Exception:
pass
storage.py — 数据库层
封装 SQLite 操作,两个核心表:
history表:(word, translation, translation_raw, created_at)— 翻译缓存和历史记录vocab表:(word, added_at, mastered)— 生词本
formatter.py — 格式化输出
- 10 种词性各有独立颜色(
n.青色、v.红色、adj.绿色等) - 5 个词典源各有独立颜色(
[YOUDAO]青色、[OXFORD]绿色等) format_single_source()格式化单个源的结果,用于流式输出
repl.py — 交互模式
基于标准库 readline 实现的交互式循环,无需额外依赖。支持:
- 上下方向键翻历史输入
/save/list/history/source等命令.前缀翻译整句Ctrl+D/exit退出
关键技术决策
ThreadPoolExecutor并行请求 — 5 个词典源并发抓取,总耗时 ≈ 最慢的源而非各源之和- 生成器流式输出 —
translate()用yield逐条吐出结果,到达即打印,不等全部完成 - 0.6s 硬超时 — 超过 0.6 秒无响应的源直接跳过,不阻塞、不显示错误
requests.Session连接复用 —BaseTranslator.__init__创建 session,避免重复 TCP/TLS 握手- BS4 + 双模式解析 — BeautifulSoup 解析 HTML,主模式 + 备用模式兜底,容错性强
beautifulsoup4替代正则 — 0.2.0 版本用 BS4 替换了原有的正则 HTML 解析,消除了结构变动导致的断裂风险
词典源
- 有道词典 (Youdao) — 英中双语释义
- 牛津词典 (Oxford) — 权威英英释义
- 柯林斯词典 (Collins) — 例句丰富
- 剑桥词典 (Cambridge) — 适合学习者
- FreeDictionary — 免费开源词典
功能
- 多词典源并行查询,结果逐条流式输出;
- 交互式 REPL 模式(
-i),支持/save/list等命令; - 生词本管理(添加、删除、列表、标记已掌握);
- SQLite 缓存,首次在线查询,后续本地秒回;
- 不同词性使用不同颜色区分,词典源也有独立颜色标识;
- 所有历史查询记录展示和清除。
安装
pip install cli-trans
使用
# 翻译单词(查询所有词典源)
cli-trans hello
cli-trans hello world
# 指定词典源
cli-trans hello --source youdao
cli-trans hello --source youdao,oxford
# 查看历史记录
cli-trans -l
cli-trans -l -n 20
# 强制从 API 重新获取(忽略缓存)
cli-trans hello --force
# 清除历史记录
cli-trans -c
# 进入 REPL 交互模式
cli-trans -i
# 生词本管理
cli-trans --vocab-add hello
cli-trans --vocab-list
cli-trans --vocab-rm hello
# 查看版本
cli-trans -v
REPL 模式命令
| 命令 | 说明 |
|---|---|
/save <word> |
添加单词到生词本 |
/remove <word> |
删除生词 |
/list |
生词本列表 |
/history [n] |
查看翻译历史 |
/source [name] |
切换词典源 |
/clear |
清屏 |
/help |
帮助 |
exit / Ctrl+D |
退出 |
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
cli_trans-0.3.1.tar.gz
(19.5 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
cli_trans-0.3.1-py3-none-any.whl
(15.1 kB
view details)
File details
Details for the file cli_trans-0.3.1.tar.gz.
File metadata
- Download URL: cli_trans-0.3.1.tar.gz
- Upload date:
- Size: 19.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a352b87bcbc1e97fcbb6c36e014dc64aec9536f6008c75d593b12b2caf84adb2
|
|
| MD5 |
dfef6b50f0393ad67f2fe9a64424844b
|
|
| BLAKE2b-256 |
b2758f940f14a1dc20d8648376e3576580527e79f080017d0d94d550eb6b1139
|
File details
Details for the file cli_trans-0.3.1-py3-none-any.whl.
File metadata
- Download URL: cli_trans-0.3.1-py3-none-any.whl
- Upload date:
- Size: 15.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
231e8e2b2b381bae605ade9da8418041574213d12e0ef5a895c8bc9cc02ef291
|
|
| MD5 |
d362f20e49cc4e4c7a0f97eac76fb642
|
|
| BLAKE2b-256 |
4be0ee8866b36ac30cad95ba788f2467dc9d6b5341f3b8d268afc0203b29e7e4
|