文本翻译
翻译、批量翻译、语言检测、引擎与语言对、术语润色、历史记录管理与平台统计。
3.1 引擎与支持语言
引擎路由规则:请求指定 ALIBABA_CLOUD 走阿里云 TranslateGeneral;
指定 QWEN 走通义千问;指定其他值或引擎故障时自动降级为内置 Mock 演示引擎(返回演示译文,点数自动退回)。
默认引擎为 ALIBABA_CLOUD(文本翻译)/ QWEN(文档翻译)。
源语言额外支持 auto(自动检测,要求目标语言为上述 10 种之一)。
语言对校验规则:双方均须在支持列表内且不相等;源语言为 auto 时只校验目标语言。
3.2 接口总览(前缀 /api/translation)
3.3 翻译核心接口详情
/api/translation/translate
单条文本翻译。完整流程:缓存查询 → 扣点 → RAG 增强 → 引擎翻译 → 写缓存存档。
| 字段 | 类型 | 必填 | 默认值 | 校验 / 说明 |
|---|---|---|---|---|
sourceText | String | 必填 | — | 非空,长度 ≤ 10000 字符 |
sourceLanguage | String | 必填 | — | 长度 2–10;支持 auto 或语言代码 |
targetLanguage | String | 必填 | — | 长度 2–10;语言代码 |
translationType | String | 可选 | TEXT | 翻译类型(STANDARD / PROFESSIONAL / FAST / ACCURATE / TEXT) |
translationEngine | String | 可选 | ALIBABA_CLOUD | QWEN 或 ALIBABA_CLOUD;其他值降级 Mock |
useTerminology | Boolean | 可选 | true | 是否启用术语库增强 |
useRag | Boolean | 可选 | true | 是否启用 RAG 检索增强(术语 + 历史翻译 + Embedding 重排) |
ragTopK | Integer | 可选 | 5 | RAG 检索条数 |
domain | String | 可选 | — | 领域标签,影响 RAG 检索范围 |
needQualityAssessment | Boolean | 可选 | false | 是否同步返回质量评分 |
priority | Integer | 可选 | 1 | 任务优先级 |
userId | Long | 忽略 | — | 服务端强制以登录用户上下文覆盖,客户端传值无效 |
clientInfo | Map | 可选 | — | 客户端环境信息(自由键值对) |
requestSource | String | 可选 | — | 请求来源标识 |
| 字段 | 类型 | 说明 |
|---|---|---|
translationId | Long | 翻译记录 ID |
sourceText / translatedText | String | 原文 / 译文 |
sourceLanguage / targetLanguage | String | 语言对(auto 请求时 sourceLanguage 为检出语言) |
detectedLanguage | String | 自动检测出的源语言代码 |
translationType / translationEngine | String | 实际使用的类型与引擎(含 Mock 降级回显) |
processingTime | Long | 处理耗时(毫秒) |
characterCount | Integer | 计费字符数 |
usedTerminology | Boolean | 是否命中术语库 |
terminologyCount | Integer | 命中术语条数 |
qualityScore | Double | 质量评分(needQualityAssessment=true 时返回) |
confidence | Double | 置信度 |
alternatives | String[] | 候选译文 |
suggestions | String[] | 改进建议 |
status | String | 状态 |
errorMessage | String | 错误信息(失败时) |
usedPoints | Long | 本次消耗点数(缓存命中为 0) |
pointsBalance | Long | 扣减后余额 |
createdAt | DateTime | 创建时间(ISO-8601) |
usedPoints = max(1, ceil(字符数 / 1000)) // text-chars-per-point = 1000 // 缓存命中:不扣点(usedPoints = 0) // Mock 引擎:返回后自动全额退回 // 点数不足且会员额度不足:HTTP 402 INSUFFICIENT_POINTS
{
"sourceText": "人工智能正在改变世界",
"sourceLanguage": "zh",
"targetLanguage": "en",
"translationEngine": "QWEN",
"useTerminology": true,
"domain": "TECHNOLOGY"
}
/api/translation/batch-translate
批量文本翻译。请求体为 TranslationRequest 数组,逐条独立计费,响应为结果数组(顺序与请求一致)。userId 同样被服务端上下文强制覆盖。
// 请求体:数组 [ { "sourceText": "第一句", "sourceLanguage": "zh", "targetLanguage": "en" }, { "sourceText": "第二句", "sourceLanguage": "zh", "targetLanguage": "ja" } ] // 响应 data:TranslationResponse 数组,顺序对应 [ { "translationId": 101, "translatedText": "Sentence one", ... }, { "translationId": 102, "translatedText": "第二文", ... } ]
/api/translation/detect-language
检测文本语言。注意:请求体为纯文本字符串(JSON String),不是对象。
"Hello, world!"
非空;长度 ≤ 1000 字符(超出返回 400 VALIDATION_ERROR)。
{
"language": "en",
"languageName": "English",
"confidence": 0.98,
"success": true,
"processingTime": 120,
"errorMessage": null
}
/api/translation/polish
对既有机器翻译结果做二次润色:按术语库强制对齐术语译法,并按风格要求改写。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
sourceText | String | 必填 | 源文本 |
mtText | String | 必填 | 待润色的机器翻译结果 |
sourceLanguage / targetLanguage | String | 必填 | 语言对 |
category | String | 可选 | 术语分类过滤 |
domain | String | 可选 | 领域过滤 |
style | String | 可选 | 风格要求(如 formal / casual) |
userId | Long | 可选 | 默认取当前登录用户 |
{
"polishedText": "润色后的译文",
"termHits": [ { "sourceTerm": "AI", "targetTerm": "人工智能", ... } ],
"appliedTermsCount": 2,
"qualityScore": 92.5,
"errorMessage": null
}
3.4 元数据、历史与统计
/api/translation/supported-languages
返回支持语言列表。
[
{ "languageCode": "zh", "languageName": "中文", "nativeName": "中文", "isActive": true, "sortOrder": 1 },
{ "languageCode": "en", "languageName": "English", "nativeName": "English", "isActive": true, "sortOrder": 2 }
// ... 共 10 种
]
/api/translation/engines
返回可用引擎代码列表。
["QWEN", "ALIBABA_CLOUD"]
/api/translation/check-language-pair
校验某语言对是否受支持。
| 参数 | 必填 | 说明 |
|---|---|---|
sourceLanguage | 必填 | 源语言(可为 auto) |
targetLanguage | 必填 | 目标语言 |
{ "sourceLanguage": "auto", "targetLanguage": "zh", "supported": true }
/api/translation/health
翻译服务健康检查(免登录白名单外接口,仍需 Token;系统级探活请用 /actuator/health)。
{ "timestamp": 1725600000000, "service": "Translation Service", "version": "1.0.0" }
/api/translation/history
分页查询当前登录用户的翻译历史,支持多维筛选。响应 data 为 TranslationRecord 实体数组。
| 参数 | 必填 | 说明 |
|---|---|---|
keyword | 可选 | 源文本关键词(模糊) |
targetKeyword | 可选 | 译文关键词(模糊) |
sourceLang / targetLang | 可选 | 语言代码过滤 |
engine | 可选 | 引擎过滤 |
startTime / endTime | 可选 | 时间范围,ISO-8601 格式:2026-01-01T00:00:00 |
page | 可选 | 默认 0(0 起始) |
size | 可选 | 仅允许 10 / 20 / 50,其余值强制回落 20 |
{
"data": [ {
"id": 1001, "userId": 1,
"sourceLanguage": "zh", "targetLanguage": "en",
"sourceText": "你好", "translatedText": "Hello",
"translationType": "TEXT", "translationEngine": "QWEN",
"qualityScore": 95, "processingTime": 800, "characterCount": 2,
"useTerminology": true, "status": "SUCCESS",
"errorMessage": null, "createdAt": "2026-09-01T10:30:00", "updatedAt": "..."
} ],
"page": 0, "size": 20, "totalPages": 5, "totalElements": 96
}
/api/translation/history/{id}
删除单条翻译记录(校验归属当前用户)。
true
/api/translation/history
清空当前登录用户的全部翻译历史。
37 // 实际删除的记录条数(未登录返回 0)
/api/translation/platform-stats
首页平台统计。免认证白名单接口。
{
"totalTranslations": 12580, // 累计翻译次数
"totalDocuments": 326, // 累计文档数
"totalTerminologies": 1420, // 术语总条数
"activeUsers": 89, // 活跃用户数
"recentTranslations": [ ... ] // 最近翻译列表
}
3.5 调用示例
curl -X POST http://localhost:8090/api/translation/translate \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "sourceText": "人工智能正在改变世界", "sourceLanguage": "zh", "targetLanguage": "en", "translationEngine": "QWEN" }' # 语言检测(请求体是纯字符串) curl -X POST http://localhost:8090/api/translation/detect-language \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '"Hello, world!"' # 历史查询 curl "http://localhost:8090/api/translation/history?page=0&size=10&sourceLang=zh&targetLang=en" \ -H "Authorization: Bearer $TOKEN"
async function translate(token, text, target = 'en') { const resp = await fetch('/api/translation/translate', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ sourceText: text, sourceLanguage: 'auto', targetLanguage: target }) }).then(r => r.json()); if (!resp.success) { if (resp.error === 'INSUFFICIENT_POINTS') { throw new Error('点数不足,请开通会员或充值'); // HTTP 402 } throw new Error(resp.message); } return resp.data; // TranslationResponse }