没有不值得去解决的问题,也没有不值得去学习的技术!

原本预计 6 小时,最后用了约 16~18 小时:A Tour of Go 韩语版上线复盘

图 1:根据 ko-KR 期间 76 次 Git 提交估算实际工作时间

作者:

在

系列帖子

Markdown Page 经过 Parse / Protect、Generation 和 Reconstruct / Validate 的流程示意图,强调保护 inline code、链接、代码等机器语义,同时允许译文按照自然语言调整语序。

(1) Markdown 不是纯文本:Learn / Docs 为什么需要新的 parser 与结构保护

图3:访问过去的 Go Tour 简体中文站 tour.go-zh.org 时,当前已经无法正常建立连接。

(2) 从「A Tour of Go 中文版」这个搜索词开始:我决定做一个持续维护的 Go Tour 中文版

本地运行的 A Tour of Go「Methods continued」课程页面,左侧为课程说明,右侧为 Go 代码编辑器及运行结果。

(3) A Tour of Go 中文版项目设计冻结:从 101 页到 103 页,从 Gin 转向 Cobra CLI

A Tour of Go 中文版开发实战:英文基线、在线运行与 101 页上游同步体系

(4) A Tour of Go 中文版开发实战:英文基线、在线运行与 101 页上游同步体系

go-tour-i18n 项目完成首个简体中文课程页面 welcome/1 的整页翻译、结构校验和本地预览。

(5) A Tour of Go 多语言翻译项目实录:完成首个 zh-CN 页面翻译闭环

图 1:DeepSeek 官方更新日志显示,本次只更新 DeepSeek-V4-Flash,DeepSeek-V4-Pro API 与 APP、Web 模型均未更新

(6) A Tour of Go 中文翻译项目进展:完成前 8 页、修复 present 语法,并暂缓 DeepSeek 对比

图 1:generics/1 简体中文页面本地预览

(7) 一个页面重试五次:使用 GLM-5.2 翻译 A Tour of Go 时遇到的 Token 与 Present 结构问题

图 1:methods/16 简体中文页面浏览器预览

(8) A Tour of Go 中文翻译实录:如何只翻译教学代码注释,而不破坏 Go 代码

图 2:A Tour of Go methods/20「练习:错误」中文候选页面最终渲染效果

(9) A Tour of Go 多语言翻译:当正确的中文语序被受保护标记顺序校验误判

图 3:methods/24 中文页面,静态代码、Bounds 行内代码和链接内的 image.Rectangle 均正确渲染

(10) A Tour of Go 中文翻译完成 7 个代表页校准:最后 3 页又发现了哪些真实问题

图 2:首批 10 个普通页面经过试跑与流程校准后全部进入 ready

(11) A Tour of Go 多语言翻译项目:首批 10 个普通页面试跑,从 2 个 blocked 到全部 ready

图 2:flowcontrol/6 最终中文页面,return 与 v 为适应自然中文语序发生整体换位

(12) A Tour of Go 中文翻译第二批实跑:从 Inline Code 顺序误判到历史响应重新验证

图 1:flowcontrol/6 首次原始输入实验直接通过统一自动校验

(13) A Tour of Go 多语言翻译项目:从 swap 问题重新审视 Token 保护,原始输入与最小保护的一次真实实验

图 7:moretypes/1 最终中文页面预览。左侧课程正文、静态代码块、行内代码和教学注释均正常渲染,右侧官方 Go 示例继续保持原样。

(14) A Tour of Go 多语言翻译实战:第三批 10 页全部 Ready,继续校准 Protected Token 的结构角色

图 4:上游源码确认共有 103 个课程页面,zh-CN 最终达到 ready=103、pending=0、blocked=0

(15) A Tour of Go 多语言翻译项目:zh-CN 103 个课程页面全部 ready,课程正文翻译阶段完成

图 4:GitHub 与 ChatGPT 已成功连接

(16) ChatGPT 连接 GitHub 实测:让 AI 直接读取 go-tour-i18n 仓库参与译文审核

图 3:中文 Go 术语校准完成后,将确定的译法写入 zh-CN glossary

(17) 为什么 channel 最终选择“通道”:A Tour of Go 中文术语统一的一次实践

图 1:技术含义基本正确,但“返回一个返回……”已经明显影响阅读,因此仍被列入 C 类修订

(18) 103 页逐页审核后,只返修 16 页:A Tour of Go 中文正文发布前质量审计

图 2:中文课程页面以及已经完成本地化的编辑器控制区

(19) A Tour of Go 多语言翻译项目:公共 UI 本地化完成,从课程译文走向完整中文界面

图 2:完整 zh-CN 正式投影成功生成,103 个课程页面被重新组装为 7 个 .article

(20) 从 103/103 ready 到完整站点验收:A Tour of Go 中文版补齐正式投影与课程元数据本地化

图 3:从 production bundle 独立启动的 A Tour of Go 简体中文页面,课程正文、公共 UI 和官方 Go 示例均已进入最终发布形态。

(21) A Tour of Go 多语言翻译项目:103 页全部完成后,我终于生成了可独立部署的 zh-CN Production Bundle

图 1:A Tour of Go 简体中文版正式生产页面,远程运行已经成功输出“Hello, 世界”。

(22) A Tour of Go 多语言翻译项目:zh-CN 正式上线,从生产发布到 go.dev Playground 的完整部署记录

图 1:新生产域名 go-dev.shuijingwanwq.com 已正常访问,Go 示例远程运行成功

(23) A Tour of Go 多语言翻译项目:从 go-tour 到 go-dev,完成 EdgeOne、Nginx 与 HTTPS 生产域名迁移

图 1:A Tour of Go 多语言翻译项目正式生产首页

(24) A Tour of Go 多语言翻译项目正式上线:从项目首页、公共 Footer 到生产发布元数据的完整收尾

图 3:GA4 g/collect 请求返回 HTTP 204,并携带当前课程页面地址,确认 Google Analytics 已产生真实事件上报

(25) A Tour of Go 多语言翻译项目:接入 Google Analytics 与百度统计,从 systemd 注入到 EdgeOne 与真实上报验证

图 1:生产环境 robots.txt 与 sitemap.xml 已正确对外提供,Sitemap 共包含 104 个规范 URL。

(26) A Tour of Go 中文站上线后:补齐 robots.txt、Sitemap,并完成五大搜索引擎提交

图 4:发布生产并刷新 EdgeOne 缓存后,再次通过真实手机访问,顶栏项目名称已经完整保持在一行,最终移动端验收通过。

(27) A Tour of Go 多语言翻译项目:修复手机端首页顶栏标题换行,并完成真机验证

图 3:生产自动部署脚本第一次真实运行时,systemd 已经显示 active,但首次 localhost 探测仍然得到 HTTP 000;随后连续 3 次同时满足 active + HTTP 200 后,脚本才判定部署成功,并继续完成公网 HTTP 200 验收。这次真实运行验证了连续应用层健康检查的必要性。

(28) A Tour of Go 多语言翻译项目:从一次 203/EXEC 故障到生产自动部署脚本落地

图 1:阿里云生产环境访问 go.dev Playground 时出现 TLS 握手超时

(29) A Tour of Go 多语言翻译项目:为 Playground 搭建独立的 ZgoCloud 执行代理

图 3:清除 /tour/script.js 缓存后,Run 已直接请求 ZgoCloud /compile 并返回 HTTP 200

(30) A Tour of Go 多语言翻译项目:将生产 Run / Format 切换到 ZgoCloud 执行节点

【图 1:微信中运行 Go 示例时出现 Error communicating with remote server.】

(31) A Tour of Go 中文版手机端运行与格式化偶发失败排查:从间歇性报错到补强 Nginx 可观测性

【图 4:向 golang-dev 公开邮件列表发送 Playground 使用告知邮件并投递成功】

(32) A Tour of Go 多语言项目:为 Playground 代理增加唯一 User-Agent,并主动告知 Go 官方

【图 3:百度剩余 9 个核心 URL 提交成功,remain 归零】

(33) A Tour of Go 搜索引擎收录实测:从 Google 自然索引到百度主动提交与 Bing IndexNow

【图 1:当前正式中文 methods/24 页面,右侧示例代码运行成功】

(34) A Tour of Go 中文翻译完成后,我为什么重新评估 minimal-protect 翻译模式

【图 3:5 个页面 Request SHA256 完全一致,但 Response SHA256 全部不同】

(35) A Tour of Go 翻译实验:更多原始上下文为什么没有更好?从 157 个保护标记到 30 次重复盲评

图 3:3 个代表页 × 4 个评审模型,共 12 次匿名评审的完整排名与第一名票数。

(36) A Tour of Go 翻译质量再评估:minimal-protect 未达预期后,我开始比较 ChatGPT、Codex 与 GLM-5.2

图 2:GitHub 中的 chatgpt-zh-CN-008 重译批次。一个 Batch 同时保存 inputs、raw-responses、candidates、validation 和 retry 记录,GitHub 成为 ChatGPT 与本地翻译流水线之间的数据交接层。

(37) 没有 OpenAI API,我如何用 ChatGPT + GitHub 完成 A Tour of Go 103 页全量重译

图 1:103 个正式课程页面完成最终语义质量审核,结果为 A=103、B/C/D=0,同时不存在缺失、重复或额外页面。A/B/C/D 是本轮项目内部语义质量分级,并不是自动结构 validator 的结果。

(38) 103 页翻完还不能发布:A Tour of Go ChatGPT 译文的语义审核与 Canonical Promotion

图 3:7 个 article endpoint 的 production origin 与 EdgeOne 公网响应全部 exact match,同时新的 ChatGPT 译文标记存在,旧版译文标记已经消失。

(39) 103/103 与 7/7 Exact Match:A Tour of Go ChatGPT 新译文的最终线上验收

【图 2:upstream source preview】

(40) A Tour of Go 多语言翻译项目首次实现 upstream 同步机制:从一次性翻译到长期维护

图 2:A/B/C/D 质量评级规则,展示正式质量 rubric 与 Promotion gate。

(41) A Tour of Go 多语言翻译项目引入 Translation Quality Review:从自动验证到 AI 翻译质量控制

图 4:翻译后 Playground Example,展示中文注释与保持不变的 Go 代码结构。

(42) A Tour of Go 多语言翻译项目实现 Playground Example 本地化:从代码注释翻译到完整学习体验

图 5:公网页面验证广告脚本输出

(43) A Tour of Go 多语言翻译项目接入广告系统:从 AdSense 专用配置到通用 HTML 注入架构

图 3:百度统计单页应用设置

(44) go-dev 单页网站接入统计与 Google AdSense Auto Ads 验证记录

图 1:GitHub 仓库中的多语言翻译项目结构

(45) A Tour of Go 多语言翻译项目:选择日语作为第二语言并启动翻译验证

图 5:模型身份描述不一致

(46) A Tour of Go 多语言翻译项目中的 AI 协作异常排查:一次长期工程会话失效分析

【图 1:ChatGPT GitHub 写入流程调整说明截图】

(47) go-tour-i18n 翻译流程调整:从 ChatGPT GitHub 写入到本地 artifact 导入

图 4 展示了本次异常状态。

(48) go-tour-i18n 翻译自动化流程复盘:已验证的 ChatGPT 翻译能力在新任务中的稳定性问题

【图 6:全部评审结束以后才读取 secret key,完成最终揭盲】

(49) A Tour of Go 翻译质量再评估:Codex High 已接近 ChatGPT High,我决定调整默认翻译引擎

图 4:ja-JP 生产课程页实际运行 Go 示例

(50) A Tour of Go 日语版正式上线:第二门语言 ja-JP 完成生产发布

图 1:ja-JP 上线以后,先提交“新增语言标准化流程”

(51) A Tour of Go 多语言扩展复盘:为第三门语言建立标准化流程

图 1:课程正文结束以后,页面左侧仍然存在大块视觉空白,但 AdSense 并没有在这里插入展示广告。

(52) A Tour of Go 明明有大片空白,为什么 AdSense 就是不显示展示广告?

图 2:golang/website 当前的 _content/tour/。课程内容、静态资源和模板都在这个上游目录中持续维护。

(53) 为了 AdSense,要不要放弃 SPA?A Tour of Go 页面架构的一次取舍

图 4:最终的手动课程广告真实展示在课程内容区域内,而不是 footer 之后。

(54) 保留 SPA 以后,广告应该放在哪里?从 AdSense 预览到方案 B

图 1:Google Search Console 中,多个不同的 A Tour of Go 课程 URL 被判断为“重复网页,用户未选定规范网页”。

(55) SPA 的 SEO 老问题:为什么最后还是给 103 个 A Tour of Go 课程页生成了 Prerender HTML

图 2:方案 B 生产环境中,源码已经正常,但课程主体高度异常缩短,footer 提前进入第一屏。

(56) 从源码空白到 AdSense 高度污染:A Tour of Go 方案 B 的生产收尾

图 1:A Tour of Go 德语版 de-DE 已正式运行在生产环境

(57) A Tour of Go de-DE 上线复盘:第三门语言用了约 16 小时,下一门如何压到 8 小时?

图 1:fr-FR 首次 production 验收完成后,我没有立即开始 ko-KR,而是先连续完成新增语言与首次生产流程的优化

(58) 法语版上线后,我没有马上开始韩语:A Tour of Go 新增语言流程的一轮完善与简化

图 1:根据 ko-KR 期间 76 次 Git 提交估算实际工作时间

(59) 原本预计 6 小时,最后用了约 16~18 小时:A Tour of Go 韩语版上线复盘

图 2:英文 source 与当时发生 validation failure 的 ko-KR candidate 对比

(60) Validator 报错,到底该改译文还是改规则?一次 A Tour of Go 韩语翻译实战

图 2:法语 A Tour of Go 仓库目前已经归档,页面仍保留 553 Commits 和 61 Contributors 的历史

(61) 从法语 553 次提交到韩语两代离线:A Tour of Go 社区翻译为什么难以长期维护

【图 4:es-ES 首次 Production 收口后连续完成的流程优化 commit】

(62) 从 es-ES 首次上线复盘:我把 A Tour of Go 新增语言的 Production 流程又收敛了一轮

图 1:旧公网验收链路连续出现 curl 28 超时,最终导致 public-machine 阶段失败

(63) A Tour of Go Production 公网验收踩坑:从跨境 SOCKS 链路改为 zgocloud direct

图 1:两次 Production Machine Acceptance 都已经通过,但 Headless Chrome 分别在 / 和 /tour/ 判定页面没有完成渲染

(64) 页面明明能打开,为什么 Headless Chrome 仍然判定 Production 失败?

图 3:Bing 从 Google Search Console 中识别到新的 it-IT 站点,并同时发现已有的 1 个 sitemap

(65) GSC → Bing Webmaster Tools:多语言站点如何减少重复验证

图 3:英文站 3 小时内出现 565 个 Cloudflare 来源 URL

(66) IndexNow 实战:手工提交长期不显示,Cloudflare Crawler Hints 却很快出现在 Bing Webmaster Tools

【图 1:A Tour of Go 项目首页目前的语言版本列表】

(67) 从 nl-NL 到 tr-TR:A Tour of Go 连续上线三门语言后,我又优化了哪些流程

【图 4:Go local 页面中已经出现 French、German、Korean、Simplified Chinese】

(68) 从邮件无人回复到进入 Go 官方 Go local:我的 4 个 A Tour of Go 翻译站终于被收录

图8:最终只保留一把启用的新 API Key

(69) 腾讯云 EdgeOne API 自动化:从 CAM 子用户到最小权限 API Key 的完整配置

【图 7:Production Release Batch 最终汇总】

(70) 从同步 Go 官方上游到一个命令发布 10 个语言站:A Tour of Go Production 流程的再次收敛

【图 3:Cloudflare Smart Tiered Cache 已启用】

(71) Cloudflare 缓存 HIT 很快,MISS 却不稳定:回源阿里云杭州的一次真实优化

【图 3:简体中文站 Support 页面】

(72) 广告之外,社区项目如何长期活下去?我给 A Tour of Go 多语言项目加了 Support

图5:评论成功发布

(73) 从 Go Weekly 到 Reddit、DEV 和 Go Forum:第一次系统推广 A Tour of Go 多语言项目

【图 4:RTL 桌面课程布局修复后的效果】

(74) 第一次把 A Tour of Go 做成 RTL:阿拉伯语版本上线,以及我踩过的几个坑

多语言项目应该先做哪些语言?我的 66 个语言版本商业优先级排序

(75) 多语言项目应该先做哪些语言?我的 66 个语言版本商业优先级排序

当术语一致性遇到性能瓶颈:Go 多语言翻译项目的一次架构取舍

(76) 当术语一致性遇到性能瓶颈:Go 多语言翻译项目的一次架构取舍

从 A Tour of Go 走向 Go Learning & Documentation:为什么这个多语言项目需要 v2

(77) 从 A Tour of Go 走向 Go Learning & Documentation:为什么这个多语言项目需要 v2

Markdown 明明可以拆成很多段,为什么 v2 仍然坚持一个 Page 就是一个 TranslationUnit

(78) Markdown 明明可以拆成很多段,为什么 v2 仍然坚持一个 Page 就是一个 TranslationUnit

Tour、Learn、Docs 为什么不应该各维护一份术语表:v2 的统一 Glossary 设计

(79) Tour、Learn、Docs 为什么不应该各维护一份术语表:v2 的统一 Glossary 设计

v2 术语表变更后的页面影响范围判断流程:区分 Compatible 与 Affected,只处理真正受影响的页面。

(80) 术语表改了,为什么不应该让所有页面重新翻译?v2 的影响范围判断

CLI 性能优化示意图:通过 Prepare Once、Reuse Many Times,将执行时间从 6m54.554s 降至 10.335s,约提升 40.1 倍。

(81) 从 6 分 54 秒到 10.3 秒:Go 多语言项目一次 CLI 性能优化实战

历史为什么值得保留:复用已经完成的翻译成果,而不是重新做一遍

(82) 历史为什么值得保留:复用已经完成的翻译成果,而不是重新做一遍

历史状态通过 Trusted Checkpoint 建立可信断点,旧记录继续保留用于审计和诊断,后续工作流从当前状态继续向前,不再要求无限重建过去。

(83) 历史应该被保留,而不是被反复重建:v2 为什么最终需要一个“断点”

v2 依赖与失效传播流程图:从内容变化开始,评估依赖关系和真实影响,将结果区分为“仍然有效”和“需要失效”,只让真正受影响的状态重新进入流程。

(84) 一次内容变化,到底应该让哪些状态失效?v2 的依赖与失效传播设计

v2 本地内容覆盖判断流程图:官方英文页面先检查是否已有正式本地覆盖,有覆盖时使用本地 URL,没有覆盖时直接链接 go.dev,并保持本地路径真实 404。

(85) 有英文页面,不代表一定应该有本地页面:v2 如何处理本地内容覆盖、canonical 与真实 404

完成 A Tour of Go 法语版以后,我对下一门语言其实是比较乐观的。

法语版从初始化、翻译、Quality Check、Final Review,一直到首次 production 验收,大约用了 9 小时。更重要的是,法语完成以后,我没有马上开始下一门语言,而是又专门花时间完善了一轮流程:

  • 新增 locale 的机械骨架改为正式命令生成;
  • 首次 production 继续自动化;
  • production identity 进一步收敛;
  • 一些 CLI 默认输出开始精简;
  • 增加 Deferred Issues,避免已经发现但暂缓的问题只留在聊天记录里。

所以真正开始韩语时,我的预期反而比法语更激进。

我当时觉得:

大约 6 小时,应该有机会完成。

结果完全不是这样。

最终,韩语从 2026 年 9 月 1 日下午开始,一直做到 9 月 3 日上午才完成 production 收尾,随后还增加了 Naver Search Advisor。

如果只看墙钟时间,整个过程跨了约 44 小时。

但当然不能说我连续工作了 44 小时。

因此这次写复盘前,我专门重新根据 Git 提交时间估算了一遍真正的投入。


一、先算清楚:韩语到底用了多久

这次我把:

Plaintext
2026-09-01 14:58:18
feat: 初始化 ko-KR locale

作为起点。

把:

Plaintext
2026-09-03 11:04:39
docs: 完成 ko-KR 课程目录修复生产验收记录

作为 Git 仓库中这一轮工作的结束点。

中间共有 76 次提交。

图 1:根据 ko-KR 期间 76 次 Git 提交估算实际工作时间
图 1:根据 ko-KR 期间 76 次 Git 提交估算实际工作时间

从起点到终点:

Plaintext
墙钟跨度:44 小时 6 分 21 秒

这个数字显然不能直接当成工作时间。

里面包含:

  • 睡觉;
  • 吃饭;
  • 离开电脑;
  • 等待模型额度恢复;
  • 其他没有持续工作的时间。

所以我又采用了一个比较保守的估算方法:

相邻两次 Git 提交之间,如果间隔不超过 30 分钟,就按照真实时间计算;如果超过 30 分钟,则最多只记 30 分钟。

这样既不会把晚上睡觉的几个小时算进去,也不会武断地认为:

commit 完以后,我立刻就离开电脑了。

因为在实际工作中,一次 Codex 修改、ChatGPT Quality Check、浏览器验收或者服务器排查,本来就可能三四十分钟都没有新的 Git commit。

按照这个口径,结果是:

Plaintext
15 小时 43 分 25 秒

而且这仍然只是一个保守估算。

Git 无法记录很多真实操作,例如:

Plaintext
ChatGPT Quality Check
Codex 执行过程
浏览器检查
服务器命令
Cloudflare Dashboard
Naver Search Advisor

尤其是 Naver 的站点登记和 Sitemap 提交,本身就发生在 Git production 收尾之后。

因此,我最后更愿意把这次韩语版的实际投入记作:

约 16~18 小时。

这已经接近原计划 6 小时的 3 倍,也是法语约 9 小时的接近 2 倍。

那么问题就来了:

明明流程已经比法语阶段更完善了,为什么韩语反而慢了这么多?


二、不是“翻译模型慢”,而是整个质量回流次数明显增加了

如果只看“把 122 个 TranslationUnit 翻译出来需要多久”,其实很容易误判一门语言的真实成本。

正式流程里,模型生成第一版译文只是开始。

后面还有:

Plaintext
automatic validation
→ Candidate Snapshot
→ Quality Check
→ revision
→ Quality Check
→ Final Review
→ 必要时再次 revision
→ promotion

韩语最明显的问题,就是这条回流链真的跑了很多次。

图 2:ko-KR 从 qc-001 一直走到 qc-005,中间经历多轮 revision,Final Review 后仍再次返工
图 2:ko-KR 从 qc-001 一直走到 qc-005,中间经历多轮 revision,Final Review 后仍再次返工

第一次正式 Quality Check:

Plaintext
qc-001

没有直接进入 Final Review。

后面连续导出了:

Plaintext
revision batch 006
revision batch 007
revision batch 008
revision batch 009
revision batch 010

修订以后,又进入:

Plaintext
qc-002

然后还有:

Plaintext
revision batch 011

再进入:

Plaintext
qc-003

随后:

Plaintext
revision batch 012

之后到了:

Plaintext
qc-004

这时候 Quality Check 已经能够进入 Final Review。

但事情仍然没有结束。

qc-004 的 Final Review 又发现了问题,于是流程再次回到:

Plaintext
revision batch 013

完成以后重新:

Plaintext
qc-005
→ Final Review qc-005

最后才真正通过。

这也是这一轮最让我有感触的地方之一。

以前写流程规范的时候,很容易觉得:

Plaintext
Quality Check
→ Final Review
→ promotion

是一条很清晰的线。

但到了真实语言上,它真正的含义其实是:

只要质量没有达到门槛,就必须允许它正确地变慢。

韩语就是这样。

如果为了完成“6 小时目标”,在 qc-001 以后降低门槛,那么当然可以更快。

但那样 6 小时这个数字就没有什么意义了。


三、韩语还暴露了此前没有遇到过的 validator 边界

韩语阶段另一个比较明显的时间消耗来自 automatic validation。

这里需要先说明一点:

中文和日文同样属于非拉丁语系,所以不能说韩语是项目“第一次遇到非拉丁语系”。

真正不同的是:

韩语暴露了一种此前中文、日文阶段没有触发的具体语言边界。

图 3:batch 004 从 validation failure,到调整规则,再通过正式 revalidate
图 3:batch 004 从 validation failure,到调整规则,再通过正式 revalidate

这段 Git 历史非常典型:

Plaintext
完成 ko-KR retranslation batch 004 翻译

→ 记录 batch 004 validation failure

→ 支持 ko-KR 注释标识符韩语后缀

→ 增加 retranslation revalidate 正式流程

→ 记录 batch 004 revalidation evidence

→ 完成 batch 004

最开始看到 validation failure 时,很自然的反应是:

翻译哪里把 Go 标识符弄坏了?

但继续检查以后才发现,并不是所有失败都应该通过“修改译文”解决。

韩语有一种非常自然的语言现象:

Go 标识符后面可能直接连接韩语助词。

从韩语语法来看,这是正常写法。

但原来的 validator 更偏向按照拉丁字符词边界识别标识符,于是某些实际上没有被修改的 Go identifier,也可能被判断成“丢失”。

这时候就出现了一个很重要的分界:

Plaintext
如果是真正修改了 protected identifier
→ 必须修改翻译

如果 identifier 完整存在,只是自然连接韩语语法成分
→ 应该检查 validator

这件事情后来值得单独写一篇,因为它涉及一个我现在越来越重视的问题:

validator 的目标不是逼所有语言长得像英文,而是检测真正的技术结构损坏。

当然,这也不能走向另一个极端:

只要是韩语 validation failure,就认为 validator 错了。

韩语这次仍然有不少问题确实需要修改译文。

所以正确做法是逐个区分:

到底是语言质量问题,还是验证规则边界问题。

这部分我准备放到下一篇 validator 专题里详细整理,这里先不展开。


四、5 小时额度第一次真正影响了整个生产节奏

韩语阶段还有一个非常现实的问题:

模型额度。

这里的“5 小时额度”很容易被理解错。

它并不是:

我可以连续使用模型 5 个小时。

而是一个使用额度窗口。

在韩语这种 TranslationUnit 数量多、正式翻译之后又需要多轮 revision 的情况下,消耗速度明显比我之前预想得快。

实际工作中,我甚至遇到过:

真正高强度使用一个多小时以后,当前 5 小时额度就已经基本用完。

这会直接改变生产节奏。

正常情况下,我本来可以:

Plaintext
Quality Check
→ export revision
→ Codex 重译
→ process
→ 再次 Quality Check

连续推进。

但额度耗尽以后,就会变成:

Plaintext
发现 B
→ 准备 revision
→ 当前额度不足
→ 等待下一个窗口
→ 再继续

于是墙钟时间被明显拉长。

这也解释了为什么:

Plaintext
实际投入约 16~18 小时

但整个过程却跨了:

Plaintext
44 小时 6 分

两者并不矛盾。

这也是我之前单纯用“今天能不能做完一门语言”思考时没有充分考虑的问题。

一门语言真正的生产周期,不只取决于:

Plaintext
TranslationUnit 数量 × 单次翻译速度

还取决于:

Plaintext
首次翻译
+ Quality Check
+ revision 数量
+ Final Review
+ 模型额度窗口
+ production 阶段实际问题

韩语把这些因素一次性叠加起来了。


五、TranslationUnit promotion 完成以后,事情还远远没有结束

9 月 2 日 18:23 左右,韩语 TranslationUnit 已经完成 promotion。

如果只把“翻译完成”理解成项目完成,那么到这里其实已经可以庆祝了。

但实际上,后面还有很长一段工作。

图 4:TranslationUnit promotion 以后,ko-KR 又连续暴露 preview、production 和课程目录相关问题
图 4:TranslationUnit promotion 以后,ko-KR 又连续暴露 preview、production 和课程目录相关问题

从提交历史看,后面连续发生了:

Plaintext
自动化 preview Surface Review 验收
记录 ko-KR production 前 Surface Review
提升 shared-assets 生产验收网络稳定性
修复首次生产 Nginx 路径
复用 shared-assets 公网验收核心
兼容 aliyun Python 3.6 预检
修复 ZgoCloud Nginx 路径
简化 Cloudflare 缓存资格验收
提升 production 公网验收稳定性
完善课程目录预渲染与 SEO 元数据
修正课程目录浏览器验收语义
更新 ko-KR 课程目录修复验收记录
完成 ko-KR production 状态收尾
完成 ko-KR 课程目录修复生产验收记录

这些问题有些尤其有代表性。


六、法语以后已经优化过 production,但没有经过韩语这次实战

上一篇我刚刚写过,法语完成以后,我专门完善并简化了一轮新增 locale 与首次 production 流程。

从逻辑上讲,韩语应该是第一个真正享受到这轮优化红利的 locale。

它确实享受到了。

但是另一个事实也同时出现了:

写完自动化,不等于自动化已经经历过所有真实环境。

例如首次 production 的 Nginx 路径。

脚本已经存在,流程也已经明确。

但真正跑到新 locale 时,仍然发现路径假设需要修正。

随后又遇到了 ZgoCloud Nginx 路径。

再例如服务器预检。

本地开发环境使用的 Python 版本比较新,但阿里云真实服务器上仍然是 Python 3.6,于是自动化脚本又必须兼容生产环境中的真实版本。

还有 Cloudflare。

理论上的缓存资格检查和真实公网环境中的可稳定验收,并不完全是一回事。

这些都属于:

只有真实跑一次,才会知道原来的假设是否真的成立。

所以法语之后的流程优化并没有白做。

相反,正因为有了自动化,韩语暴露出来的问题才更集中地变成:

Plaintext
脚本失败在哪里?
假设错在哪里?
应该修共享实现,还是 locale-specific 配置?

而不是重新手工拼一遍整个 production。


七、连“验收成功”本身,也需要检查验收的是不是正确语义

韩语最后阶段还有一个我觉得很值得记录的问题:

/tour/list。

当时浏览器验收脚本已经能够读取课程目录页面,也能够检查一些结构。

但真实运行以后发现:

脚本检查到“页面里有内容”,不代表它验证的就是我们真正想保证的内容。

后来又专门出现了一次:

Plaintext
fix: 修正课程目录浏览器验收语义

这个事情看起来很小,却非常典型。

自动化测试最危险的一种情况并不是:

Plaintext
FAIL

因为 FAIL 会逼着我去处理。

真正危险的是:

Plaintext
PASS

但这个 PASS 验证的是错误的东西。

例如:

页面存在几个 wrapper。

和:

课程目录正确展示了所有应该展示的 module / lesson。

这两个语义完全不同。

所以这次韩语 production 也再次提醒我:

自动验收不是检查越多越好,而是必须验证正确的业务语义。


八、韩语上线以后,还第一次正式增加了 Naver

等 production、课程目录以及浏览器验收全部完成以后,韩语还有一项其他语言没有的额外工作:

Naver Search Advisor。

图 5:ko-KR 正式加入 Naver Search Advisor,并提交 sitemap.xml
图 5:ko-KR 正式加入 Naver Search Advisor,并提交 sitemap.xml

对于中文站,我会关注百度。

通用海外 locale 主要关注 Google 和 Bing。

到了韩语,如果仍然完全照搬:

Plaintext
Google Search Console
+ Bing

其实并不完整。

因此这次我把:

Plaintext
ko-go-dev.shuijingwanwq.com

加入了 Naver Search Advisor,并提交:

Plaintext
https://ko-go-dev.shuijingwanwq.com/sitemap.xml

这件事情也让我开始重新理解“新增一门语言”的范围。

最开始容易把它想象成:

把 122 个 TranslationUnit 翻译成另一种语言。

但做到现在,它实际上已经变成:

Plaintext
语言
+ glossary
+ TranslationUnit
+ UI
+ metadata
+ SEO
+ domain
+ CDN
+ Playground
+ production
+ ads
+ search ecosystem

其中最后这个 search ecosystem 甚至还不一定能完全共享。

新增韩语,就要考虑 Naver。

以后如果新增其他语言,也可能存在当地占比较高的搜索引擎或者内容生态。

所以所谓“locale-specific”,并不只发生在译文里面。


九、为什么韩语比法语慢,并不能归结成一个原因

如果现在重新看这次 16~18 小时,我已经不太愿意用一句:

“因为韩语比较难翻译。”

来解释。

语言复杂度当然是其中一部分。

我自己也明显感觉到,韩语阶段模型消耗速度比法语、德语更快。

但真正导致总时间增加的是多个因素叠加。

大致可以拆成:

1. 韩语语言本身带来了新的边界

不是项目第一次遇到非拉丁语系,因为此前已经有中文和日文。

但韩语暴露了此前没有遇到的具体语法现象,导致部分 validator 规则需要重新校准。

2. Quality Check 的回流次数明显增加

不是:

Plaintext
qc-001
→ 全 A
→ Final Review

而是一直跑到:

Plaintext
qc-005

中间还有多批 revision。

3. Final Review 真的独立发现了问题

qc-004 已经进入 Final Review,但并没有因为 Quality Check 已经过关就自动放行。

它重新发现问题,又回到了 revision 013。

这一点虽然增加了时间,但反而证明 Final Review 并不是形式上的第二次盖章。

4. 5 小时额度限制开始明显影响节奏

高强度翻译和 revision 很快消耗当前窗口,必须等待后续额度。

5. production 自动化还处于第一次真正大规模实战阶段

法语之后刚完成的优化,在韩语阶段继续暴露:

Plaintext
Nginx
Python 3.6
shared-assets
Cloudflare
公网验收
课程目录
浏览器验收语义

6. 韩语还有 Naver

这部分本身甚至不会留下 Git commit,却同样属于正式上线工作。

所以 16~18 小时并不是“翻译 122 个文件用了 18 小时”。

而是:

把一门新的语言从零推进到真正可以长期维护的 production locale,大约用了 16~18 小时。

这两个概念差别很大。


十、这次真正改变的是我对“6 小时目标”的理解

韩语开始以前,我确实希望:

法语约 9 小时,流程又优化了一轮,那么韩语能不能做到 6 小时?

现在看来,6 小时并不是完全没有意义。

但它只能作为:

happy path 的效率目标。

不能变成硬性上线时间。

如果某一门语言:

Plaintext
首次翻译质量很高
validator 没有新边界
Quality Check 一轮全 A
Final Review 一次通过
Surface Review 没发现新问题
production 基线全部复用成功

那么未来做到 6 小时甚至更快,我觉得仍然有可能。

但如果真实 evidence 表明:

Plaintext
有 B
有 validation failure
有 Final Review rejection
有 production failure

那正确的流程就应该允许它:

变成 10 小时、15 小时,甚至更久。

这不是流程失败。

真正的流程失败反而是:

为了守住预估时间,把真实失败解释成“不重要”。


十一、流程成熟,不意味着每门语言越来越快

做完法语以后,我一度有一个比较自然的预期:

Plaintext
前一门 9 小时
→ 再优化流程
→ 下一门 6 小时
→ 再下一门 5 小时

好像只要继续自动化,新增语言的耗时就应该一路下降。

韩语打破了这种很线性的想象。

我现在更倾向于这样理解:

流程优化降低的是已经理解问题的重复成本,而不能消灭未知问题。

例如:

新增 locale 骨架已经自动化了。

那么韩语不需要再花时间手工搭目录。

首次 production 已经有正式入口。

那么韩语不需要重新设计 deployment。

共享广告架构已经稳定。

那么韩语不需要重新研究广告 SPA 生命周期。

这些时间确实都省掉了。

但与此同时,韩语又第一次把:

Plaintext
韩语助词与 Go identifier 边界
Final Review revision export
真实 production Python 3.6
课程目录预渲染
浏览器验收语义
Naver

这些新问题带进了项目。

所以从整个项目来看,这 16~18 小时并不只是:

“韩语比较慢。”

其中还有一部分时间,其实是在替未来的第五门、第六门语言继续修路。


十二、这也是为什么我现在更愿意记录“问题类型”,而不是只记录耗时

如果只看数字:

Plaintext
法语:约 9 小时
韩语:约 16~18 小时

很容易得出:

韩语效率退步了。

但如果看这些时间最终留下了什么:

Plaintext
validator 更理解韩语语法边界
revalidate 流程正式化
Quality Check revision evidence 更完整
Final Review failure 可以正式回 revision
preview Surface Review 自动化
shared-assets 验收继续复用
首次 production 的真实环境兼容继续加强
Cloudflare 验收更稳定
课程目录 prerender 与 SEO 更完整
浏览器 acceptance 验证了更正确的语义
Naver 正式进入韩语 locale 生命周期

那么这 16~18 小时里有相当一部分,并不是一次性的韩语成本。

它们会继续被后续 locale 复用。

这也是长期项目和单次翻译最大的区别。


小结

韩语版开始以前,我原本预计大约 6 小时。

最终从 Git 记录看:

Plaintext
开始:
2026-09-01 14:58:18

Git production 收尾:
2026-09-03 11:04:39

墙钟跨度:
44 小时 6 分 21 秒

76 次 Git 提交

30 分钟封顶活跃估算:
15 小时 43 分 25 秒

考虑 ChatGPT、Codex、浏览器、服务器、Cloudflare、Naver 等没有完整进入 Git 时间线的操作,我最终把真实投入记作:

约 16~18 小时。

它接近最初 6 小时目标的 3 倍。

但这次真正值得记录的,并不是“韩语做慢了”。

而是为什么会慢:

Plaintext
新的语言边界
+ 更多 Quality Check revision
+ Final Review 再次返工
+ 5 小时额度窗口
+ production 自动化首次真实实战
+ 新的课程目录与验收问题
+ Naver 搜索生态

法语让我看到:

当流程成熟以后,一门新语言确实可以很快上线。

韩语则补上了另一半:

真正成熟的流程,不是保证每门语言都越来越快,而是在遇到新问题时,仍然知道应该正确地慢在哪里。

对我来说,这比“6 小时上线一门语言”这个数字本身重要得多。

下一篇我准备单独整理这次最典型的技术问题:

当 Go identifier 遇到韩语助词时,为什么一部分看起来“不通过”的翻译,真正需要修改的其实是 validator;又为什么另外一些问题仍然必须回到译文本身修正。

法语版上线后,我没有马上开始韩语:A Tour of Go 新增语言流程的一轮完善与简化 Validator 报错,到底该改译文还是改规则?一次 A Tour of Go 韩语翻译实战

Go 学习与文档多语言本地化项目

本系列完整记录 Go 学习与文档多语言本地化项目从 A Tour of Go 起步,逐步扩展到站点首页、项目说明页、学习内容、文档以及未来内容包的实际开发过程,包括架构设计、统一术语治理、整页翻译、结构保护、自动校验、独立质量审核、生产发布与长期维护。

项目源码:
✅ GitHub:shuijingwan/go-tour-i18n

语言版本:

当前跨项目目标语言池共包含 66 个语言版本。Go 项目本身目前提供 65 个社区 Production 语言版本,下面每一门 Go 语言版本都直接链接到其当前公开站点。语言列表沿用项目首页现有的展示顺序。

英语(美国)仅作为跨项目目标语言纳入列表,并不是单独的 Go Production 语言版本。当前 Go 的英文源内容仍为官方 generic English,因此英语(美国)链接到 Go 官方站点,而不是不存在的本地社区部署。

  1. 阿姆哈拉语
  2. 阿拉伯语
  3. 孟加拉语
  4. 葡萄牙语(巴西)
  5. 保加利亚语
  6. 加泰罗尼亚语
  7. 克罗地亚语
  8. 捷克语
  9. 丹麦语
  10. 荷兰语
  11. 英语(美国)(Go 官方英文站点)
  12. 英语(澳大利亚)
  13. 英语(加拿大)
  14. 英语(印度)
  15. 英语(新加坡)
  16. 英语(南非)
  17. 英语(英国)
  18. 爱沙尼亚语
  19. 菲律宾语
  20. 芬兰语
  21. 法语(法国)
  22. 法语(加拿大)
  23. 德语(德国)
  24. 德语(奥地利)
  25. 德语(瑞士)
  26. 希腊语
  27. 古吉拉特语
  28. 希伯来语
  29. 印地语
  30. 匈牙利语
  31. 印度尼西亚语
  32. 意大利语
  33. 日语
  34. 卡纳达语
  35. 哈萨克语
  36. 韩语
  37. 西班牙语(拉丁美洲)
  38. 拉脱维亚语
  39. 立陶宛语
  40. 马来语
  41. 马拉雅拉姆语
  42. 马拉地语
  43. 书面挪威语(Bokmål)
  44. 波斯语
  45. 波兰语
  46. 葡萄牙语(葡萄牙)
  47. 旁遮普语(果鲁穆奇文,印度)
  48. 罗马尼亚语
  49. 俄语
  50. 塞尔维亚语(西里尔文)
  51. 简体中文(中国大陆)
  52. 简体中文(新加坡)
  53. 斯洛伐克语
  54. 斯洛文尼亚语
  55. 西班牙语(西班牙)
  56. 斯瓦希里语(坦桑尼亚)
  57. 瑞典语
  58. 泰米尔语
  59. 泰卢固语
  60. 泰语
  61. 繁体中文(台湾)
  62. 繁体中文(香港)
  63. 土耳其语
  64. 乌克兰语
  65. 乌尔都语
  66. 越南语

项目正在持续扩展新的 Go 学习与文档内容,并长期维护各语言版本的术语一致性、翻译质量、独立审核、生产发布与后续更新。

本项目属于非官方社区多语言本地化项目,与 Go 官方无隶属、授权或背书关系。