第 03 章

文本翻译

翻译、批量翻译、语言检测、引擎与语言对、术语润色、历史记录管理与平台统计。

3.1 引擎与支持语言

可用翻译引擎(固定 2 个)
QWEN — 通义千问大模型翻译 ALIBABA_CLOUD — 阿里云机器翻译

引擎路由规则:请求指定 ALIBABA_CLOUD 走阿里云 TranslateGeneral; 指定 QWEN 走通义千问;指定其他值或引擎故障时自动降级为内置 Mock 演示引擎(返回演示译文,点数自动退回)。 默认引擎为 ALIBABA_CLOUD(文本翻译)/ QWEN(文档翻译)。

支持语言(固定 10 种)
zh 中文 en English ja 日本語 ko 한국어 fr Français de Deutsch es Español ru Русский ar العربية pt Português

源语言额外支持 auto(自动检测,要求目标语言为上述 10 种之一)。 语言对校验规则:双方均须在支持列表内且不相等;源语言为 auto 时只校验目标语言。

3.2 接口总览(前缀 /api/translation)

POST/api/translation/translate单条文本翻译(含计费)
POST/api/translation/batch-translate批量文本翻译
POST/api/translation/detect-language语言检测
POST/api/translation/polishMT 后编辑润色(术语对齐 + 风格改写)
GET/api/translation/supported-languages支持语言列表
GET/api/translation/engines可用引擎列表
GET/api/translation/check-language-pair语言对支持校验
GET/api/translation/health翻译服务健康检查
GET/api/translation/history翻译历史分页查询
DELETE/api/translation/history/{id}删除单条历史
DELETE/api/translation/history清空全部历史
GET/api/translation/platform-stats平台统计(免登录)

3.3 翻译核心接口详情

POST

/api/translation/translate

单条文本翻译。完整流程:缓存查询 → 扣点 → RAG 增强 → 引擎翻译 → 写缓存存档。

请求体(TranslationRequest)
字段类型必填默认值校验 / 说明
sourceTextString必填—非空,长度 ≤ 10000 字符
sourceLanguageString必填—长度 2–10;支持 auto 或语言代码
targetLanguageString必填—长度 2–10;语言代码
translationTypeString可选TEXT翻译类型(STANDARD / PROFESSIONAL / FAST / ACCURATE / TEXT)
translationEngineString可选ALIBABA_CLOUDQWEN 或 ALIBABA_CLOUD;其他值降级 Mock
useTerminologyBoolean可选true是否启用术语库增强
useRagBoolean可选true是否启用 RAG 检索增强(术语 + 历史翻译 + Embedding 重排)
ragTopKInteger可选5RAG 检索条数
domainString可选—领域标签,影响 RAG 检索范围
needQualityAssessmentBoolean可选false是否同步返回质量评分
priorityInteger可选1任务优先级
userIdLong忽略—服务端强制以登录用户上下文覆盖,客户端传值无效
clientInfoMap可选—客户端环境信息(自由键值对)
requestSourceString可选—请求来源标识
响应 data(TranslationResponse)
字段类型说明
translationIdLong翻译记录 ID
sourceText / translatedTextString原文 / 译文
sourceLanguage / targetLanguageString语言对(auto 请求时 sourceLanguage 为检出语言)
detectedLanguageString自动检测出的源语言代码
translationType / translationEngineString实际使用的类型与引擎(含 Mock 降级回显)
processingTimeLong处理耗时(毫秒)
characterCountInteger计费字符数
usedTerminologyBoolean是否命中术语库
terminologyCountInteger命中术语条数
qualityScoreDouble质量评分(needQualityAssessment=true 时返回)
confidenceDouble置信度
alternativesString[]候选译文
suggestionsString[]改进建议
statusString状态
errorMessageString错误信息(失败时)
usedPointsLong本次消耗点数(缓存命中为 0)
pointsBalanceLong扣减后余额
createdAtDateTime创建时间(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"
}
POST

/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": "第二文", ... } ]
POST

/api/translation/detect-language

检测文本语言。注意:请求体为纯文本字符串(JSON String),不是对象。

请求体
"Hello, world!"
校验

非空;长度 ≤ 1000 字符(超出返回 400 VALIDATION_ERROR)。

响应 data(LanguageDetectionResponse)
{
  "language": "en",
  "languageName": "English",
  "confidence": 0.98,
  "success": true,
  "processingTime": 120,
  "errorMessage": null
}
POST

/api/translation/polish

对既有机器翻译结果做二次润色:按术语库强制对齐术语译法,并按风格要求改写。

请求体(PolishRequest)
字段类型必填说明
sourceTextString必填源文本
mtTextString必填待润色的机器翻译结果
sourceLanguage / targetLanguageString必填语言对
categoryString可选术语分类过滤
domainString可选领域过滤
styleString可选风格要求(如 formal / casual)
userIdLong可选默认取当前登录用户
响应 data(PolishResponse)
{
  "polishedText": "润色后的译文",
  "termHits": [ { "sourceTerm": "AI", "targetTerm": "人工智能", ... } ],
  "appliedTermsCount": 2,
  "qualityScore": 92.5,
  "errorMessage": null
}

3.4 元数据、历史与统计

GET

/api/translation/supported-languages

返回支持语言列表。

响应 data(SupportedLanguageResponse[])
[
  { "languageCode": "zh", "languageName": "中文", "nativeName": "中文", "isActive": true, "sortOrder": 1 },
  { "languageCode": "en", "languageName": "English", "nativeName": "English", "isActive": true, "sortOrder": 2 }
  // ... 共 10 种
]
GET

/api/translation/engines

返回可用引擎代码列表。

["QWEN", "ALIBABA_CLOUD"]
GET

/api/translation/check-language-pair

校验某语言对是否受支持。

Query 参数
参数必填说明
sourceLanguage必填源语言(可为 auto)
targetLanguage必填目标语言
响应 data(LanguagePairSupportResponse)
{ "sourceLanguage": "auto", "targetLanguage": "zh", "supported": true }
GET

/api/translation/health

翻译服务健康检查(免登录白名单外接口,仍需 Token;系统级探活请用 /actuator/health)。

响应 data(HealthResponse)
{ "timestamp": 1725600000000, "service": "Translation Service", "version": "1.0.0" }
GET

/api/translation/history

分页查询当前登录用户的翻译历史,支持多维筛选。响应 data 为 TranslationRecord 实体数组。

Query 参数
参数必填说明
keyword可选源文本关键词(模糊)
targetKeyword可选译文关键词(模糊)
sourceLang / targetLang可选语言代码过滤
engine可选引擎过滤
startTime / endTime可选时间范围,ISO-8601 格式:2026-01-01T00:00:00
page可选默认 0(0 起始)
size可选仅允许 10 / 20 / 50,其余值强制回落 20
响应 data(PagedResponse<TranslationRecord>,关键字段)
{
  "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
}
DELETE

/api/translation/history/{id}

删除单条翻译记录(校验归属当前用户)。

响应 data
true
DELETE

/api/translation/history

清空当前登录用户的全部翻译历史。

响应 data
37    // 实际删除的记录条数(未登录返回 0)
GET

/api/translation/platform-stats

首页平台统计。免认证白名单接口。

响应 data(PlatformStatisticsResponse)
{
  "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
}