Bundle
@huanlin/dsh-plugin-better-locale
DSH web 插件:通过 DSH v0.1.5-rc.1 原生第三方语言 API(locale.addLanguage + register(ns, locale, dict))注册 19 种内置语言字典(ja/ko/fr/...),语言直接出现在 DSH 设置页原生 Language 行中切换,未覆盖文案按 fallback 链回退英文。 | DSH web plugin: registers 19 bundled third-language dictionaries (ja/ko/fr/...)
- Source
- HuanLinOTO
- License
- AGPL-3.0
- Updated
- Updated 6 hours ago
Readme
<p align="center"> <a href="https://dshfind.com/zh/plugins/huanlinoto/dsh-plugin-better-locale"><img src="https://dshfind.com/api/card/huanlinoto/dsh-plugin-better-locale?lang=zh" alt="dsh-plugin-better-locale card"></a> </p> # dsh-plugin-better-locale [中文](README.zh-CN.md) | **English** A DSH web plugin that ships bundled third-language dictionaries (Japanese / Korean / French / German / ... — 19 languages) for DSH's own built-in UI namespaces, plus a compile-time **drift engine** that keeps the dictionaries tracking every DSH release. Languages are registered through DSH v0.1.2-alpha.1's native language-pack API (`locale.addLanguage` + `locale.register(ns, locale, dict)`), so they appear directly in DSH's own Language settings row; uncovered copy falls back along DSH's per-key fallback chain. | | | |---|---| | **Package** | `@huanlin/dsh-plugin-better-locale` | | **Repo** | `huanlinoto/dsh-plugin-better-locale` | | **Requires** | DSH `dsh-v0.1.5-rc.1` or newer | | **License** | AGPL-3.0 | ## Invariants This package publishes **no `./invariant` export**. Per the DSH invariant rules effective since v0.1.2-rc.1, an invariant is only published when independent observations can diverge; here every language contribution (catalog entry + namespace dictionaries) is registered through `ctx.effect`, so fiber disposal / HMR removes exactly what was added (covered by `tests/apply.spec.ts`), and the plugin holds no mutable state of its own — the empty invariant companion was therefore removed. ## Supported languages | Language | id | Label | |---|---|---| | Japanese | `ja` | 日本語 | | Korean | `ko` | 한국어 | | French | `fr` | Français | | German | `de` | Deutsch | | Portuguese | `pt` | Português | | Arabic | `ar` | العربية | | Hindi | `hi` | हिन्दी | | Indonesian | `id` | Bahasa Indonesia | | Turkish | `tr` | Türkçe | | Vietnamese | `vi` | Tiếng Việt | | Thai | `th` | ไทย | | Russian | `ru` | Русский | | Italian | `it` | Italiano | | Dutch | `nl` | Nederlands | | Swedish | `sv` | Svenska | | Polish | `pl` | Polski | | Traditional Chinese (HK) | `zh-HK` | 繁體中文(香港) | | Traditional Chinese (TW) | `zh-TW` | 繁體中文(台灣) | | Traditional Chinese (MO) | `zh-MO` | 繁體中文(澳門) | ## Install ```sh # npm registry dsh plugin --profile web add "@huanlin/dsh-plugin-better-locale" # or github ref dsh plugin --profile web add "github:huanlinoto/dsh-plugin-better-locale" ``` After install, restart `dsh web` and hard-refresh the browser (`Ctrl+Shift+R`). ## Usage Open **Settings → General → Language**: every bundled language is listed alongside DSH's built-in 中文 / English. Pick one and the whole UI switches immediately — the selection persists in DSH's durable `locale.preference` setting (survives browsers and devices sharing the same DSH home), and `<html lang>` follows. Uncovered namespaces / keys fall back through DSH's per-key fallback chain (selected language → declared fallback → `en`; the Traditional Chinese variants declare `zh`, so their gaps show Simplified Chinese rather than English). Coverage table: `TRANSLATION.md` (regenerate with `pnpm run gen:translations`). ## Coverage & scope - **DSH itself only:** the dictionaries translate DSH's built-in namespaces (`common` / `settings.locale` / `command` / ... — every namespace merged into DSH's `LocaleNamespaceMap`, 39 namespaces / 1233 keys × 19 languages at current coverage). The scope is **machine-locked at compile time**: `pnpm typecheck` fails if the dictionaries miss an upstream namespace/key (drift) or carry one upstream does not own (trespass). - **The drift engine:** after upgrading the DSH checkout, run `pnpm typecheck` — red means upstream added or renamed copy; translate until green. `scripts/check-upstream-merges.mjs` (part of the same command) fails when a new upstream merge module is not yet imported by the assertion file, so new namespaces can never slip in unnoticed. - **Third-party plugins are out of scope by design:** a plugin's own namespaces belong to that plugin. Unmigrated plugins coexist with zero errors (their copy falls back to English); migration is a few lines of native API — see the [Developer Guide](docs/developer-guide/README.md). ## Migration from 0.1.x (v0.1.2-alpha.1 adaptation) 0.1.x injected third languages by monkey-patching `LocaleRuntime.prototype.lookup` and borrowing DSH's English slot (selection in a custom settings row, persisted to localStorage, English-only activation). DSH v0.1.2-alpha.1 made all of that native, and the plugin dropped the hack: - the custom "Language override" settings row is gone — use DSH's native Language row; - persistence moved from browser localStorage to DSH's `locale.preference` setting; - the override now works with any DSH active locale (no "switch to English first" step); - the `ctx.betterLocale` service was removed — register plugin dictionaries through `ctx.locale` directly. ## Known limitations - **Coverage is a process, not a promise:** the dictionaries track the upstream merge table exactly at each release of this plugin (currently 39 namespaces / 1233 keys × 19 languages); between a DSH upgrade and a better-locale update, new upstream copy falls back along the fallback chain. Run `pnpm typecheck` in the repo to see any gap. - **Traditional Chinese variants fall back to Simplified Chinese:** `zh-HK` / `zh-TW` / `zh-MO` declare `fallback: 'zh'` — missing keys show the Simplified dictionary (chain `zh-TW` → `zh` → `en`), not English. - **Third-party plugin copy is not translated here:** those namespaces belong to their plugins (see the Developer Guide); expect English for unmigrated plugins while a third language is active. - **Web only:** the client bundle targets the browser; it does not run in Node. ## License AGPL-3.0
Install
dsh plugin --profile web add @huanlin/dsh-plugin-better-locale@0.4.1
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install huanlin-dsh-plugin-better-locale from the hub