dsh-multi-lang-ui
by asd13006
為 DeepSeek Harness Web UI 語言選單新增六種語言(繁體中文、日本語、한국어、Français、Deutsch、Español):各語言逐條精譯,缺字串自動兜底(繁中即時簡轉繁、其他語言回退英文),官方更新與第三方插件都能覆蓋。
Add six languages (繁體中文, 日本語, 한국어, Français, Deutsch, Español) to the DeepSeek Harness Web UI language options, with hand-polished per-language translations and automatic fallbacks (Simplified-to-Traditional conversion for zh-TW, English for the others) covering upstream updates and third-party plugins.
安装
dsh plugin --profile web add github:asd13006/dsh-multi-lang-uiGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗
安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。
README
目录
Languages: English · 繁體中文 · 日本語 · 한국어 · Français · Deutsch · Español
A DSH plugin that adds multiple languages to the DeepSeek Harness Web UI language options — 繁體中文, 日本語, 한국어, Français, Deutsch, Español. Known UI strings use hand-polished translations (each language translated from the English baseline); any new / updated / third-party strings fall back to English (or, for 繁體中文, a runtime Simplified→Traditional converter) — so upstream UI updates and other plugins are covered without re-translating every language.
Features
- Adds 6 languages to the "Settings → General → Language" menu (alongside the built-in 中文 / English): 繁體中文, 日本語, 한국어, Français, Deutsch, Español.
- Hand-polished translations per language: every official locale namespace is translated string-by-string from the English baseline (700+ strings per language).
- Fallback for untranslated strings: upstream-added or third-party-plugin strings — 繁體中文 uses a built-in Simplified→Traditional char table (720+ chars) converted on the fly; the other languages fall back to English (the official
endictionaries are complete for every namespace), so no garbled or missing text appears. - DOM-level fallback conversion (zh-TW only): non-dictionary content (e.g. plugin-market descriptions) is converted from Simplified to Traditional via MutationObserver in zh-TW mode (inputs, code blocks and other user content are always excluded).
- Persistence: the language choice is stored in browser
localStorageand survives reloads. - Zero-intrusion: a pure client plugin — no upstream packages are modified; it silently degrades if the locale service is unavailable, without affecting other plugins.
Installation
Recommended: install from GitHub (give this link to an agent, or run it yourself)
dsh plugin --profile web add https://github.com/asd13006/dsh-multi-lang-ui
Or let an agent install it: paste this repository link into DSH and ask the agent to run the command above.
After installation, restart dsh web, then pick your language in "Settings → General → Language".
Removal (important): always use dsh plugin remove — it cleans up the profile's bundle list; manually deleting the package can leave dangling references that prevent DSH from starting:
dsh plugin --profile web remove dsh-multi-lang-ui
npm install (once published):
dsh plugin --profile web add dsh-multi-lang-ui
How it works
locale translate(ns, key)
│
├─ active is one of our languages ?
│ ├─ curated translation exists (DICTS) ? → return it
│ └─ missing (new strings / third-party plugins)
│ ├─ zh-TW → convert the zh value via the char table
│ └─ others → fall back to the en value
└─ other languages → handled by dsh-client-locale as usual
At startup the plugin:
- Registers the per-language dictionaries for every locale namespace;
- Wraps
locale.translate(curated → fallback) andlocale.setLocale(accepts our language ids, writeslocalStorage); - Adds all our languages to the language-options list (patches the locale snapshot and fires
locale/changeto refresh the settings row); - Wraps
locale.adopt— the built-in locale's host preference loads asynchronously and resetsactivetolocale.preference ?? browser language; if the user's preference is one of our languages, it is re-asserted; - Starts the DOM-level fallback conversion (MutationObserver) in zh-TW mode for non-dictionary content, restoring on switch-away.
Do I need to re-translate after upstream updates?
No. Three layers of protection:
- Upstream-added strings → covered on the fly by the fallback mechanism;
- Upstream-changed strings → curated dictionaries keep the old values, while new/third-party strings still fall back automatically; regenerate the curated dicts when you want full sync (below);
- To fully sync the curated translations: run the regeneration flow once — no per-string manual work.
Regenerating the curated dictionaries (optional)
node scripts/extract.mjs <path-to-node_modules/@deepseek-ai> # 1. extract the latest zh/en dicts into src/zh-src/ and src/en/
# 2. translate src/en/*.json → src/<lang>/*.json (LLM batch OK; keys and placeholders must match)
node scripts/assemble.mjs # 3. regenerate lib/client.js
Checking for uncovered Simplified characters (after upstream/third-party updates)
node scripts/collect-chars.mjs [third-party-client.js...] # collect all Simplified characters in use
node scripts/check-missing-chars.mjs # list Simplified-only characters missing from the char table
If any are reported, add the "简字": "繁字" mapping to src/zh-tw-parts/chars.json, then run node scripts/assemble.mjs.
Repository layout
dsh-multi-lang-ui/
├── package.json # plugin manifest (dsh.client.inject / bundle.patch)
├── index.mjs # Host side: no-op entry (pure client plugin)
├── cordis.patch.yml # Host plugin entry
├── lib/client.js # generated browser bundle (do not edit by hand)
├── src/
│ ├── zh-src/ # extracted zh (Simplified Chinese) dicts (generated data)
│ ├── en/ # extracted en dicts (translation baseline for all languages)
│ ├── zh-tw/ ja/ ko/ fr/ de/ es/ # per-language curated translations (quality baseline)
│ ├── zh-tw-parts/
│ │ ├── chars.json # Simplified→Traditional char table (zh-TW runtime fallback)
│ │ ├── simplified-only.txt # Simplified-only character checklist (maintenance)
│ │ └── collected-chars.txt # collect-chars output
│ └── TERMINOLOGY.md # terminology reference (used when polishing translations)
├── scripts/ # extract / assemble / verify / collect / check
└── verify/ # Playwright end-to-end verification scripts
Known limitations
- One-to-many Simplified characters (e.g. 复 in 复制/恢复/复杂 maps to different Traditional forms) use a single mapping (復); the curated dictionaries cover the main strings, but a few new strings may convert imperfectly.
- The language preference lives in browser
localStorage(per-browser); the built-in locale is also non-persistent for remote browsers — this is a consistent design. - Simplified characters not in the char table pass through unchanged — run
check-missing-chars.mjsperiodically and extend the table.
Security & privacy
- No network traffic: the plugin never makes any network request (no fetch / WebSocket / telemetry); the only external URL is the documentation link in this README.
- No data collection: no telemetry, analytics, or error reporting; the only persisted data is
localStorage["dsh-multi-lang-ui.preference"](a language id such as"ja"). - No access to sensitive data: no credentials / tokens / session records / filesystem access; the host side (
index.mjs) is a no-op. - Read-only DOM conversion: only text nodes are rewritten (no innerHTML, no injection); inputs, textarea, contenteditable and code blocks (pre/code) are always excluded, so typing and code are never affected. Displayed session messages are converted (read-only display effect; stored data unchanged) and restored when switching back.
- Zero supply-chain risk:
dependenciesis empty — installing downloads nothing new; the client bundle is fully self-contained (zerorequire); peer dependencies are official packages already present in DSH.
FAQ
Q: Why doesn't dshmarket show my plugin's description?
A: The market's description and category come from the curated "the community catalog" registry (data/plugins/<owner>__<repo>.yml), not from the local package.json. Once the entry is merged into that registry it will appear.
Q: Do I need to publish to npm to get a version number in the market?
A: No. The version of an installed plugin is read from its local node_modules package.json (a GitHub install already shows v0.1.0). npm publishing only affects npm search and plain-npm installs.
Q: Do I need to update the plugin when upstream adds new strings?
A: No — the runtime fallback covers new strings immediately, including third-party plugins' Simplified Chinese strings. Regenerate the curated dictionaries with scripts/ when you want best-quality sync.
Q: DSH won't start after removing the plugin?
A: Always remove via dsh plugin --profile web remove dsh-multi-lang-ui (it cleans up the profile's bundle list). Manually deleting the package can leave dangling references that break startup.
License
MIT
原始 README: https://github.com/asd13006/dsh-multi-lang-ui/blob/master/README.md ↗
同类插件
查看全部 →
dsh-web-ui-all
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。

dsh-web-ui
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。

dsh-TUI
Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。

DSH-better-sidebar
侧边栏完整工作台:内置文件渲染编辑、终端、Git 与子代理,支持三方插件注册新 Tab。

working-activity
让 agent 的"工作状态行"活过来——实时工具动态与进度、俏皮文案、模型自述、上下文预警。同一套想法,适配两个平台: pi CLI 与 DeepSeek Harness(DSH) 。

deepseek-idesign
可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。