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

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

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

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 韩语版上线复盘

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2026 年 8 月 2 日,我正式开始推进 go-tour-i18n 项目的简体中文翻译,并完成了第一个页面 welcome/1 的完整翻译闭环。

在上一篇文章《A Tour of Go 多语言翻译项目实录:完成首个 zh-CN 页面翻译闭环》中,我记录了页面投影、术语表、Protected Token、开发阶段重试机制以及首个中文 candidate 的生成过程。

经过第二天的继续开发,目前项目已经完成 8 个简体中文课程页面:

  • welcome/1
  • welcome/2
  • welcome/3
  • welcome/4
  • welcome/5
  • basics/1
  • basics/2
  • basics/3

Welcome 章节已经全部完成,Basics 章节也完成了前三页。

不过,这次推进过程中最重要的收获,并不只是增加了几个已翻译页面,而是进一步确认了正式发布页面的运行语义、改进了中文提示词,并修复了一个隐藏在 legacy present 语法中的行内代码保护问题。

一、项目目前采用 103 个正式发布页面

A Tour of Go 官方源码包含 7 个 .article 文件。

按照 standalone 本地运行模式统计,原本共有 101 个普通课程页面。不过,Welcome 章节中还存在两个受 #appengine: 条件控制的页面:

  • Go offline
  • The Go Playground

这两个页面在官方线上运行环境中会被展开为独立页面。

由于本项目的目标是构建公开发布的中文版,而不只是复制 standalone 本地运行结果,因此最终采用了 103 个正式发布页面:

  • 101 个普通页面;
  • 2 个条件页面;
  • 同时保留 2 条条件源记录用于审计。

项目没有直接修改官方原始 _content 文件,而是在发布投影层生成正式页面。

这样既可以保持上游源码不变,也可以明确区分:

  • 官方原始源码;
  • standalone 本地页面;
  • 正式发布页面投影;
  • 中文 candidate;
  • 最终发布内容。

二、Welcome 章节已经全部完成

正式发布投影中的 Welcome 章节共有 5 个页面:

  1. Hello, 世界
  2. 其他语言版本
  3. 离线使用(可选)
  4. Go 语言演练场
  5. 恭喜

其中,第一个页面经历了多次开发 attempt。

这些 attempt 并不只是反复修改中文,而是在逐步校准:

  • 页面投影;
  • 条件内容处理;
  • Protected Token;
  • 术语表;
  • System Prompt;
  • candidate validator;
  • 开发模式重试行为。

所有模型请求、原始响应和验证结果都按照 source SHA 和 attempt 编号保存,没有被后续结果覆盖。

三、正式发布页面改用远程执行语义

welcome/1 中有一句话用于说明用户点击“运行”按钮后,程序在哪里编译和运行。

官方源码针对不同环境提供了两种语义:

  • standalone 本地 Tour:在用户的计算机上运行;
  • 官方线上 Tour:在远程服务器上运行。

本地 Tour 会注册 /socket,调用服务器本机的 Go 工具链执行代码。这种方式适合开发人员在自己的电脑上运行,但不能直接公开到生产环境。

本项目的生产站点不会直接开放本地 /socket,因此正式发布投影最终采用:

在远程服务器上编译并运行该程序。

与此同时,仓库中的原始 standalone Tour 行为保持不变。

也就是说:

  • 本地原始 Tour 仍然使用 your computer 分支;
  • 中文正式发布投影使用 a remote server 分支;
  • 旧 source 下已经保存的 6 次翻译 attempt 继续保留;
  • 不会为了切换发布投影而伪造新的模型调用记录。

这一步进一步明确了:课程翻译不能脱离最终发布环境单独处理。

四、开始翻译正式 Go 技术页面

Welcome 章节完成以后,我开始翻译 Basics 章节。

目前完成了前三页。

1. Packages

中文标题定为:

这一页介绍:

  • Go 程序由包组成;
  • 程序从 main 包开始运行;
  • 如何使用 fmtmath/rand
  • 包名与导入路径之间的关系。

GLM-5.2 生成的中文整体自然、准确,基本可以直接使用。

这一页沉淀了三个基础术语:

  • package → 包
  • import path → 导入路径
  • package name → 包名

2. Imports

中文标题定为:

导入

模型最初生成的句子是:

这段代码将导入路径放在一个带圆括号的“分组”导入语句中。

技术含义基本正确,但“将导入路径放在”略显机械,也没有充分表达多个导入项被组织到一起的含义。

最终调整为:

这段代码将多个导入项组织在一个带圆括号的“分组”导入语句中。

另一句原始译文是:

但使用分组导入语句是更好的风格。

最终调整为:

不过,使用分组导入语句是更好的代码风格。

这一页新增术语:

  • import statement → 导入语句

3. Exported names

中文标题最终定为:

导出名

模型原始标题为“导出的名称”,意思没有错误,但在 Go 技术语境中,“导出名”更简洁,也更符合中文开发者的常用表达。

模型原始正文包括:

如果一个名称以大写字母开头,它就是导出的。

最终调整为:

在 Go 中,以大写字母开头的名称是导出的。

最后的操作说明也从:

然后再试一次。

调整为:

然后再次运行。

这一页新增术语:

  • exported name → 导出名
  • unexported name → 未导出的名称

五、发现一个看起来像错误的反引号结构

检查 Packages 页面时,我注意到官方源码中有这样一段:

Plaintext
`package`rand`

如果按照普通 Markdown 理解,这段内容似乎存在明显问题:

  • `package` 是一个行内代码;
  • rand 是普通文本;
  • 最后还多了一个反引号。

但是,查看官方线上页面的 HTML 后发现,实际渲染结果是:

HTML
<code>package rand</code>.

这里的结构完全正确:

  • package rand 是一个完整的代码节点;
  • 空格位于代码节点内部;
  • 英文句号位于 </code> 之后。

原因在于 A Tour of Go 使用的不是普通 Markdown,而是 legacy present 语法。

在这种语法中,代码范围内部出现的单个反引号会被转换为空格。

因此:

Plaintext
`package`rand`

最终表示的是:

Plaintext
package rand

源文件本身没有错误,正式页面投影也没有破坏这段内容。

六、真正的问题发生在 Protected Token 层

虽然官方源码和最终页面渲染都正确,但项目自己的保护器没有完整理解这套 present 语法。

原保护器使用的正则类似于:

Plaintext
`[^`\n]+`

这个正则遇到第一个后续反引号时,就会认为行内代码已经结束。

因此:

Plaintext
`package`rand`

被错误拆分为:

Plaintext
`package`

以及没有受到保护的:

Plaintext
rand`

模型实际收到的页面片段类似于:

Plaintext
... statement ⟪GTI18N_f769f12c_000006⟫rand`.

其中,Protected Token 只对应 `package`,后面的 `rand“ 仍然作为普通文本发送给模型。

这次 GLM-5.2 恰好没有修改剩余内容,所以 Token 恢复后,candidate 仍然得到了原始的合法 present 写法。

但这种成功存在明显偶然性。

模型以后完全可能:

  • 移动 rand
  • 删除末尾反引号;
  • rand 当成普通英文处理;
  • 调整 Token 与 rand 的顺序。

因此,即使当前 candidate 能够通过 validator,这个保护逻辑仍然必须修复。

七、修复 legacy present 行内代码保护

修复后,保护器能够把整个 present 行内代码识别为一个完整单元。

现在:

Plaintext
`package`rand`

会被整体映射为:

Plaintext
⟪GTI18N_f769f12c_000006⟫

其语义内容是:

Plaintext
package rand

Token 恢复时,则逐字还原为官方原始 present 源码:

Plaintext
`package`rand`

最终仍由 present 正确渲染成:

HTML
<code>package rand</code>

本次修复增加了相应的回归测试,覆盖:

  • 普通单词行内代码;
  • 包含一个内部空格的代码;
  • 包含多个内部空格的代码;
  • 代码后的标点边界;
  • Protected Token 的完整映射;
  • Token 恢复后的逐字还原;
  • candidate validator 的结构比较;
  • Basics Packages 页面中不再残留未保护的 `rand“。

这次问题再次说明:

candidate 与 source 结构一致,并不代表进入模型前的 source 保护过程一定正确。

如果保护器首先错误拆分了合法源码,那么模型响应与错误保护结果保持一致,也可能通过后续校验。

因此,除了验证模型输出,还必须为保护器本身建立与官方 present 解析行为一致的测试。

八、原计划测试 DeepSeek,但最终暂时搁置

上一篇项目实录的最后,我原本计划先暂停继续翻译页面,对 DeepSeek 的新版本进行一次测试,再决定 A Tour of Go 项目后续主要使用哪个模型。(永夜)

当时考虑 DeepSeek,主要有两个原因。

第一,GLM-5.2 的付费 Tokens 已经消耗了不少。如果后续要翻译全部 103 个页面,甚至扩展到其他语言,就有必要评估是否存在质量、速度和成本更合适的模型。

第二,DeepSeek 官方刚刚发布了新的模型更新。我原本希望使用同一个完整课程页面,在完全相同的条件下比较:

Plaintext
完整课程页面
→ 相同的 Protected Token
→ 相同的 glossary
→ 相同的提示词要求
→ 相同的 present 解析和结构校验
→ 比较中文质量、首次通过率、速度和费用

此前,我确实已经对 deepseek-v4-pro 与 GLM-5.2 做过一次比较。

但那次测试发生在 WordPress 技术博客翻译场景中,而不是 A Tour of Go 课程页面翻译场景。

当时的目标,是评估 DeepSeek 是否值得接入现有的 WordPress 博客整篇翻译流程。测试脚本向两个模型提供相同的中文内容、提示词,以及标题、摘要和正文测试字段。

测试结果表明:

  • DeepSeek V4 Pro 的响应速度更快;
  • 标题更加简洁,但遗漏了一部分技术信息;
  • 摘要更倾向于压缩和重组内容;
  • 正文存在少量段落衔接和指代问题;
  • GLM-5.2 对原文信息的保留更加完整;
  • GLM-5.2 的技术文章语气和段落独立性更加稳定。

因此,当时得到的准确结论并不是“DeepSeek 在 A Tour of Go 翻译中不如 GLM-5.2”,而是:

在面向 WordPress 技术博客整篇翻译流程的基础 A/B 测试中,DeepSeek V4 Pro 没有表现出足以替换 GLM-5.2 的稳定质量优势。

那次测试也没有继续投入大量时间,把完整的 Gutenberg 长文保护和还原逻辑全部复制到本地 A/B 脚本中。更详细的测试过程可以参考《在 GLM 5.2 之后测试 DeepSeek:一次面向 WordPress 长文翻译的模型对比与取舍》。 (永夜)

这一次原本考虑重新测试,是因为我以为 DeepSeek V4 Pro 已经推出了更新版本。

进一步检查官方更新日志后才发现,2026 年 7 月 31 日完成更新的实际上是:

Plaintext
DeepSeek-V4-Flash-0731

官方明确说明:

  • 本次只升级 DeepSeek-V4-Flash API;
  • DeepSeek-V4-Pro API 没有更新;
  • APP 和 Web 端模型也没有更新;
  • 正式更新后的 V4-Pro 仍需等待后续发布。(DeepSeek API Docs)

当时的官方文档还显示,Responses API 只支持 deepseek-v4-flashdeepseek-v4-pro 的相关支持预计在 2026 年 8 月上旬加入。(DeepSeek API Docs)

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

我真正希望重新评估的是更新后的 Pro 版本,而不是以速度和成本为主要优势的 Flash 版本。

如果现在继续调用 deepseek-v4-pro,实际测试的仍然是此前已经评估过、尚未完成新一轮更新的模型。

这种情况下,即使重新跑一遍 A Tour of Go 页面,也很难得到真正有意义的“新版本对比”结论,只会额外消耗:

  • 开发时间;
  • API Tokens;
  • Codex 使用额度;
  • 模型适配与结果分析成本。

因此,最终决定是:

暂时搁置本轮 DeepSeek 对比,继续使用已经完成校准的 GLM-5.2 推进项目。

这里的“搁置”并不是永久排除 DeepSeek。

等到 DeepSeek 官方真正发布新的 V4-Pro 版本,并且能够确认模型版本或实际能力已经发生变化后,再使用 go-tour-i18n 现有的统一流程进行测试:

  • 相同页面;
  • 相同 Protected Token;
  • 相同 glossary;
  • 相同翻译提示词;
  • 相同 candidate validator;
  • 相同页面渲染和结构校验。

这样得到的结果才具有真正的比较价值。

九、GLM-5.2 当前表现如何

从目前完成的正式技术页面来看,GLM-5.2 的整体表现比较稳定。

截至 basics/3,尚未发现:

  • Go 技术概念的明显误译;
  • 关键内容遗漏;
  • 模型自行增加解释;
  • .play 路径损坏;
  • 行内代码内容变化;
  • 预格式化代码变化;
  • present 页面结构损坏;
  • 链接 target 被修改。

三个 Basics 页面的大致情况是:

  • basics/1:基本可以直接使用;
  • basics/2:需要轻微中文润色;
  • basics/3:需要轻微中文润色。

目前需要调整的内容,主要集中在中文表达,而不是技术准确性。

例如:

  • 标题过于字面;
  • 句子保留英文语序;
  • “是更好的风格”一类机械表达;
  • “再试一次”没有准确描述实际操作;
  • Go 专用术语不够简洁。

这说明 GLM-5.2 已经能够可靠完成完整技术页面的初始翻译,但还不能仅凭前三个简单页面,就直接证明剩余所有复杂页面都可以完全无人观察地批量发布。

十、不会继续把剩余页面全部逐页推进

项目初期采用的是严格的单页流程:

Plaintext
完整课程页面
→ GLM-5.2 整页翻译
→ 保存 candidate
→ 自动校验
→ 检查中文质量
→ 更新 glossary 或保护规则
→ ready

这种方式非常适合最初几个页面。

它已经帮助项目发现并解决:

  • production 页面投影问题;
  • 本地执行与远程执行的语义差异;
  • 固定 UI 术语问题;
  • 普通正文与专有名称的区别;
  • legacy present 行内代码问题;
  • 开发阶段重试限制问题;
  • 中文提示词中的机械表达问题。

但是,如果剩余九十多个页面仍然一篇篇翻译、返回、评审、修改、提交,整体效率会非常低。

而且,连续翻译 Basics 开头的短页面,无法覆盖整个 A Tour of Go 的结构和技术复杂度。

因此,接下来不会直接继续 basics/4,而是改成三阶段推进。

十一、下一阶段先选择代表页面

第一阶段将从不同章节挑选约 5~7 个有代表性的页面。

这些页面应尽量覆盖:

  • 较长的技术说明;
  • 练习页面;
  • 特殊 present 结构;
  • 方法与接口;
  • 泛型;
  • goroutine 与 channel;
  • .image 页面;
  • 其他少见 directive。

这批页面仍然采用单页翻译和完整评审。

目标不是继续增加 ready 数量,而是尽快确认:

  • 保护器是否仍然遗漏其他 present 语法;
  • GLM-5.2 是否能准确处理复杂 Go 概念;
  • glossary 是否已经足够稳定;
  • System Prompt 是否还需要调整;
  • 长页面是否会出现截断、重复或上下文问题。

十二、代表页稳定后试跑 10 页

代表页面完成后,将一次自动翻译 10 个普通 pending 页面。

这 10 页作为全量运行前的试生产批次。

主要观察:

  • 是否全部通过结构和 candidate 校验;
  • 是否再次出现需要修改保护器的问题;
  • 是否出现技术概念误译;
  • glossary 是否发生大范围冲突;
  • 是否需要继续调整 System Prompt;
  • 多数页面能否直接使用或只需很轻的润色。

这一步将不再每翻译一页就暂停和提交,而是完成一个批次后统一分析。

十三、最后才进行剩余页面的批量翻译

如果代表页面和 10 页试跑都保持稳定,就可以让程序自动处理剩余页面:

Plaintext
pending
→ 自动翻译
→ 自动验证
├─ 通过 → ready
└─ 失败 → 有限重试
             └─ 仍失败 → blocked

进入 blocked 的页面,可以导出完整页面,由 ChatGPT 重新翻译,再进入同一套自动校验。

需要特别说明的是:

批量自动翻译不等于自动发布。

即使剩余页面全部生成 candidate,仍然需要完成:

  • present 重新解析;
  • 页面结构比较;
  • .play.image 和链接校验;
  • HTML 渲染验证;
  • 页面路由验证;
  • 章节级抽样;
  • 全站发布前检查。

只有通过这些检查的页面,才允许进入最终发布流程。

十四、当前阶段总结

截至目前,go-tour-i18n 项目已经完成:

  • 固定官方 upstream commit;
  • 103 个正式发布页面目录;
  • 2 条条件源页面审计记录;
  • Welcome 章节全部翻译;
  • Basics 前 3 页翻译;
  • 共 8 个 zh-CN 页面进入 ready
  • GLM-5.2 请求、响应和验证记录留存;
  • candidate 与页面状态管理;
  • 中文 glossary 逐步积累;
  • 正式发布远程执行语义修正;
  • legacy present 行内代码保护修复;
  • source SHA 与上游内容跟踪;
  • candidate validator;
  • 开发模式与正式模式重试区分;
  • 跨章节代表页、10 页试跑和全量翻译策略;
  • 核实 DeepSeek 本轮只更新 V4-Flash,因 V4-Pro 尚未更新而暂缓模型对比。

项目开始时,我原本以为最主要的问题是:

AI 能不能把 Go 教程翻译好?

真正开始实现以后才发现,模型翻译只是整个系统中的一个环节。

一个可以长期维护的多语言项目,还必须解决:

  • 页面身份如何保持稳定;
  • 上游更新如何同步;
  • 正式发布投影如何生成;
  • 特殊语法如何正确保护;
  • 模型调用如何审计;
  • 自动校验如何避免误判;
  • 术语如何保持一致;
  • 本地运行和生产运行如何区分;
  • 失败页面如何恢复;
  • 模型何时值得重新评估;
  • 什么时候才适合进入批量翻译。

目前只完成了 8 个页面,但项目的翻译、校验和状态管理基础已经逐渐稳定。

接下来最重要的事情,不是尽快把数字从 8 页增加到几十页,而是通过少量有代表性的复杂页面,确认整个流程是否真的具备安全批量运行的条件。

A Tour of Go 多语言翻译项目实录:完成首个 zh-CN 页面翻译闭环 一个页面重试五次:使用 GLM-5.2 翻译 A Tour of Go 时遇到的 Token 与 Present 结构问题

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 官方无隶属或授权关系。