dsh-languages:給 DSH Web UI 裝 14 種社區翻譯

前言

DSH 的理念是「一切皆插件」,但界面本身只內置了英文和中文兩套文案。這兩套文案編譯在 @deepseek-ai/dsh-client-* 客戶端 bundle 裏,激活時通過 ctx.locale.register(ns, { zh, en }) 註冊;插件沒有獨立的翻譯文件可以覆蓋。於是想給團隊換成俄文、日文或越南文界面,常見做法是改打包後的 app.asar,或者乾脆不改。

dsh-languages 就是針對這個問題的:一個插件包,走 DSH 公開的 ctx.locale API 註冊 14 種社區語言,覆蓋聊天、設置、插件、調度器、側邊欄、對話框和系統消息。維護者是社區開發者 elims777,項目屬於客戶端分類,在社區目錄裏由第三方收錄。README 明確寫了「非官方項目,與 DeepSeek 無關」。

這是什麼

一句話定位:社區維護的語言包,通過 ctx.locale.addLanguage + ctx.locale.register 給 DSH Web UI 注入多語言,不碰 app.asar,也不重新構建客戶端。

支持的語言

語言 代碼 狀態
俄語 ru 已完成,100%
西班牙語 es 社區草稿
巴西葡萄牙語 pt-BR 社區草稿
德語 de 社區草稿
法語 fr 社區草稿
意大利語 it 社區草稿
波蘭語 pl 社區草稿
土耳其語 tr 社區草稿
日語 ja 社區草稿
韓語 ko 社區草稿
繁體中文 zh-TW 社區草稿
印尼語 id 社區草稿
越南語 vi 社區草稿
印地語 hi 社區草稿

14 種語言每種 2 886 行,共 63 個 namespace。阿拉伯語(ar)沒有納入,因爲 DSH 界面不支持 RTL 佈局。已完成的語言會進入構建;只翻譯了部分 namespace 的新語言不會自動加入,需要補全後隨 PR 提交。

安裝與啓用

方式一:界面安裝

1、打開側邊欄 Plugins,點 Install。
2、填 spec:dsh-languages(npm 包名)或 github:elims777/dsh-languages(GitHub 源碼)。README 建議 npm 優先。
3、啓用 bundle,按 Ctrl+R 刷新頁面。
4、進 Settings → General → Language 選擇語言。

方式二:CLI 安裝

dsh plugin add dsh-languages
# 或從 git 安裝:
dsh plugin add github:elims777/dsh-languages

裝完重啓應用,再到設置裏選語言。

方式三:離線手動安裝

從 releases 下載 dsh-languages-<版本>.zip,解壓後執行:

powershell -ExecutionPolicy Bypass -File install.ps1

腳本會把包複製到 %USERPROFILE%\.dsh\profiles\desktop\node_modules\dsh-languages,並寫入 dsh.profile.bundles。-Profile <名稱> 指定 profile,-DshHome <路徑> 指定主目錄。之後重啓 DSH。

已驗證的兼容版本

README 記錄的實測環境是 DSH 0.2.1-rc.5(Windows / Desktop):bundle 方式安裝,14 種語言實時切換,未翻譯的鍵回落到英文,卸載乾淨。反饋貼在 https://github.com/deepseek-ai/deepseek-harness/discussions/12172 。

它是怎麼工作的

DSH 沒有獨立翻譯文件,插件做的是在客戶端 bundle 之外補註冊一套語言。包內文件分工如下:

文件 作用
cordis.patch.yml bundle patch,在組合裏插入 locales 行
lib/index.js Node 側佔位,讓 Loader 裏的字符串合法
lib/client.js browser 側:註冊全部語言和詞條
locales/en/*.json 從應用裏抽取的英文詞條,作爲 key 基準
locales/<代碼>/*.json 各語言譯文,一個 namespace 一個文件
locales.json 語言目錄(代碼 + 顯示名)
locale/*.json 插件列表用的包元數據

lib/client.js 做的事就是官方文檔裏那兩行:

ctx.locale.addLanguage({ id: 'de', label: 'Deutsch', fallback: 'en' });
ctx.locale.register('settings', 'de', { trigger: 'Einstellungen' });

未翻譯的鍵自動取英文(fallback en),所以缺翻譯不會整屏空白。包是零依賴的純 JavaScript,構建產物 bundle 直接隨包分發。

典型用法

裝好之後就是切語言。設置路徑:Settings → General → Language。選了語言即時生效,不需要重新啓動;界面刷新後仍是所選語言,因爲註冊發生在客戶端 bundle 激活時。

想加自己的語言:

node tools/new-locale.mjs de "Deutsch"   # 生成 locales/de/ 和 locales.json 記錄
# 翻譯 locales/de/*.json 裏的 value,key 和 {佔位符} 不要動
npm run check                            # 校驗完整性並重建 lib/client.js

然後提交 locales.json、locales/de/、lib/client.js 並開 PR。詳細規則、術語表和質量要求在 CONTRIBUTING.md,PR 裏可以把自己寫成該語言的 maintainer。語言不必放進這個公共包:做一個自己的語言插件,只要包裏有 dsh.client,執行 addLanguage 和 register 即可,本倉庫可以當模板,DSH 會同時加載兩個插件。

維護現有翻譯時,DSH 升級後用下面的命令抽取新英文串:

node tools/extract.mjs "<路徑>\resources\app.asar"   # 更新 locales/en/*.json
npm run build

新 key 會出現在 locales/en/<namespace>.json 裏,逐個語言補上即可。構建會因爲缺 key 或 {佔位符} 不一致而失敗。

故障排查

  • 列表裏沒有新加的語言 — bundle 沒掛上。檢查 dsh.profile.bundles 裏有 dsh-languages,然後重啓應用;Ctrl+R 不夠,組合圖是啓動時構建的。
  • 部分字符串仍是英文 — 是新版 DSH 帶來的新 key。跑 node tools/extract.mjs …,補齊譯文,npm run build。
  • 登錄成功但顯示「賬戶數據暫不可用」 — 不是本地化問題。該面板從 platform.deepseek.com 請求姓名和郵箱,請求沒通過(token 過期,或被網絡/WAF 攔了)。重新登錄或換網絡可恢復。
  • 裝完白屏 — 從 dsh.profile.bundles 移除 dsh-languages,重啓,然後帶 DSH 版本提 issue。

適用場景與注意

適合:團隊內部日誌和協作要統一成非英、非中界面,又不想改應用包、不想自己維護 fork。也適合想從零做起某個語言插件的開發者——本包的文件結構和 CONTRIBUTING 流程可以直接照着抄。

需要留意的邊界,基本都寫在 README 的「Ограничения」一節:

  • 插件以當前 dsh 進程的權限運行,裝之前要檢查源碼和許可證(本包是 MIT)。它不聯網取翻譯,裝的是別人倉庫裏的靜態 JSON。
  • 動態元數據(LocalizedText,包名、插件名等由宿主提供的值)仍是英文,因爲它們在 app.asar 內的 manifest 裏,不在界面 bundle 中。
  • 緊湊單位({count} min、{value} tok/s)和產品名(Cursor、VS Code、PDF)是有意不翻譯的。
  • DSH 沒有 ICU 複數形式,含 {count} 的字符串統一用中性表述。
  • 譯文由社區完成,含機器翻譯加人工校對,歡迎母語者提 PR 修正。

結尾

dsh-languages 的價值在於把「DSH 界面只有英文和中文」這個限制收窄爲一個可插拔的選項:不改包、不加依賴,裝完在設置裏選語言。14 種語言裏只有俄語標註爲 100% 完成,其餘是社區草稿,覆蓋完整度需要按 namespace 自查。

目錄頁:https://www.skillhub.cn/plugins/elims777/dsh-languages
代碼與安裝說明:https://github.com/elims777/dsh-languages

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

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

小夜