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

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

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

作者:

A Tour of Go 多语言翻译项目

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

图 4:GitHub 与 ChatGPT 已成功连接

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(35) 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 与本地翻译流水线之间的数据交接层。

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

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

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

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

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

【图 2:upstream source preview】

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

完成 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 de-DE 上线复盘:第三门语言用了约 16 小时,下一门如何压到 8 小时?

A Tour of Go 多语言翻译项目

本系列完整记录 A Tour of Go 多语言翻译项目从架构设计、整页翻译、结构保护、自动校验,到生产发布与后续维护的实际开发过程。

项目入口:
✅ 简体中文:A Tour of Go 简体中文版
✅ 日语:A Tour of Go 日语版
✅ 德语:A Tour of Go 德语版
✅ 法语:A Tour of Go 法语版
✅ 项目源码:GitHub:shuijingwan/go-tour-i18n

当前已上线简体中文、日语、德语和法语版本。项目属于非官方社区多语言翻译项目,与 Go 官方无隶属或授权关系。