持续本地化: 每次合并,每种语言同步就绪。
持续本地化会在代码变更时即时翻译新增和修改的字符串,而非在每次发布前单独进行。每种语言都能随时与所需代码一起发布。
什么是持续本地化?
持续本地化是一种工作方式:新增和修改的字符串一旦变更便自动进入翻译流程,译文无需人工排期即可直接回流到产品中。
由于翻译从未停止,因此不存在专门的“翻译阶段”。开发人员合并字符串后,译文会随代码流同步更新,发布不再依赖任何人的文件交付。
它是持续交付中的本地化环节。如果团队每天合并代码但每几周才移交一次翻译,那么每月大部分时间各语言版本都会落后于代码。持续本地化可将这一差距缩短至单次运行周期。
这并不意味着机器翻译结果未经审阅就直接上线。您可以决定哪些字符串需要人工处理,而发布版本只包含已审阅的内容。
区别在于翻译发生的时机, 而非由谁执行。
| 变化之处 | 批量交接 | 持续 |
|---|---|---|
| 并排显示 | ||
| 翻译发生的时间 | 每次发布前的一个阶段 | 每当字符串发生变化时 |
| 触发因素 | 有人导出文件 | 推送、合并或内容变更 |
| 每个任务的大小 | 一次性处理数周的字符串 | 单次变更中的字符串 |
| 发布等待的内容 | 等待文件返回 | 对您标记的字符串进行审校 |
| 后期文案变更 | 另一次往返流程 | 重新运行该单个键 |
| 译者的工作依据 | 字符串电子表格 | 该行,包含其术语库词条、记忆匹配和截图 |
| 发布时的语言 | 分批进行,一波接一波 | 与功能一起同步发布 |
- 翻译发生的时间
- 每次发布前的一个阶段
- 触发因素
- 有人导出文件
- 每个任务的大小
- 一次性处理数周的字符串
- 发布等待的内容
- 等待文件返回
- 后期文案变更
- 另一次往返流程
- 译者的工作依据
- 字符串电子表格
- 发布时的语言
- 分批进行,一波接一波
- 翻译发生的时间
- 每当字符串发生变化时
- 触发因素
- 推送、合并或内容变更
- 每个任务的大小
- 单次变更中的字符串
- 发布等待的内容
- 对您标记的字符串进行审校
- 后期文案变更
- 重新运行该单个键
- 译者的工作依据
- 该行,包含其术语库词条、记忆匹配和截图
- 发布时的语言
- 与功能一起同步发布
持续本地化的工作原理
跟随一个新字符串走完整个流程。每个环节都展示了您实际会看到的内容。
变更通过 CLI、GitHub Action 或 Git 托管平台上的应用到达 Transglot。源文件以 20 种原生格式之一进行解析,并将每个字符串与项目中已有的内容进行比对。只有新增和变更的字符串才会进入下一步。
来自翻译记忆库的完全匹配会填充该行且不消耗字数。剩余部分将连同您的术语库、风格指南以及该键的上下文一起发送给 Glossa。
每次运行都会检查每一行的占位符、复数形式、术语表词条和长度。损坏的占位符、缺失的复数形式或被禁止的术语表词条会被修复一次并再次检查,如果第二次仍失败则会被拒绝,不会发布。仅超出长度的行会被写入,从团队计划开始,自动批准或 QA 运行会将其标记为待审核。
运行绝不会覆盖人员已编辑或审核过的行。如果其源文本后来发生变化,译文将保留,运行会统计该行并通知您,从团队计划开始,建议的更新会等待在一旁供人员接受。
Git 应用将语言环境文件提交到一个同步分支,并保持一个拉取请求为最新状态。在 GitHub 上,在拉取请求中评论 /translate,文件就会落到该拉取请求自己的分支上。或者发布到 CDN,正在运行的产品无需发布即可读取更改。
持续本地化出错的六种方式,以及如何避免
运行覆盖了人员的工作成果
每位撰写者都会先检查行的状态:运行、记忆匹配和推送。人员编辑或审核过的行会保留,运行会报告它。
→法语,已审核,源文本刚更改
✓已保留,已统计,已报告
损坏的字符串到达生产环境
每个传入的令牌都必须原样传出。在 ICU 项目中,会在渲染时抛出错误的消息会被排除在拉取请求、连接器和 CDN 包之外,并在运行日志中明确标识。
→{count, plural, one {# article}
✓从文件中排除,并在运行中标识
仓库中充斥着机器人创建的拉取请求
每个仓库仅有一个同步分支和一个拉取请求。两次快速推送会合并到该分支,而不是创建第二个拉取请求。
→#812 #815 #819 #823 l10n 更新
✓#812 transglot/sync,原地更新
源文本编辑导致旧翻译过时
每个目标行都记录了其对应的源文本,因此一旦字符串发生更改,系统会立即识别出所有语言中的对应翻译已过期,并仅重新处理该键。
→“保存”变为“保存草稿”。fr、de、ja 仍显示为“保存”
✓fr、de、ja 针对该键重新运行
每次运行都会对整个项目再次计费
运行规模取决于变更内容。未更改的字符串不会发送,完全匹配的记忆库条目不消耗字数,而由人工拥有的行在任何费用产生前都会被拒绝处理。
→文件包含 48,000 字
✓本次运行:60 字
未完成的拉取操作会清空区域设置文件
如果服务器报告某区域设置没有条目,拉取操作将拒绝覆盖含有内容的文件,并以退出代码 1 终止,从而停止流水线。
→拉取:ja 有 0 个条目,文件包含 1,204 个
✓拒绝使用空包覆盖 locales/ja.json
- run 4182 fr:草稿中缺少占位符,重试时已修复
- run 4182 de:保留了 3 行,由人工拥有
- run 4182 ja:41 行来自记忆库,0 字
- run 4183 ar:重试后仍缺少复数形式,该行被拒绝
- pull 已写入 locales/pt-BR.json
- sync transglot/sync 已更新,拉取请求 #812
三者均连接到您的仓库。 区别在于合并时的处理方式。
数据摘自各公司于 2026 年 11 月 5 日发布的官方页面。价格信息来自下方链接的比较页面,其中展示了套餐和计算方式。价格和套餐可能会变动,请在决策前核实。
| 发生的情况 | Transglot | Lokalise | Crowdin |
|---|---|---|---|
| 新字符串已合并 | 默认情况下已翻译 推送会启动运行。项目设置可将其关闭。 | 配置完成后即可翻译 创建键和导入文件时,自动化默认处于关闭状态。包含 AI 步骤的工作流按其计划运行。 | 开启后即可翻译 在“设置”>“自动翻译”下,每次上传后都会运行。Git 同步默认每小时运行一次。 |
| 翻译未通过检查 | 修复一次,随后拒绝 针对每次运行中的每一行,若存在损坏的占位符、复数形式或禁用术语,则进行处理。长度超限会被记录。在 ICU 项目中,损坏的行不会进入拉取请求、连接器及 CDN。 | 错误级检查会阻止在编辑器中保存 每项检查可设置为关闭、警告或错误。 | 错误级检查会阻止保存 每项检查可设置为警告或错误。 |
| 有人已编辑该行 | 运行将拒绝写入 记忆匹配和推送也是如此。如果后续源文本发生更改,运行将报告该行。 | 自动化默认填充空值 强制选项和清除操作会覆盖已填充的值。 | 选项保留人工编辑和已批准的行 还提供全部替换选项。 |
| 繁忙仓库中的拉取请求 | 一个分支,一个拉取请求 每次推送时原地更新。 | 每个拉取请求创建一个新分支 以时间戳命名。 | 服务分支,每小时同步 默认每小时同步,间隔可更改。 |
| 套餐计数内容 | 每种语言翻译一次的字数 完全记忆匹配免费。存储字符串免费。 | 处理字数 基础语言和目标语言均计入总数。 | 托管字数 待翻译字数乘以目标语言数量。 |
| AI 费用构成 | 套餐包含的字数 不单独计费。 | 各套餐的 AI 字数配额 标准 AI 和专业 AI 字数作为独立的套餐项目列出。 | 独立余额或使用自有密钥 Crowdin 的托管 AI 服务通过积分支付,不包含在订阅费用中。 |
| 相同工作量:10 种语言中的 5,000 条字符串 | $39/月 Team,含翻译 | $1,049/月 Advanced (billed yearly) | $138/月 Pro with 560K hosted words (billed monthly),另加 AI 费用 |
| GitHub、GitLab、Bitbucket、Azure Repos、CLI 和 MCP 服务器 | 全部支持 Git 应用从 Team 版开始提供,涵盖云端版本。 | 全部支持 所有套餐均包含集成。 | 全部支持 还支持 Bitbucket Server。 |
- 新字符串已合并
- 默认情况下已翻译推送会启动运行。项目设置可将其关闭。
- 翻译未通过检查
- 修复一次,随后拒绝针对每次运行中的每一行,若存在损坏的占位符、复数形式或禁用术语,则进行处理。长度超限会被记录。在 ICU 项目中,损坏的行不会进入拉取请求、连接器及 CDN。
- 有人已编辑该行
- 运行将拒绝写入记忆匹配和推送也是如此。如果后续源文本发生更改,运行将报告该行。
- 繁忙仓库中的拉取请求
- 一个分支,一个拉取请求每次推送时原地更新。
- 套餐计数内容
- 每种语言翻译一次的字数完全记忆匹配免费。存储字符串免费。
- AI 费用构成
- 套餐包含的字数不单独计费。
- 相同工作量:10 种语言中的 5,000 条字符串
- $39/月Team,含翻译
- GitHub、GitLab、Bitbucket、Azure Repos、CLI 和 MCP 服务器
- 全部支持Git 应用从 Team 版开始提供,涵盖云端版本。
- 新字符串已合并
- 配置完成后即可翻译创建键和导入文件时,自动化默认处于关闭状态。包含 AI 步骤的工作流按其计划运行。
- 翻译未通过检查
- 错误级检查会阻止在编辑器中保存每项检查可设置为关闭、警告或错误。
- 有人已编辑该行
- 自动化默认填充空值强制选项和清除操作会覆盖已填充的值。
- 繁忙仓库中的拉取请求
- 每个拉取请求创建一个新分支以时间戳命名。
- 套餐计数内容
- 处理字数基础语言和目标语言均计入总数。
- AI 费用构成
- 各套餐的 AI 字数配额标准 AI 和专业 AI 字数作为独立的套餐项目列出。
- 相同工作量:10 种语言中的 5,000 条字符串
- $1,049/月Advanced (billed yearly)
- GitHub、GitLab、Bitbucket、Azure Repos、CLI 和 MCP 服务器
- 全部支持所有套餐均包含集成。
- 新字符串已合并
- 开启后即可翻译在“设置”>“自动翻译”下,每次上传后都会运行。Git 同步默认每小时运行一次。
- 翻译未通过检查
- 错误级检查会阻止保存每项检查可设置为警告或错误。
- 有人已编辑该行
- 选项保留人工编辑和已批准的行还提供全部替换选项。
- 繁忙仓库中的拉取请求
- 服务分支,每小时同步默认每小时同步,间隔可更改。
- 套餐计数内容
- 托管字数待翻译字数乘以目标语言数量。
- AI 费用构成
- 独立余额或使用自有密钥Crowdin 的托管 AI 服务通过积分支付,不包含在订阅费用中。
- 相同工作量:10 种语言中的 5,000 条字符串
- $138/月Pro with 560K hosted words (billed monthly),另加 AI 费用
- GitHub、GitLab、Bitbucket、Azure Repos、CLI 和 MCP 服务器
- 全部支持还支持 Bitbucket Server。
从字符串所在位置启动。 所有入口均汇入同一管道。
如何设置持续本地化
- 01
从代码中提取字符串
每个面向用户的字符串都需要在区域设置文件中拥有稳定的键。Transglot 支持 20 种格式,因此您可以保留现有格式。
jsonyamlxliffarb - 02
连接代码仓库
初始化命令会查找您的区域设置文件,通过浏览器完成登录,上传已有内容并执行首次翻译。
npx transglot@latest init - 03
每次合并时运行
添加 GitHub Action,从任何其他 CI 调用 CLI,或为 GitHub、GitLab、Bitbucket 或 Azure Repos 安装应用。
transglot push --wait - 04
确定需要人工处理的内容
在拉取规则上将 min_state 设置为 reviewed,该文件将仅包含经人工审核的字符串。若不设置,草稿也将发布。
min_state: reviewed
每次合并运行的成本: 发生变动的字词。
一个单词指源语言中的一个词,按每种目标语言分别计数。运行规模取决于变动内容,因此即使项目庞大,若一次合并涉及五种语言中的十二个单词,则计为六十个单词。
适用于 Starter:$19/mo,每月 300,000 个单词。
这约占配额的 9%。
此统计仅包含翻译。质量检查、品牌语调草稿和修复也计入单词数,而来自记忆库的完全匹配不产生费用。CLI 和 GitHub Action 从 Starter 套餐开始支持,GitHub、GitLab、Bitbucket 和 Azure Repos 的应用从 Team 套餐开始支持。
持续本地化无法解决的三个问题
仍嵌入代码中的字符串
流水线只能翻译可读取的内容。硬编码的字符串以及由部分拼接而成的句子必须首先修复,这通常是导致发布停滞的主要原因。
无人负责术语
自动化可以移动字符串,但无法决定产品如何命名。必须有人负责管理术语表,否则无人阅读的语种会逐渐偏离标准而无人察觉。
需要人工判断的文案
法律文本、定价和品牌标语应由人工处理。将其送审,并在有人签字确认之前,不要将其包含在发布文件中。
持续本地化常见问题解答
团队在启用前常问的问题。