@ragnoryok1/dsh-client-locale-ru 0.2.22 → 0.2.24

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
@@ -1,3 +1,31 @@
1
+ ## [0.2.24] — 2026-10-30
2
+
3
+ ### Изменено
4
+
5
+ - **Слово «локализация» в описании.** 0.2.23 выиграл запрос «russian language pack»
6
+ (4-е место из 25 — раньше нас там не было вовсе), но «русская локализация» и
7
+ «russian localization» остались вне выдачи: этого слова в описании не было, а у
8
+ `@goodandready/dsh-russian-lang` оно есть. Добавлены обе формы — английская и
9
+ русская.
10
+
11
+ Замеры после 0.2.23: «locale ru» — 1-е, «русский интерфейс» — 2-е, «dsh ru» — 3-е,
12
+ «russian language pack» — 4-е, «русский deepseek» — 4-е, «перевод интерфейса» — 17-е;
13
+ «dsh russian», «russian dsh», «dsh locale» — по-прежнему слабо (25-е и вне 25).
14
+
15
+ ## [0.2.23] — 2026-10-30
16
+
17
+ ### Изменено
18
+
19
+ - **Метаданные под поиск npm.** Поиск весит имя, описание и ключевые слова, а в нашем
20
+ имени слова «russian» нет. Описание теперь содержит целую фразу «Russian language
21
+ pack» и русское предложение — под запросы «russian language pack» и «русская
22
+ локализация», где нас раньше не было в выдаче вовсе. Заодно исправлено число
23
+ плагинов: 520 → 522.
24
+
25
+ Замеры до правки: «locale ru» — 1-е место, «dsh ru» — 3-е, «русский deepseek» —
26
+ 4-е, но «dsh russian», «russian dsh», «russian language pack» и «русская
27
+ локализация» — за пределами первых 25.
28
+
1
29
  ## [0.2.22] — 2026-10-28
2
30
 
3
31
  ### Добавлено
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.22",
4
+ "version": "0.2.24",
5
5
  "tags": ["localization", "russian", "i18n", "web-gui", "language-pack"],
6
- "description": "Russian for the DeepSeek Harness web GUI: the whole interface plus the menus of 520 third-party plugins — 594 sections, 69 177 strings.",
6
+ "description": "Russian language pack and full Russian localization for the DeepSeek Harness web GUI: the whole interface plus the menus of 522 third-party plugins — 594 sections, 69 177 strings. Русский язык и полная локализация веб-интерфейса DeepSeek Harness: весь интерфейс и меню 522 плагинов, 594 раздела, 69 177 строк.",
7
7
  "icon": "https://raw.githubusercontent.com/Ragnoryok1/dsh-client-locale-ru/main/assets/icon.png",
8
8
  "compatible_versions": ["v0.2.2-alpha.2", "v0.2.1-rc.3", "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",
@@ -107,7 +107,7 @@ two (the message names the version) or drop the `minimumReleaseAge` limit in the
107
107
  settings.
108
108
  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.
109
109
 
110
- 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 2019 kB: the banner ships as JPEG, and the icon and source map stay out of the npm payload.
110
+ 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 2023 kB: the banner ships as JPEG, and the icon and source map stay out of the npm payload.
111
111
 
112
112
  ## Why hybrid
113
113
 
@@ -202,6 +202,13 @@ translates the title, the description, the accessible name and a bundle row —
202
202
  it must alone.
203
203
 
204
204
 
205
+ ## If you want to translate the harness into your language
206
+
207
+ The order of work, the pitfalls and the checks we went through are collected in
208
+ [docs/how-to-translate-dsh.md](docs/how-to-translate-dsh.md): how to find namespaces, why templates
209
+ must never be collected by key across files, what a runtime dependency change does to a translation,
210
+ and how to hand publishing over to CI.
211
+
205
212
  ## License
206
213
 
207
214
  MIT
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.22",
4
+ "version": "0.2.24",
5
5
  "tags": ["localization", "russian", "i18n", "web-gui", "language-pack"],
6
- "description": "Russian for the DeepSeek Harness web GUI: the whole interface plus the menus of 520 third-party plugins — 594 sections, 69 177 strings.",
6
+ "description": "Russian language pack and full Russian localization for the DeepSeek Harness web GUI: the whole interface plus the menus of 522 third-party plugins — 594 sections, 69 177 strings. Русский язык и полная локализация веб-интерфейса DeepSeek Harness: весь интерфейс и меню 522 плагинов, 594 раздела, 69 177 строк.",
7
7
  "icon": "https://raw.githubusercontent.com/Ragnoryok1/dsh-client-locale-ru/main/assets/icon.png",
8
8
  "compatible_versions": ["v0.2.2-alpha.2", "v0.2.1-rc.3", "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",
@@ -95,7 +95,7 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
95
95
 
96
96
  清单按 harness 自身的规则检查,而不是靠肉眼(`npm run check:manifest`,包含在 `verify` 中)。每一条规则都取自 harness 源码,每一条都对应一种否则会先落到用户头上的失败:`parseDshClient` 接受任意字符串作为 `platform`,但消费方只保留 `platform === 'web'` 的行,因此写成 `'Web'` 这样的笔误会**悄悄关掉**客户端那一半;声明了 `dsh.client` 却没有 `./client` 导出会让 `client-modules` 抛错;`dsh.bundle.patch` 必须指向确实存在的文件。
97
97
 
98
- 从 GitHub 安装同样可用:`dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru`(插件目录生成的就是这种不带 npm scope 的写法)安装的是仓库归档,而构建好的 `lib/` 已提交进 git——你的机器上不会运行构建,也不需要运行。正因如此,`npm run check:built`(包含在 `verify` 中)会重新构建 `lib/` 并与提交内容比对:git 里过期的构建产物会直接落到用户手里,而审计看不到它——审计读的是源码。发布的包为 2019 kB:横幅以 JPEG 提供,图标与源码映射不进入 npm 包。
98
+ 从 GitHub 安装同样可用:`dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru`(插件目录生成的就是这种不带 npm scope 的写法)安装的是仓库归档,而构建好的 `lib/` 已提交进 git——你的机器上不会运行构建,也不需要运行。正因如此,`npm run check:built`(包含在 `verify` 中)会重新构建 `lib/` 并与提交内容比对:git 里过期的构建产物会直接落到用户手里,而审计看不到它——审计读的是源码。发布的包为 2023 kB:横幅以 JPEG 提供,图标与源码映射不进入 npm 包。
99
99
 
100
100
  ## 为什么是混合插件
101
101
 
@@ -135,6 +135,12 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
135
135
  同样这 32 个名称会作为补丁(`docs/harness-descriptors-ru.patch`)送到 harness:在 harness 自己的界面里插件也有俄文名称,而这个补丁先到。补丁是构建产物——它由翻译和 harness 目录树生成,门禁 `npm run check:descriptor-patch` 在生成的补丁与仓库里那份不一致时失败。第三方插件的名称放在 `src/client/plugin-names-ru.json`:这个文件由插件词典生成(`npm run build:plugin-names`),门禁 `npm run check:plugin-names:map` 在它与词典不一致时失败。同一个英文名称不能有两种译法——harness 与插件各说各话。`npm run check:plugin-names` 在真实文档上证明(jsdom,12 个用例)这个流程会翻译标题、说明、朗读名称和 bundle 的一行,而该不动的它不动。
136
136
 
137
137
 
138
+ ## 想把 harness 翻译成自己的语言
139
+
140
+ 我们走过的顺序、坑和检查都整理在 [docs/how-to-translate-dsh.md](docs/how-to-translate-dsh.md):
141
+ 如何找到各个命名空间、为什么不能跨文件按 key 收集模板、运行时依赖变更会怎样影响译文,
142
+ 以及如何把发布交给 CI。
143
+
138
144
  ## 许可证
139
145
 
140
146
  MIT
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.22",
4
+ "version": "0.2.24",
5
5
  "tags": ["localization", "russian", "i18n", "web-gui", "language-pack"],
6
- "description": "Russian for the DeepSeek Harness web GUI: the whole interface plus the menus of 520 third-party plugins — 594 sections, 69 177 strings.",
6
+ "description": "Russian language pack and full Russian localization for the DeepSeek Harness web GUI: the whole interface plus the menus of 522 third-party plugins — 594 sections, 69 177 strings. Русский язык и полная локализация веб-интерфейса DeepSeek Harness: весь интерфейс и меню 522 плагинов, 594 раздела, 69 177 строк.",
7
7
  "icon": "https://raw.githubusercontent.com/Ragnoryok1/dsh-client-locale-ru/main/assets/icon.png",
8
8
  "compatible_versions": ["v0.2.2-alpha.2", "v0.2.1-rc.3", "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",
@@ -106,7 +106,7 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
106
106
  половину; declared `dsh.client` без экспорта `./client` заставляет `client-modules` бросить
107
107
  ошибку; `dsh.bundle.patch` обязан указывать на существующий файл.
108
108
 
109
- Установка из GitHub тоже работает: `dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru` (в таком виде команду генерирует каталог плагинов, без `@`-скоупа) ставит архив репозитория, а собранный `lib/` лежит в git — сборка на вашей машине не запускается и не требуется. Поэтому `npm run check:built` (входит в `verify`) пересобирает `lib/` и сверяет его с коммитом: устаревший бандл в git иначе получил бы именно пользователь, а аудит этого не увидел бы — он читает исходники. Публикуемый пакет занимает 2019 КБ: баннер отдаётся JPEG, а иконка и карта исходников в npm не входят.
109
+ Установка из GitHub тоже работает: `dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru` (в таком виде команду генерирует каталог плагинов, без `@`-скоупа) ставит архив репозитория, а собранный `lib/` лежит в git — сборка на вашей машине не запускается и не требуется. Поэтому `npm run check:built` (входит в `verify`) пересобирает `lib/` и сверяет его с коммитом: устаревший бандл в git иначе получил бы именно пользователь, а аудит этого не увидел бы — он читает исходники. Публикуемый пакет занимает 2023 КБ: баннер отдаётся JPEG, а иконка и карта исходников в npm не входят.
110
110
 
111
111
  ## Почему гибрид
112
112
 
@@ -201,6 +201,13 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
201
201
  должен.
202
202
 
203
203
 
204
+ ## Если хотите перевести харнесс на свой язык
205
+
206
+ Порядок, ловушки и проверки, через которые мы прошли, собраны в
207
+ [`docs/how-to-translate-dsh.md`](docs/how-to-translate-dsh.md): как найти секции, почему
208
+ нельзя собирать шаблоны по одному ключу из любого файла, что делает с переводом смена
209
+ зависимости рантайма и как отдать публикацию CI.
210
+
204
211
  ## Лицензия
205
212
 
206
213
  MIT
@@ -0,0 +1,119 @@
1
+ # Как перевести DeepSeek Harness на свой язык
2
+
3
+ Это руководство — наш опыт перевода веб-клиента DSH на русский: 594 секции и 69 177 строк,
4
+ которые сейчас работают у нескольких тысяч человек. Здесь нет теории локализации; здесь
5
+ описано, как устроен словарь харнесса, что ломается на каждом шаге и как это проверить
6
+ машиной, а не глазами.
7
+
8
+ ## Как устроены строки в DSH
9
+
10
+ Веб-клиент не держит текста в компонентах. Каждый пакет объявляет секцию и словарь:
11
+
12
+ ```ts
13
+ locale.register('settings.models', {
14
+ en: { reorderModel: 'Reorder model', fetchKeepOne: 'Keep at least one model checked.' },
15
+ zh: { reorderModel: '重新排序模型', fetchKeepOne: '至少保留一个选中的模型。' },
16
+ })
17
+ ```
18
+
19
+ Секция — это пространство имён; ключ уникален внутри неё, но не между секциями: `cancel`
20
+ есть в десятках словарей, и это разные строки. Рантайм `@deepseek-ai/dsh-client-locale`
21
+ подменяет словарь на клиенте, поэтому сторонний перевод не требует правок в харнессе.
22
+
23
+ Найти все секции:
24
+
25
+ ```bash
26
+ grep -rE "register\(\s*['\"]|PropsLocale<\s*['\"]|export const NS = ['\"]" packages --include=*.ts --include=*.tsx
27
+ ```
28
+
29
+ ## Шаг 1. Соберите английские строки
30
+
31
+ Не переводите из интерфейса: словарь придётся поддерживать, а не пересматривать. Выгрузите
32
+ `en` каждой секции в JSON — это ваш вход и ваш эталон:
33
+
34
+ ```js
35
+ const start = /(?:export\s+)?const\s+en\b[^=]*=\s*\{/.exec(text) // где словарь
36
+ // дальше — сбалансированные скобки от первого `{`, чтобы не зацепить `zh`
37
+ ```
38
+
39
+ Две ловушки, на которых мы потеряли часы:
40
+
41
+ - **Словарь не всегда в том же файле.** `register` живёт в `mount.ts`, а `en` — в
42
+ соседнем `locales.ts`. Если в файле регистрации словаря нет, смотрите каталог.
43
+ - **Имя секции не всегда литерал.** Бывает `export const NS = 'cuaPermissions'` плюс
44
+ `register(NS, …)`. Ищите тройку: `register('x')`, `PropsLocale<'x'>`, `NS = 'x'`.
45
+
46
+ ## Шаг 2. Переводите ключ за ключом, не строку за строкой
47
+
48
+ Правила, которые у нас выросли в проверки:
49
+
50
+ - **Плейсхолдеры неприкосновенны.** `{count}`, `{name}`, `{version}` обязаны остаться
51
+ в переводе, иначе строка отрисуется с пустотой. Проверяется регуляркой по обеим сторонам.
52
+ - **Формы числа.** Там, где английский держит `one`/`other`, русский держит три формы.
53
+ Мы генерируем пары из одного шаблона и требуем, чтобы форма `one` и `other`
54
+ существовали вместе с базовым ключом.
55
+ - **Технические имена не переводятся:** имена продуктов (`DSH`, `LiveShare`), названия
56
+ шрифтов (`Comic Sans MS`), обозначения клавиш (`Ctrl+S`), команды (`dsh plugin remove …`).
57
+ Держите их в отдельном списке разрешений, иначе очередная проверка их «исправит».
58
+ - **Один термин — один перевод.** У нас `session` — всегда «сессия», `turn` — «раунд»,
59
+ `step` — «шаг». Без глоссария через сто строк появляется «сеанс», и это видно в интерфейсе.
60
+
61
+ ## Шаг 3. Проверяйте машиной
62
+
63
+ Всё, что можно проверить, должно падать на сборке. Наши проверки, которые реально ловили
64
+ дефекты:
65
+
66
+ | проверка | что ловит |
67
+ |---|---|
68
+ | ключи, которых нет в шаблоне | опечатка в ключе: строка молча не появляется |
69
+ | ключи, добавленные харнессом | новый ключ без перевода после обновления |
70
+ | пары форм числа | пропущенная форма, и вместо числа — пусто |
71
+ | плейсхолдеры | `{count}` потерян или переименован |
72
+ | остатки латиницы и иероглифов | непереведённая строка |
73
+ | запрещённые термины | «сеанс» рядом с «сессия» |
74
+ | длина относительно шаблона | перевод втрое длиннее и рвёт вёрстку |
75
+
76
+ **Главная ловушка проверок:** не собирайте шаблоны «по ключу из любого файла». Ключ
77
+ `cancel` есть в сотнях словарей, и если сложить их в одну кучу, любая русская строка
78
+ совпадёт с русской строкой из чужой локализации. У нас из-за этого проверка выдавала
79
+ 2 368 ложных находок, за которыми не было видно трёх настоящих. Сравнивайте в пределах
80
+ секции — или отсекайте шаблоны с кириллицей, если секции нет.
81
+
82
+ ## Шаг 4. Держите синхронизацию с харнессом
83
+
84
+ Харнесс двигается быстро: за неделю вышло три тега, и один из них (0.2.2-alpha.2) добавил
85
+ 745 строк в девяти новых секциях. Плановый прогон проверок против свежего дерева — это не
86
+ роскошь, а способ не отстать на релиз:
87
+
88
+ ```bash
89
+ git -C ../deepseek-harness fetch --tags
90
+ git -C ../deepseek-harness checkout dsh-v0.2.2-alpha.2
91
+ npm run verify -- ../deepseek-harness/packages
92
+ ```
93
+
94
+ Отдельно проверяйте **совместимость рантайма**: у 0.2.2-alpha.2 сменилась зависимость
95
+ (`cordis@~4.0.6-alpha.1`), и наш диапазон её не пускал — установка падала с `ERESOLVE`,
96
+ пока мы не расширили `peerDependencies`.
97
+
98
+ ## Шаг 5. Не доверяйте именам секций
99
+
100
+ Секции приходят из кода, и в них попадает мусор. У нас жили две «секции» с именами файлов
101
+ (`.runs.json`, `.ndjson.zst`) — 72 строки, которых никто никогда не видел, и они искажали
102
+ и счёт, и проверки. Если имя секции похоже на имя файла или оканчивается точкой — почти
103
+ наверняка это ошибка разбора, а не словарь.
104
+
105
+ ## Шаг 6. Выпускайте так, чтобы это можно было повторить
106
+
107
+ - Собранный код держите в репозитории и сверяйте пересборкой с коммитом: иначе
108
+ пользователь получит устаревший бандл, а проверки этого не увидят.
109
+ - Публикацию отдайте CI по тегу: у нас ручная публикация дважды застревала на 2FA,
110
+ и версии просто не доезжали до реестра.
111
+ - Числа в README (секции, строки, размер) считайте из пакета, а не вручную: за релиз
112
+ они разъезжаются дважды.
113
+
114
+ ## Что почитать у нас
115
+
116
+ - `scripts/audit.mjs` — все проверки в одном месте, включая отсечку шаблонов с кириллицей.
117
+ - `scripts/keep-english.json` — список того, что остаётся латиницей, с причиной для каждой записи.
118
+ - `scripts/terminology.json` — глоссарий и запрещённые варианты.
119
+ - `docs/harness-descriptors-ru.patch` — как переводятся описания плагинов в каталоге.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ragnoryok1/dsh-client-locale-ru",
3
- "description": "Russian for the DeepSeek Harness web GUI: the whole interface plus the menus of 520 third-party plugins — 594 sections, 69 177 strings.",
4
- "version": "0.2.22",
3
+ "description": "Russian language pack and full Russian localization for the DeepSeek Harness web GUI: the whole interface plus the menus of 522 third-party plugins — 594 sections, 69 177 strings. Русский язык и полная локализация веб-интерфейса DeepSeek Harness: весь интерфейс и меню 522 плагинов, 594 раздела, 69 177 строк.",
4
+ "version": "0.2.24",
5
5
  "keywords": [
6
6
  "dsh",
7
7
  "deepseek-harness",
@@ -10,8 +10,11 @@
10
10
  "dsh-locale",
11
11
  "dsh-i18n",
12
12
  "dsh-russian",
13
+ "russian-language-pack",
14
+ "russian-localization",
13
15
  "language-pack",
14
16
  "locale",
17
+ "ru-RU",
15
18
  "i18n",
16
19
  "l10n",
17
20
  "localization",
@@ -131,6 +134,7 @@
131
134
  "README-zh.md",
132
135
  "CHANGELOG.md",
133
136
  "LICENSE",
134
- "NAMESPACES.md"
137
+ "NAMESPACES.md",
138
+ "docs/how-to-translate-dsh.md"
135
139
  ]
136
140
  }