Introduction¶
DSH’s philosophy is “everything is a plugin,” but the interface itself only comes with English and Chinese text. These two sets of copy are compiled into the @deepseek-ai/dsh-client-* client bundles and registered via ctx.locale.register(ns, { zh, en }) upon activation; plugins do not have independent translation files to override. Therefore, if the team wants to switch to a Russian, Japanese, or Vietnamese interface, the common practice is to modify the packaged app.asar, or simply not change it.
dsh-languages is specifically for this problem: a plugin package that registers 14 community languages via DSH’s public ctx.locale API, covering chat, settings, plugins, scheduler, sidebar, dialogs, and system messages. The maintainer is community developer elims777, the project falls under the Client category, and is listed in the community directory by a third party. The README explicitly states “Non-official project, unrelated to DeepSeek.”
What is this¶
One-sentence positioning: A community-maintained language pack that injects multi-language support into the DSH Web UI via ctx.locale.addLanguage + ctx.locale.register, without touching app.asar or rebuilding the client.
Supported Languages¶
| Language | Code | Status |
|---|---|---|
| Russian | ru |
Completed, 100% |
| Spanish | es |
Community Draft |
| Brazilian Portuguese | pt-BR |
Community Draft |
| German | de |
Community Draft |
| French | fr |
Community Draft |
| Italian | it |
Community Draft |
| Polish | pl |
Community Draft |
| Turkish | tr |
Community Draft |
| Japanese | ja |
Community Draft |
| Korean | ko |
Community Draft |
| Traditional Chinese | zh-TW |
Community Draft |
| Indonesian | id |
Community Draft |
| Vietnamese | vi |
Community Draft |
| Hindi | hi |
Community Draft |
14 languages, 2,886 lines each, totaling 63 namespaces. Arabic (ar) is not included because DSH’s interface does not support RTL layout. Completed languages will enter the build; new languages with only partial namespace translations will not be added automatically and need to be completed before being submitted via a PR.
Installation and Activation¶
Method 1: UI Installation¶
- Open the sidebar Plugins, click Install.
- Fill in spec:
dsh-languages(npm package name) orgithub:elims777/dsh-languages(GitHub source code). README suggests npm first. - Enable the bundle, refresh the page with Ctrl+R.
- Go to Settings → General → Language and select the language.
Method 2: CLI Installation¶
dsh plugin add dsh-languages
# or install from git:
dsh plugin add github:elims777/dsh-languages
After installation, restart the application and select the language in settings.
Method 3: Offline Manual Installation¶
Download dsh-languages-<version>.zip from releases, extract and run:
powershell -ExecutionPolicy Bypass -File install.ps1
The script copies the package to %USERPROFILE%\.dsh\profiles\desktop\node_modules\dsh-languages and writes to dsh.profile.bundles. -Profile <name> specifies the profile, -DshHome <path> specifies the home directory. Restart DSH afterwards.
Verified Compatible Versions¶
README records the actual tested environment as DSH 0.2.1-rc.5 (Windows / Desktop): installed via bundle method, 14 languages switched in real-time, untranslated keys fall back to English, cleanly uninstalled. Feedback post at https://github.com/deepseek-ai/deepseek-harness/discussions/12172.
How It Works¶
DSH does not have independent translation files; the plugin’s role is to register an additional set of languages outside the client bundle. The files inside the package have the following division of labor:
| File | Purpose |
|---|---|
cordis.patch.yml |
bundle patch, inserting locales line into the composite |
lib/index.js |
Node-side placeholder, making strings in Loader valid |
lib/client.js |
Browser-side: registers all languages and entries |
locales/en/*.json |
English entries extracted from the app, used as key baseline |
locales/<code>/*.json |
Translations for each language, one file per namespace |
locales.json |
Language directory (code + display name) |
locale/*.json |
Package metadata for the plugin list |
lib/client.js does exactly those two lines from the official documentation:
ctx.locale.addLanguage({ id: 'de', label: 'Deutsch', fallback: 'en' });
ctx.locale.register('settings', 'de', { trigger: 'Einstellungen' });
Untranslated keys automatically take the English (fallback en), so missing translations won’t result in a completely blank screen. The package is zero-dependency pure JavaScript, and the build artifact bundle is distributed directly with the package.
Typical Usage¶
After installation, just switch the language. Settings path: Settings → General → Language. The language takes effect immediately upon selection without needing a restart; the interface remains in the selected language after refresh because the registration happens when the client bundle is activated.
To add your own language:
node tools/new-locale.mjs de "Deutsch" # generates locales/de/ and records in locales.json
# Translate the values in locales/de/*.json, do not change keys and {placeholders}
npm run check # validates integrity and rebuilds lib/client.js
Then commit locales.json, locales/de/, lib/client.js and open a PR. Detailed rules, glossary, and quality requirements are in CONTRIBUTING.md. You can write yourself as the maintainer for that language in the PR. You don’t have to put the language into this public package: make your own language plugin, as long as the package has dsh.client, just execute addLanguage and register, this repository can serve as a template, DSH will load both plugins simultaneously.
When maintaining existing translations, use the following command to extract new English strings after DSH upgrades:
node tools/extract.mjs "<path>\resources\app.asar" # updates locales/en/*.json
npm run build
New keys will appear in locales/en/<namespace>.json, just fill them in for each language. The build will fail due to missing keys or inconsistent {placeholders}.
Troubleshooting¶
- New language not appearing in list — The bundle is not attached. Check that
dsh.profile.bundlescontainsdsh-languages, then restart the application; Ctrl+R is not enough, the composite state is built at startup. - Some strings are still in English — These are new keys brought by the newer DSH. Run
node tools/extract.mjs ..., fill in the translations,npm run build. - Login successful but shows “Account data temporarily unavailable” — This is not a localization issue. The panel requests name and email from
platform.deepseek.com, and the request did not pass (token expired, or blocked by network/WAF). Re-login or switch network to restore. - White screen after installation — Remove
dsh-languagesfromdsh.profile.bundles, restart, then file an issue with the DSH version.
Applicable Scenarios and Notes¶
Suitable for: teams where internal logs and collaboration require a unified non-English, non-Chinese interface, without wanting to modify the application package or maintain their own fork. Also suitable for developers who want to start a language plugin from scratch—the file structure and CONTRIBUTING process of this package can be copied directly.
The boundaries that need attention are basically written in the “Limitations” section of the README:
- The plugin runs with the permissions of the current dsh process; check the source code and license before installing (this package is MIT). It does not fetch translations online; it installs static JSON from another repository.
- Dynamic metadata (
LocalizedText, package name, plugin name, etc., values provided by the host) remains in English because they are in the manifest insideapp.asar, not in the interface bundle. - Compact units (
{count} min,{value} tok/s) and product names (Cursor, VS Code, PDF) are intentionally not translated. - DSH does not have ICU plural forms; strings containing
{count}should use a neutral phrasing. - Translations are done by the community, including machine translation plus manual proofreading, native speakers are welcome to submit PRs to correct them.
Conclusion¶
The value of dsh-languages lies in narrowing the limitation that “DSH interface only has English and Chinese” to a pluggable option: no package modification, no extra dependencies, just select the language in settings after installation. Out of the 14 languages, only Russian is marked as 100% complete, the rest are community drafts, completeness needs to be checked per namespace.
Directory page: https://www.skillhub.cn/plugins/elims777/dsh-languages
Code and installation instructions: https://github.com/elims777/dsh-languages