@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 +54 -0
- package/NAMESPACES.md +11 -2
- package/README.en.md +76 -41
- package/README.md +72 -39
- package/README.zh.md +53 -32
- package/images/plugins-ru.png +0 -0
- package/images/settings-ru.png +0 -0
- package/lib/client.js +1940 -20
- package/lib/typography.d.ts +3 -1
- package/lib/typography.js +1 -1
- package/package.json +6 -3
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
|
-
Пакет переводит **
|
|
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
|
-
Итого: **
|
|
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.
|
|
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:
|
|
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)
|
|
22
22
|
[](https://github.com/Ragnoryok1/dsh-client-locale-ru/actions/workflows/verify.yml)
|
|
23
23
|
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
24
|
-
[](https://github.com/Ragnoryok1/dsh-client-locale-ru)
|
|
25
|
+
[](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 —
|
|
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):
|
|
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
|
|
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
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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 (
|
|
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.
|
|
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:
|
|
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)
|
|
22
22
|
[](https://github.com/Ragnoryok1/dsh-client-locale-ru/actions/workflows/verify.yml)
|
|
23
23
|
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
24
|
-
[](https://github.com/Ragnoryok1/dsh-client-locale-ru)
|
|
25
|
+
[](https://github.com/Ragnoryok1/dsh-client-locale-ru)
|
|
26
26
|
|
|
27
|
-
Русский язык для веб-интерфейса DeepSeek Harness:
|
|
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):
|
|
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 иначе получил бы именно пользователь, а аудит этого не увидел бы — он читает исходники. Публикуемый пакет занимает
|
|
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, лежит именно в нём. Сверяются все
|
|
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
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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` — русские словари (
|
|
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`).
|