@ragnoryok1/dsh-client-locale-ru 0.2.16 → 0.2.18

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/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.16",
4
+ "version": "0.2.18",
5
5
  "tags": ["localization", "russian", "i18n", "web-gui", "language-pack"],
6
- "description": "Full Russian (ru) interface for the DeepSeek Harness web GUI: 584 namespaces, 67666 strings, 520 third-party plugin dictionaries, Russian screen typography and Russian plural forms, with a locale audit in CI pinned to a harness tag.",
6
+ "description": "Russian for the DeepSeek Harness web GUI: the whole interface plus the menus of 520 third-party plugins — 584 sections, 67 666 strings.",
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",
@@ -13,7 +13,7 @@
13
13
 
14
14
  # @ragnoryok1/dsh-client-locale-ru
15
15
 
16
- **Русский** | [English](README.en.md) | [中文](README.zh.md)
16
+ **Русский** | [English](README-en.md) | [中文](README-zh.md)
17
17
 
18
18
  ![Русский языковой пакет для DeepSeek Harness](assets/banner.jpg)
19
19
 
@@ -24,7 +24,15 @@
24
24
  [![namespaces](https://img.shields.io/badge/namespaces-584-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
25
25
  [![strings](https://img.shields.io/badge/strings-67666-6466f1)](https://github.com/Ragnoryok1/dsh-client-locale-ru)
26
26
 
27
- Русский (`ru`) язык для веб-интерфейса [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (`dsh`). Пакет регистрирует `ru` как выбираемый язык клиента через сервис локали (`ctx.locale.addLanguage`) и везёт по словарю на каждый namespace — 584 namespace, 67 666 строк, сборка под dsh `0.2.1-rc.2`. Установка: `dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru`, затем **Русский** в Settings → General. Недостающие ключи падают в английский, поэтому более новый харнесс продолжает работать. Область — собственный интерфейс харнесса (64 namespace и 2 996 строк) и словари 521 стороннего плагина, переведённые с английского, который публикует сам плагин. MIT, поддерживается сообществом, не связан с DeepSeek.
27
+ Плагин делает интерфейс [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) русским. Переводится всё, что вы видите: настройки, боковые панели, диалоги, подсказки, сообщения об ошибках — и меню сторонних плагинов, у которых нет своего русского перевода.
28
+
29
+ Сейчас в пакете 584 раздела и 67 666 строк, из них 520 словарей сторонних плагинов — больше, чем у любого другого русского пакета для харнесса, который я смог найти.
30
+
31
+ Установка — одна команда: `dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru`, дальше русский выбирается в настройках, в разделе General.
32
+
33
+ Кроме перевода плагин делает три вещи, которых харнесс сам не умеет: подставляет русские формы числа («1 вызов», «2 вызова», «5 вызовов»), приводит текст к русской типографике («ёлочки», длинное тире, многоточие) и переводит названия плагинов, у которых нет своей локали. Каждую из этих надстроек можно выключить одной строкой в профиле — перевод при этом останется.
34
+
35
+ Пакет не меняет файлы харнесса и не трогает ваши данные. Если в новой версии харнесса появится строка, которой в пакете ещё нет, она останется английской: интерфейс продолжит работать. Лицензия MIT, пакет поддерживается сообществом и не связан с DeepSeek.
28
36
 
29
37
  > **If the pack was useful to you, please star the repository.** It is the only signal that a
30
38
  > translation is wanted, and it is what decides which parts get worked on next.
@@ -98,7 +106,7 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
98
106
  половину; declared `dsh.client` без экспорта `./client` заставляет `client-modules` бросить
99
107
  ошибку; `dsh.bundle.patch` обязан указывать на существующий файл.
100
108
 
101
- Установка из GitHub тоже работает: `dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru` (в таком виде команду генерирует каталог плагинов, без `@`-скоупа) ставит архив репозитория, а собранный `lib/` лежит в git — сборка на вашей машине не запускается и не требуется. Поэтому `npm run check:built` (входит в `verify`) пересобирает `lib/` и сверяет его с коммитом: устаревший бандл в git иначе получил бы именно пользователь, а аудит этого не увидел бы — он читает исходники. Публикуемый пакет занимает 2013 КБ: баннер отдаётся JPEG, а иконка и карта исходников в npm не входят.
109
+ Установка из GitHub тоже работает: `dsh plugin --profile web add Ragnoryok1/dsh-client-locale-ru` (в таком виде команду генерирует каталог плагинов, без `@`-скоупа) ставит архив репозитория, а собранный `lib/` лежит в git — сборка на вашей машине не запускается и не требуется. Поэтому `npm run check:built` (входит в `verify`) пересобирает `lib/` и сверяет его с коммитом: устаревший бандл в git иначе получил бы именно пользователь, а аудит этого не увидел бы — он читает исходники. Публикуемый пакет занимает 1976 КБ: баннер отдаётся JPEG, а иконка и карта исходников в npm не входят.
102
110
 
103
111
  ## Почему гибрид
104
112
 
@@ -193,403 +201,6 @@ dsh plugin --profile web add @ragnoryok1/dsh-client-locale-ru
193
201
  должен.
194
202
 
195
203
 
196
- ## Проверки
197
-
198
- ```sh
199
- npm run build # сборка трёх выходов
200
- npm run check:typography # 18 правил типографики, включая «не трогать»
201
- npm run check:locale # сосуществование словарей: 6 проверок
202
- npm run check:plural # формы числа: 1 вызов / 2 вызова / 5 вызовов
203
- npm run check:composition # собранные фразы: «Пн, Ср в 09:00», «Раз в 2 дня»
204
- npm run check:namespaces # NAMESPACES.md совпадает с собранным бандлом
205
- npm run check:tarball # что установят: архив распаковывается и проверяется
206
- npm run check:workflows # оба workflow запускают всю цепочку verify
207
- npm run check:readmes:pairs # три README двигаются вместе (хеши разделов)
208
- npm run check:plugin-names # названия плагинов по-русски на настоящем документе
209
- npm run check:descriptor-patch # патч для харнесса совпадает с переводами
210
- npm run audit -- <дерево харнеса> # аудит локали
211
- npm run verify -- <дерево харнеса> # всё вместе
212
-
213
- npm run namespaces # перегенерировать NAMESPACES.md и pack-count.json
214
- npm run readmes:record # перезаписать хеши разделов после правки трёх README
215
- npm run diff:harness -- <старое> <новое> # что харнесс переформулировал
216
- ```
217
-
218
- Отдельная проверка складывает фразы так, как это делает харнесс, и читает результат
219
- целиком. Аудит сверяет значение с его собственным шаблоном, поэтому фраза, верная в
220
- одиночку, но сломанная подстановкой, для него невидима: `frequency.weekly` был переведён
221
- как «По {weekdays} в {time}», а дни приходят как «Пн, Ср» — получалось «По Пн, Ср в 09:00»,
222
- чего не увидит ни одна построчная проверка. Так же проверяются «Каждые 2 дня» (теперь «Раз в
223
- 2 дня»), «Каждый день в 09:00 (Europe/Moscow)» и составной интервал с формами числа.
224
- Третье, что нашлось этим же способом: `time.locale` — не текст, а тег для `Intl`, и он был
225
- `en`. Правило с ограничением по месяцу показывало «Каждый день в January», а подпись
226
- часового пояса — «Moscow Standard Time» в русском интерфейсе. Теперь тег `ru` (у китайского
227
- словаря харнесса точно так же `zh-CN`), а месяц встаёт в скобки: «Каждый день (январь,
228
- март)».
229
-
230
- Тот же разбор по частям нашёлся в описании cron. Там были сокращения («Каждые {step} мин»,
231
- «Каждые {count} ч») и книжные обороты («в минуту {minutes}», «минуты {minutes} в часы
232
- {hours}»). Счётные части получили формы числа — «Каждые 3 минуты» / «Каждые 5 минут»,
233
- «Каждые 2 часа» / «Каждые 6 часов», — а остальные части переписаны в один читаемый вид с
234
- метками: «Каждый час, минуты: 5, 30», «минуты: 5, часы: 09–17». Вся фраза расписания
235
- складывается проверкой целиком: «Пн–Пт каждые 5 минут». Тем же способом закреплены даты: отметка «5 окт. 2026 г., 15:51» и подпись пояса «Москва, стандартное время» — из Intl с нашим тегом, без единого латинского слова.
236
-
237
- Аудит выполняется в CI (`.github/workflows/verify.yml`) против **закреплённого тега**
238
- харнеса, а не против случайного локального чекаута. Раз в неделю тот же прогон запускается
239
- по расписанию: перевод гниёт и без наших правок — харнесс уезжает вперёд, локально всё
240
- зелено, а расхождение всплывает только при сборке у пользователя. Гейтами проверяются
241
- полнота (ключи и namespace), формы числа, плейсхолдеры, остатки английского и китайского,
242
- терминология, латиница в прозе, гигиена текста, краевые пробелы, стиль, типографика значений,
243
- «ё», составные фразы, длина подписей в боковой панели и заявленные числа — и каждая из этих
244
- проверок уже ловила настоящие дефекты. Рядом аудит печатает **справочные
245
- отчёты**, которые гейтом не являются, потому что требуют решения человека: сколько
246
- namespace сверено и какие не удалось привязать, остались ли места «число + склоняемое
247
- слово», и не выросли ли короткие строки больше чем в 2,8 раза от английского (риск для
248
- вёрстки — «Effort» → «Уровень рассуждения» это нормальная длина русского, а не дефект).
249
-
250
- Шаблоны харнесса аудит читает в том виде, в каком их пишут: строкой, **массивом абзацев**
251
- (так хранятся руководства режимов) и **ссылкой на константу** (`'hint.plan':
252
- PLAN_NEXT_ACTION_EN`). Пока читался только первый вид, десять ключей — восемь из них целые
253
- руководства — молча выпадали из сверки. И наоборот: пустой файл политики (`keep-english.json`,
254
- пустой раздел `terminology.json`) теперь валит аудит, а не ослабляет гейт незаметно. Так же
255
- сверяются и числа, которые README о себе заявляют: устаревший счётчик — это просто неверное
256
- утверждение, и аудит читает его из бейджа, описания и текста всех трёх README, а также из
257
- описания в `package.json` — того, что npm показывает в поиске и на странице пакета (там
258
- дольше всех жило «55 namespaces»), включая
259
- разряды («2,542 строки») — именно эта запись дольше всех держала в себе число 2,489, пока
260
- гейт видел только форму без разрядов. Там же сверяется и фраза о том, против какой версии
261
- харнесса пакет собран: она сравнивается с тегом, закреплённым в workflow, потому что
262
- проверяет пакет именно он (оба README обещали `0.2.1-alpha.2`, когда CI уже стоял на
263
- `dsh-v0.2.1-rc.2`). Там же меряется и размер публикуемого пакета: `npm run check:size`
264
- собирает архив и сравнивает заявленные килобайты с настоящими (допуск в один килобайт — gzip
265
- на разных сборках Node сжимает чуть иначе, а сама фраза округлена до целых килобайт).
266
-
267
- - **мёртвые namespace** — каждый namespace, который регистрирует пакет, обязан
268
- существовать в харнессе. В 0.1.6 переводы каталога расписания были зарегистрированы
269
- под именем `schedule.manager`, тогда как читает их `schedule.catalog`: проверка покрытия
270
- по ключам при этом рапортовала «всё переведено»;
271
- - **пары форм числа** — множества `.one`/`.other` должны совпадать, потому что клиент
272
- выбирает форму как `count === 1 ? '.one' : '.other'`. Этого мало для русского: каждой
273
- паре нужны ещё `.few` и `.many`, иначе обёртка молча вернётся к нейтральному `.other` и
274
- вместо «2 дня» покажет «2 д». Проверка сверяет это **по namespace** — обёртка ищет форму
275
- в том namespace, который спросил, поэтому пара, забытая в одном экране при наличии в
276
- другом, иначе осталась бы незамеченной. Так нашлись четыре единицы времени
277
- (`unit.day/hour/minute/second` в `schedule.catalog`) и `trigger` в менеджере задач;
278
- заодно единицы перестали быть сокращениями («д», «ч», «мин») и получили полные формы в
279
- нужном падеже — «через 2 дня», «через 5 часов», а «Каждые 2 дня» стало «Раз в 2 дня».
280
- То же требование действует и для ключей, которые пакет добавил сам (`terminal.expand` и
281
- родственные: харнесс передаёт им счёт, но пары не заводит) — их формы держатся только
282
- нами, и потеря одной ничем больше не обнаружилась бы;
283
- - **плейсхолдеры** — русское значение обязано нести ровно те `{name}`, что и английский
284
- шаблон ключа: лишний плейсхолдер попадает на экран буквально (`Заняло {duration}7мин 26с`,
285
- исправлено в #2), а потерянный молча убирает подставленное значение. Для пакетов,
286
- которые везут только китайский словарь, шаблоном служит `zh`. Наши **собственные формы
287
- числа** — добавленные `.few`/`.many` и `.one` у ключа, который харнесс не паровал, — в
288
- харнессе отсутствуют, поэтому сверяются с шаблоном соседней формы того же слова (`.one`/
289
- `.other`) или самого ключа. Без этого 52 значения не проверялись вовсе: именно так из
290
- формы может пропасть `{count}`, и на экране останется фраза без числа.
291
- - **остатки** — значение обязано быть русским: точная копия английского шаблона, китайский
292
- иероглиф или пустая строка там, где шаблон не пуст, — это ошибка. Копии английского
293
- допускаются только по решению, записанному в `scripts/keep-english.json` (адреса,
294
- форматные строки без слов, названия протоколов и инструментов, аббревиатуры), поэтому
295
- новая недопереведённая строка не проедет молча. Сами решения тоже проверяются: запись,
296
- которая больше ничего не разрешает, валит сборку — либо ключа в пакете уже нет, либо
297
- значение перевели и решение устарело. Так нашлась запись про `deepSeekBaseUrl`: английский
298
- шаблон обзавёлся пояснением про `DEEPSEEK_BASE_URL`, а подсказка в поле ввода — пример
299
- адреса, поэтому пояснение на экране было бы мусором внутри поля. Запись убрана, значение
300
- оставлено. Решение может называть и целый закрытый список: `chat · app.*` разрешает
301
- тридцать названий приложений одной строкой — словарь имён приложений и есть список имён.
302
- А значения без слов вне плейсхолдеров (`{from}–{to}`, `{percent}%`, `, `) решения не
303
- требуют вовсе: переводить в них нечего, и политика остаётся про слова, а не про
304
- пунктуацию. Сверка остатков читает **все** шаблоны ключа, а не только блок `en`: раньше
305
- 60 значений в словарях с неопознанным блоком не проверялись вовсе, теперь сверено 2911
306
- значения, 68 из них покрыты решениями (38 записей, одна из них — шаблон), и зона исчезла
307
- как класс. Шире от этого правило не стало: пустое значение — ошибка только там, где ни
308
- один шаблон не пуст, иначе русский справедливо опускает префикс, который английский тоже
309
- опускает (`message.stepProcess.sharedPrefix`). И точное совпадение — не единственный вид
310
- копии: значение, отличающееся от шаблона только регистром или краевыми пробелами
311
- (`Cancel` при шаблоне `cancel`), — это тот же непереведённый текст, и оно тоже требует
312
- решения. Иначе такая строка читалась бы как английская, а все проверки оставались бы
313
- зелёными.
314
- - **мёртвые ключи** — ключ, которого нет ни в одном словаре харнесса и на который не
315
- ссылается ни один его исходник, — это остаток от прежней версии: он ничего не показывает
316
- и только путает. Такие ключи валят сборку. Ключ, который компонент всё ещё спрашивает,
317
- остаётся в справочном отчёте: его значение — единственное, что может попасть на экран.
318
- - **терминология** — одно понятие переводится одним способом. Запрещённые варианты («кеш»
319
- вместо «кэш», «сеанс» вместо «сессия», «этап» вместо «шаг») валят сборку, а
320
- `scripts/terminology.json` хранит и решение, и счётчики выбранных форм, чтобы дрейф был
321
- виден раньше, чем станет дефектом. Проверка сразу нашла ключ `confirm.description`,
322
- переведённый в двух namespace по-разному — «шаги» и «этапы». Слово не может писаться с «ё»
323
- и без него: «ещё» и «еще» в одном пакете читаются как машинный перевод, поэтому «ё» внутри
324
- проверки сводится к «е», и два написания одной формы валят сборку. Исключения — настоящие
325
- разные слова вроде «все» и «всё»: они объявлены в `scripts/yo-pairs.json`, а запись, чьи
326
- написания из пакета ушли, тоже валит сборку. Там же проверяется латиница
327
- внутри русских фраз: имя продукта, команды или код-токен допустимы, простое английское
328
- слово в предложении — нет. Название продукта обязано писаться так, как его пишет харнесс:
329
- «Github Desktop» вместо «GitHub Desktop» читается как опечатка в имени продукта, и
330
- появляется она только у нас. Ориентир — английские шаблоны; слово, которое харнесс пишет
331
- только строчными («cursor», «desktop»), не считается — там заглавная буква как раз и
332
- означает имя продукта. Рядом проверяется механическая гигиена: двойные пробелы,
333
- пробел перед знаком препинания, непарные «ёлочки» и скобки, неразрывный пробел внутри
334
- значения, а также краевые пробелы — значение, которое начинается или кончается пробелом,
335
- компонент склеивает с соседним, поэтому оно обязано совпадать с английским шаблоном
336
- своего namespace. Тем же шаблоном сверяется стиль: если английский кончается знаком,
337
- русский не должен его терять (на этом проверка нашла `registryCustomHint` без точки),
338
- а регистр первой буквы обязан совпадать — кроме сокращений вроде `JSON` и шаблонов,
339
- начинающихся с плейсхолдера. Отдельно проверяется обращение к пользователю: внутри фразы
340
- русский интерфейс пишет «вы» со строчной, а «Вы» с заглавной — только в начале предложения,
341
- где это просто орфография. Наконец, пакет сверяется сам с собой: одну и ту же английскую
342
- фразу он обязан переводить одним способом. Если два namespace дают разные русские
343
- предложения (считаются шаблоны от четырёх слов — короткая подпись законно зависит от
344
- контекста), сборка падает. Так нашёлся `confirm.description`: один вариант обещал
345
- «пропускать шаги подтверждения», другой — «уменьшать число шагов», а английское
346
- «subsequent tasks» во втором стало «текущей задачей». Намеренное расхождение объявляется
347
- в `scripts/one-rendering.json` вместе с причиной, и устаревшее исключение тоже валит
348
- сборку — иначе список решений тихо расширял бы проверку. Обратное направление печатается
349
- справочно: одинаковый русский ответ на **разные** английские фразы от четырёх слов — это
350
- след копипасты (подсказка, приехавшая от соседнего ключа) либо два разных факта, слитых в
351
- одну фразу. Гейтом это быть не может: русский законно сливает слова, которые английский
352
- различает, — поэтому обе стороны печатаются рядом, и решение принимает человек.
353
-
354
- За свежестью тега следит отдельный workflow: `watch-upstream` раз в неделю сравнивает
355
- закреплённый тег с тегами харнесса, при новом открывает issue со списком шагов и красит
356
- прогон — чтобы отставание находилось по расписанию, а не по чужому скриншоту. Сравнение
357
- версий проверяется без сети (`npm run check:upstream`: порядок предрелизов, равенство версий,
358
- переход между линиями) и входит в `verify`:
359
- релиз должен быть новее собственных предрелизов, иначе дозор срабатывал бы вечно.
360
-
361
- Число покрытия не является гейтом: часть разделов пакет сознательно оставляет на английском.
362
- Рядом печатается отчёт **по namespace**: аудит восстанавливает связь «namespace → словарь»
363
- по тому, кто его регистрирует (`NS` или литерал в `locale.register`; `bind` и `PropsLocale`
364
- только читают namespace), и показывает ключи, которых нет ни в своём namespace, ни в общем
365
- `common`, куда рантайм падает при поиске. Глобальное сравнение имён такие дыры не видит:
366
- перевод, лежащий под чужим namespace, считается покрытием, а экран в это время показывает
367
- английский. Отчёт справочный — одинаковое имя в разных namespace может значить разное
368
- (`list.aria` — «Активные напоминания» в каталоге и «Фоновые задачи» в задачах), поэтому
369
- перевод переносится в чужой namespace только там, где оба namespace обслуживает один и
370
- тот же словарь. На закреплённом теге отчёт пуст: каждая строка, которую харнесс рисует в
371
- нашем namespace, лежит именно в нём. Сверяются все 584 namespace пака — привязка строится и по
372
- импорту словаря рядом с регистрацией, и по именам, которые передаёт сама регистрирующая
373
- строка (`locale.register(NS, { zh, en })`); без второго правила `common` и `settings.locale`,
374
- чьи словари лежат в соседнем каталоге, оставались бы вне сверки. Обратная сторона проверяется
375
- жёстко: namespace, который харнесс регистрирует и наполняет ключами, а пак не регистрирует, —
376
- это отказ сборки, потому что такой экран остаётся английским, а покрытие по именам ключей
377
- этого не видит. Так нашёлся `settings.sessionLog` — строка «Загружать журнал сессии» на
378
- странице общих настроек.
379
-
380
- ## Область покрытия: харнесс и словари плагинов
381
- Пакет переводит **собственные namespace клиента харнесса** — 64 namespace сверенных с
382
- закреплённым тегом, — и **словари сторонних плагинов**: 520 плагинов, чей английский текст
383
- выгружен из их собственной публикации вместе с версией и лицензией.
384
-
385
- Поиск по реестру npm — шесть запросов вместо одного «dsh» — нашёл ещё 40 плагинов со своим
386
- словарём. 39 из них переведены; три имени (`dsh-automation`, `remote`, `settings.ip-pool`)
387
- уже заняты словарями других плагинов и оставлены прежним владельцам, чтобы не подменить
388
- перевод чужого продукта. Итог на 22 октября 2026: **584 namespace, 67 666 значений,
389
- 520 словарей, 47 700 различных русских строк** в собранном пакете. Замер конкурентов тем же
390
- методом — [docs/competitors.md](https://github.com/Ragnoryok1/dsh-client-locale-ru/blob/main/docs/competitors.md).
391
-
392
- Раньше словари плагинов в область не входили, и на то была причина: у `dshmarket` уже
393
- версия 1.66.44, её ключи меняются независимо от харнесса, а молчаливое обещание «покрыто
394
- всё» — это не обещание, а долг, который нельзя предъявить. Ответ оказался простым: чужой
395
- английский текст **выгружается** (`npm run fetch:plugins`) и хранится рядом с переводом —
396
- с именем пакета, версией и лицензией, а аудит сверяет наш перевод именно с этим снимком, а
397
- не с чужим русским. Мы проверили 17 самых скачиваемых плагинов экосистемы (npm,
398
- `keywords:dsh-plugin`, скачивания за месяц) и посмотрели, какие из них вообще поставляют
399
- собственные строки:
400
-
401
- | Что обнаружено | Плагинов |
402
- |---|---|
403
- | **Своих строк нет** — интерфейс берёт текст из namespace харнесса | **11 из 17** |
404
- | Крупный собственный словарь (подтверждено вручную) | 2 — `dshmarket` (733 ключа), `@nanmicoder/dsh-agent-teams` (420) |
405
- | Только типы `.d.ts`, строк нет | 1 — `dsh-plugin-model-proxy` |
406
- | Требует отдельной проверки | 3 |
407
-
408
- У 11 из 17 популярнейших плагинов русский интерфейс уже работает без отдельного словаря:
409
- их текст лежит в общих namespace харнесса, которые пакет переводит полностью. Словари
410
- есть там, где плагин везёт свои строки, — их 32, и у каждого зафиксирована версия, с
411
- которой выгружен английский текст.
412
-
413
- Такой словарь — обязательство следить за чужими релизами, но теперь оно проверяемое:
414
- новая версия плагина с другими ключами видна как расхождение снимка, а не как тишина.
415
- Нужен конкретный плагин — заведите issue: словарь для него возможен как отдельный слой,
416
- привязанный к версии, а не как молчаливое обещание «покрыто всё».
417
-
418
- ## Разработка
419
-
420
- ```sh
421
- pnpm install
422
- pnpm run build # tsdown -> lib/index.js (node half) + lib/client.js (client bundle)
423
- npm pack # -> ragnoryok1-dsh-client-locale-ru-<version>.tgz
424
- ```
425
-
426
- `lib/client.js` собирается в формате, который понимает клиентский загрузчик `dsh` (`__ModuleLoader__.load`), и экспортирует `inject`/`apply`.
427
-
428
- ## Релизы
429
-
430
- Публикация в npm выполняется workflow `publish` по тегу — учётные данные лежат в секрете
431
- репозитория (`NPM_TOKEN`), поэтому токен не нужно ни вводить в терминал, ни пересылать.
432
- Ручная публикация с машины возможна, но не нужна.
433
-
434
- ```
435
- npm version 0.3.0 --no-git-tag-version # поднять версию в package.json
436
- # …и синхронно обновить версию в блоке deepseek-harness-meta в этом README
437
- git commit -am "release: 0.3.0" && git tag v0.3.0 && git push origin v0.3.0
438
- ```
439
-
440
- Перед публикацией workflow проверяет:
441
-
442
- 1. версия в теге совпадает с версией в `package.json`;
443
- 2. версия в блоке `deepseek-harness-meta` совпадает с `package.json` — маркетплейс берёт её оттуда,
444
- причём читает **только при первой индексации**, поэтому расхождение не исправляется само;
445
- 3. типографику (18 правил);
446
- 4. аудит локализации против закреплённого тега харнесса — мёртвые namespace, дубли и пары форм
447
- числа упадут и остановят публикацию;
448
- 5. **совместимость со всеми версиями из `compatible_versions`**: для каждой скачивается её
449
- рантайм локали с npm и против него прогоняются три набора — сосуществование языков, формы
450
- числа и собранные фразы (`npm run check:compat`, входит в CI) — обещание в meta-блоке
451
- проверяется, а не подразумевается.
452
-
453
- Отдельно проверяется само **объявление** совместимости (`npm run check:peers`, входит в
454
- `verify`): харнесс читает наши `peerDependencies` для `@deepseek-ai/dsh*` не как версии пакетов,
455
- а как диапазон **версий рантайма** и с `includePrerelease` — и если диапазон не удовлетворит
456
- работающий dsh, пользователь увидит предупреждение о несовместимости и запрос на исключение.
457
- Скрипт прогоняет это правило харнесса по всем заявленным версиям: сейчас проходят все восемь.
458
-
459
- Проверить всё то же локально, без публикации:
460
-
461
- ```
462
- npm run verify -- путь/к/дереву/харнесса
463
- ```
464
-
465
- Для workflow есть ручной запуск с переключателем «только проверки, без публикации»
466
- (`workflow_dispatch` → `dry-run`).
467
-
468
- ## Содержимое
469
-
470
- - `src/client/dicts.ts` — русские словари: 584 namespace и 67 666 строк, файл 71 453 строки. Это и есть основная ценность.
471
- - `src/client/index.ts` — точка входа клиентского плагина (регистрация `ru` + словарей).
472
- - `src/index.ts` — пустая host-половина (`apply()`).
473
- - `cordis.patch.yml` — профиль-патч (`- insert:` клиентской строки `locale-ru`).
474
-
475
- ## Что переведено
476
-
477
- Актуальный набор — по тегам харнеса: ключи сняты с профильного коммита, а добавленные
478
- позже падают на `en` при поиске, поэтому пакет не ломает интерфейс на новых версиях.
479
-
480
- ### 0.1.7 — исправлен мёртвый namespace, переведён менеджер задач, переписаны числительные
481
-
482
- Главное в релизе — **исправление ошибки из 0.1.6**. Тогда было записано, что namespace
483
- `schedule.catalog` упразднён, а его место занял `schedule.manager`. На деле в харнесе
484
- **оба** namespace живут и по отдельности: `schedule.catalog` — это каталог напоминаний в
485
- шапке сессии с частотами и единицами, `schedule.manager` — новый менеджер задач
486
- автоматизации. Из-за неверного вывода ~30 строк переводов (напоминания, частота, единицы
487
- времени) были зарегистрированы под именем, которое никто не читает, и **никогда не
488
- показывались** в интерфейсе. Теперь каталог зарегистрирован как `schedule.catalog`.
489
-
490
- - **исправлено:** переводы каталога расписания снова видны — `trigger.*`, `list.*`,
491
- `delete.*`, `frequency.*`, `cron.*`, `unit.*`, `relative.*`, `mark.aria`, `hover.more`;
492
- - **добавлен `schedule.manager`** (188 ключей) — менеджер задач автоматизации целиком на
493
- русском: панель и каталог задач, поиск, фильтр состояний, сведения о задаче и её вкладки,
494
- **журнал запусков** с правилами хранения, редактор расписания (дата, время, час, минута,
495
- секунда, часовой пояс, интервал повтора), правила повтора (разово, каждые N минут/часов/
496
- секунд, ежедневно, пн–пт, еженедельно, свой cron), cron-форма с выбором дат и минуты,
497
- удаление с подтверждением, уведомления и карточки;
498
- - **числительные переписаны** (17 пар ключей): формы, которые ломались на числах 2–4,
499
- заменены на корректные при любом `n ≥ 2` — например «2 субагентов» → «Субагентов: 2»,
500
- «каждые 2 часов» → «каждые 2 ч». Ещё 8 строк с `{count}` перед склоняемым словом
501
- переведены на сокращения: «ещё 3 строк» → «ещё 3 стр.»;
502
- - **добавлено 7 ключей**, которые отсутствовали: `blocked.composer`,
503
- `defaultWorkspace.title`, `schedule.active`, `settings.transcript.expanded`,
504
- `status.scheduled`, `status.overdue` и namespace `shortcuts.layout` (подпись команды
505
- показа левой панели);
506
- - **новая проверка в проекте:** аудит имён namespace. Прежняя проверка покрытия
507
- сверяла ключи внутри namespace, но не сверяла сами имена, поэтому целый namespace
508
- мог быть зарегистрирован под несуществующим именем и тихо не работать. Теперь имена
509
- извлекаются из всех способов их объявления (`const NS`/`SETTINGS_NS`/`namespace`,
510
- `locale.register`, `locale.bind`, `PropsLocale<…>`) и сравниваются множествами.
511
-
512
- В 0.1.2 добавлены разделы, которых не было в 0.1.1: `open-in-app` («Открыть в
513
- приложении»), `sidebarFiles`, `sidebarRight` (правый сайдбар с файлами) и
514
- `sidebarCodePreview` (предпросмотр кода). Также обновлены ключи, изменившиеся в
515
- харнесе 0.1.5, и удалены 21 ключ, которых в нём больше нет.
516
-
517
- В 0.1.3 пакет догнал харнес 0.1.6-alpha.1: добавлено 139 ключей и 7 новых
518
- разделов — `sidebarTerminal` (терминал в правом сайдбаре), `settings.archivedSessions`
519
- (архивные сессии) и семейство предпросмотра документов (`sidebarDocumentPreview`,
520
- `documentHtml`, `sidebarImage`, `documentMarkdown`, `sidebarPdf`). Кроме этого
521
- переведена экспериментальная «Автопроверка» (`permission.access`: `auto.*`),
522
- подписи и токены палитры команд, поля эндпоинтов в настройках моделей и
523
- изменения в `conversation`, `trajectory`, `chat`, `session-log-download`.
524
- 28 ключей, исчезнувших из харнеса, удалены.
525
-
526
- Проверка покрытия выполняется по исходникам харнеса: для каждого namespace
527
- сравниваются множества ключей, поэтому следующий выпуск начинается с точного
528
- списка «добавить / проверить / удалить».
529
-
530
- В 0.1.6 пакет догнал харнес **0.1.7-rc.2**: добавлено **252 ключа**, 18 обновлены,
531
- 26 удалены, добавлены два новых namespace. Изменения:
532
-
533
- - **`shortcuts`** (новый namespace, 56 ключей) — редактор горячих клавиш: запись
534
- сочетания, конфликты, зарезервированные комбинации, подсказки для macOS и
535
- Windows, восстановление значений по умолчанию;
536
- - **`schedule.manager`** (70 ключей на тот момент) — менеджер задач автоматизации: список,
537
- удаление, повтор, история запусков, выражения Cron. **Ошибочно было записано, что
538
- namespace `schedule.catalog` при этом упразднён; в 0.1.7 это исправлено — оба
539
- namespace существуют параллельно**;
540
- - **`settings.account`** (50 ключей) — первый запуск приложения: приветствие,
541
- выбор назначения и глубины показа хода работы, пополнение баланса, выход из
542
- учётной записи во время выполнения задач;
543
- - добавлены подписи добавления и удаления инструментов на ходу
544
- (`message.tools*`, `trajectory.layout.*`), команды правой боковой панели
545
- (`sidebarRight`), состояния «сначала выберите сессию» в панелях, обновлено
546
- название раздела настроек: «Инструменты для кода» вместо «Инструментов
547
- разработчика»;
548
- - 18 ключей обновлены под изменившийся английский текст, 26 удалены. Единый термин
549
- «рабочая папка» вместо «рабочей области» в одном месте.
550
-
551
- В 0.1.5 пакет догнал харнес **0.1.7-rc.1**: добавлено **49 ключей**, 13 обновлены,
552
- 16 удалены, namespace `directory-browser` убран (в rc.1 его больше нет). Появились
553
- подписи шагов работы инструментов (`message.stepProcess.prepare.*` и `done.*` —
554
- чтение изображений, запись файлов, подготовка к поиску по коду, веб-поиску,
555
- координации субагентов и другие), просмотр изображений во весь экран
556
- (`image.*`), режимы показа ходов «Стандартный» и «Подробный», установка плагинов
557
- из GitHub с таймаутом и китайским зеркалом, предупреждение о несовместимой версии
558
- плагина, выбор источника загрузки моделей для голосового ввода и сообщения
559
- команды `Cordis`. Уточнены формулировки, где upstream заменил «teammate/agent»
560
- на «subagent», а «Beta» — на «Experimental».
561
-
562
- Также в 0.1.5 исправлена единица счёта в инвентаре плагинов: было «187 плагины»,
563
- стало «187 плагинов». Переведены и встроенные снимки интерфейса, добавлены npm
564
- keywords и исправлен peer-диапазон `@deepseek-ai/dsh-client-locale`
565
- (`>=0.1.0-rc.2 <0.2.0`) — раньше `^0.1.0` не разрешался, потому что пакет
566
- публикуется только под prerelease-версиями.
567
-
568
- В 0.1.4 пакет догнал харнес **0.1.7-alpha.2** — самый крупный скачок: добавлено
569
- **905 ключей**, 29 изменены, 126 удалены. Новые разделы:
570
-
571
- - **`pluginManager`** — встроенная панель плагинов: установка, удаление,
572
- включение и отключение компонентов, версии, реестры и подсказки по установке;
573
- - **`settings.account`** — учётная запись DeepSeek: вход, баланс, расход,
574
- API-ключ;
575
- - отдельные разделы настроек, на которые разъехался прежний `settings.plugins`:
576
- **`settings.agentLoop`**, **`settings.shell`**, **`settings.subagent`**,
577
- **`settings.webSearch`**;
578
- - **`sidebarBrowser`** — встроенный браузер в правой панели (адрес, песочница,
579
- восстановление страницы);
580
- - **`sidebarExcel`** и **`sidebarOffice`** — предпросмотр таблиц и документов
581
- Office; масштабирование (`zoom.*`) добавлено в PDF и изображения;
582
- - **`voice-input`** — экспериментальный голосовой ввод.
583
-
584
- Также переведены новые тексты в `conversation` (+194), `chat` (+53),
585
- `workspace` (+43: архив сессий, закрепление), `deliverables` (+31: обзор
586
- изменений хода), `job` (+24: живой вывод фоновых задач), `settings` (+22:
587
- обновление десктопного приложения), `plan`, `open-in-app`, `trajectory`,
588
- `model`, `reference`, `session-log-download` и в руководствах по режимам
589
- агента (`settings.agentPreset`, 12 длинных текстов). Раздел
590
- `settings.archivedSessions` удалён: в 0.1.7 upstream убрал этот пакет, а архив
591
- сессий переехал в `workspace`.
592
-
593
204
  ## Лицензия
594
205
 
595
206
  MIT
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ragnoryok1/dsh-client-locale-ru",
3
- "description": "Russian (ru) interface for the DeepSeek Harness web GUI: 584 namespaces, 67666 strings, 520 third-party plugin dictionaries, ru plural forms and screen typography. Hybrid dsh.bundle + dsh.client plugin.",
4
- "version": "0.2.16",
3
+ "description": "Russian for the DeepSeek Harness web GUI: the whole interface plus the menus of 520 third-party plugins — 584 sections, 67 666 strings.",
4
+ "version": "0.2.18",
5
5
  "keywords": [
6
6
  "dsh",
7
7
  "deepseek-harness",
@@ -127,10 +127,10 @@
127
127
  "assets/banner.jpg",
128
128
  "cordis.patch.yml",
129
129
  "README.md",
130
+ "README-en.md",
131
+ "README-zh.md",
130
132
  "CHANGELOG.md",
131
133
  "LICENSE",
132
- "README.en.md",
133
- "README.zh.md",
134
134
  "NAMESPACES.md"
135
135
  ]
136
136
  }