你创建了一个任务组,拿到了一个 groupId,现在多个语言区域正在并行翻译。接下来,在整批任务尘埃落定之前,你需要反复回答同一个问题:这次提交此刻的整体进展如何?不是逐个语言区域去看,而是看汇总结果。多少已完成,多少产出了带警告的结果,多少失败了,多少仍在处理中。
这个端点返回的正是这些信息。一次轮询,就能在单个响应中拿到所有语言区域的状态。刚接触异步本地化?建议先阅读 异步本地化 API 概览。
本页内容
获取任务组#
获取一个任务组及其所有子任务的状态。
GET /jobs/localization/groups/:groupId在 X-API-Key 请求头中使用你的 API 密钥进行身份验证,也就是你在 创建该任务组 时使用的同一把密钥。groupId 是 202 响应中带有 ljg_ 前缀的 id。
响应#
这个响应是整次提交的一个快照:包含任务组自身的 status、四个计数,以及各个子任务及其各自状态。每次轮询时,你读取的都是这个对象。
{
"groupId": "ljg_A1b2C3d4E5f6G7h8",
"status": "processing",
"sourceLocale": "en",
"totalJobs": 3,
"completedJobs": 1,
"completedWithWarningsJobs": 0,
"failedJobs": 0,
"jobs": [
{ "id": "ljb_A1b2C3d4E5f6G7h8", "targetLocale": "de", "status": "completed", "warnings": [], "completedAt": "2026-03-16T10:30:04.000Z" },
{ "id": "ljb_B2c3D4e5F6g7H8i9", "targetLocale": "fr", "status": "processing", "warnings": [], "completedAt": null },
{ "id": "ljb_C3d4E5f6G7h8I9j0", "targetLocale": "ja", "status": "queued", "warnings": [], "completedAt": null }
],
"createdAt": "2026-03-16T10:30:00.000Z"
}终态任务的三个计数字段——completedJobs、completedWithWarningsJobs 和 failedJobs——相加后,就是已完成的语言区域数量。其余的 totalJobs 仍处于 queued 或 processing。在上面的快照中,3 个里有 1 个已完成,2 个仍在进行中,所以只看一次计数,你就能知道任务尚未结束,无需扫描 jobs 数组。当这个总和达到 totalJobs 时,任务组就进入了终态。
每个任务的 warnings 数组会标出非关键性的 pipeline 阶段失败,例如预编辑或回译步骤未能完成。数组非空意味着该任务依然产出了结果,但至少有一个可选阶段没有完成。实际翻译后的 outputData 则位于对应的 单个任务 上——当你准备查看某个已完成语言区域的内容时,再去获取它。
任务组状态#
任务组的 status 会将所有子任务汇总为一个状态值。你需要持续轮询,直到它进入终态。
| 任务组状态 | 含义 |
|---|---|
pending | 任务组已创建,但还没有任务开始 |
processing | 至少有一个任务正在进行中 |
completed | 所有任务均已成功完成 |
completed_with_warnings | 所有任务都已产出结果,但至少有一个任务中的一个或多个可选 pipeline 阶段失败 |
partial | 部分任务已完成,部分任务失败 |
failed | 所有任务均失败 |
completed、completed_with_warnings 和 partial 之间的区分,正是这个端点的价值所在:它能区分“所有语言区域都已交付”“所有语言区域都已交付,但部分带有警告”以及“部分语言区域已交付,部分未交付”——否则你就得逐个读取任务,才能拼出这三种结果。partial 不是错误;它是一个真实存在的状态,任务组会如实返回,好让你的代码据此分支处理。
轮询频率#
轮询间隔
对于大多数任务,每种语言的处理通常需要 2–8 秒。如果你选择轮询,而不是使用 webhook 或 WebSocket,那么以 2 秒为间隔是一个合理的起点。
轮询是跟踪任务组最简单的方式,对于短生命周期的批处理也完全够用。但它确实不是更强的方案,这点值得直说:无论是否有变化,每次轮询都要走一次完整的请求往返;而且你只能在下一次轮询时才知道某个语言区域已完成,而不是在它完成的那一刻立即得知。
如果你希望每个结果一就绪就立刻拿到,就别轮询——让系统主动通知你。平台会在每个语言区域完成时,将结果发送到你的 webhook URL;同时,任务组上的 WebSocket connection 会在每次状态变化时推送完整的状态快照,让你的 UI 无需主动询问也能实时更新。当 webhook 端点或持久连接的成本高于这项任务本身的价值时,适合使用轮询;当你的 UI 对延迟敏感时,则应选择推送。
单个语言区域失败时#
看到“同时翻译成多个语言区域”,一个务实的问题自然会先冒出来:如果其中一个语言区域失败了,其余的会怎样?答案就在响应里。
每个语言区域都是一个独立任务。如果德语成功而日语失败,德语翻译仍会正常完成并交付——失败不会让它回滚。失败的任务会在任务组中显示为 status: "failed",failedJobs 会增加,而任务组整体会汇总为 partial:
{
"groupId": "ljg_A1b2C3d4E5f6G7h8",
"status": "partial",
"sourceLocale": "en",
"totalJobs": 3,
"completedJobs": 2,
"completedWithWarningsJobs": 0,
"failedJobs": 1,
"jobs": [
{ "id": "ljb_A1b2C3d4E5f6G7h8", "targetLocale": "de", "status": "completed", "warnings": [], "completedAt": "2026-03-16T10:30:04.000Z" },
{ "id": "ljb_B2c3D4e5F6g7H8i9", "targetLocale": "fr", "status": "completed", "warnings": [], "completedAt": "2026-03-16T10:30:05.000Z" },
{ "id": "ljb_C3d4E5f6G7h8I9j0", "targetLocale": "ja", "status": "failed", "warnings": [], "completedAt": null }
],
"createdAt": "2026-03-16T10:30:00.000Z"
}两个语言区域已交付,一个没有,计数会直接告诉你这一点,无需逐项检查。要重试,请仅针对失败的语言区域 提交一个新请求,并使用新的幂等键。某个失败语言区域的完整错误描述——也就是 errorMessage——位于对应的 单个任务 上;任务组提供的是计数和结论。
部分失败是正常状态
partial 的含义就和计数显示的一样明确:部分语言区域已完成,部分失败。已完成的语言区域已经交付。无需回滚,也无需为成功的语言区域重复花费——你只需要重试失败的部分。
