# DeepLX
***[English](README.md)***
[](./LICENSE)
[](#self-deployment)
DeepLX 是一个专为 Cloudflare Workers 优化的无服务器翻译服务。通过智能代理端点轮换、高级限流算法、缓存和熔断器机制,它比传统翻译 API 接入方式更能避免 HTTP 429 错误,同时带来更低的延迟。当前同时支持 DeepL 和 Google 翻译。
> [!NOTE]
> 与付费翻译 API 不同,DeepLX 可以免费使用。无需 API 密钥、无需订阅,也没有按量计费。
## 为什么选择 DeepLX
**与付费翻译 API 不同,DeepLX 完全免费使用** - 无需 API 密钥、无订阅费用、无使用限制。只需部署一次,即可享受无限制的翻译请求,无需担心任何费用问题。
## 特性与性能优势
### 多服务提供商支持
- **DeepL 翻译** (`/deepl`) - 高质量的 AI 翻译
- **Google 翻译** (`/google`) - 广泛的语言支持和快速处理
- **传统兼容性** (`/translate`) - 使用 DeepL 的向后兼容端点
### 性能优势
DeepLX 在性能和稳定性方面相较于 DeepL API 有显著提升,以下是基于特定网络环境下的关键指标对比:
| 指标 | DeepL API | DeepLX (预部署实例) |
|------|-----------|-------------------|
| 速率限制 | 50 请求/秒 | 80 请求/秒 (8 请求/秒 × 10 代理端点) |
| 平均网络往返时间 | ~450ms | ~180ms (边缘网络加速) |
| HTTP 429 错误率 | 10-30% | <1% |
| 并发支持 | 单端点限制 | 多端点负载均衡 |
| 地理分布 | 有限 | 全球 330+ 边缘节点 |
#### 核心性能特性
- **更高速率限制**:智能负载均衡,比 DeepL API 支持更高的并发请求
- **更低延迟**:基于 Cloudflare Workers 的全球边缘网络部署
- **零冷启动**:无服务器架构,瞬时响应
- **智能缓存**:双层缓存系统(内存 + KV 存储)减少重复请求
#### 技术优势
- **智能负载均衡**:多个代理端点自动分发请求
- **动态限流算法**:基于代理数量自动调整速率限制
- **双层缓存系统**:内存缓存 + KV 存储减少重复请求
- **熔断器机制**:故障端点自动切换,保证服务连续性
- **边缘计算**:Cloudflare Workers 全球部署,降低延迟
### 稳定性保障
- **避免 HTTP 429 错误**:通过代理端点轮换和令牌桶算法几乎完全避免限流
- **熔断器机制**:自动检测故障端点并进行故障转移
- **指数退避重试**:智能重试机制提高成功率
### 安全特性
- **输入验证**:全面的参数校验和文本清理
- **速率限制**:基于客户端 IP 和代理端点的多维度限流
- **CORS 支持**:灵活的跨域资源共享配置
- **安全头部**:自动添加安全相关的 HTTP 头部
- **错误净化**:敏感信息永不暴露
## 架构概览
```mermaid
graph TB
%% 客户端层
subgraph "客户端层"
Client[API 客户端]
end
%% Cloudflare Workers 层
subgraph "Cloudflare Workers"
direction TB
Router[Hono 路由器]
subgraph "API 端点"
DeepL[POST /deepl]
Google[POST /google]
Translate[POST /translate]
Debug[POST /debug]
end
subgraph "核心中间件与组件"
CORS[CORS 处理器]
Security[安全中间件]
RateLimit[限流系统]
Cache[双层缓存
内存 + KV]
end
subgraph "翻译服务"
QueryEngine[DeepL 查询引擎]
GoogleService[Google 翻译服务]
end
subgraph "支持系统"
ProxyManager[代理管理器
& 负载均衡]
CircuitBreaker[熔断器]
RetryLogic[重试逻辑]
ErrorHandler[错误处理器]
end
end
%% 存储层
subgraph "Cloudflare 存储"
CacheKV[(缓存 KV
翻译结果)]
RateLimitKV[(限流 KV
令牌桶)]
Analytics[(分析引擎
指标 & 监控)]
end
%% 外部服务
subgraph "外部翻译 API"
DeepLAPI[DeepL JSONRPC API
www2.deepl.com]
GoogleAPI[Google 翻译 API
translate.google.com]
XDPL[XDPL 代理集群
多个 Vercel 实例]
end
%% 请求流连接
Client --> Router
Router --> CORS
CORS --> DeepL
CORS --> Google
CORS --> Translate
CORS --> Debug
DeepL --> Security
Google --> Security
Translate --> Security
Debug --> Security
Security --> RateLimit
RateLimit --> Cache
Cache --> QueryEngine
Cache --> GoogleService
QueryEngine --> ProxyManager
GoogleService --> GoogleAPI
ProxyManager --> CircuitBreaker
CircuitBreaker --> RetryLogic
RetryLogic --> ErrorHandler
%% 外部 API 连接
ProxyManager -.-> XDPL
XDPL -.-> DeepLAPI
%% 存储连接
Cache -.-> CacheKV
RateLimit -.-> RateLimitKV
Router -.-> Analytics
%% 样式
classDef clientClass fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef workerClass fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef middlewareClass fill:#e8f5e8,stroke:#388e3c,stroke-width:2px
classDef serviceClass fill:#fff3e0,stroke:#f57c00,stroke-width:2px
classDef storageClass fill:#fce4ec,stroke:#e91e63,stroke-width:2px
classDef externalClass fill:#ffebee,stroke:#d32f2f,stroke-width:2px
class Client clientClass
class Router,DeepL,Google,Translate,Debug workerClass
class CORS,Security,RateLimit,Cache middlewareClass
class QueryEngine,GoogleService,ProxyManager,CircuitBreaker,RetryLogic,ErrorHandler serviceClass
class CacheKV,RateLimitKV,Analytics storageClass
class DeepLAPI,GoogleAPI,XDPL externalClass
```
## 在线服务
> [!WARNING]
> 预部署实例因请求过多已暂时停止服务。请[自行部署](#self-deployment)以继续使用。
~~**预部署实例**:`https://dplx.xi-xu.me`~~ (暂时停止)
## 快速开始
### cURL 示例
#### DeepL 翻译(推荐)
```bash
curl -X POST https://dplx.xi-xu.me/deepl \
-H "Content-Type: application/json" \
-d '{
"text": "Hello, world!",
"source_lang": "EN",
"target_lang": "ZH"
}'
```
#### Google 翻译
```bash
curl -X POST https://dplx.xi-xu.me/google \
-H "Content-Type: application/json" \
-d '{
"text": "Hello, world!",
"source_lang": "EN",
"target_lang": "ZH"
}'
```
#### 传统端点(DeepL)
```bash
curl -X POST https://dplx.xi-xu.me/translate \
-H "Content-Type: application/json" \
-d '{
"text": "Hello, world!",
"source_lang": "EN",
"target_lang": "ZH"
}'
```
### JavaScript 示例
#### DeepL 翻译(JavaScript)
```javascript
async function translateWithDeepL(text, sourceLang = 'auto', targetLang = 'zh') {
const response = await fetch('https://dplx.xi-xu.me/deepl', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
text: text,
source_lang: sourceLang,
target_lang: targetLang
})
});
const result = await response.json();
return result.data;
}
// 使用示例
translateWithDeepL('Hello, world!', 'en', 'zh')
.then(result => console.log(result))
.catch(error => console.error(error));
```
#### Google 翻译(JavaScript)
```javascript
async function translateWithGoogle(text, sourceLang = 'auto', targetLang = 'zh') {
const response = await fetch('https://dplx.xi-xu.me/google', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
text: text,
source_lang: sourceLang,
target_lang: targetLang
})
});
const result = await response.json();
return result.data;
}
// 使用示例
translateWithGoogle('Hello, world!', 'en', 'zh')
.then(result => console.log(result))
.catch(error => console.error(error));
```
### Python 示例
#### DeepL 翻译(Python)
```python
import requests
import json
def translate_with_deepl(text, source_lang='auto', target_lang='zh'):
url = 'https://dplx.xi-xu.me/deepl'
data = {
'text': text,
'source_lang': source_lang,
'target_lang': target_lang
}
response = requests.post(url, json=data)
result = response.json()
if result['code'] == 200:
return result['data']
else:
raise Exception(f"翻译失败: {result.get('message', '未知错误')}")
# 使用示例
try:
result = translate_with_deepl('Hello, world!', 'en', 'zh')
print(result)
except Exception as e:
print(f"错误: {e}")
```
#### Google 翻译(Python)
```python
import requests
import json
def translate_with_google(text, source_lang='auto', target_lang='zh'):
url = 'https://dplx.xi-xu.me/google'
data = {
'text': text,
'source_lang': source_lang,
'target_lang': target_lang
}
response = requests.post(url, json=data)
result = response.json()
if result['code'] == 200:
return result['data']
else:
raise Exception(f"翻译失败: {result.get('message', '未知错误')}")
# 使用示例
try:
result = translate_with_google('Hello, world!', 'en', 'zh')
print(result)
except Exception as e:
print(f"错误: {e}")
```
## 客户端集成
配置 API 客户端以使用预部署实例:
### [DeepLX App](https://github.com/xixu-me/DeepLX-App)(开源 web 应用)
一个现代化、免费的基于 web 的翻译应用,由 DeepLX API 驱动。功能包括:
- 支持多语言自动检测
- 输入时自动翻译
- 翻译历史和语言切换
- 适配所有设备的响应式设计
- RTL 语言支持
**在线演示**:[https://deeplx.xi-xu.me](https://deeplx.xi-xu.me)
### [Pot](https://github.com/pot-app/pot-desktop)(开源跨平台 Windows、macOS 和 Linux 应用)
1. [下载并安装适用于您平台的 Pot](https://github.com/pot-app/pot-desktop/releases/latest)
2. 打开 Pot 设置并导航到服务设置
3. 将 DeepL 服务类型配置为 DeepLX,并将自定义 URL 配置为 `https://dplx.xi-xu.me/deepl`
### [Zotero](https://www.zotero.org/)(开源文献管理应用)
1. [下载并安装适用于您平台的 Zotero](https://www.zotero.org/download/)
2. 下载并安装 [Translate for Zotero](https://github.com/windingwind/zotero-pdf-translate) 插件
3. 打开 Zotero 设置并导航到翻译中的服务部分
4. 将翻译服务配置为 DeepLX(API),并点击配置按钮后将接口配置为 `https://dplx.xi-xu.me/deepl`
### [PDFMathTranslate(pdf2zh)](https://github.com/Byaidu/PDFMathTranslate)(开源 PDF 文档翻译工具)
参考[高级选项](https://github.com/Byaidu/PDFMathTranslate/blob/main/docs/README_zh-CN.md#%E9%AB%98%E7%BA%A7%E9%80%89%E9%A1%B9)和[使用不同的服务进行翻译](https://github.com/Byaidu/PDFMathTranslate/blob/main/docs/ADVANCED.md#translate-with-different-services)。
### [沉浸式翻译](https://immersivetranslate.com/zh-Hans/)(闭源浏览器扩展)
1. [安装沉浸式翻译](https://immersivetranslate.com/zh-Hans/download/)
2. 进入开发者设置并开启 beta 测试特性
3. 进入翻译服务添加自定义翻译服务 DeepLX,将 API URL 配置为 `https://dplx.xi-xu.me/deepl`
4. 将每秒最大请求数和每次请求最大文本长度配置为合适的值(例如 `80` 和 `5000`),以确保稳定性和性能
### [Bob](https://bobtranslate.com/)(闭源 macOS 应用)
1. [从 Mac App Store 下载并安装 Bob](https://apps.apple.com/cn/app/id1630034110)
2. 下载并安装 [bob-plugin-deeplx](https://github.com/missuo/bob-plugin-deeplx) 插件
3. 配置插件使用 `https://dplx.xi-xu.me/deepl`
## 自部署
[](https://deploy.workers.cloudflare.com/?url=https://github.com/xixu-me/DeepLX)
### 前置要求
- Node.js 18+
- Cloudflare Workers 账户
- Wrangler CLI
### 1. 克隆存储库
```bash
git clone https://github.com/xixu-me/DeepLX.git
cd DeepLX
```
### 2. 安装依赖
```bash
npm install
```
### 3. 配置环境
编辑 `wrangler.jsonc` 文件,更新以下配置:
```jsonc
{
"account_id": "你的_CLOUDFLARE_账户_ID",
"name": "你的_Worker_名称",
"vars": {
"DEBUG_MODE": "false",
"PROXY_URLS": "你的代理端点列表,用逗号分隔"
}
}
```
### 4. 创建 KV 命名空间
```bash
# 创建缓存 KV 命名空间
npx wrangler kv namespace create "CACHE_KV"
# 创建限流 KV 命名空间
npx wrangler kv namespace create "RATE_LIMIT_KV"
```
将返回的命名空间 ID 更新到 `wrangler.jsonc` 的 `kv_namespaces` 配置中。
### 5. 部署到 Cloudflare Workers
```bash
# 开发环境
npx wrangler dev
# 生产部署
npx wrangler deploy
```
## 代理端点部署
为了获得最佳性能和稳定性,建议部署尽可能多的 [XDPL](https://github.com/xixu-me/XDPL) 代理端点:
### 快速部署 XDPL
[](https://vercel.com/new/clone?repository-url=https://github.com/xixu-me/XDPL)
### 配置代理端点
1. 部署多个 XDPL 实例
2. 将部署后的 URL 添加到 DeepLX 的 `PROXY_URLS` 环境变量中:
```jsonc
{
"vars": {
"PROXY_URLS": "https://your-xdpl-1.vercel.app/jsonrpc,https://your-xdpl-2.vercel.app/jsonrpc,https://your-xdpl-3.vercel.app/jsonrpc,https://your-xdpl-n.vercel.app/jsonrpc"
}
}
```
## API 参考
### 可用端点
| 端点 | 服务提供商 | 描述 | 状态 |
|----------|----------|-------------|---------|
| `/deepl` | DeepL | 主要 DeepL 翻译端点 | **推荐** |
| `/google` | Google 翻译 | Google 翻译端点 | 活跃 |
| `/translate` | DeepL | 传统端点(使用 DeepL) | 传统 |
### `/deepl`(推荐)
**请求方法**:`POST`
**请求标头**:`Content-Type: application/json`
**请求参数**:
| 参数 | 类型 | 说明 | 是否必要 |
| - | - | - | - |
| `text` | string | 要翻译的文本 | 是 |
| `source_lang` | string | 源语言代码 | 否,默认值 `AUTO` |
| `target_lang` | string | 目标语言代码 | 否,默认值 `EN` |
**响应**:
```json
{
"code": 200,
"data": "翻译结果",
"id": "随机标识符",
"source_lang": "检测到的源语言代码",
"target_lang": "目标语言代码"
}
```
### `/google`
**请求方法**:`POST`
**请求标头**:`Content-Type: application/json`
**请求参数**:
| 参数 | 类型 | 说明 | 是否必要 |
| - | - | - | - |
| `text` | string | 要翻译的文本 | 是 |
| `source_lang` | string | 源语言代码 | 否,默认值 `AUTO` |
| `target_lang` | string | 目标语言代码 | 否,默认值 `EN` |
**响应**:
```json
{
"code": 200,
"data": "翻译结果",
"id": "随机标识符",
"source_lang": "检测到的源语言代码",
"target_lang": "目标语言代码"
}
```
### `/translate`(传统)
**请求方法**:`POST`
**请求标头**:`Content-Type: application/json`
> [!NOTE]
> 这是一个使用 DeepL 的传统端点。对于新集成,请使用 `/deepl`。
**请求参数**:
| 参数 | 类型 | 说明 | 是否必要 |
| - | - | - | - |
| `text` | string | 要翻译的文本 | 是 |
| `source_lang` | string | 源语言代码 | 否,默认值 `AUTO` |
| `target_lang` | string | 目标语言代码 | 否,默认值 `EN` |
**响应**:
```json
{
"code": 200,
"data": "翻译结果",
"id": "随机标识符",
"source_lang": "检测到的源语言代码",
"target_lang": "目标语言代码"
}
```
**支持的语言代码**:
- `AUTO` - 自动检测(仅作为源语言)
- `AR` - 阿拉伯语
- `BG` - 保加利亚语
- `CS` - 捷克语
- `DA` - 丹麦语
- `DE` - 德语
- `EL` - 希腊语
- `EN` - 英语
- `ES` - 西班牙语
- `ET` - 爱沙尼亚语
- `FI` - 芬兰语
- `FR` - 法语
- `HE` - 希伯来语
- `HU` - 匈牙利语
- `ID` - 印尼语
- `IT` - 意大利语
- `JA` - 日语
- `KO` - 韩语
- `LT` - 立陶宛语
- `LV` - 拉脱维亚语
- `NB` - 挪威博克马尔语
- `NL` - 荷兰语
- `PL` - 波兰语
- `PT` - 葡萄牙语
- `RO` - 罗马尼亚语
- `RU` - 俄语
- `SK` - 斯洛伐克语
- `SL` - 斯洛文尼亚语
- `SV` - 瑞典语
- `TH` - 泰语
- `TR` - 土耳其语
- `UK` - 乌克兰语
- `VI` - 越南语
- `ZH` - 汉语
最新的语言支持列表请参考[支持的语言 - DeepL 文档](https://developers.deepl.com/docs/getting-started/supported-languages#translation-source-languages)。
### `/debug`(仅在 `DEBUG_MODE=true` 时可用)
**请求方法**:`POST`
用于验证请求格式和排查问题。
### 错误代码
| 代码 | 说明 |
|------|------|
| 200 | 翻译成功 |
| 400 | 请求参数错误 |
| 429 | 请求频率过高 |
| 500 | 服务器内部错误 |
| 503 | 服务暂时不可用 |
## 配置说明
### 环境变量
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `DEBUG_MODE` | 调试模式开关 | `false` |
| `PROXY_URLS` | 代理端点列表,逗号分隔 | 无 |
### 性能配置
可在 `src/lib/config.ts` 中调整:
```typescript
// 请求超时时间
export const REQUEST_TIMEOUT = 10000; // 10秒
// 重试配置
export const DEFAULT_RETRY_CONFIG = {
maxRetries: 3, // 最大重试次数
initialDelay: 1000, // 初始延迟
backoffFactor: 2, // 退避因子
};
// 限流配置
export const RATE_LIMIT_CONFIG = {
PROXY_TOKENS_PER_SECOND: 8, // 每代理每秒令牌数
PROXY_MAX_TOKENS: 16, // 代理最大令牌数
BASE_TOKENS_PER_MINUTE: 480, // 基础每分钟令牌数
};
// 负载限制
export const PAYLOAD_LIMITS = {
MAX_TEXT_LENGTH: 5000, // 最大文本长度
MAX_REQUEST_SIZE: 32768, // 最大请求大小
};
```
## 开发
| 命令 | 说明 |
| --- | --- |
| `npm run dev` | 使用 Wrangler 启动本地开发环境 |
| `npm run deploy` | 部署到 Cloudflare Workers |
| `npm run cf-typegen` | 生成 Cloudflare Workers 类型定义 |
| `npm run lint` | 执行 TypeScript 类型检查 |
| `npm test` | 运行完整测试套件 |
## 测试
```bash
# 运行所有测试
npm test
# 运行单元测试
npm run test:unit
# 运行集成测试
npm run test:integration
# 运行性能测试
npm run test:performance
# 生成覆盖率报告
npm run test:coverage
```
## 故障排除
### 常见问题
#### 1. HTTP 429 错误仍然频繁出现
- 检查代理端点配置是否正确
- 增加代理端点数量
- 调整限流配置
#### 2. 翻译结果不准确
- 确认源语言检测正确
- 检查文本编码是否正确
- 验证语言代码格式
#### 3. 部署失败
- 检查 Cloudflare 账户配置
- 验证 KV 命名空间是否创建
- 确认 wrangler.jsonc 配置正确
### 调试模式
启用调试模式获取详细信息:
```jsonc
{
"vars": {
"DEBUG_MODE": "true"
}
}
```
然后使用调试端点:
```bash
curl -X POST https://your-domain.workers.dev/debug \
-H "Content-Type: application/json" \
-d '{"text": "test", "source_lang": "EN", "target_lang": "ZH"}'
```
## 项目信息
### 致谢
- [OwO-Network/DeepLX](https://github.com/OwO-Network/DeepLX) - 原始实现,基于 Go 编程语言
- [Cloudflare Workers](https://workers.cloudflare.com/) - 托管平台
- [Hono](https://hono.dev/) - 快速 Web 框架
- [XDPL](https://github.com/xixu-me/XDPL) - 代理端点解决方案
### 参与项目
我们欢迎各种形式的贡献!请查看[贡献指南](CONTRIBUTING.md)了解如何参与存储库开发。
1. **报告问题**: 使用 [issue 模板](https://github.com/xixu-me/DeepLX/issues/new/choose)报告 bug 或提出功能请求
2. **提交代码**: fork 存储库,创建功能分支,提交 pull request
3. **改进文档**: 修正错误、添加示例、完善说明
4. **测试反馈**: 在不同环境下测试并提供反馈
仓库协作细节请参考 [CONTRIBUTING.md](./CONTRIBUTING.md)。
### Star 历史