dsh-zh-tw-ui:在 DOM 层把 DSH Web 界面转成繁体中文(台湾)

前言

DeepSeek Harness(DSH)内置语言目前主要是简体中文(zh)和英文(en)。在台湾地区日常使用时,常见问题是:主界面是简体,第三方插件各自带简体文案,语言包往往追不上新版本,界面上会出现「一半繁体、一半简体」或某次升级后翻译静默失效。

dsh-zh-tw-ui 不走 DSH 语言列表里新增 locale、也不注册整包词典,而是在浏览器渲染层把已经出现在页面上的简体中文转成繁体中文(台湾用词)。下面介绍它的定位、工作原理,以及如何从仓库安装到 desktop / web profile。

这是什么

  • 名称:dsh-zh-tw-ui(npm 包名与仓库同名)
  • 维护者:linmino
  • 版本(package.json):0.1.0,许可证 MIT
  • 分类:社区目录归类为「趣味换装」——本质是界面呈现层的本地化,不改变 DSH 核心逻辑
  • 一句话:在 Web / Desktop 客户端,用 DOM 文本转换(OpenCC + 少量覆盖表)把整页已渲染文案转为繁体台湾用语,包含 DSH 本体与第三方插件在界面上显示的简体字串

设置里仍可选 Settings → General → Language: 中文 (Simplified);底层 locale 保持 zh,屏幕上看到的是转换后的繁体。README 用下面方式说明这种「表里不一」是刻意设计,以便移除其他语言包后界面仍是中文、仍有内容可转:

Settings -> General -> Language: 中文 (Simplified)   <- the app's own locale
What you actually see:           繁體中文(台灣)     <- converted on screen

核心功能

覆盖范围

按项目 README 中的目标(G1–G5),插件侧重:

  1. 整页界面:DSH 自带文案、第三方插件文案,以及后续动态插入的内容(流式输出、面板更新等),在 DOM 层统一处理。
  2. 与 DSH 版本解耦:不声明 @deepseek-ai/* peer,不 patch LocaleRuntime,不注册词典 namespace,因此不依赖 DSH 某一版的内部 API 形状。
  3. 可逆、可审计:提供 runtime 开关、覆盖表、跳过标记(见下文安全边界);安装脚本会备份 profile 相关文件。

非目标(README 明确写出):不是语言包;不做英文翻译、不调用模型;不改写已持久化存储的数据;仅 Web / Desktop 客户端(TUI、无 DOM 的 profile 不适用);canvas 绘制文字、跨域 iframe 不处理。

转换机制

页面上的文本节点大致经以下路径(README 图示):

screen text → DOM text node → OpenCC cn→twp → override table → 写回 DOM
                ↑
                └── MutationObserver:新增节点 / 文本变更时重跑
  • 引擎:OpenCC cn → twp(大陆简体 → 繁体,含台湾词汇),例如 设置→設定、网络→網路、软件→軟體、插件→外掛 等。
  • 覆盖表:src/convert.mjs 中的 DEFAULT_OVERRIDES 修正 OpenCC 未覆盖或非台湾习惯用语(如 只讀→唯讀、超時→逾時、許可權→權限)。
  • 文档语言:将 <html lang> 设为 zh-Hant-TW,便于浏览器选用台湾字形。
  • 性能与 React:按文本节点 memo;无汉字则跳过;仅在实际变化时写回,并记录自身写入以避免与 React 来回震荡。

安全边界:哪些内容不会被改

复制代码、编辑输入应与未安装插件时一致。README 表格摘要如下:

对象 行为
<code> <pre>、CodeMirror / Monaco / xterm 等 子树与属性不转换
<input> <textarea> 等 仅可转换 placeholder / title;用户输入不碰
contenteditable 不转换
<script> <style> <canvas> <iframe> 等 不转换
带 data-zh-tw-skip 或 translate="no" 不转换
无汉字的字串 原样通过

与其他繁体方案的差异(背景)

README 在 2026-10-13 核对过若干社区方案:词典类往往盖不全 namespace 且缺键时回退到简体;patch 核心的包可能在 DSH 升级后静默失效;peer 范围过窄会导致启动时被 compatibility gate 跳过整包。本项目 trade-off 是:只做展示层转换,换得版本独立与第三方插件可见文案一并处理;展示层局限(例如已存进数据库的简体、canvas 内文字)见仓库 README 的 Limitations 一节。

同功能的替代之一 README 提到 dsh-multi-lang-ui;本项目刻意保持「仅 DOM 转换、无词典同步」的单职责体量。

安装与启用

README 写明:当前推荐路径是从本仓库安装(npm 发布小节在资料中已截断,此处不展开未完整出现的命令)。

在已具备 Node.js 的环境下,按仓库说明执行:

git clone https://github.com/linmino/dsh-zh-tw-ui.git
cd dsh-zh-tw-ui
node install.mjs --profile desktop
  • --profile desktop 为默认;Web 专用 profile 使用 --profile web。
  • install.mjs 会做四件事(均可通过 uninstall.mjs 回滚方向还原):备份 profile 的 package.json 与 cordis.patch.yml(*.zh-tw-ui.bak);把 dsh-zh-tw-ui 加入 dsh.profile.bundles;将 locale 行的 preference 设为 zh;把 profile 下 node_modules/dsh-zh-tw-ui 链接到本目录。脚本不运行包管理器,不会重算整个 profile 依赖树。

安装后必须重启 DeepSeek Harness——新 bundle 在启动时组合,仅刷新页面不够。

卸载方向可使用 package.json 中的脚本:

node uninstall.mjs --profile desktop

(具体参数与 desktop/web 与安装时一致。)

典型用法

  1. 完成上述安装并重启 DSH。
  2. 在 Settings → General → Language 选择 中文 (Simplified)(或与安装脚本写入的 zh preference 一致)。
  3. 打开 Web UI 或 Desktop 客户端,确认菜单、设置、已安装第三方插件在页面上的简体文案显示为繁体台湾用语。
  4. 若某块 UI 不应被转换,在对应 DOM 上按 README 使用 data-zh-tw-skip 或 translate="no"(需插件或页面支持该标记)。

无额外「调用 API」步骤;转换在客户端注入逻辑中自动进行。

适用场景与注意

适合谁

  • 在台湾或习惯繁体(台湾)用语的开发者,希望 DSH Web / Desktop 界面统一为繁体,且不想维护随 DSH 版本更新的巨型词典。
  • 安装了大量简体文案的社区插件,词典类语言包无法覆盖插件 namespace 时,仍希望屏幕上看到繁体。

务必知晓

  • 插件随 当前 DSH profile 的 bundle 机制 加载,与 DSH 进程同一前端运行环境;安装前应阅读 GitHub 仓库 源码与 MIT 许可证,自行评估是否纳入工作环境。
  • 转换发生在展示层:聊天记录、配置里已存的简体不会因此改写;导出数据、API payload 仍以底层 locale 与原始存储为准。
  • 不支持 TUI、无 DOM 场景;canvas、跨域 iframe 内文字不会转。
  • 仅做简体→繁体(台湾),英文界面不会因此被翻译。

DSH 生态强调「一切皆插件」;插件目录站点 SkillHub 上的 linmino/dsh-zh-tw-ui 为社区索引,与 DeepSeek / 幻方无官方从属关系。

结尾

若你的痛点是「语言包盖不全、升级后静默失效、第三方插件仍是简体」,可以评估 dsh-zh-tw-ui 的 DOM + OpenCC 路线:用展示层转换换版本与覆盖面,并保留代码区与用户输入不被改写的边界。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye