@ragnoryok1/dsh-client-locale-ru 0.2.8 → 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,33 @@
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
+
9
36
  ## [0.2.8] — 2026-10-19
10
37
 
11
38
  ### Добавлено
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.8",
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,
@@ -105,7 +105,7 @@ two (the message names the version) or drop the `minimumReleaseAge` limit in the
105
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 504 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
 
@@ -377,32 +377,37 @@ pack never registers, leaves that screen in English while key coverage still loo
377
377
  This is how `settings.sessionLog` was found — the “Upload Session Log” switch on the general
378
378
  settings page.
379
379
 
380
- ## Coverage scope: the official interface only
381
-
382
- The package translates **the harness client's own namespaces** — 81 namespaces, reconciled against
383
- the pinned tag. Third-party plugin dictionaries are deliberately out of scope, and here is
384
- why.
385
-
386
- We checked the 17 most-downloaded plugins in the ecosystem (npm, `keywords:dsh-plugin`,
387
- monthly downloads) and looked at which of them ship strings of their own at all:
388
-
389
- | What we found | Plugins |
390
- |---|---|
391
- | **No strings of their own** — the interface takes its text from harness namespaces | **11 of 17** |
392
- | A large dictionary of their own (confirmed by hand) | 2 — `dshmarket` (~1262 keys), `@nanmicoder/dsh-agent-teams` (420) |
393
- | `.d.ts` types only, no strings | 1 — `dsh-plugin-model-proxy` |
394
- | Needs a separate check | 3 |
395
-
396
- The practical consequence: for **11 of the 17** most popular plugins the Russian interface
397
- already works — their text lives in the shared harness namespaces, which the package translates
398
- in full. A separate dictionary is needed only where a plugin carries strings of its own, and such
399
- a dictionary is a commitment to track someone else's releases: `dshmarket` is already at version 1.66.3,
400
- and its keys change independently of the harness.
401
-
402
- That is why there is one package and one commitment here: **the official interface, translated and
403
- verified**, with no race after other people's dictionaries. Need a specific plugin? Open an issue:
404
- a dictionary for it is possible as a separate layer pinned to a version, rather than as a silent
405
- 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».
406
411
 
407
412
  ## Development
408
413
 
@@ -456,7 +461,7 @@ The workflow also has a manual run with a «только проверки, бе
456
461
 
457
462
  ## Contents
458
463
 
459
- - `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.
460
465
  - `src/client/index.ts` — the client plugin entry point (registration of `ru` + the dictionaries).
461
466
  - `src/index.ts` — the empty host half (`apply()`).
462
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.8",
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` хранит пакет, версию, лицензию и
@@ -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 иначе получил бы именно пользователь, а аудит этого не увидел бы — он читает исходники. Публикуемый пакет занимает 504 КБ: баннер отдаётся 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
 
@@ -379,7 +379,7 @@ PLAN_NEXT_ACTION_EN`). Пока читался только первый вид,
379
379
  (`list.aria` — «Активные напоминания» в каталоге и «Фоновые задачи» в задачах), поэтому
380
380
  перевод переносится в чужой namespace только там, где оба namespace обслуживает один и
381
381
  тот же словарь. На закреплённом теге отчёт пуст: каждая строка, которую харнесс рисует в
382
- нашем namespace, лежит именно в нём. Сверяются все 81 namespace пака — привязка строится и по
382
+ нашем namespace, лежит именно в нём. Сверяются все 90 namespace пака — привязка строится и по
383
383
  импорту словаря рядом с регистрацией, и по именам, которые передаёт сама регистрирующая
384
384
  строка (`locale.register(NS, { zh, en })`); без второго правила `common` и `settings.locale`,
385
385
  чьи словари лежат в соседнем каталоге, оставались бы вне сверки. Обратная сторона проверяется
@@ -388,32 +388,36 @@ PLAN_NEXT_ACTION_EN`). Пока читался только первый вид,
388
388
  этого не видит. Так нашёлся `settings.sessionLog` — строка «Загружать журнал сессии» на
389
389
  странице общих настроек.
390
390
 
391
- ## Область покрытия: только официальный интерфейс
392
-
393
- Пакет переводит **собственные namespace клиента харнесса** — 81 namespace, сверенные с
394
- закреплённым тегом. Словари сторонних плагинов в область сознательно не входят, и вот
395
- почему.
396
-
397
- Мы проверили 17 самых скачиваемых плагинов экосистемы (npm, `keywords:dsh-plugin`,
398
- скачивания за месяц) и посмотрели, какие из них вообще поставляют собственные строки:
399
-
400
- | Что обнаружено | Плагинов |
401
- |---|---|
402
- | **Своих строк нет** — интерфейс берёт текст из namespace харнеса | **11 из 17** |
403
- | Крупный собственный словарь (подтверждено вручную) | 2 — `dshmarket` (~1262 ключа), `@nanmicoder/dsh-agent-teams` (420) |
404
- | Только типы `.d.ts`, строк нет | 1 — `dsh-plugin-model-proxy` |
405
- | Требует отдельной проверки | 3 |
406
-
407
- Практическое следствие: у **11 из 17** популярнейших плагинов русский интерфейс уже
408
- работает — их текст лежит в общих namespace харнеса, которые пакет переводит полностью.
409
- Отдельный словарь нужен только там, где плагин везёт свои строки, а такой словарь — это
410
- обязательство следить за чужими релизами: у `dshmarket` уже версия 1.66.3, и её ключи
411
- меняются независимо от харнеса.
412
-
413
- Поэтому здесь один пакет и одно обязательство: **официальный интерфейс, переведённый и
414
- проверенный**, без гонки за чужими словарями. Нужен конкретный плагин — заведите issue:
415
- словарь для него возможен как отдельный слой, привязанный к версии, а не как молчаливое
416
- обещание «покрыто всё».
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
+ привязанный к версии, а не как молчаливое обещание «покрыто всё».
417
421
 
418
422
  ## Разработка
419
423
 
@@ -467,7 +471,7 @@ npm run verify -- путь/к/дереву/харнесса
467
471
 
468
472
  ## Содержимое
469
473
 
470
- - `src/client/dicts.ts` — русские словари (81 namespaces, 4949 перевод, ~3000 строк). Это и есть основная ценность.
474
+ - `src/client/dicts.ts` — русские словари (90 namespaces, 6433 перевод, ~6000 строк). Это и есть основная ценность.
471
475
  - `src/client/index.ts` — точка входа клиентского плагина (регистрация `ru` + словарей).
472
476
  - `src/index.ts` — пустая host-половина (`apply()`).
473
477
  - `cordis.patch.yml` — профиль-патч (`- insert:` клиентской строки `locale-ru`).
package/README.zh.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.8",
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,16 +21,16 @@
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](https://github.com/deepseek-ai/deepseek-harness) Web 界面(`dsh`)的俄语(`ru`)语言包。它通过 locale 服务(`ctx.locale.addLanguage`)把 `ru` 注册为可选的客户端语言,并为每个 namespace 提供一份词典——共 81 个 namespace、4,949 条翻译,基于 dsh `0.2.1-alpha.3` 构建。用 `dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru` 安装,然后在 Settings → General 中选择 **Русский**。缺失的 key 会回退到英文,因此更新的 harness 也能照常工作。覆盖范围仅限 harness 自带的客户端界面——第三方插件的词典有意不纳入范围,而下载量最高的 17 个生态插件中有 11 个不提供自己的字符串,所以它们通过这些 namespace 已经是俄语界面了。MIT 许可,由社区维护,与 DeepSeek 无隶属关系。
27
+ [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web 界面(`dsh`)的俄语(`ru`)语言包。它通过 locale 服务(`ctx.locale.addLanguage`)把 `ru` 注册为可选的客户端语言,并为每个 namespace 提供一份词典——共 90 个 namespace、6,433 条翻译,基于 dsh `0.2.1-alpha.3` 构建。用 `dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru` 安装,然后在 Settings → General 中选择 **Русский**。缺失的 key 会回退到英文,因此更新的 harness 也能照常工作。覆盖范围仅限 harness 自带的客户端界面——第三方插件的词典有意不纳入范围,而下载量最高的 17 个生态插件中有 11 个不提供自己的字符串,所以它们通过这些 namespace 已经是俄语界面了。MIT 许可,由社区维护,与 DeepSeek 无隶属关系。
28
28
 
29
29
  > **如果这个包对你有用,请给仓库点一颗 star。** 这是表明「有人需要这份翻译」的唯一信号,它也决定了接下来优先做哪些部分。
30
30
 
31
31
  ---
32
32
 
33
- 完整清单见 [NAMESPACES.md](NAMESPACES.md):81 个 namespace、4949 条字符串,随包附带的插件词典单独标注。
33
+ 完整清单见 [NAMESPACES.md](NAMESPACES.md):90 个 namespace、6433 条字符串,随包附带的插件词典单独标注。
34
34
 
35
35
  如果 pnpm 报 `ERR_PNPM_NO_MATURE_MATCHING_VERSION`,这不是包坏了,而是成熟度策略:配置文件
36
36
  不安装发布不足 48 小时的版本。等一两天(报错信息里写着版本号),或在配置文件设置里去掉
@@ -90,7 +90,7 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
90
90
 
91
91
  清单按 harness 自身的规则检查,而不是靠肉眼(`npm run check:manifest`,包含在 `verify` 中)。每一条规则都取自 harness 源码,每一条都对应一种否则会先落到用户头上的失败:`parseDshClient` 接受任意字符串作为 `platform`,但消费方只保留 `platform === 'web'` 的行,因此写成 `'Web'` 这样的笔误会**悄悄关掉**客户端那一半;声明了 `dsh.client` 却没有 `./client` 导出会让 `client-modules` 抛错;`dsh.bundle.patch` 必须指向确实存在的文件。
92
92
 
93
- 从 GitHub 安装同样可用:`dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru`(插件目录生成的就是这种不带 npm scope 的写法)安装的是仓库归档,而构建好的 `lib/` 已提交进 git——你的机器上不会运行构建,也不需要运行。正因如此,`npm run check:built`(包含在 `verify` 中)会重新构建 `lib/` 并与提交内容比对:git 里过期的构建产物会直接落到用户手里,而审计看不到它——审计读的是源码。发布的包为 504 KB:横幅以 JPEG 提供,图标与源码映射不进入 npm 包。
93
+ 从 GitHub 安装同样可用:`dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru`(插件目录生成的就是这种不带 npm scope 的写法)安装的是仓库归档,而构建好的 `lib/` 已提交进 git——你的机器上不会运行构建,也不需要运行。正因如此,`npm run check:built`(包含在 `verify` 中)会重新构建 `lib/` 并与提交内容比对:git 里过期的构建产物会直接落到用户手里,而审计看不到它——审计读的是源码。发布的包为 546 KB:横幅以 JPEG 提供,图标与源码映射不进入 npm 包。
94
94
 
95
95
  ## 为什么是混合插件
96
96
 
@@ -169,24 +169,32 @@ npm run diff:harness -- <old> <new> # harness 改写了哪些英文
169
169
 
170
170
  标签的新旧由单独的 workflow 盯守:`watch-upstream` 每周把锁定的标签与 harness 的标签比对一次,出现更新的标签就开一个 issue(内含操作步骤)并把运行标红——让「落后」按计划被发现,而不是靠用户的截图。版本比较无需网络即可验证(`npm run check:upstream`,五个用例),并且纳入 `verify`:正式版本必须比自己的预发布版本更新,否则盯守会永远报警。
171
171
 
172
- 覆盖率数字不是门禁:有些分区是有意保留英文的。紧随其后,审计会打印**按 namespace** 的报告:它根据注册方重建「namespace → 词典」的对应关系(`NS` 声明,或 `locale.register` 里的字面量;`bind` 与 `PropsLocale` 只是读取 namespace),并列出既不在自己 namespace、也不在运行时回退所用的 `common` 词典中的 key。全局比较 key 名称看不到这类空洞:放在别的 namespace 下的翻译会被算作已覆盖,而那个界面实际显示英文。该报告仅供参考——同名 key 在不同 namespace 下含义可能不同(`list.aria` 在提醒目录里是「活动提醒」,在任务里是「后台任务」),因此只有在两个 namespace 由同一份词典提供服务时才会跨 namespace 搬运翻译。在锁定的标签上,该报告为空:harness 在我们注册的 namespace 里渲染的每一条字符串,都位于该 namespace。本包的全部 81 个 namespace 都会被比对——对应关系既来自紧邻注册处的词典导入,也来自注册语句本身传入的名称(`locale.register(NS, { zh, en })`);若没有第二条规则,词典位于相邻目录的 `common` 与 `settings.locale` 就会落在检查之外。反方向是硬失败而不是参考报告:harness 注册并填充了 key、而本包从不注册的 namespace,会让那个界面停留在英文,而按 key 名称统计的覆盖率看起来依然完整。`settings.sessionLog` 正是这样被发现的——通用设置页上的「上传 Session Log」开关。
173
-
174
- ## 覆盖范围:仅官方界面
175
-
176
- 本包翻译的是 **harness 客户端自有的 namespace**——共 81 个 namespace,已与锁定标签核对。第三方插件的词典有意不在范围内,原因如下。
177
-
178
- 我们检查了生态中下载量最高的 17 个插件(npm、`keywords:dsh-plugin`、月下载量),看其中哪些会提供自己的字符串:
179
-
180
- | 发现的情况 | 插件数 |
181
- |---|---|
182
- | **没有自己的字符串**——界面文本取自 harness 的 namespace | **17 个中的 11 个** |
183
- | 较大的自有词典(已人工确认) | 2 个——`dshmarket`(约 1262 个 key)、`@nanmicoder/dsh-agent-teams`(420) |
184
- | 只有 `.d.ts` 类型,没有字符串 | 1 个——`dsh-plugin-model-proxy` |
185
- | 需要单独检查 | 3 个 |
186
-
187
- 实际结论:在最流行的插件中,**17 个里有 11 个**的俄语界面已经可用——它们的文本位于 harness 的公共 namespace 中,而本包已把这些 namespace 完整翻译。只有插件自带字符串时才需要单独的词典,而这样的词典意味着一份要跟进别人发布节奏的责任:`dshmarket` 已经到 1.66.3 版本,它的 key 变化与 harness 无关。
188
-
189
- 所以这里只有一个包、一份承诺:**官方界面,已翻译并经过检查**,不去追赶别人的词典。需要某个具体插件——请开 issue:可以为它做一个绑定版本的独立层词典,而不是默默地承诺「全部都覆盖了」。
172
+ 覆盖率数字不是门禁:有些分区是有意保留英文的。紧随其后,审计会打印**按 namespace** 的报告:它根据注册方重建「namespace → 词典」的对应关系(`NS` 声明,或 `locale.register` 里的字面量;`bind` 与 `PropsLocale` 只是读取 namespace),并列出既不在自己 namespace、也不在运行时回退所用的 `common` 词典中的 key。全局比较 key 名称看不到这类空洞:放在别的 namespace 下的翻译会被算作已覆盖,而那个界面实际显示英文。该报告仅供参考——同名 key 在不同 namespace 下含义可能不同(`list.aria` 在提醒目录里是「活动提醒」,在任务里是「后台任务」),因此只有在两个 namespace 由同一份词典提供服务时才会跨 namespace 搬运翻译。在锁定的标签上,该报告为空:harness 在我们注册的 namespace 里渲染的每一条字符串,都位于该 namespace。本包的全部 90 个 namespace 都会被比对——对应关系既来自紧邻注册处的词典导入,也来自注册语句本身传入的名称(`locale.register(NS, { zh, en })`);若没有第二条规则,词典位于相邻目录的 `common` 与 `settings.locale` 就会落在检查之外。反方向是硬失败而不是参考报告:harness 注册并填充了 key、而本包从不注册的 namespace,会让那个界面停留在英文,而按 key 名称统计的覆盖率看起来依然完整。`settings.sessionLog` 正是这样被发现的——通用设置页上的「上传 Session Log」开关。
173
+
174
+ ## 覆盖范围:harness 与插件词典
175
+ 本包翻译 **harness 客户端自有的 namespace**——共 90 个 namespace,已与锁定标签核对——以及
176
+ **第三方插件的词典**:25 个插件,其英文文本连同版本与许可证一起从它们自己的发布物中提取。
177
+
178
+ 此前插件词典不在范围内,理由是:`dshmarket` 已经到 1.66.44 版本,它的 key 变化与 harness
179
+ 无关,而「全部都覆盖了」这种无声承诺不是承诺,是一笔没人能讨的债。答案其实很简单:把
180
+ 别人的英文文本**提取出来**(`npm run fetch:plugins`),与翻译放在一起——带上包名、版本与
181
+ 许可证,审计比对的正是这份快照,而不是别人的俄语。我们检查了生态中下载量最高的 17 个
182
+ 插件(npm、`keywords:dsh-plugin`、月下载量),看其中哪些会提供自己的字符串:
183
+
184
+ | 发现的情况 | 插件数 |
185
+ |---|---|
186
+ | **没有自己的字符串**——界面文本取自 harness 的 namespace | **17 个中的 11 个** |
187
+ | 较大的自有词典(已人工确认) | 2 个——`dshmarket`(733 个 key)、`@nanmicoder/dsh-agent-teams`(420) |
188
+ | 只有 `.d.ts` 类型,没有字符串 | 1 个——`dsh-plugin-model-proxy` |
189
+ | 需要单独检查 | 3 个 |
190
+
191
+ 在最流行的 17 个插件里,有 11 个的俄语界面无需单独词典即可工作——它们的文本位于 harness
192
+ 的公共 namespace 中,而本包已把这些 namespace 完整翻译。词典存在于插件自带字符串的地方,
193
+ 共 25 个,每个都记着提取英文文本时所依据的版本。
194
+
195
+ 这样的词典意味着要跟进别人的发布节奏,但现在这份责任是可核查的:插件的新版本带来不同的
196
+ key 时,表现为与快照的差异,而不是一片沉默。需要某个具体插件——请开 issue:可以为它做一个
197
+ 绑定版本的独立层词典,而不是默默地承诺「全部都覆盖了」。
190
198
 
191
199
  ## 开发
192
200
 
@@ -228,7 +236,7 @@ npm run verify -- путь/к/дереву/харнесса
228
236
 
229
237
  ## 内容
230
238
 
231
- - `src/client/dicts.ts`——俄语词典(81 个 namespace、4949 条翻译、约 3000 行)。这正是本包的核心价值。
239
+ - `src/client/dicts.ts`——俄语词典(90 个 namespace、6433 条翻译、约 6000 行)。这正是本包的核心价值。
232
240
  - `src/client/index.ts`——客户端插件入口(注册 `ru` 和词典)。
233
241
  - `src/index.ts`——空的宿主部分(`apply()`)。
234
242
  - `cordis.patch.yml`——profile 补丁(`- insert:` 客户端条目 `locale-ru`)。
Binary file
Binary file