前言¶
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