WUD 简体中文版 DC1024/wud_zh
基于上游 9.2.0 · 分支 i18n-zh · 持续跟进上游

把 What's Up Docker?
完整讲成中文,
再补上它缺的 5 件事

wud_zh 是 getwud/wud 的简体中文本地化分支: 全站中文界面、可一键切回英文,并在不破坏上游行为的前提下,补上了 监控清单、Docker Hub 多镜像源、跨机监控向导、阿里云 ACR 匿名鉴权。 换镜像名即可用,环境变量 / 触发器 / 卷映射 / REST API 与上游完全一致。

上游 9.2.0 为基线 版本 wud_zh-beta1.4 MIT · 公开可拉取 ghcr.io/dc1024/wud_zh:latest amd64
0
条界面文案已汉化
0
个 i18n 命名空间
0/227
上游界面文案逐字回取
0
项上游没有的增强
Localization

汉化内容:不是贴一层皮,是重做了一套 i18n

上游 WUD 的界面文案是硬编码在 17 个 Vue 文件里的英文串,没有任何 i18n 框架。 本分支引入了 vue-i18n v10,把散落的文案抽成两份键位对称的消息包,并接上了 Vuetify 的内置本地化。

语言包结构

两份消息包键位一一对应,改一处不会漏另一处。

zh-CN.ts简体中文消息包
en.ts英文消息包(值直接取自上游源码)
命名空间17 个(containers / watchlist / servers / config / hubMirrors …)
叶子键364 条(中英各 364)
index.ts默认语言、读写 wud-lang、同步 <html lang>

汉化覆盖范围

已汉化的界面:

  • 导航侧边栏、顶部栏、登录页
  • 首页仪表盘(容器数 / 触发器 / 监视器 / 镜像仓库统计)
  • 容器列表:筛选、分组、暂缓更新、删除确认弹窗
  • 容器详情抽屉全部子页:更新 / 触发器 / 镜像 / 容器信息 / 错误
  • 配置页:触发器、监视器、服务器与系统配置
  • 监控清单(本分支新增页面)

英文模式 = 上游原文,不是回译

切回 English 看到的界面串,都是照着上游源码原文取的,不是"翻译回去的英文"(只把上游的模板插值改写成 {占位符})。下面是脚本逐条回查上游 9.2.0 源码的实测结果:

分类条数说明
上游已有界面227其中 211 条逐字一致(93%),差集 16 条见下
本分支新增界面137监控清单 54 / 服务器管理 55 / 镜像源 28 三个新增命名空间
合计364中英两份消息包各 364 条,键位完全对称

那 16 条差集已逐条核对:1 条是 HTML 实体写法差异(上游 &amp;、消息包里 &,渲染等价),14 条是挂在既有页面上的新入口文案(监控清单入口、语言切换、已知未监控区块),1 条是真偏差——首页的复数句丢了上游的 s,已在仓库待办里记着。

汉化过程中还回修了 4 处偏差,例如登录按钮必须还原成上游的 Login、复制提示要保留 xxx copied to clipboard 的类别前缀。

仍然保留英文的页面(诚实交代)

上游的 6 个次要页面还没翻,功能完全正常,只是文案是英文:

日志 Logs 个人资料 Profile 镜像仓库 Registries 认证 Authentications 用户 Users 状态 State

补翻很便宜:两份消息包同时加键 → 在 .vue 里把硬编码串换成 $t('ns.key') → push 到 i18n-zh,CI 自动重建镜像。

语言切换入口

界面默认简体中文,两处入口随时切回 English;选择记在 localStorage(wud-lang),刷新和重新登录都保持。

入口说明
侧边栏底部 🌐 语言已登录时的入口。侧栏收起显示为带悬浮提示的图标;展开显示为列表项,右侧标注当前语言(中文 / English)
登录页卡片上方未登录状态也能切换(中文 / English)
联动项自动同步文档 <html lang>,以及 Vuetify 内置文案(表格分页、空状态等)一并跟随切换
效果预览
容器 local 最新
监视容器 watched_containers
发现更新 ollama/ollama 1 个更新
镜像源 docker.1panel.live 可达
切换只影响文案,功能与数据完全一致。

为什么值得重做 i18n

WUD 是那种"更新一多就得天天看"的工具 —— 容器列表、触发器状态、错误信息全在界面上。母语界面的价值不是好看,是看到 error 那一行的瞬间就能判断要不要动手。

  • 错误信息本地化:容器详情里的错误子页整页中文
  • 配置页汉化:触发器、监视器、服务器与系统配置
  • Vuetify 一并跟随:分页器、空状态、日期选择器都是中文
  • 可回退:切英文即回到上游观感,排障时可对照官方文档
Beyond upstream

相对原项目做的 5 项改进

汉化只是起点。下面这几条是上游当前版本没有、而中文用户几乎一定会撞上的问题 —— 尤其是国内出口访问不到 Docker Hub 这一条,会直接让 WUD 变成"全屏报错"。 所有改动都是纯增量:不改上游的环境变量、触发器与 REST API 行为。

① Docker Hub 镜像源可配置 + 多源 failover

上游把 Hub 地址硬编码为 registry-1.docker.io / auth.docker.io/token。国内出口这条链路会被 RST 重置(ECONNRESET),结果是所有 Docker Hub 容器整片报错、检测不了更新,而 GHCR、ECR 等其他源却一切正常 —— 这也是最难排查的一种"看起来是 WUD 坏了"。

环境变量作用何时需要
WUD_REGISTRY_HUB_URL仓库 API 基址(manifest / tags 拉取)想走镜像站时必填
…_AUTHURLtoken 端点匿名站不填;认证站填其 token 地址
…_SERVICEtoken 的 service 参数认证站且 service 非默认值时才填

默认值时与上游逐字一致,存量部署零影响。另提供网页版镜像列表编辑器:按顺序逐个试,第一个通的即生效,带连通性与鉴权类型探测。

② 监控清单:在网页上勾选要监控谁

上游只能靠 wud.watch 标签决定监控范围 —— 想改一个容器就得改 compose 再重建。本分支加了一个页面:在网页上直接勾,勾完点"立即生效"就下一次扫描生效。

优先级来源说明
1wud.watch 标签基础设施即代码,始终最高;打了标签的容器在页面上锁定
2网页勾选存库,键为 (watcher, 容器名) —— 按名字而非容器 ID,因为重建后 ID 会变
3watchbydefault都没设置才回落默认。库里没记录 ≠ false,否则老实例一升级就集体停止监控

新增两个纯增量接口:GET /api/containers/discover(列出全部容器含未监控)、PUT /api/containers/watch-preference。另支持批量勾选、孤儿偏好清理、未监控容器折叠。

③ 服务器管理页

跨机监控不再靠手拼环境变量。/configuration/watchers 升级为服务器列表(地址 / 端口 / 扫描计划 / 监控数 / 可达性),并带添加服务器三步向导:生成对端只读 socket 代理的 compose → 生成隧道账号与公钥 → 生成 wud.yaml 片段。删除也有对应引导。

④ 阿里云 ACR 匿名鉴权

上游的 Alibaba provider 只在配了凭据时才发 Basic,否则不带任何认证头、不走 Bearer 匿名流程 —— 而阿里云要求 Bearer,于是公开仓库也永远 401,检测不了更新。本分支自己实现 Bearer 握手:探测 /v2/ 取 realm → 换 token → 带 token 重放,兼容两种响应键;有凭据时仍转发 Basic 以支持私有仓库。

⑤ 通知与更新闭环

更新成功后自动回一封成功/失败邮件,含旧/新镜像 digest 与目标版本。并修掉了两个真实痛点:邮件正文里 digest 类更新会显示 (undefined) 的模板缺陷;以及"更新→重建→又更新"的自激循环(按容器名加冷却护栏 + 双判据成功检测)。

兼容承诺:升级只需换镜像名,回退也只需换回来。环境变量、触发器、卷映射、REST API 行为与上游完全一致; 后端新增部分(监控清单、镜像源列表)是纯增量的新表 + 新接口,不影响上游原有语义。
Diff at a glance

改动规模与文件清单

相对上游基线 9.2.0 的纯 fork 差异(git diff --stat 227ce2a2 i18n-zh,227ce2a2 即合入的 v9.2.0 提交)。

0
个文件变更
0
行新增
0
行删除
0
个新增文件

新增文件

文件作用
ui/src/i18n/index.tsi18n 入口:默认语言、读写 wud-lang、同步 <html lang>
ui/src/i18n/zh-CN.ts简体中文消息包
ui/src/i18n/en.ts英文消息包(与中文键位对称)
ui/src/views/WatchlistView.vue监控清单页面(勾选 + 来源标识 + 待生效提示)
ui/src/components/HubMirrorsEditor.vue镜像源列表编辑器
app/store/watchPreference.ts监控偏好读写层(三态语义 + fail-safe)
app/store/watchPreference.test.ts上述 store 的单元测试(11 用例)
app/store/hubMirror.ts镜像源列表的存储与探测
ui/src/services/mock/data/discovered.ts监控清单演示数据(复刻三态语义)
.github/workflows/docker-image.ymlpush i18n-zh 自动构建推送 GHCR

后端改动(仅 14 个文件)

文件改动
app/api/container.ts新增 discover 与 watch-preference 两个接口
app/api/registry.ts镜像源列表的读取 / 保存 / 连通性探测
app/watchers/…/docker/Docker.ts监控判定改为三优先级;新增 discoverContainers()
app/registries/…/hub/Hub.tsHub 的 url/authurl/service 可经环境变量覆盖
app/registries/…/alibaba/Alibaba.ts实现匿名 Bearer 鉴权握手
app/store/db/migrations.ts新增 watched_containers 表(迁移 id=5)
app/store/db/schema.ts对应 schema
app/store/watchPreference.ts监控偏好读写层(三态语义 + fail-safe)
app/store/hubMirror.ts镜像源列表的存储与探测
配套 .test.ts上述 store / registry / watcher 的单测

其余改动全在 ui/(汉化 + 语言切换 + 新页面)。

上游持续跟进

分支每次合并上游后都要手工补键:上游新增的界面文案不会自动出现在语言包里(上游没有 i18n 框架),所以每次同步都要把新串补进两份消息包。合并冲突集中在被翻译过的 .vue 文件;ui/src/i18n/* 基本不冲突。

已同步的上游版本说明
9.1.0合并提交,零 i18n 补键(上游未动 UI)
9.2.0当前基线,已并入 i18n-zh
Get started

三行命令,把 WUD 换成中文

镜像公开托管在 GHCR,无需登录即可拉取。

docker run

bash
docker run -d \
  --name wud \
  -p 3000:3000 \
  -e WUD_AUTH_ADMIN_USER="admin" \
  -e WUD_AUTH_ADMIN_PASSWORD="MySecurePassword123" \
  -v /var/run/docker.sock:/var/run/docker.sock \
  ghcr.io/dc1024/wud_zh:latest

Docker Compose(只改一行)

diff
 services:
   wud:
-    image: getwud/wud:latest
+    image: ghcr.io/dc1024/wud_zh:latest

国内出口推荐配置(绕过 Docker Hub 封锁)

yaml
services:
  wud:
    image: ghcr.io/dc1024/wud_zh:latest
    container_name: wud
    ports:
      - "3000:3000"
    environment:
      - WUD_AUTH_ADMIN_USER=admin
      - WUD_AUTH_ADMIN_PASSWORD=MySecurePassword123
      # --- Docker Hub 镜像:绕过出口封锁(匿名镜像站,无需 authurl)---
      - WUD_REGISTRY_HUB_URL=https://docker.1panel.live
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

镜像站可换任意信任的公共 / 私有 OCI 代理,只要它完整实现 manifest 与 tags/list。(选 1panel 而非 daocloud,是因为后者禁用了 tags/list,会破坏 semver 版本发现。)

发布与补翻

镜像自动构建

push 到 i18n-zh 后由 GitHub Actions 自动构建(约 1~3 分钟)并推送 GHCR,标签为 latest 与 sha-<commit>;也可在 Actions 页手动 Run workflow。

版本号规则

构建时把 WUD_VERSION 固定写入,界面显示为 wud_zh-beta1.4。规则:无新功能则维持,有实质更新则最后一位 +0.1(1.0 → 1.1 → 1.2 → 1.3 → 1.4)。

想补翻译?

在 zh-CN.ts 和 en.ts 里同时加键(两份必须键位对称)→ 把 .vue 里的硬编码文案换成 $t('命名空间.键') → 提交推送,CI 自动重建镜像。约定:en.ts 的值必须与上游原文逐字一致;中文按语义自然表达,不逐字直译。