发布翻译任务
把一个已完成翻译的任务,把里面的字符串和译文发布到项目级 —— 写入 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 不冲突
使用时机
典型接入顺序:
POST /tasks/create→ 任务进入翻译流程- 收到
task.completed回调(或轮询 任务状态 到completed)→ 任务字符串已经翻译好,但还没进入项目级(SDK / 其它 API 还读不到) - 调本接口 → 触发 PUBLISH_TASK 工作流
- 收到
task.publish.completed回调(或轮询 发布状态 到completed)→ 字符串已经写入项目级,其它流程 / SDK 可读,此时再调/export/ini才能拿到本次发布后的数据
请求地址
POST {BASE_URL}/api/open/v1/tasks/publish鉴权 Header
和 创建翻译任务 完全一样。
请求参数(Body)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
task_id | string | 是 | 要发布的任务 ID;必须是同 App Key 创建的开放平台任务 |
callback_url | string | 否 | 本次发布的回调 URL 覆盖;留空沿用原 /tasks/create 的 callback_url |
callback_events | string[] | 否 | 订阅事件白名单: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_PUBLISH,job_type=PUBLISH_TASK) - 只是
publish_type当前固定为simple;若任务有发布冲突(某些字符串已被其它任务发布过),按后端默认策略(覆盖为最新)处理 - 需要显式冲突解决(选择保留哪一版)请通过前端 UI
幂等
本接口没有幂等键。同一任务多次调用会启动多次 PUBLISH_TASK 工作流,每次得到独立 job_id + trace_id。后续调用会把上一次的发布结果覆盖为最新。
建议在集成侧在收到上一轮 task.publish.completed 之后再发起下一轮,避免并发 PUBLISH_TASK 工作流。