|
文档
预约演示平台
平台MCPCLIAPI
工作流
指南更新日志

欢迎

  • 概览
  • 身份验证
  • 错误与状态码
  • Webhook 签名

本地化

  • 概览
  • 创建任务
  • 锁定不可翻译的键
  • 查看任务组状态
  • 获取单个作业
  • 列出作业
  • Webhook 结果投递
  • 实时进度(WebSocket)

流水线

  • 概览
  • 本地化前 AI 预编辑
  • 人工审核
  • AI 审校(后编辑)
  • 改写成更自然的文案
  • 回译检查
  • 配置 Pipeline
  • 查看流水线运行记录

预配

  • 概览
  • 创建预配作业
  • 来源类型
  • AI 会提取哪些内容
  • Webhook 投递
  • 实时进度(WebSocket)

同步

  • 本地化
  • Recognize

引擎管理

  • Engine Suggestions

创建本地化任务

创建一个本地化任务组:一次请求,就能把内容分发到你指定的所有目标语言区域。

如果你手上有一份字符串 payload 和一组语言区域列表,希望一次性完成全部翻译,而不用自己写分发逻辑,POST /jobs/localization 就能在单次请求中接收完整 payload 和最多 100 个目标语言区域,并立即返回 202 Accepted,附带一个组 ID,以及每个语言区域对应的一个任务。一次请求,覆盖所有语言区域——平台会自动创建任务,并分别独立处理。

text
POST /jobs/localization

本页介绍创建调用本身:包括参数、请求结构、202 响应,以及如何让这次调用能够安全重试。第一次接触异步本地化?建议先看 异步本地化 API 概览,先建立整体认知。任务组创建后,跟踪任务组 会告诉你每个语言区域状态分别代表什么。

身份验证

请在 X-API-Key 请求头中传入你的 API 密钥。密钥作用域为组织级,可访问该组织下的所有引擎。详情请参见 身份验证。

参数#

sourceLocale、targetLocales 和 data 为必填项,其余字段用于调整行为,或让调用在重复执行时更安全。

参数类型说明
sourceLocalestringBCP-47 源语言区域(例如 en)。
targetLocalesstring[]BCP-47 目标语言区域(例如 ["de", "fr", "ja"])。每次请求可传 1–100 个。每个语言区域都会创建一个任务。
dataobject待翻译的键值内容。支持任意深度的嵌套对象和数组。
contextstring(可选)这份翻译 payload 的整体上下文,例如产品界面、目标受众或用途。会应用到本次请求创建的每一个任务。
hintsobject(可选)按 key 提供的上下文,以面包屑字符串数组表示,用于消除简短或复用字符串的歧义。
callbackUrlstring(可选)此任务组的 HTTPS webhook URL。会覆盖组织默认值。不接受 HTTP。
idempotencyKeystring(可选)客户端生成的键。用相同的键发送两次相同请求时,返回的是现有任务组,而不是新建一个。按引擎划分作用域。
engineIdstring(可选)用于执行这些任务的本地化引擎。若省略,则回退到组织的默认引擎。
pipelineConfigobject(可选)按请求设置的 pipeline 覆盖项。未指定的阶段会继承引擎配置。
lockedKeysstring[](可选)值会被排除在翻译之外、并原样合并回 outputData 的 key 或 glob 模式。最多 100 个模式。参见 锁定不可翻译的键。

请求#

data 字段既支持扁平键值对,也支持包含对象和数组、可任意深度嵌套的结构。引擎会翻译其中每一个字符串值,保留非字符串值(数字、布尔值、null)不变,并按你传入的原始结构返回结果。所以你可以直接把应用当前存储的对象交给它——不用拍平,也不用改结构。

json
{
  "sourceLocale": "en",
  "targetLocales": ["de", "fr", "ja"],
  "data": {
    "lesson_title": "Introduction to Machine Learning",
    "lesson_summary": "This lesson covers the fundamentals of ML, including supervised and unsupervised learning."
  },
  "callbackUrl": "https://your-app.com/webhooks/translations",
  "idempotencyKey": "course_101-v3"
}

必须使用 HTTPS

callbackUrl 必须使用 HTTPS。HTTP URL 会被拒绝,并返回 400 错误。

这个嵌套 payload 同时包含可翻译文本,以及必须原样保留的值——id、course_101、difficulty。字符串会被翻译;其余内容会按原始类型保留。如果你还需要让某个 字符串 也不参与翻译(例如 slug、资源 URL 或枚举代码),就在 lockedKeys 中指定它,它就会原样合并回每个语言区域的输出结果。

响应(202 Accepted)#

调用会立即返回,不会等待翻译完成——它会先把组 ID 和各语言区域的任务 ID 返回给你,随后平台会在后台独立处理每个任务。

json
{
  "groupId": "ljg_A1b2C3d4E5f6G7h8",
  "status": "pending",
  "jobs": [
    { "id": "ljb_A1b2C3d4E5f6G7h8", "targetLocale": "de", "status": "queued" },
    { "id": "ljb_B2c3D4e5F6g7H8i9", "targetLocale": "fr", "status": "queued" },
    { "id": "ljb_C3d4E5f6G7h8I9j0", "targetLocale": "ja", "status": "queued" }
  ],
  "createdAt": "2026-03-16T10:30:00.000Z"
}
字段说明
groupId整个任务组的标识符,带有 ljg_ 前缀。请保存它——后续 跟踪 和查看实时进度都要靠它。
status任务组创建时的状态,通常为 pending。
jobs每个目标语言区域对应一条记录:id(带有 ljb_ 前缀)、targetLocale,以及该任务的 status。
createdAtISO 8601 时间戳。

传入三个语言区域,就会返回三个任务;每个任务都处于 queued 状态,随时可以开始执行。随着任务推进,每种状态具体代表什么——以及当某个语言区域失败、其他语言区域仍然成功交付时会发生什么——请参见 跟踪任务组。

示例#

下面分别展示 Node 和 Python 的同一请求。两者都只发送一次 POST,并直接从 202 中读取组 ID 和任务数量。

javascript
const response = await fetch("https://api.lingo.dev/jobs/localization", {
  method: "POST",
  headers: {
    "X-API-Key": process.env.LINGO_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    sourceLocale: "en",
    targetLocales: ["de", "fr", "ja"],
    data: {
      title: "Introduction to Machine Learning",
      steps: [
        { heading: "What is ML?", body: "Machine learning is a subset of AI." },
        { heading: "Supervised Learning", body: "Training with labeled data." },
      ],
    },
    callbackUrl: "https://your-app.com/webhooks/translations",
  }),
});

const { groupId, jobs } = await response.json();
// 202 Accepted – the call returns without waiting for translation.
console.log(groupId);     // "ljg_A1b2C3d4E5f6G7h8"
console.log(jobs.length); // 3 – one queued job per target locale

让调用可安全重试#

最适合触发这类请求的地方,往往是保存钩子或事件处理器——而这也正是发生重试或收到重复事件时最容易执行两次的代码。如果没有保护,两次调用就意味着两个任务组,同一份内容也会被重复排队翻译两次。

传入 idempotencyKey 后,这个风险就不存在了。用相同的键发送两次相同请求时,平台返回的是现有任务组,而不是重新创建一个——不会产生第二批任务。键按引擎划分作用域,因此同一个键如果用于不同引擎,对应的就是不同任务组。

选择一个有意义的键

一个好的键,应该把内容标识和版本组合起来:{contentId}-v{contentVersion}。同一份内容的同一版本,总会解析到同一个任务组,因此重试天然就是空操作。内容一旦变化,只要提升版本号,就会得到一个新的任务组。

javascript
const key = `${content.id}-v${content.version}`;

async function submit() {
  const response = await fetch("https://api.lingo.dev/jobs/localization", {
    method: "POST",
    headers: {
      "X-API-Key": process.env.LINGO_API_KEY,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      sourceLocale: "en",
      targetLocales: ["de", "fr", "ja", "ko", "pt-BR"],
      data: { title: content.title, steps: content.steps },
      callbackUrl: "https://your-app.com/webhooks/translations",
      idempotencyKey: key,
    }),
  });
  return (await response.json()).groupId;
}

const first = await submit();
const again = await submit(); // same key – duplicate submission
console.log(first === again); // true – same group returned, no second set of jobs

这一条 POST,就能把一份 payload 分发到所有语言区域;而且即使放在会自动重试的同一条代码路径里调用,也依然安全。请保存 groupId;后续做跟踪和查看实时进度时,你都要用到它。

后续步骤#

锁定不可翻译的键
通过 key 和 glob 模式,让 ID、slug、资源 URL 和枚举代码不参与翻译。
配置 pipeline
按请求覆盖 pipeline 各阶段,或设置每个任务都会继承的引擎级默认值。
跟踪任务组
查看任务组和各语言区域的状态,并处理某个语言区域失败而其余语言区域成功交付的情况。

这个页面对你有帮助吗?

Max PrilutskiyMax Prilutskiy·已更新 10 天前·3 分钟阅读