@ragnoryok1/dsh-client-locale-ru 0.2.7 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,60 @@
6
6
  Пакет следует за харнессом: целевая версия — `dsh 0.2.1-alpha.1` и новее
7
7
  (`>=0.1.0-rc.2 <0.3.0` для `@deepseek-ai/dsh-client-locale`).
8
8
 
9
+ ## [0.2.9] — 2026-10-19
10
+
11
+ ### Добавлено
12
+
13
+ - **Словари сторонних плагинов: 25.** Пакет переводит не только namespace харнесса, но и словари
14
+ сторонних плагинов: их английский текст выгружается из публикации плагина вместе с версией и
15
+ лицензией (`npm run fetch:plugins`), а перевод сверяется именно с этим снимком, а не с чужим
16
+ русским. В этом релизе добавлены: `dshmarket` (733 ключа), `@goodandready/dsh-tts` (226),
17
+ `@goodandready/dsh-moa` (159), `dsh-better-input` (123), `@goodandready/dsh-cost-meter` (85),
18
+ `dsh-ego-browser` (75), `@goodandready/dsh-usage-guard` (42), `dsh-config-manager` (36),
19
+ `dsh-personal-directive` (5).
20
+ - **Инструмент выгрузки словарей читает чужие форматы.** Ключ, записанный как идентификатор
21
+ (`cancel: "Cancel"`), не попадал в снимок — часть словарей читалась пустыми; регистрация языка
22
+ по одному (`locale.register(NS, "en", en)`) и константа namespace из другого файла пакета тоже
23
+ не распознавались; клиентский бандл не обязательно лежит в `lib/` — `dshmarket` держит его в
24
+ `client/`, и скан только `lib/` находил там словарь хостового модуля. Теперь снимок совпадает с
25
+ тем, что плагин показывает.
26
+
27
+ ### Исправлено
28
+
29
+ - **Отчёт о названиях плагинов больше не считает переведённые непереведёнными.**
30
+ `npm run report:descriptors` перечислял все читаемые названия как непереведённые, даже те, у
31
+ которых в дереве харнесса уже лежал `locale/ru.json`. Теперь отчёт делит их на переведённые и
32
+ оставшиеся и говорит число каждых.
33
+ - **`dsh-plugins-store` убран из покрытия:** то, что выгрузка приняла за словарь, оказалось
34
+ фрагментом JSON Schema — переводить схему значит сломать её.
35
+
36
+ ## [0.2.8] — 2026-10-19
37
+
38
+ ### Добавлено
39
+
40
+ - **Названия плагинов переводятся без правки харнесса.** Название плагина приходит из его
41
+ собственного файла `locale/<язык>.json`, а служба локализации разрешает эту карту, не
42
+ обращаясь к зарегистрированным словарям, — поэтому словарь мог перевести строки плагина,
43
+ но не его имя. Пакет несёт 32 названия сам: английский текст, из которого сделан перевод,
44
+ и русский. Отрисованный интерфейс проходит через проход, который подставляет русский на
45
+ место английского: карточки плагинов, строки состава bundle, страница плагина, реестр в
46
+ настройках, имя для скринридера. Проход берёт только точное совпадение, поэтому фраза, в
47
+ которой название лишь упомянуто, остаётся как была; код, поля ввода и переписка не
48
+ трогаются. Как и типографский, проход работает только пока активен русский. Проверено на
49
+ настоящем документе: `npm run check:plugin-names` (jsdom, 11 случаев).
50
+ - **Патч для харнесса собирается, а не пишется руками.** `docs/harness-descriptors-ru.patch` —
51
+ 32 файла `locale/ru.json` для переведённых плагинов — теперь строится из переводов и дерева
52
+ харнесса (`npm run build:descriptor-patch`), а гейт `npm run check:descriptor-patch` падает,
53
+ когда собранный патч и лежащий в репозитории разошлись. Гейт доказан в обе стороны: с
54
+ изменённым переводом и с вырезанной строкой в патче.
55
+
56
+ ### Исправлено
57
+
58
+ - **Отчёт о названиях плагинов больше не считает переведённые.** `npm run report:descriptors`
59
+ перечислял все читаемые названия как непереведённые, даже те, у которых в дереве харнесса
60
+ уже лежал `locale/ru.json`. Теперь отчёт делит их на переведённые и оставшиеся и говорит
61
+ число каждых.
62
+
9
63
  ## [0.2.7] — 2026-10-19
10
64
 
11
65
  ### Исправлено
package/NAMESPACES.md CHANGED
@@ -1,7 +1,7 @@
1
1
  <!-- Сгенерировано `npm run namespaces`; проверяется `npm run check:namespaces`. -->
2
2
  # Что переведено
3
3
 
4
- Пакет переводит **81 namespace** — 4949 строк. Колонка «как это выглядит»
4
+ Пакет переводит **90 namespace** — 6433 строк. Колонка «как это выглядит»
5
5
  берёт заголовок самого namespace (то, что читает пользователь), а не отдельное описание:
6
6
  список нельзя разойтись с переводами.
7
7
 
@@ -14,10 +14,12 @@
14
14
  |---|---|---|---|
15
15
  | `agent-team` | Команда агентов | 25 | харнесс |
16
16
  | `approval` | — | 5 | харнесс |
17
+ | `better-input` | — | 123 | dsh-better-input@0.2.6 |
17
18
  | `chat` | — | 200 | харнесс |
18
19
  | `claude-code-mods` | — | 4 | харнесс |
19
20
  | `command` | — | 28 | харнесс |
20
21
  | `common` | — | 41 | харнесс |
22
+ | `config-manager` | — | 36 | dsh-config-manager@0.1.78 |
21
23
  | `conversation` | — | 379 | харнесс |
22
24
  | `cordis` | — | 51 | харнесс |
23
25
  | `cotTranslation` | — | 32 | харнесс |
@@ -25,13 +27,19 @@
25
27
  | `deliverables` | — | 60 | харнесс |
26
28
  | `documentHtml` | HTML | 4 | харнесс |
27
29
  | `documentMarkdown` | — | 4 | харнесс |
30
+ | `dsh-cost-meter` | Счётчик расходов | 85 | @goodandready/dsh-cost-meter@0.8.22 |
31
+ | `dsh-market` | Магазин плагинов | 733 | dshmarket@1.66.44 |
32
+ | `dsh-moa` | Ансамбль агентов (MoA) | 159 | @goodandready/dsh-moa@0.2.53 |
28
33
  | `dsh-remote-ssh` | — | 111 | @zhangfengshun/dsh-remote-ssh@2.4.33 |
29
34
  | `dsh-skill-explorer` | — | 75 | @linxin666/dsh-client-ui-skill-explorer@0.4.7 |
30
35
  | `dsh-ssh` | — | 154 | @linxin666/dsh-ssh@0.4.7 |
36
+ | `dsh-tts` | Речь | 226 | @goodandready/dsh-tts@0.4.34 |
37
+ | `dsh-usage-guard` | Сторож расхода | 42 | @goodandready/dsh-usage-guard@0.1.19 |
31
38
  | `dsh-web-ui-market` | — | 106 | @linxin666/dsh-client-ui-market@0.4.7 |
32
39
  | `dsh-web-ui-preset-center` | — | 46 | @linxin666/dsh-client-ui-preset-center@0.4.7 |
33
40
  | `dsh-web-ui-session-archive` | — | 124 | @linxin666/dsh-session-archive@0.4.7 |
34
41
  | `dsh-web-ui-usage` | — | 63 | @linxin666/dsh-usage@0.4.7 |
42
+ | `ego-browser` | ego-browser | 75 | dsh-ego-browser@0.8.6 |
35
43
  | `feedback` | — | 20 | харнесс |
36
44
  | `git-graph` | — | 63 | @linxin666/dsh-client-ui-git-graph@0.4.7 |
37
45
  | `goal` | — | 12 | харнесс |
@@ -42,6 +50,7 @@
42
50
  | `model` | — | 23 | харнесс |
43
51
  | `open-in-app` | — | 45 | харнесс |
44
52
  | `permission.access` | Права доступа | 20 | харнесс |
53
+ | `personalDirective` | Переключение личной директивы | 5 | dsh-personal-directive@0.2.11 |
45
54
  | `pet` | — | 81 | @linxin666/dsh-pet@0.4.7 |
46
55
  | `plan` | — | 17 | харнесс |
47
56
  | `pluginManager` | Плагины | 227 | харнесс |
@@ -94,4 +103,4 @@
94
103
  | `workflowRun` | — | 20 | харнесс |
95
104
  | `workspace` | — | 131 | харнесс |
96
105
 
97
- Итого: **81** namespace, **4949** строк.
106
+ Итого: **90** namespace, **6433** строк.
package/README.en.md CHANGED
@@ -1,9 +1,9 @@
1
1
  <!-- deepseek-harness-meta
2
2
  {
3
3
  "name": "Russian (ru) language pack for DeepSeek Harness",
4
- "version": "0.2.7",
4
+ "version": "0.2.9",
5
5
  "tags": ["localization", "russian", "i18n", "web-gui", "language-pack"],
6
- "description": "Full Russian interface (i18n) for the DeepSeek Harness web GUI: 81 namespaces, 4949 translated strings, Russian screen typography, and a locale audit in CI pinned to a harness tag. Includes the automation-task manager and the reminder catalog.",
6
+ "description": "Full Russian interface (i18n) for the DeepSeek Harness web GUI: 90 namespaces, 6433 translated strings, Russian screen typography, and a locale audit in CI pinned to a harness tag. Includes the automation-task manager and the reminder catalog.",
7
7
  "icon": "https://raw.githubusercontent.com/Ragnoryok1/dsh-client-locale-ru/main/assets/icon.png",
8
8
  "compatible_versions": ["v0.2.1-rc.2", "v0.2.1-rc.1", "v0.2.1-alpha.5", "v0.2.1-alpha.4", "v0.2.1-alpha.3", "v0.2.1-alpha.2", "v0.2.1-alpha.1", "v0.2.0-rc.2", "v0.2.0-rc.1", "v0.1.7-rc.2", "v0.1.7-rc.1", "v0.1.7-alpha.2"],
9
9
  "screenshots": "images",
@@ -21,17 +21,17 @@
21
21
  [![license](https://img.shields.io/npm/l/%40ragnoryok1%2Fdsh-client-locale-ru)](LICENSE)
22
22
  [![verify](https://github.com/Ragnoryok1/dsh-client-locale-ru/actions/workflows/verify.yml/badge.svg)](https://github.com/Ragnoryok1/dsh-client-locale-ru/actions/workflows/verify.yml)
23
23
  [![dsh](https://img.shields.io/badge/dsh-0.2.1--rc.2%2B-6366f1)](https://github.com/deepseek-ai/deepseek-harness)
24
- [![namespaces](https://img.shields.io/badge/namespaces-81-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
25
- [![strings](https://img.shields.io/badge/strings-4949-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
24
+ [![namespaces](https://img.shields.io/badge/namespaces-90-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
25
+ [![strings](https://img.shields.io/badge/strings-6433-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
26
26
 
27
- Russian (`ru`) language pack for the [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) web GUI (`dsh`). It registers `ru` as a selectable client language through the locale service (`ctx.locale.addLanguage`) plus one dictionary per namespace — 81 namespaces, 4,949 strings, built against dsh `0.2.1-rc.2`. Install with `dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru`, then pick **Русский** in Settings → General. Missing keys fall back to English, so a newer harness keeps working. The scope is the harness's own client interface only — third-party plugin dictionaries are deliberately out of scope, and 11 of the 17 most-downloaded ecosystem plugins ship no strings of their own, so they are already Russian through these namespaces. MIT, community-maintained, not affiliated with DeepSeek.
27
+ Russian (`ru`) language pack for the [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) web GUI (`dsh`). It registers `ru` as a selectable client language through the locale service (`ctx.locale.addLanguage`) plus one dictionary per namespace — 90 namespaces, 6,433 strings, built against dsh `0.2.1-rc.2`. Install with `dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru`, then pick **Русский** in Settings → General. Missing keys fall back to English, so a newer harness keeps working. The scope is the harness's own client interface only — third-party plugin dictionaries are deliberately out of scope, and 11 of the 17 most-downloaded ecosystem plugins ship no strings of their own, so they are already Russian through these namespaces. MIT, community-maintained, not affiliated with DeepSeek.
28
28
 
29
29
  > **If the pack was useful to you, please star the repository.** It is the only signal that a
30
30
  > translation is wanted, and it is what decides which parts get worked on next.
31
31
 
32
32
  ---
33
33
 
34
- The complete inventory is in [NAMESPACES.md](NAMESPACES.md): 81 namespaces, 4949 strings, with the bundled plugin dictionaries marked.
34
+ The complete inventory is in [NAMESPACES.md](NAMESPACES.md): 90 namespaces, 6433 strings, with the bundled plugin dictionaries marked.
35
35
 
36
36
  The plugin names and descriptions on the Plugins page cannot come from this pack: the harness
37
37
  keeps them in `locale/<language>.json` inside each package, builds a translation map from them,
@@ -43,9 +43,9 @@ language pack; only `locale/ru.json` files on the harness side can close them.
43
43
  Plugins outside the harness tree are translated the same way, but their English comes from
44
44
  their own publication: `plugins/<namespace>.json` records the package, version, licence and the
45
45
  English strings extracted from its bundle (`npm run fetch:plugins`). `npm run report:plugins`
46
- It also warns about another thing: when the profile holds a second pack that registers
47
- Russian itself, the language belongs to whoever registered it first — the other one silently
48
- skips its namespaces, and the interface ends up showing someone else's translation.
46
+ It also warns about another thing: when the profile holds a second pack that registers
47
+ Russian itself, the language belongs to whoever registered it first — the other one silently
48
+ skips its namespaces, and the interface ends up showing someone else's translation.
49
49
  shows what in your installation is still English: it walks the profile's `node_modules`, reads
50
50
  each plugin's own dictionary and compares its keys with ours. A plugin without a dictionary is
51
51
  reported as such — there is nothing to translate until it asks for one — and a plugin that
@@ -99,13 +99,13 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
99
99
 
100
100
  After that, the next time `dsh web` starts, **Русский** will appear in the settings. A separate `pnpm add` into a built `dsh web` is not needed — the plugin pulls in the built-in locale through the `locale` service.
101
101
 
102
- If pnpm answers `ERR_PNPM_NO_MATURE_MATCHING_VERSION`, that is not a broken package but a
103
- maturity policy: a profile refuses versions published less than 48 hours ago. Wait a day or
104
- two (the message names the version) or drop the `minimumReleaseAge` limit in the profile
105
- settings.
102
+ If pnpm answers `ERR_PNPM_NO_MATURE_MATCHING_VERSION`, that is not a broken package but a
103
+ maturity policy: a profile refuses versions published less than 48 hours ago. Wait a day or
104
+ two (the message names the version) or drop the `minimumReleaseAge` limit in the profile
105
+ settings.
106
106
  The manifest is checked against the harness's own rules rather than by eye (`npm run check:manifest`, part of `verify`). Each rule was read out of the harness sources and each is a failure the user would otherwise meet first: `parseDshClient` accepts `platform` as any string while the consumers keep only `platform === 'web'`, so a typo like `'Web'` would **silently drop** the client half; a declared `dsh.client` without the `./client` export makes `client-modules` throw; and `dsh.bundle.patch` has to point at a file that exists.
107
107
 
108
- Installing from GitHub works too: `dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru` (the form the plugin catalogue generates, without the npm scope) installs the repository archive, and the built `lib/` is committed — no build runs on your machine, and none is needed. That is exactly why `npm run check:built` (part of `verify`) rebuilds `lib/` and compares it with the commit: a stale bundle in git would reach the user, while the audit would never see it, because the audit reads the sources. The published package is 497 kB: the banner ships as JPEG, and the icon and source map stay out of the npm payload.
108
+ Installing from GitHub works too: `dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru` (the form the plugin catalogue generates, without the npm scope) installs the repository archive, and the built `lib/` is committed — no build runs on your machine, and none is needed. That is exactly why `npm run check:built` (part of `verify`) rebuilds `lib/` and compares it with the commit: a stale bundle in git would reach the user, while the audit would never see it, because the audit reads the sources. The published package is 546 kB: the banner ships as JPEG, and the icon and source map stay out of the npm payload.
109
109
 
110
110
  ## Why hybrid
111
111
 
@@ -167,6 +167,34 @@ another language would edit text this pack does not own — `"quotes"` would bec
167
167
  English interface. The pack listens to `locale/change` and starts or stops the pass on a switch
168
168
  rather than on installation.
169
169
 
170
+ ## Plugin names
171
+
172
+ A plugin's name comes from its own `locale/<language>.json` file, and the locale service
173
+ resolves that map without consulting registered dictionaries — its own documentation says
174
+ «maps do not consult registered dictionaries». A dictionary therefore cannot translate a
175
+ plugin's name: the pack has no access to another package's map, and the English name stays
176
+ English until the plugin itself ships `locale/ru.json`.
177
+
178
+ The pack carries those names itself: 32 plugins, each with the English title and description
179
+ the translation was made from, and the Russian text. The rendered interface passes through a
180
+ pass that puts the Russian text where the English was — in the plugin cards, in the rows of a
181
+ bundle, on a plugin's page and in the settings inventory. The accessible name (`aria-label`)
182
+ is replaced too, so a card is read in Russian as a whole.
183
+
184
+ The pass matches exactly: a string is replaced only when the whole string is one of the titles
185
+ or descriptions the pack knows. A sentence that merely mentions a name keeps its wording;
186
+ code, input fields and the conversation are not touched. Like the typography pass, it runs
187
+ only while Russian is the active language.
188
+
189
+ The same 32 names go to the harness as a patch (`docs/harness-descriptors-ru.patch`): in the
190
+ harness interface the plugins are named in Russian, and the patch gets there first. The patch
191
+ is a build artefact — it is built from the translations and the harness tree, and the gate
192
+ `npm run check:descriptor-patch` fails when the built patch and the committed one differ.
193
+ `npm run check:plugin-names` proves on a real document (jsdom, 11 cases) that the pass
194
+ translates the title, the description, the accessible name and a bundle row — and leaves what
195
+ it must alone.
196
+
197
+
170
198
  ## Checks
171
199
 
172
200
  ```sh
@@ -179,6 +207,8 @@ npm run check:namespaces # NAMESPACES.md matches the built bundle
179
207
  npm run check:tarball # what gets installed: the archive is unpacked and checked
180
208
  npm run check:workflows # both workflows run the whole verify chain
181
209
  npm run check:readmes:pairs # the three READMEs move together (recorded section hashes)
210
+ npm run check:plugin-names # plugin names in Russian on a real document
211
+ npm run check:descriptor-patch # the harness patch matches the translations
182
212
  npm run audit -- <harness tree> # the locale audit
183
213
  npm run verify -- <harness tree> # everything together
184
214
 
@@ -347,32 +377,37 @@ pack never registers, leaves that screen in English while key coverage still loo
347
377
  This is how `settings.sessionLog` was found — the “Upload Session Log” switch on the general
348
378
  settings page.
349
379
 
350
- ## Coverage scope: the official interface only
351
-
352
- The package translates **the harness client's own namespaces** — 81 namespaces, reconciled against
353
- the pinned tag. Third-party plugin dictionaries are deliberately out of scope, and here is
354
- why.
355
-
356
- We checked the 17 most-downloaded plugins in the ecosystem (npm, `keywords:dsh-plugin`,
357
- monthly downloads) and looked at which of them ship strings of their own at all:
358
-
359
- | What we found | Plugins |
360
- |---|---|
361
- | **No strings of their own** — the interface takes its text from harness namespaces | **11 of 17** |
362
- | A large dictionary of their own (confirmed by hand) | 2 — `dshmarket` (~1262 keys), `@nanmicoder/dsh-agent-teams` (420) |
363
- | `.d.ts` types only, no strings | 1 — `dsh-plugin-model-proxy` |
364
- | Needs a separate check | 3 |
365
-
366
- The practical consequence: for **11 of the 17** most popular plugins the Russian interface
367
- already works — their text lives in the shared harness namespaces, which the package translates
368
- in full. A separate dictionary is needed only where a plugin carries strings of its own, and such
369
- a dictionary is a commitment to track someone else's releases: `dshmarket` is already at version 1.66.3,
370
- and its keys change independently of the harness.
371
-
372
- That is why there is one package and one commitment here: **the official interface, translated and
373
- verified**, with no race after other people's dictionaries. Need a specific plugin? Open an issue:
374
- a dictionary for it is possible as a separate layer pinned to a version, rather than as a silent
375
- promise that «покрыто всё».
380
+ ## Coverage scope: the harness and plugin dictionaries
381
+ The package translates **the harness client's own namespaces** — 90 namespaces, reconciled
382
+ against the pinned tag — and **the dictionaries of third-party plugins**: 25 plugins whose
383
+ English text is vendored from their own publication, with the version and the licence.
384
+
385
+ Plugin dictionaries were out of scope before, and there was a reason: `dshmarket` is already
386
+ at version 1.66.44, its keys change independently of the harness, and a silent promise of
387
+ «everything is covered» is not a promise but a debt nobody can collect. The answer turned
388
+ out to be simple: the foreign English text is **vendored** (`npm run fetch:plugins`) and
389
+ stored next to the translation, with the package name, the version and the licence, and the
390
+ audit holds our translation to that snapshot rather than to somebody else's Russian. We
391
+ checked the 17 most-downloaded plugins in the ecosystem (npm, `keywords:dsh-plugin`, monthly
392
+ downloads) and looked at which of them ship strings of their own at all:
393
+
394
+ | What we found | Plugins |
395
+ |---|---|
396
+ | **No strings of their own** — the interface takes its text from harness namespaces | **11 of 17** |
397
+ | A large dictionary of their own (confirmed by hand) | 2 — `dshmarket` (733 keys), `@nanmicoder/dsh-agent-teams` (420) |
398
+ | `.d.ts` types only, no strings | 1 — `dsh-plugin-model-proxy` |
399
+ | Needs a separate check | 3 |
400
+
401
+ For 11 of the 17 most popular plugins the Russian interface already works without a
402
+ dictionary of their own: their text lives in the shared harness namespaces, which the package
403
+ translates in full. Dictionaries exist where a plugin carries strings of its own — there are
404
+ 25 of them, and each records the version its English text was vendored from.
405
+
406
+ Such a dictionary is a commitment to track someone else's releases, but it is now a
407
+ checkable one: a new version of the plugin with different keys shows up as a difference from
408
+ the snapshot instead of as silence. Need a specific plugin? Open an issue: a dictionary for
409
+ it is possible as a separate layer pinned to a version, rather than as a silent promise that
410
+ «everything is covered».
376
411
 
377
412
  ## Development
378
413
 
@@ -426,7 +461,7 @@ The workflow also has a manual run with a «только проверки, бе
426
461
 
427
462
  ## Contents
428
463
 
429
- - `src/client/dicts.ts` — the Russian dictionaries (81 namespaces, 4949 translations, ~3000 lines). This is where the main value lies.
464
+ - `src/client/dicts.ts` — the Russian dictionaries (90 namespaces, 6433 translations, ~6000 lines). This is where the main value lies.
430
465
  - `src/client/index.ts` — the client plugin entry point (registration of `ru` + the dictionaries).
431
466
  - `src/index.ts` — the empty host half (`apply()`).
432
467
  - `cordis.patch.yml` — the profile patch (`- insert:` of the client entry `locale-ru`).
package/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  <!-- deepseek-harness-meta
2
2
  {
3
3
  "name": "Russian (ru) language pack for DeepSeek Harness",
4
- "version": "0.2.7",
4
+ "version": "0.2.9",
5
5
  "tags": ["localization", "russian", "i18n", "web-gui", "language-pack"],
6
- "description": "Full Russian interface (i18n) for the DeepSeek Harness web GUI: 81 namespaces, 4949 translated strings, Russian screen typography, and a locale audit in CI pinned to a harness tag. Includes the automation-task manager and the reminder catalog.",
6
+ "description": "Full Russian interface (i18n) for the DeepSeek Harness web GUI: 90 namespaces, 6433 translated strings, Russian screen typography, and a locale audit in CI pinned to a harness tag. Includes the automation-task manager and the reminder catalog.",
7
7
  "icon": "https://raw.githubusercontent.com/Ragnoryok1/dsh-client-locale-ru/main/assets/icon.png",
8
8
  "compatible_versions": ["v0.2.1-rc.2", "v0.2.1-rc.1", "v0.2.1-alpha.5", "v0.2.1-alpha.4", "v0.2.1-alpha.3", "v0.2.1-alpha.2", "v0.2.1-alpha.1", "v0.2.0-rc.2", "v0.2.0-rc.1", "v0.1.7-rc.2", "v0.1.7-rc.1", "v0.1.7-alpha.2"],
9
9
  "screenshots": "images",
@@ -21,17 +21,17 @@
21
21
  [![license](https://img.shields.io/npm/l/%40ragnoryok1%2Fdsh-client-locale-ru)](LICENSE)
22
22
  [![verify](https://github.com/Ragnoryok1/dsh-client-locale-ru/actions/workflows/verify.yml/badge.svg)](https://github.com/Ragnoryok1/dsh-client-locale-ru/actions/workflows/verify.yml)
23
23
  [![dsh](https://img.shields.io/badge/dsh-0.2.1--rc.2%2B-6366f1)](https://github.com/deepseek-ai/deepseek-harness)
24
- [![namespaces](https://img.shields.io/badge/namespaces-81-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
25
- [![strings](https://img.shields.io/badge/strings-4949-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
24
+ [![namespaces](https://img.shields.io/badge/namespaces-90-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
25
+ [![strings](https://img.shields.io/badge/strings-6433-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
26
26
 
27
- Русский язык для веб-интерфейса DeepSeek Harness: 81 namespaces, 4949 перевод, экранная типографика и аудит локализации в CI.
27
+ Русский язык для веб-интерфейса DeepSeek Harness: 90 namespaces, 6433 перевод, экранная типографика и аудит локализации в CI.
28
28
 
29
29
  > **If the pack was useful to you, please star the repository.** It is the only signal that a
30
30
  > translation is wanted, and it is what decides which parts get worked on next.
31
31
 
32
32
  ---
33
33
 
34
- Полный список того, что переведено, — в [NAMESPACES.md](NAMESPACES.md): 81 namespaces, 4949 строки, с пометкой у словарей плагинов.
34
+ Полный список того, что переведено, — в [NAMESPACES.md](NAMESPACES.md): 90 namespaces, 6433 строки, с пометкой у словарей плагинов.
35
35
 
36
36
  Плагины за пределами дерева харнесса переводятся так же, но их английский текст берётся
37
37
  из их собственной публикации: `plugins/<namespace>.json` хранит пакет, версию, лицензию и
@@ -103,10 +103,10 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
103
103
 
104
104
  Дальше при следующем старте `dsh web` в настройках появится **Русский**. Отдельно `pnpm add` в собранный `dsh web` не нужен — плагин тянет штатную локаль через сервис `locale`.
105
105
 
106
- Если pnpm отвечает `ERR_PNPM_NO_MATURE_MATCHING_VERSION` — это не поломка пакета, а
107
- политика зрелости: профиль не ставит версии, опубликованные меньше 48 часов назад.
108
- Подождите сутки-двое (имя версии в сообщении показывает, сколько осталось) или снимите
109
- ограничение `minimumReleaseAge` в настройках профиля.
106
+ Если pnpm отвечает `ERR_PNPM_NO_MATURE_MATCHING_VERSION` — это не поломка пакета, а
107
+ политика зрелости: профиль не ставит версии, опубликованные меньше 48 часов назад.
108
+ Подождите сутки-двое (имя версии в сообщении показывает, сколько осталось) или снимите
109
+ ограничение `minimumReleaseAge` в настройках профиля.
110
110
  Манифест проверяется по правилам харнесса, а не на глаз (`npm run check:manifest`, входит в
111
111
  `verify`). Правила вычитаны из его исходников и каждое — это отказ, который иначе увидел бы
112
112
  пользователь: `parseDshClient` принимает `platform` любой строкой, но потребители отбирают
@@ -114,7 +114,7 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
114
114
  половину; declared `dsh.client` без экспорта `./client` заставляет `client-modules` бросить
115
115
  ошибку; `dsh.bundle.patch` обязан указывать на существующий файл.
116
116
 
117
- Установка из GitHub тоже работает: `dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru` (в таком виде команду генерирует каталог плагинов, без `@`-скоупа) ставит архив репозитория, а собранный `lib/` лежит в git — сборка на вашей машине не запускается и не требуется. Поэтому `npm run check:built` (входит в `verify`) пересобирает `lib/` и сверяет его с коммитом: устаревший бандл в git иначе получил бы именно пользователь, а аудит этого не увидел бы — он читает исходники. Публикуемый пакет занимает 497 КБ: баннер отдаётся JPEG, а иконка и карта исходников в npm не входят.
117
+ Установка из GitHub тоже работает: `dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru` (в таком виде команду генерирует каталог плагинов, без `@`-скоупа) ставит архив репозитория, а собранный `lib/` лежит в git — сборка на вашей машине не запускается и не требуется. Поэтому `npm run check:built` (входит в `verify`) пересобирает `lib/` и сверяет его с коммитом: устаревший бандл в git иначе получил бы именно пользователь, а аудит этого не увидел бы — он читает исходники. Публикуемый пакет занимает 546 КБ: баннер отдаётся JPEG, а иконка и карта исходников в npm не входят.
118
118
 
119
119
  ## Почему гибрид
120
120
 
@@ -177,6 +177,33 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
177
177
 
178
178
  Правила проверяются скриптом, а не на глаз: `npm run check:typography`.
179
179
 
180
+ ## Имена плагинов
181
+
182
+ Название плагина приходит из его собственного файла `locale/<язык>.json`, а служба локализации
183
+ разрешает эту карту, не обращаясь к зарегистрированным словарям: её собственная документация
184
+ говорит «maps do not consult registered dictionaries». Поэтому словарём название плагина не
185
+ перевести — у пакета нет доступа к чужой карте, и английское название остаётся английским,
186
+ пока сам плагин не привезёт `locale/ru.json`.
187
+
188
+ Пакет несёт эти названия сам: 32 плагина, у каждого английское название и описание — то, из
189
+ чего перевод сделан, — и русское. Отрисованный интерфейс проходит через проход, который
190
+ подставляет русский текст на место английского: в карточках плагинов, в строках состава
191
+ bundle, на странице плагина и в реестре настроек. Подменяется и имя для скринридера
192
+ (`aria-label`), чтобы карточка читалась по-русски целиком.
193
+
194
+ Проход берёт только точное совпадение: строка целиком равна названию или описанию из пакета.
195
+ Предложение, в котором название лишь упомянуто, остаётся как было; код, поля ввода и переписка
196
+ не трогаются. Как и типографский проход, он работает только пока активен русский.
197
+
198
+ Те же 32 названия уходят в харнесс отдельным патчем (`docs/harness-descriptors-ru.patch`): в
199
+ интерфейсе самого харнесса плагины называются по-русски, и патч этот до начала. Патч —
200
+ собираемый артефакт: он строится из переводов и дерева харнесса, а гейт
201
+ `npm run check:descriptor-patch` падает, когда собранный и лежащий в репозитории разошлись.
202
+ `npm run check:plugin-names` доказывает на настоящем документе (jsdom, 11 случаев), что проход
203
+ переводит название, описание, имя для скринридера и строку bundle — и не трогает то, что не
204
+ должен.
205
+
206
+
180
207
  ## Проверки
181
208
 
182
209
  ```sh
@@ -189,6 +216,8 @@ npm run check:namespaces # NAMESPACES.md совпадает с собранн
189
216
  npm run check:tarball # что установят: архив распаковывается и проверяется
190
217
  npm run check:workflows # оба workflow запускают всю цепочку verify
191
218
  npm run check:readmes:pairs # три README двигаются вместе (хеши разделов)
219
+ npm run check:plugin-names # названия плагинов по-русски на настоящем документе
220
+ npm run check:descriptor-patch # патч для харнесса совпадает с переводами
192
221
  npm run audit -- <дерево харнеса> # аудит локали
193
222
  npm run verify -- <дерево харнеса> # всё вместе
194
223
 
@@ -350,7 +379,7 @@ PLAN_NEXT_ACTION_EN`). Пока читался только первый вид,
350
379
  (`list.aria` — «Активные напоминания» в каталоге и «Фоновые задачи» в задачах), поэтому
351
380
  перевод переносится в чужой namespace только там, где оба namespace обслуживает один и
352
381
  тот же словарь. На закреплённом теге отчёт пуст: каждая строка, которую харнесс рисует в
353
- нашем namespace, лежит именно в нём. Сверяются все 81 namespace пака — привязка строится и по
382
+ нашем namespace, лежит именно в нём. Сверяются все 90 namespace пака — привязка строится и по
354
383
  импорту словаря рядом с регистрацией, и по именам, которые передаёт сама регистрирующая
355
384
  строка (`locale.register(NS, { zh, en })`); без второго правила `common` и `settings.locale`,
356
385
  чьи словари лежат в соседнем каталоге, оставались бы вне сверки. Обратная сторона проверяется
@@ -359,32 +388,36 @@ PLAN_NEXT_ACTION_EN`). Пока читался только первый вид,
359
388
  этого не видит. Так нашёлся `settings.sessionLog` — строка «Загружать журнал сессии» на
360
389
  странице общих настроек.
361
390
 
362
- ## Область покрытия: только официальный интерфейс
363
-
364
- Пакет переводит **собственные namespace клиента харнесса** — 81 namespace, сверенные с
365
- закреплённым тегом. Словари сторонних плагинов в область сознательно не входят, и вот
366
- почему.
367
-
368
- Мы проверили 17 самых скачиваемых плагинов экосистемы (npm, `keywords:dsh-plugin`,
369
- скачивания за месяц) и посмотрели, какие из них вообще поставляют собственные строки:
370
-
371
- | Что обнаружено | Плагинов |
372
- |---|---|
373
- | **Своих строк нет** — интерфейс берёт текст из namespace харнеса | **11 из 17** |
374
- | Крупный собственный словарь (подтверждено вручную) | 2 — `dshmarket` (~1262 ключа), `@nanmicoder/dsh-agent-teams` (420) |
375
- | Только типы `.d.ts`, строк нет | 1 — `dsh-plugin-model-proxy` |
376
- | Требует отдельной проверки | 3 |
377
-
378
- Практическое следствие: у **11 из 17** популярнейших плагинов русский интерфейс уже
379
- работает — их текст лежит в общих namespace харнеса, которые пакет переводит полностью.
380
- Отдельный словарь нужен только там, где плагин везёт свои строки, а такой словарь — это
381
- обязательство следить за чужими релизами: у `dshmarket` уже версия 1.66.3, и её ключи
382
- меняются независимо от харнеса.
383
-
384
- Поэтому здесь один пакет и одно обязательство: **официальный интерфейс, переведённый и
385
- проверенный**, без гонки за чужими словарями. Нужен конкретный плагин — заведите issue:
386
- словарь для него возможен как отдельный слой, привязанный к версии, а не как молчаливое
387
- обещание «покрыто всё».
391
+ ## Область покрытия: харнесс и словари плагинов
392
+ Пакет переводит **собственные namespace клиента харнесса** — 90 namespace, сверенные с
393
+ закреплённым тегом, — и **словари сторонних плагинов**: 25 плагинов, чей английский текст
394
+ выгружен из их собственной публикации вместе с версией и лицензией.
395
+
396
+ Раньше словари плагинов в область не входили, и на то была причина: у `dshmarket` уже
397
+ версия 1.66.44, её ключи меняются независимо от харнесса, а молчаливое обещание «покрыто
398
+ всё» — это не обещание, а долг, который нельзя предъявить. Ответ оказался простым: чужой
399
+ английский текст **выгружается** (`npm run fetch:plugins`) и хранится рядом с переводом —
400
+ с именем пакета, версией и лицензией, а аудит сверяет наш перевод именно с этим снимком, а
401
+ не с чужим русским. Мы проверили 17 самых скачиваемых плагинов экосистемы (npm,
402
+ `keywords:dsh-plugin`, скачивания за месяц) и посмотрели, какие из них вообще поставляют
403
+ собственные строки:
404
+
405
+ | Что обнаружено | Плагинов |
406
+ |---|---|
407
+ | **Своих строк нет** — интерфейс берёт текст из namespace харнесса | **11 из 17** |
408
+ | Крупный собственный словарь (подтверждено вручную) | 2 — `dshmarket` (733 ключа), `@nanmicoder/dsh-agent-teams` (420) |
409
+ | Только типы `.d.ts`, строк нет | 1 — `dsh-plugin-model-proxy` |
410
+ | Требует отдельной проверки | 3 |
411
+
412
+ У 11 из 17 популярнейших плагинов русский интерфейс уже работает без отдельного словаря:
413
+ их текст лежит в общих namespace харнесса, которые пакет переводит полностью. Словари
414
+ есть там, где плагин везёт свои строки, — их 25, и у каждого зафиксирована версия, с
415
+ которой выгружен английский текст.
416
+
417
+ Такой словарь — обязательство следить за чужими релизами, но теперь оно проверяемое:
418
+ новая версия плагина с другими ключами видна как расхождение снимка, а не как тишина.
419
+ Нужен конкретный плагин — заведите issue: словарь для него возможен как отдельный слой,
420
+ привязанный к версии, а не как молчаливое обещание «покрыто всё».
388
421
 
389
422
  ## Разработка
390
423
 
@@ -438,7 +471,7 @@ npm run verify -- путь/к/дереву/харнесса
438
471
 
439
472
  ## Содержимое
440
473
 
441
- - `src/client/dicts.ts` — русские словари (81 namespaces, 4949 перевод, ~3000 строк). Это и есть основная ценность.
474
+ - `src/client/dicts.ts` — русские словари (90 namespaces, 6433 перевод, ~6000 строк). Это и есть основная ценность.
442
475
  - `src/client/index.ts` — точка входа клиентского плагина (регистрация `ru` + словарей).
443
476
  - `src/index.ts` — пустая host-половина (`apply()`).
444
477
  - `cordis.patch.yml` — профиль-патч (`- insert:` клиентской строки `locale-ru`).