Skip to content

发布翻译任务

把一个已完成翻译的任务,把里面的字符串和译文发布到项目级 —— 写入 translation_strings_aggregated(项目级聚合字符串)和 tm_records_aggregated(翻译记忆索引)。等价前端任务页面的"发布"按钮。

关键特性

  • 异步:接口立刻返回 job_id + execution_id + trace_id;真实发布在后台 GCP Workflow 里跑
  • 成功 / 失败都回调task.publish.completed / task.publish.failed
  • 可轮询:无法接收回调的环境,用 job_id查询发布状态 轮询到终态
  • 进度事件回调:本接口没有子步骤事件,只有终态事件
  • trace_id 独立:每次发布是一次独立的调用 + 一串独立回调,和原 /tasks/create 的 trace 不冲突

使用时机

典型接入顺序:

  1. POST /tasks/create → 任务进入翻译流程
  2. 收到 task.completed 回调(或轮询 任务状态completed)→ 任务字符串已经翻译好,但还没进入项目级(SDK / 其它 API 还读不到)
  3. 调本接口 → 触发 PUBLISH_TASK 工作流
  4. 收到 task.publish.completed 回调(或轮询 发布状态completed)→ 字符串已经写入项目级,其它流程 / SDK 可读,此时再调 /export/ini 才能拿到本次发布后的数据

请求地址

POST {BASE_URL}/api/open/v1/tasks/publish

鉴权 Header

创建翻译任务 完全一样。

请求参数(Body)

参数类型必填说明
task_idstring要发布的任务 ID;必须是同 App Key 创建的开放平台任务
callback_urlstring本次发布的回调 URL 覆盖;留空沿用原 /tasks/createcallback_url
callback_eventsstring[]订阅事件白名单:task.publish.completed / task.publish.failed;留空 → 两个都发

源语言自动从任务读取(task.source_languages[0]),不需要传。

目标语言自动取任务自身的 target_languages 全量,不需要传。子集选择 / 冲突解决都由任务本身决定,本接口只负责把任务里的字符串发到项目级。

响应(同步)

成功(HTTP 200):

json
{
  "success": true,
  "code": 0,
  "msg": "ok",
  "trace_id": "b4e82a1c...",
  "data": {
    "task_id": "68a12cb7e1f9a88b4ea23c77",
    "job_id": "publish_open_...",
    "accepted_at": "2026-04-23T09:15:22.117Z",
    "source_language": "zh-cn",
    "target_languages": ["en", "ja"]
  }
}
  • job_id:PUBLISH_TASK 工作流任务标识
  • accepted_at:服务器接受请求的 UTC 时间
  • source_language:本次发布使用的源语言(= 任务的源语言)
  • target_languages:本次发布涉及的目标语言(= 任务的 target_languages 全量)

回调

task.publish.completed(成功)

工作流终态时发出。detail 里带后端返回的统计信息(处理的行数、成功 / 失败计数等)。

json
{
  "event": "task.publish.completed",
  "task_id": "68a12cb7e1f9a88b4ea23c77",
  "project_id": "...",
  "trace_id": "b4e82a1c...",
  "delivery_id": "...",
  "timestamp": "2026-04-23T09:16:05.442Z",
  "status": "SUCCEEDED",
  "detail": {
    "message": "Publish task workflow completed successfully"
  },
  "error": null
}

task.publish.failed(失败)

json
{
  "event": "task.publish.failed",
  "task_id": "68a12cb7e1f9a88b4ea23c77",
  "trace_id": "b4e82a1c...",
  "status": "FAILED",
  "detail": {
    "error": "…后端返回的错误明细…"
  },
  "error": "…人类可读的原因…"
}

签名、重试(4 次内联:立即 / 16s / 32s / 64s)、SSRF 守卫都与 创建翻译任务 的回调完全一致。

错误码

code说明
400参数错误(task_id 缺失 / callback_url 非 http(s) / callback_events 不在白名单)
401签名校验失败 / 时间戳过期
403任务不属于该 App Key
404任务不存在
422任务未配置源语言 / 任务没有 target_languages
500系统错误(同步阶段)

异步阶段的失败(工作流触发失败 / 工作流执行失败)不会改变同步响应的 success: true,只会通过 task.publish.failed 回调通知。

示例

bash
APP_KEY="5685414646a54423c891d87194d87f3f"
APP_SECRET="<你的 App Secret>"
TASK_ID="68a12cb7e1f9a88b4ea23c77"
BASE_URL="https://api.loxily.com"

TIMESTAMP=$(date +%s)
BODY='{"task_id":"'"${TASK_ID}"'"}'
SIGN=$(printf '%s' "${TIMESTAMP}${BODY}${APP_SECRET}" | md5)

curl -s -X POST "${BASE_URL}/api/open/v1/tasks/publish" \
  -H "Content-Type: application/json" \
  -H "X-Loxily-AppKey: ${APP_KEY}" \
  -H "X-Loxily-Timestamp: ${TIMESTAMP}" \
  -H "X-Loxily-Sign: ${SIGN}" \
  --data "${BODY}"

指定独立 callback_url

bash
BODY='{
  "task_id": "68a12cb7e1f9a88b4ea23c77",
  "callback_url": "https://my-hooks.example.com/loxily/publish",
  "callback_events": ["task.publish.completed", "task.publish.failed"]
}'

前端联动

  • 前端任务页面的"发布"按钮和本接口触发的是同一条 GCP Workflow(WORKFLOW_PUBLISHjob_type=PUBLISH_TASK
  • 只是 publish_type 当前固定为 simple;若任务有发布冲突(某些字符串已被其它任务发布过),按后端默认策略(覆盖为最新)处理
  • 需要显式冲突解决(选择保留哪一版)请通过前端 UI

幂等

本接口没有幂等键。同一任务多次调用会启动多次 PUBLISH_TASK 工作流,每次得到独立 job_id + trace_id。后续调用会把上一次的发布结果覆盖为最新。

建议在集成侧在收到上一轮 task.publish.completed 之后再发起下一轮,避免并发 PUBLISH_TASK 工作流。