dsh-languages: Installing 14 Community Translations for DSH Web UI

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

  1. Open the sidebar Plugins, click Install.
  2. Fill in spec: dsh-languages (npm package name) or github:elims777/dsh-languages (GitHub source code). README suggests npm first.
  3. Enable the bundle, refresh the page with Ctrl+R.
  4. 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.bundles contains dsh-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-languages from dsh.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 inside app.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

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

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

Xiaoye