现象

Chrome 里打开英文页面,右键有「翻译成中文」,点下去页面没任何变化,也不报错。不是没这个菜单,也不是弹「无法翻译此网页」,就是安安静静什么都不发生。

第一反应:被墙了,配代理

直觉是 Google 翻译服务不通,于是给 Chrome 配了代理(SwitchyOmega + Clash),页面能正常打开外网,翻译依旧没反应。

这时候容易得出错误结论:再换节点、再换规则。其实没必要,先看 Chrome 自己的日志。

关键证据:chrome://translate-internals

地址栏输入 chrome://translate-internals,切到 Error Logs,复现一次,能看到:

Time                URL                                          Error
2026-10-24 17:42:18 https://opencode.ai/console/.../go            1: Network

1: Network 是 Chromium 的 TranslateErrors::NETWORK。查源码,这个错误码只在一个地方产生:

// components/translate/core/browser/translate_manager.cc
void TranslateManager::OnTranslateScriptFetchComplete(std::string source_lang,
                                                     std::string target_lang,
                                                     bool success) {
  if (success) {
    DoTranslatePage(translate_script->data(), source_lang, target_lang);
  } else {
    ShowTranslateUI(..., TranslateErrors::NETWORK, false);  // ← 就是这条
  }
}

也就是说:Chrome 连「翻译脚本」都没下载下来,页面还没开始翻译就断了。

这个脚本是 https://translate.googleapis.com/translate_a/element.js(见 components/translate/core/browser/translate_script.cc)。

交叉验证:代理本身是好的

直接走同一个代理取这个文件:

curl -s --proxy http://127.0.0.1:30100 \
  -o /dev/null -w 'http=%{http_code} size=%{size_download}\n' \
  "https://translate.googleapis.com/translate_a/element.js?cb=googleTranslateElementInit"
# http=200 size=2988

200,2988 字节。代理通,是 Chrome 自己没走代理。

同时抓 socket 也能看到 Chrome 有直接连 Google IP 的连接,一直卡在 SYN-SENT:

SYN-SENT 192.168.0.110:40580 172.217.118.4:443 users:(("chrome",pid=20641))
SYN-SENT 192.168.0.110:50524 172.217.115.4:443 users:(("chrome",pid=20641))

根因

SwitchyOmega 这类扩展设置的 PAC,只作用于「配置文件(profile)网络上下文」,也就是页面流量。 浏览器自己发起的内部请求(翻译脚本、组件更新、账号同步等)走的是另一套「系统网络上下文」,它读的是操作系统代理设置。

当时这台机器上:

gsettings get org.gnome.system.proxy mode
# 'none'

系统代理是关的。于是页面走 PAC 正常,翻译脚本直连 Google 被墙,element.js 下载失败,记一条 1: Network,表现就是「点了没反应」。

修复

让系统代理也指向 Clash,浏览器内部请求就有出路了。

Clash Verge 里打开「系统代理」开关,或者开 TUN 模式(网络层兜底,任何绕过代理的请求都能接住)。

Linux 下也可以直接设 GNOME 代理:

gsettings set org.gnome.system.proxy mode 'manual'
gsettings set org.gnome.system.proxy.http host '127.0.0.1'
gsettings set org.gnome.system.proxy.http port 30100
gsettings set org.gnome.system.proxy.https host '127.0.0.1'
gsettings set org.gnome.system.proxy.https port 30100
gsettings set org.gnome.system.proxy.socks host '127.0.0.1'
gsettings set org.gnome.system.proxy.socks port 30100

改完重启 Chrome(已有连接不会自动改道),翻译立刻恢复。

下次怎么快速判断

现象 看哪里 结论
右键有「翻译成中文」,点了没反应 chrome://translate-internals → Error Logs 有 1: Network 说明脚本没下载下来
弹「无法翻译此网页」 同上 通常是服务端拒绝或网络中断
干脆没有翻译入口 chrome://settings/languages 语言在「一律不询问」名单里

判断网络问题时的对照命令:

# 走代理取翻译脚本,能 200 就说明代理侧没问题
curl -s --proxy http://127.0.0.1:30100 -o /dev/null -w '%{http_code}\n' \
  "https://translate.googleapis.com/translate_a/element.js"

小结

  • 页面能上外网 ≠ 浏览器内部请求能上外网。PAC / SwitchyOmega 只管页面,翻译脚本走系统代理。
  • chrome://translate-internals 的 1: Network 是「翻译脚本下载失败」,不是「翻译接口报错」。
  • 遇到同类问题(Chrome 组件更新失败、账号同步转圈),先看系统代理是不是关的,比换节点快得多。