- 多供应商,随时切换 — OpenAI、Claude、Gemini、DeepSeek、OpenRouter、AIHubMix、Azure OpenAI、自定义 OpenAI 兼容端点,八种 adapter 内置;Dashboard 填 Key 即用,无需改代码。
- 流式翻译 — 译文经 SSE 逐字渲染,跟读 DeepL 的即时手感。
- 插件化扩展 — 供应商走注册表,功能模块走 DB 驱动开关;新增厂商或功能只需加一个 adapter + 一行注册。
- 密钥加密存储 — 供应商 API Key 用
ENCRYPTION_KEY加密后落 D1,明文绝不入库。 - 细粒度限流 — 基于 Durable Object 的每 IP 滑动窗口,公开用户与登录用户分别配额。
- 缓存与统计 — KV 翻译缓存避免重复请求,用量日志落 D1,Dashboard 可视化。
- AI 专家 — 沉浸式翻译 YAML 兼容的场景化 prompt;Dashboard 勾选启用,翻译时按
expertId切换策略。 - 站点开关 — 一键关闭公开访问,转为纯私有部署。
- 多用户管理 — 可选功能模块:启用后管理员可创建普通用户、分配权限并启用/停用账号;全站仅一名管理员。
双语对照、语言自动检测、模型切换与快捷键翻译,开箱即用。
润色、风格、正式度与精简等写作辅助,双栏对照即时输出。
用量概览 — 总请求数、总字符数与各供应商用量一目了然,并可管理用户资料。
供应商 — 新增、编辑多家 AI 供应商,切换模型并设置公开默认。
站点设置 — 登录用户限流、KV 翻译缓存、功能模块开关与数据库维护。
AI 专家 — 基于沉浸式翻译的专业策略,按场景启用科技、金融、GitHub 等领域专家。
- Node 22+(pnpm 11 要求 Node 22.13+)、pnpm 11+
- Cloudflare 账号(仅部署时需要;本地开发无需登录)
pnpm install
pnpm db:init # 初始化本地 D1(wrangler dev 用本地 SQLite)
pnpm dev # 并行启动 web(5173) + api(8787)打开 http://localhost:5173 ,首页会请求 /api/ping 验证前后端闭环。Vite 把 /api 代理到 http://localhost:8787,开发期同源、无需 CORS。本地密钥由 .dev.vars 提供(已 gitignore)。
打开 http://localhost:5173 。尚未创建管理员时会自动进入初始化页,设定管理员邮箱和密码后进入控制台。再到「供应商」新增(填入真实 API Key 并勾选「设为公开默认」),回到 / 即可翻译。
Note
前端打包进同一个 Worker,wrangler deploy 一次发布前后端,同源无需 CORS、无需 VITE_API_BASE_URL。部署后首次打开站点进入初始化页,建表并设定管理员账号即可。
方式一:Cloudflare Git 连接(推荐,全程网页操作)
push 到 GitHub → Cloudflare 自动构建部署,无需本地装 wrangler、无需配 CI。
1. 创建资源(Dashboard)
- D1:Storage & D1 → Create database → 名字
opentranslator - KV:Workers & Pages → KV → Create namespace → 名字
KV
2. 连接 Worker(Workers Builds)
Dashboard → Workers & Pages → Create → Workers → Import a repository → 选仓库,Root directory 填 /,Build command 填 pnpm build,Deploy command 留空(用默认的 npx wrangler deploy)。
创建后进 Worker → Settings:
- Variables and Secrets 加两个 secret(32 位以上随机字符串):
JWT_SECRET:JWT 签名密钥,同时作为POST /api/init的X-Init-Secret凭证ENCRYPTION_KEY:供应商 API Key 加密密钥,务必备份,丢了等于所有密钥作废
- Bindings → Add binding:
- D1 binding,名字填
DB→ 选opentranslator数据库 - KV binding,名字填
KV→ 选刚才的命名空间
- D1 binding,名字填
3. 打开站点完成初始化
部署成功后打开 Worker 域名。首次访问会进入初始化页:填入 JWT_SECRET(Settings → Variables and Secrets),并设定管理员邮箱与密码。完成后自动登录并进入控制台。密钥不会写入地址栏。
也可以用 curl 只建表(管理员仍须在初始化页创建):
curl -X POST "https://<你的-worker-域名>/api/init" \
-H "X-Init-Secret: <你的-JWT_SECRET>"4. 配置供应商
控制台 → 供应商 → 新增(填入真实 API Key 并勾选「设为公开默认」)→ 回首页即可翻译。
5. 后续更新
改完代码 push 到 main,Cloudflare 自动重新构建部署。若有增量迁移,打开站点会再次进入初始化页,一键升级(无需密钥)。
方式二:本地 wrangler(可选)
wrangler login
wrangler d1 create opentranslator # 用返回的 ID 取消注释 wrangler.toml 里的 d1 段并填入
wrangler kv namespace create KV # 同上,取消注释 kv 段并填入
wrangler secret put JWT_SECRET
wrangler secret put ENCRYPTION_KEY
pnpm build # 构建前端到 ./dist
wrangler deploy # 一次部署前端 + API
# 打开 Worker 域名,在初始化页完成建表与管理员账号
# 或:curl -X POST https://api.yourdomain.com/api/init -H "X-Init-Secret: $(grep JWT_SECRET .dev.vars | cut -d= -f2)"配置参考
| 类型 | 名称 | 说明 |
|---|---|---|
| Secret | JWT_SECRET |
JWT 签名密钥,32 位以上随机字符串,同时作为 POST /api/init 的 X-Init-Secret 凭证 |
| Secret | ENCRYPTION_KEY |
供应商 API Key 加密密钥,务必备份 |
| Variable | ENV |
环境标识,默认 development |
| Variable | ORIGINS |
跨域来源白名单(逗号分隔);同源部署无需填写 |
| Binding (D1) | DB |
绑定到 opentranslator 数据库 |
| Binding (KV) | KV |
绑定到设置/缓存命名空间 |
| Binding (DO) | RATE_LIMITER |
Durable Object,部署时自动创建,无需 ID |
| Binding (Assets) | ASSETS |
前端静态资源,wrangler.toml 里已配,无需手动绑定 |
| 层 | 技术 |
|---|---|
| 前端 | Vite、React 19、React Router 7、TypeScript |
| 后端 | Hono、Cloudflare Workers、TypeScript |
| 数据 | Cloudflare D1(持久)、KV(缓存/设置)、Durable Object(限流) |
| 部署 | Cloudflare Workers(前端产物 + API 同一 Worker,[assets] 绑定) |
| 工程 | pnpm、TypeScript paths 别名共享类型 |
src/ # Hono Worker 后端(REST/SSE + 静态资源服务)
providers/ # 供应商 adapter + 注册表 + 表单 schema
routes/ # translate / auth / admin-*
db/ # D1 表结构 + 幂等初始化器
durable-objects/ # 限流器
features/ # 功能模块后端
web/ # Vite + React SPA(构建产物输出到根 dist/)
src/routes/ # 翻译页 / 初始化页 / 登录页 / Dashboard
src/features/ # 功能模块注册表(Dashboard 动态渲染)
shared-types/ # 前后端共享的 TypeScript 类型定义
wrangler.toml # Worker 配置(含 [assets] 静态资源绑定)
docs/images/ # README 截图
- 在
src/providers/加一个 adapter(实现TranslationProvider接口);OpenAI 兼容厂商可直接复用openai.ts。 - 在
src/providers/index.ts加一行providerRegistry.register(...)。 - 在
src/providers/schema.ts加一条表单字段定义,Dashboard 自动渲染配置表单。
核心路由与翻译逻辑无需改动。
- 在
web/src/features/加一个组件,并在features/registry.ts注册。 - 在 Dashboard → 模块管理里启用(DB 驱动开关),导航与页面自动出现。
- 基础设施 + 最小闭环
- 翻译核心:OpenAI/Claude/Gemini adapter、
/api/translate、SSE、前端翻译页 - 鉴权 + Dashboard:JWT、首次初始化、站点开关、供应商 CRUD、密钥加密、用量概览
- 供应商补全 + 缓存 + 统计:Azure OpenAI / DeepSeek / OpenRouter / custom adapter;KV 翻译缓存;用量统计
- 功能模块化:
/api/admin/featuresDB 驱动开关、Dashboard 动态导航;公开访问与 AI 专家等模块插件化 - 远期(按需排期):文档翻译 / OCR、多角色权限、Analytics Engine 迁移、计费 / 配额
欢迎提 Issue 与 PR。新增供应商或功能模块时,请遵循上面的「扩展点」两节,保持注册表式扩展。
本项目基于 GPL-3.0 发布。派生项目必须以同等协议开源。





