Payload CMS

更新时间:3周前 · 预计阅读 3 分钟

将你的 Payload CMS 连接到本地化引擎后,选好要覆盖的 collections 和 globals,Lingo.dev 就会把其中已本地化的字段翻译到目标语言区域,并按对应语言区域写回 Payload。

适用于已启用本地化并使用 Lexical 富文本编辑器的 Payload 3 项目。暂不支持较旧的 Slate 编辑器。已本地化的 text、textarea 和 richText 字段会被翻译,文档中的其他内容都会保持不变。

Payload CMS 包含在 Enterprise 方案中。如果 Connect 页面显示 Payload CMS is not on your plan,请联系我们,我们会帮您处理。

开始前请先准备#

你需要准备这三样:

  • 已配置本地化的 Payload 3。 请确保源语言区域和目标语言区域与 Payload 配置中的语言区域保持一致。
  • 一个带 API 密钥的服务用户。 在你的认证 collection(通常是 useAPIKey: true)上启用 users,为 Lingo.dev 创建一个用户,并在 Payload 管理后台为其生成 API 密钥。该用户需要对你要翻译的每个 collection 和 global 拥有读取和更新权限。
  • 一个本地化引擎。 它的术语表、品牌语气和规则会共同塑造翻译结果。

语言区域代码必须与 Payload 配置完全一致

你在 Lingo.dev 中选择的语言区域,必须与 localization.locales 下的代码完全一致。如果 Payload 里有 en 和 de,请选择 English 和 German,而不是 English (United States):en-US 和 en 是不同的语言区域。请使用你的 Payload defaultLocale 作为源语言区域,因为插件会监听这个语言区域中的变更。

连接你的 Payload 实例#

1

打开集成

前往 Studio -> All integrations,然后在 Payload CMS 卡片上点击 Connect。

2

输入实例信息

字段填写内容
地址你的实例根 URL,例如 https://cms.example.com。仅支持 HTTPS
认证集合服务 API 密钥所属的 collection,通常是 users
API 密钥服务用户的 API 密钥
自定义请求头可选。每次请求都会发送到您的实例。每个请求头都点击一次 Add header,或者粘贴一行 Name: value 来填充一行。

点击 Verify instance。Lingo.dev 会先用该密钥验证您的实例,再继续下一步。

3

选择要翻译的内容

设置作用
名称为这个连接命名,例如 Production 或 Staging,方便区分不同实例
Collections 和 Globals点击要翻译的项。如果某一项显示服务用户无法读取和更新,该项会显示删除线,并且在获得访问权限前无法选择
引擎这些翻译所使用的本地化引擎,包括其术语表、规则和品牌语调
源语言区域设置编辑人员撰写内容所用的 locale。请使用你的 Payload defaultLocale
目标语言区域设置要翻译到的目标语言区域
模式Publish 只翻译已发布的更改,并直接发布译文。Draft 也会翻译草稿保存的内容,并将译文写入为草稿。请参阅下方的 Draft 与 Published 说明

点击 Connect。

4

安装插件

最后一步会显示您的 Webhook URL。请立即复制,它只会显示一次。 将其作为 LINGO_WEBHOOK_URL 存储到您的 Payload 环境中,然后安装插件并将其添加到配置中:

bash
pnpm add @lingo.dev/payloadcms
ts
import { buildConfig } from "payload";
import { lingo } from "@lingo.dev/payloadcms";

export default buildConfig({
  // ...your collections, globals, and localization config
  plugins: [
    lingo({
      webhookUrl: process.env.LINGO_WEBHOOK_URL,
    }),
  ],
});

点击 Done,然后重新部署 Payload。此后,源语言区域设置中每次已发布的更改都会发送到 Lingo.dev 进行翻译。

插件会做什么

它会新增一个 GET /api/lingo/schema 端点,用来告诉 Lingo.dev 哪些字段是已本地化的文本;同时还会添加一个 hook,在文档或 global 发生变化时通知 Lingo.dev。范围、语言区域和引擎都在控制台中管理,因此无需重新部署也能随时调整。省略 webhookUrl 则会跳过这个 hook,此后每次翻译都需要从控制台手动发起。

选择翻译范围#

连接页面有四个标签页:Collections、Globals、Workflow runs 和 Settings。

范围会按 collection 和 global 分别设置。Collections 和 Globals 标签页会列出您的实例提供的全部内容,每项占一行,并显示上次同步时间。每行都有一个 Sync 开关:打开后,该 collection 中的所有文档或该 global 都会从此纳入范围。切换开关后,更改会立即保存,并在下一次运行时生效,无需重新部署。表头中的开关可一次性为列表中的所有项打开或关闭 Sync。

标记为 no read + update 的行会被锁定:服务用户无法读取和更新它,因此无法翻译。标记为 not localized yet 的行表示 Sync 处于关闭状态。

语言区域设置、引擎和模式可在 Settings 标签页中更改。

在文档内部,是否会被翻译取决于你的 Payload 字段配置:

字段是否翻译
标记为 text 的 textarea、richText 和 localized: true 字段是
位于已本地化 group、array、blocks 或 tabs 内的相同字段类型是
嵌入在富文本中的 blocks 和 inline blocks是的,它们的文本字段会按相同规则翻译
select、radio、checkbox、number、date、relationship、upload、json、code、email、point否
未本地化,且父级也未本地化的字段否
id、blockType、blockName否

富文本会以 Lexical 树的形式进行翻译。格式、链接、上传内容和区块结构都会完整保留,只替换其中的文本。即使一句话被加粗文字或链接拆开,也会按一个完整句子来翻译。

如果要把某个字段纳入范围,请在 Payload 中将其标记为 localized: true,然后重新部署。下一次运行时就会自动识别。

同步与重新翻译#

自动运行。 在插件中设置 webhookUrl 后,只要在源语言区域设置中保存文档或 global,Lingo.dev 就会收到通知。短时间内的多次保存会去抖合并为一次运行。其他语言区域设置中的保存、草稿保存(除非连接处于 Draft 模式),以及不在范围内的内容都会被忽略。

手动运行。 两个按钮,对应两种不同的任务:

按钮作用适用场景
Sync只翻译自上次运行以来发生变化的内容用于连接后补齐已有内容,或在失败后重试
Retranslate从头开始重新翻译范围内的所有内容适用于你修改引擎的术语表、品牌语气或规则之后

这两个按钮都位于页面顶部,作用于所有已开启 Sync 的内容。从页面顶部执行 Retranslate 时,系统会先要求您确认。若只想运行部分 collections 或 globals,可勾选对应行:随后会出现 Queue sync (N) 和 Queue retranslation (N),且只作用于这些行。只有当某一行的 Sync 开关已打开时,才能勾选该行。

连接建立时不会自动翻译任何内容。若要翻译已有内容,请点击页面顶部的 Sync。之后新增目标语言区域设置时也是一样:下一次 Sync 会补齐翻译。

每个连接同一时间只能有一个任务在运行。后续请求会进入队列,并按顺序开始。

Retranslate 会覆盖手动修改

Retranslate 会重新生成其范围内的每个已翻译字段,包括团队已在 Payload 中手动修改过的译文。Sync 只会重新生成源文本自上次运行以来发生变化的字段,因此其他手动修改的内容会被保留。

查看 Run#

Workflow runs 标签页会列出每一次运行:开始时间、触发方式(Webhook 或 Manual,然后是 Sync 或 Retranslate)、覆盖的语言区域设置、耗时以及状态。排队中或运行中的任务会显示 Stop 按钮。展开某一行可按语言区域设置查看结果。

状态含义
已排队等待排在它前面的任务先完成
运行中进行中
已完成所有译文都已写回
已是最新自上次运行以来,范围内没有任何内容发生变化。这不是失败
失败该任务已停止,原因会显示在该任务所在行中
已取消由你团队中的成员手动停止

运行失败时,已写入的内容会保留。错误信息会列出尚未写入的文档,下一次 Sync 会再次尝试写入这些文档。如果编辑者在运行过程中保存了某个文档,该文档会被跳过,并在下一次运行时补上。

译文会写到哪里#

每条翻译都会根据 Payload 自身的本地化模型,写入同一文档或 global 的目标语言区域版本中。只有已翻译的字段会被写入,其他所有字段都会保持不变。回写会以服务用户身份执行,且不会触发新一轮运行。

现有译文会被保留。文档首次同步时,目标语言区域中已有的内容会原样保留,只翻译缺失的字段。仍保留 Payload 默认值的字段会被视为缺失。需要替换现有译文时,请使用 Retranslate。

草稿与已发布#

在 Publish 模式下,只有已发布的更改才会触发运行,且译文会在写入后立即发布。Payload 会发布整个文档,因此该文档中所有尚未发布的草稿修改也会随译文一并上线。

在 Draft 模式下,草稿保存也会触发运行。Lingo.dev 会读取源内容的最新草稿,并将每个译文写为草稿。在有人于 Payload 中发布译文之前,读者不会看到任何变化。评估翻译质量或译文需要经过审核时,可使用此模式。

您之后也可以在 Settings 标签页中更改模式。

管理连接#

设置#

Settings 标签页会显示该连接读取的是哪个实例、哪些 collections 和 globals 已开启 Sync,以及连接当前是 Working 还是 Cannot be reached。您可以在这里更改名称、源语言区域设置、目标语言区域设置、引擎和模式。每次更改都会保留 webhook URL,因此无需重新部署。

地址和 API 密钥会在创建连接时设定,之后无法更改。若要让 Lingo.dev 指向其他地址或密钥,请先断开连接,再重新连接。

断开连接#

Settings 标签页底部的 Disconnect 会停止 Lingo.dev 对该实例的读取和写入。这会移除该连接、其运行历史以及已翻译内容的记录。已写入 Payload 的译文会保留。之后请从配置中移除 LINGO_WEBHOOK_URL 或插件。

重新连接会生成新的 webhook URL

新连接会生成新的 webhook URL,因此在自动运行恢复之前,请先更新 LINGO_WEBHOOK_URL 并重新部署。第一次同步会重新读取范围内的每个文档,保留 Payload 中已有的译文,并补齐缺失内容。

限制#

限制项说明
Payload 版本已配置本地化的 Payload 3
字段类型text、textarea 和 richText(仅限 Lexical)标记为 localized
范围整个 collection 和 global,不支持按字段选择
连接每个组织可有多个,每个 Payload 实例一个
并发运行每个连接一个
地址仅支持 HTTPS

故障排查#

连接失败并显示 "Payload rejected the API key"。 请检查密钥、认证 collection 的 slug,以及该 collection 是否已启用 useAPIKey。

某个 collection 或 global 显示 "no read + update"。 请在该 collection 的访问配置中为服务用户授予读取和更新权限,然后重新加载连接页面。该行的 Sync 开关就会解锁。

首次运行失败并显示 "The Lingo plugin isn't installed"。 请将 @lingo.dev/payloadcms 添加到你的 Payload 配置中的 plugins,然后重新部署。未安装插件也可以完成连接,但无法进行同步。

在 Payload 中发布后没有触发运行。 请检查是否已设置 LINGO_WEBHOOK_URL、是否已配置 localization、该 collection 或 global 是否在范围内、此次保存是否发生在源语言区域设置中,以及这次操作是发布而不是草稿,除非连接处于 Draft 模式。

字段不会被翻译。 该字段本身或其父级没有设置 localized: true,或者它不是 text、textarea 或 richText 字段。

Settings 标签页将连接显示为 Cannot be reached。请检查实例是否正在运行、密钥是否仍然有效,以及所有网关请求头是否仍能正常工作。现有连接的地址和密钥无法编辑,因此如果其中任一项已变更,请断开连接后重新连接,并用新的 webhook URL 更新 LINGO_WEBHOOK_URL。

下一步#