English Garden

LOCAL-FIRST · 英语花园

把网页里遇到的生词,种进自己的花园。

读到不懂的词,选中、点“译”、收藏——它连同所在句子和来源一起落到你本机 SQLite。 之后在 App 里复习拼读、看助记、和大模型追问,全程不需要打开网页后台。

  • Chrome 扩展 + macOS App
  • 只监听 127.0.0.1
  • 无账号 · 无云同步
English Garden macOS App 真机截图:schematic 词条详情面板,含音标、形容词与名词词性、skih / mæ / tihk 三张音节卡与助记卡,下方是释义与出处、原句和「我认识它了」按钮
App 词条详情面板实拍 · 截图来自一份只有假数据的演示词库,你收藏的词只留在本机 learn-english.sqlite
1 网页里选中英文 2 点绿色“译” 3 收藏进本机词库 4 在 App 里复习

它替你做的六件事

每一件都在本机完成。外网只在你真的需要新数据时才被访问一次,结果立刻落库。

划词收藏

选中任意网页上的单词或句子,浮出“译”按钮;也可以右键菜单或 Alt+Shift+E。

智能去重

按“规范化原文 + 源语言”判重。同一个词从别的网站再收藏,不新增词条,只更新译文和最近来源。

拼读信息

IPA 音标、中文词性、音节拆分和主重音。Datamuse 与 Dictionary API 并发取、互为回退,慢的那个不会拖住整张卡。

助记联想

大模型给 1–3 个 emoji 加一句不超过 36 字的中文联想,优先拆词根词缀。同一个单词只花一次 token。

AI 对话

每个词条一条独立对话。历史超预算时自动摘要旧消息,只把摘要和最近几轮发出去,并显示这轮的 token 消耗。

YouTube 真实语境

视频页侧边出现“学词”,读公开英文字幕按首次出现排词,点词直接跳转重播;详情页还能一键在 YouTube 搜真实视频。

怎么用

01

装好 macOS App

启动后它会自动在 http://127.0.0.1:3789 开一个只绑回环地址的后台服务。设置页的“后台服务”卡片能看到监听状态、扩展要填的地址和请求计数,端口被占用时可以在这里改。

02

加载 Chrome 扩展

构建一次,然后在 chrome://extensions 打开开发者模式,“加载已解压的扩展程序”选择 apps/extension/dist。进扩展设置点“测试连接并保存”,确认地址是 3789。

pnpm install
pnpm build   # 产物在 apps/extension/dist
03

配一把大模型密钥

在 App 设置页填 OpenAI 兼容的 Base URL、模型名和 API Key(默认走阿里百炼兼容地址 + qwen-plus)。Key 存在系统钥匙串里,不是明文写进数据库。扩展的翻译和对话共用这一把。

04

开始读,开始收

在任意网页划词收藏;回到 App 里按掌握度分桶复习(不知道 / 1 个月 / 2 个月 / 3 个月前)。默认隐藏中文释义,点一下才揭晓——先想,再看答案。

架构:一份核心,三个平台

业务逻辑收敛在一个平台无关的 Rust 核心里,SwiftUI 和 C# 通过同一套窄 C ABI 调它。Chrome 扩展连的 HTTP 服务也由核心自己实现,只开放扩展真正需要的五个端点。

扩展只用这五个接口

  • GET /api/health
  • POST /api/translate
  • GET /api/entries/status
  • PUT /api/entries
  • POST /api/video-learning/save-words

其余能力都在 App 进程内直接调核心,不暴露成 HTTP。服务只绑回环地址,填 0.0.0.0 会被核心直接拒绝。

外网数据一律先落库

音标、词性、音节、重音和助记都会写进本机 SQLite 数据库,词典那部分有效期一年。库里已有的单词不会再请求外部服务,断网也能复习。

只有“上游正常回答、但词典里确实没有这个词”才记一条 10 分钟的 miss。超时、5xx、代理拦截页都算“服务没答上”,不写进数据库——否则一次网络抖动会把单词长期钉在“没有拼读信息”上。

隐私边界

数据不出机器

没有账号、没有云同步、没有遥测。词库就是一个你能用 sqlite3 打开的文件。

只存你主动收的

保存原文、译文、页面标题、规范化 URL、所在句、首次与更新时间。不保存完整网页正文。

端口不暴露到局域网

后台服务只监听 127.0.0.1 / ::1,并限制浏览器 Origin;App 退出即释放端口。

密钥进钥匙串

API Key 存在系统钥匙串(Windows 上是凭据管理器),不写进数据库明文,接口也不会回显它。

默认数据库位置:~/Library/Application Support/EnglishGarden/learn-english.sqlite

平台状态

端状态说明
macOS App可用SwiftUI 原生,含后台服务与完整词库
Chrome 扩展可用Manifest V3,划词、右键菜单、快捷键、YouTube 学词
iOS App编译通过可整包编译到 arm64-apple-ios,缺真机验证
Windows绑定就绪C# 绑定 69 项冒烟通过,WinUI 界面待建

常见问题

为什么选中单词后没有出现“译”按钮?

扩展的按钮挂在页面自己身上,遇到强隔离的站点、Shadow DOM 或页面自己拦截了选区事件时可能不出现。可以先试右键菜单“翻译选中内容”,或用快捷键 Alt+Shift+E。

扩展提示“返回了网页而不是 API”?

说明地址填错了:扩展要连的是 App 后台服务的 3789。旧的网页版端口 5173 已经随 web 端一起移除,填它必然失败。

没有网络还能用吗?

能。已存过的单词、音标、助记和全部词条都在本机 SQLite 里,复习、朗读、跳转都不依赖网络。只有收藏新词、翻译新词、查新单词的拼读才需要外网。

一定要配大模型吗?

翻译有回退:支持 Translator API 的 Chrome 可以先用浏览器内置翻译。但词性、音标之外的中文释义、助记联想和对话需要你自己的一把兼容密钥。

为什么不做站内搜索和图片搜索?

那些都要配额和密钥,还会把访问记录留在第三方。现在详情页的“去真实视频里听”直接用系统浏览器打开 YouTube 搜索结果,登录态和地区限制都交回 YouTube 自己;配图改成本地大模型生成的 emoji 助记,结果存进本机数据库。

关于开发者

leon.li 的头像

leon.li@lilieming

“to be what you want to be.” · 杭州

English Garden 是一个人在业余时间做的本地优先工具。起点很实际:读英文资料时划词收藏了一堆, 然后那些词就再也没被打开过。于是把词库、拼读和助记做到自己机器上,让「收藏」真的能变成「记得」。

代码、词库和数据都在本机,没有账号也没有服务端。有问题或建议,欢迎在 GitHub 上找我。

词库是你自己的东西。

一个文件,一台机器,一个你随时能打开、备份、迁走的地方。

开始使用