
1. 从一本英文电子书说起为什么我要用 Cursor 写个电子翻译器事情的起因特别简单。前两天翻到一本讲教育理念的英文原版书内容挺对胃口但英文读起来总归慢半拍尤其是一些长句和术语来回查词很打断节奏。我第一反应是找中文版结果没有。那就自己动手翻译吧——但整本书手动翻显然不现实于是我把目光投向了手边的 Cursor。Cursor 是这两年很火的 AI 编程编辑器它最大的特点是内置了 Composer 模式你可以用自然语言描述需求它直接帮你生成、修改、运行代码。对于我这种想快速做个小工具、又不想在细节上耗太久的人来说它几乎是量身定做的。而这次要做的“电子翻译器”本质上就是一个能读取电子书文件、把里面的文本逐段翻译、再输出成新文件的脚本。你可能会问翻译直接复制到网页版对话框里不就行了问题在于电子书不是纯文本它通常是 EPUB 格式内部是一堆 HTML 文件打包成的压缩包还夹杂着标签、样式、目录结构。手动处理这些光是解析和还原格式就能耗掉半天。而用 Cursor 配合 AI这部分工作可以压缩到十分钟以内。这个电子翻译器适合谁适合所有手里有英文电子书、想快速得到中文版本的人也适合想体验 AI 编程、但还没找到合适练手项目的人。它不依赖复杂的框架核心就是文件解析加接口调用代码量不大但覆盖了“读文件—处理内容—调模型—写回文件”的完整链路。接下来我会把整个搭建过程拆开重点讲清楚怎么用 TaoToken 的统一 Key 来接入翻译模型避免在多个平台之间来回切换密钥。2. TaoToken 前置准备统一 Key 接入翻译模型告别多平台密钥管理在动手写代码之前得先解决翻译模型的接入问题。市面上的模型接口不少但每个平台的密钥格式、调用地址、参数命名都有差异如果今天用这家、明天换那家代码里就得维护一堆配置。我这次用的是 TaoToken 的统一 API 通道它把多家模型的调用方式统一成一套兼容接口你只需要一个 Key就能在多个模型之间切换。TaoToken 的官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。它的接口设计兼容常见的对话补全格式所以你在代码里发请求时基本不用改结构只要把 Base URL 和 Key 换掉就行。具体到操作层面你需要先拿到一个 API Key。登录后进入控制台在 API Keys 页面创建一个新的密钥。这个 Key 就是你后续所有请求的凭证建议单独保存不要直接硬编码在代码里后面我会讲怎么用环境变量管理。拿到 Key 之后你还需要确认两件事一是 Base URL也就是请求发往哪里二是 Model ID也就是你要调用哪个模型。TaoToken 支持多种模型翻译任务对模型的要求是理解准确、输出稳定你可以根据自己的需求选择。比如做中英翻译选一个擅长多语言处理的模型就行。这里有个细节要注意不同模型对参数的支持程度不一样比如 temperature、max_tokens 这些在切换模型时最好先小范围测试一下。TaoToken 的好处是接口统一你换模型只需要改 Model ID 这一个字段不用重写请求逻辑。另外如果你打算把这个翻译器开源千万别把 Key 提交到仓库里。我见过太多项目因为密钥泄露被滥用最后只能删库重来。正确的做法是用 .env 文件存放 Key然后在 .gitignore 里排除它。这样别人克隆你的仓库后只需要自己填一个 Key 就能跑起来。准备工作做到这里就差不多了一个 Key、一个 Base URL、一个 Model ID三样东西齐了接下来就可以进 Cursor 写代码了。3. 可复制配置Cursor 项目结构、settings 片段与翻译器核心代码打开 Cursor新建一个空文件夹作为项目根目录比如叫 translate-book。然后在这个目录下创建几个基础文件一个 Python 脚本负责主逻辑一个 .env 存放密钥一个 requirements.txt 声明依赖再加一个 README.md 说明用法。目录结构大概是这样translate-book/ ├── .env ├── .gitignore ├── requirements.txt ├── translate.py └── README.md先看 .env 文件里面放你的 TaoToken 配置TAOTOKEN_API_KEY你的APIKey TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODEL你的模型ID注意 Base URL 后面不要多加斜杠具体路径在代码里拼接。.gitignore 里加上 .env 和pycache避免敏感信息进仓库。requirements.txt 声明两个核心依赖requests beautifulsoup4requests 用来发 HTTP 请求beautifulsoup4 用来解析 EPUB 内部的 HTML。EPUB 本身是个 zip 包Python 标准库的 zipfile 就能处理不用额外装。接下来是核心的 translate.py。我把它拆成几个函数读取 EPUB、提取文本、调用翻译接口、写回新 EPUB。先看读取和解析部分import os import zipfile from bs4 import BeautifulSoup import requests from dotenv import load_dotenv load_dotenv() API_KEY os.getenv(TAOTOKEN_API_KEY) BASE_URL os.getenv(TAOTOKEN_BASE_URL) MODEL os.getenv(TAOTOKEN_MODEL) def read_epub(path): with zipfile.ZipFile(path, r) as z: return {name: z.read(name) for name in z.namelist()}这段代码把 EPUB 里的所有文件读进内存键是文件名值是二进制内容。接下来要找出哪些是 HTML 内容文件通常它们在 OEBPS 或 EPUB 目录下扩展名是 .xhtml 或 .html。def extract_html(epub_files): html_files {} for name, content in epub_files.items(): if name.endswith((.xhtml, .html)): html_files[name] content.decode(utf-8, errorsignore) return html_files拿到 HTML 后用 BeautifulSoup 解析把文本节点抽出来翻译再替换回去。这里要注意保留原有的标签结构否则排版会乱。我的做法是遍历所有 NavigableString 节点跳过 script 和 style 里的内容然后逐段翻译。def translate_text(text): headers { Authorization: fBearer {API_KEY}, Content-Type: application/json } payload { model: MODEL, messages: [ {role: system, content: 你是一个翻译助手把用户输入的英文翻译成中文只输出译文不要解释。}, {role: user, content: text} ], temperature: 0.3 } resp requests.post(f{BASE_URL}/v1/chat/completions, headersheaders, jsonpayload, timeout60) resp.raise_for_status() return resp.json()[choices][0][message][content]这段是调用 TaoToken 接口的关键部分。注意 URL 拼接是 BASE_URL 加 /v1/chat/completions这是兼容接口的标准路径。请求头里带 Bearer 加 Key请求体里指定 model 和 messages。返回结果从 choices 数组里取第一条的 message.content。有了翻译函数就可以处理每个 HTML 文件了def process_html(html_content): soup BeautifulSoup(html_content, html.parser) for node in soup.find_all(stringTrue): if node.parent.name in [script, style]: continue original node.strip() if len(original) 2: continue translated translate_text(original) node.replace_with(translated) return str(soup)最后把处理过的 HTML 写回一个新的 EPUB 文件保持原来的目录结构不变。主流程就是读原文件、逐个处理、写出新文件。在 Cursor 里你可以直接把这段需求描述给 Composer让它帮你补全剩余部分比如命令行参数解析、进度显示、错误重试等。我实测下来Composer 对这类文件处理任务的理解相当到位生成的代码基本能直接跑。4. 验证请求与成功结果本地运行翻译器并检查输出代码写完后先别急着翻译整本书拿一个小文件测试接口是否通。你可以单独写一个测试脚本或者直接在 Python 交互环境里调用 translate_text 函数print(translate_text(Hello, this is a test.))如果配置正确你会看到返回的中文译文。这一步能快速验证三件事Key 是否有效、Base URL 是否可达、Model ID 是否正确。如果返回 401说明 Key 有问题如果连接超时检查网络和 Base URL如果报模型不存在那就是 Model ID 写错了。接口通了之后准备一个小的 EPUB 文件做端到端测试。运行命令python translate.py --input sample.epub --output sample_zh.epub程序会读取 sample.epub逐个翻译 HTML 里的文本然后生成 sample_zh.epub。翻译过程中建议加个进度打印比如每处理完一个文件输出一行日志这样你能看到它确实在动。整本书翻译时间取决于文本量和模型响应速度小文件通常几十秒就能完成。拿到输出文件后用电子书阅读器打开检查几件事中文是否正常显示、排版有没有乱、目录能不能跳转、图片有没有丢失。如果发现某些段落没翻译可能是文本节点太短被跳过了或者被 script/style 过滤掉了。如果排版错乱检查 BeautifulSoup 解析时有没有破坏原有标签结构。我试过翻译一本两百多页的书整体流程跑下来大概十几分钟中间没有人工干预。输出文件在阅读器里打开章节结构完整正文翻译通顺只有少数专有名词需要手动调整。这个结果对于十分钟搭出来的工具来说已经相当够用了。验证通过后你就可以把这个项目推到 GitHub 上开源。记得在 README 里写清楚依赖安装、环境变量配置、运行命令再附上你的 Cursor 对话记录方便别人理解整个开发过程。5. 本篇常见错排查401、local proxy failed、reading choices 报错怎么解实际跑的时候最容易撞上的就是几类报错。我把它们和对应的排查思路列出来你遇到时可以直接对照。第一类是 401 Unauthorized。这个最直接就是 Key 不对。可能的原因有.env 文件没被正确加载、Key 复制时多了空格、Key 已经失效或被删除。排查方法是先在代码里打印一下 os.getenv(TAOTOKEN_API_KEY) 的前几位确认读到了值。如果读不到检查 load_dotenv() 是否在读取环境变量之前调用以及 .env 文件是否在项目根目录。第二类是 local proxy failed 或连接被拒绝。这通常和网络环境有关但注意不要往代理配置上想。先检查 BASE_URL 是否写成了 https://taotoken.net/api有没有多写或少写路径。然后确认你的运行环境能正常访问外网接口。如果是在某些受限网络里可能需要检查防火墙或 DNS 设置。另外requests 的 timeout 设得太短也会导致连接失败建议设成 60 秒。第三类是 reading choices 相关的报错比如 KeyError: choices 或 IndexError。这说明接口返回的结构和你预期的不一样。可能的原因是请求体格式不对比如 messages 字段拼写错误或者 model 字段传了空值。也有可能是接口返回了错误信息但你没有检查状态码就直接取 choices。正确的做法是先用 resp.raise_for_status() 抛出 HTTP 错误再打印 resp.json() 看完整返回。如果返回里有 error 字段里面会写明具体原因。第四类是翻译结果为空或乱码。这通常是因为文本编码问题。EPUB 里的 HTML 可能是 UTF-8也可能是其他编码读取时要用 errorsignore 兜底。另外如果原文里包含大量特殊符号或 HTML 实体翻译前最好先做一次清洗否则模型可能返回奇怪的结果。还有一个容易被忽略的点如果你在 Cursor 里让 AI 生成代码它可能会自动引入一些你没要求的依赖或者把 Key 硬编码在代码里。生成后一定要自己过一遍把敏感信息挪到 .env把多余依赖删掉。开源之前再检查一次 .gitignore确保 .env 不会被提交。6. 把统一 Key 接入用在更多场景从翻译器到日常编码工作流这个电子翻译器只是一个起点。它真正有意思的地方在于你通过 TaoToken 的统一 Key 把模型调用抽象成了一个独立模块以后想换模型、换任务只需要改配置不用动核心逻辑。比如你想把翻译器改成摘要生成器只需要把 system prompt 从“翻译成中文”改成“用三句话总结”其他代码原封不动。如果你经常做这类小工具可以考虑把接口调用封装成一个公共函数放在单独的文件里其他项目直接 import。这样你的每一个脚本都共享同一套 Key 管理方式不用重复配置。TaoToken 的兼容接口在这里帮了大忙因为它不绑定特定厂商的 SDK用标准 HTTP 请求就能调语言和框架都不受限。对于更长期的编码任务比如需要反复调用模型、管理多个会话、或者跑 Agent 流程可以了解一下 Coding Plan 相关的用法。它的思路是把模型调用和开发工作流结合起来适合需要持续交互的场景。而如果你只是想快速验证某个模型的效果直接进模型对话页面试几句比写代码更快。回到这个翻译器项目我把它开源在 GitHub 上仓库里除了代码还放了和 Cursor 的完整对话记录。你可以看到我是怎么一步步描述需求、怎么让 AI 补全函数、怎么调试报错的。对于刚接触 AI 编程的人来说看一遍这个过程比读十篇教程都直观。最后说个实际的小技巧翻译整本书之前先用一两页试跑确认输出质量符合预期再放开跑全量。这样万一模型选择不合适或者 prompt 需要调整你不用等整本跑完才发现问题。另外翻译结果建议人工过一遍尤其是专业术语和书名机器翻译在这类内容上偶尔会跑偏。工具是帮你省时间的最终的判断还是得自己来。