@goodandready/dsh-russian-lang 0.1.24 → 0.1.26

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,108 +1,134 @@
1
- # @goodandready/dsh-russian-lang
2
-
3
- Русская локализация веб-интерфейса DeepSeek Harness.
4
-
5
- ## Что делает
6
-
7
- - Регистрирует русские словари для namespace'ов ядра (`common`,
8
- `conversation`, `settings`, `settings.models`, `workspace`, `subagent`,
9
- `reference` и другие — **30 namespace'ов ядра, 722 ключа, 100% покрытия**
10
- релизной поверхности DSH 0.1.1-rc.2) и для ряда сторонних плагинов.
11
- - Добавляет **«Русский» третьей позицией** в родной список языков
12
- (**Настройки → Общие → Язык**). Выбор сохраняется штатным механизмом
13
- настроек DSH и переживает браузеры.
14
- - Синхронизирует `<html lang="ru-RU">` при активном русском.
15
-
16
- Непереведённые ключи показываются по-английски (штатный fallback ядра), пустых
17
- мест в интерфейсе не появляется.
18
-
19
- ### Помимо словарей
20
-
21
- - **Русские plural-формы.** Обёртка `translate` резолвит `one/few/many` для
22
- счётных ключей (как с суффиксом `.one/.other`, так и голых через
23
- `X.one/X.few/X.many`).
24
- - **Пользовательские переопределения.** Пространство настроек
25
- `russian-lang.overrides` — `{ ключ: формулировка }`, применяется верхним
26
- слоем поверх словарей.
27
- - **Типографика вывода** (`russian-lang.typography`). Идемпотентный
28
- постпроцессор текстовых узлов: кавычки-«ёлочки», тире, неразрывные пробелы
29
- после коротких слов, опциональная ё (флаг `yo`). Код, ссылки и поля ввода не
30
- трогаются.
31
- - **Орфография** браузерный `spellcheck` на текстовых полях при активном
32
- русском; моноширинные поля (код, команды) исключаются.
33
- - **Фикс неправильной раскладки.** Если текст набран латиницей вместо
34
- кириллицы, над инпутом появляется подсказка с превью конвертации; клик
35
- заменяет. Конверсия кириллицы→латиницы предлагается только для
36
- slash-команд. Ручной конверт текущего инпута — `Alt+L`.
37
-
38
- ## Как это работает
39
-
40
- Реестр локалей живёт в браузере: плагин докладывает русские словари в чужие
41
- namespace'ы через `ctx.locale.register(ns, 'ru', dict)`. Namespace'ы, которые
42
- плагины уже локализуют сами на русский, пропускаются (иначе загрузчик падает с
43
- `already has locale ru`).
44
-
45
- Список языков штатного селектора (`Настройки → Общие → Язык`) живёт в snapshot
46
- локаль-runtime; меню строится из него, и `setLocale()` валидирует выбор по
47
- нему же. На версиях ядра, где `ru` ещё не в списке (DSH 0.1.1-rc.2 из
48
- коробки), плагин расширяет snapshot пунктом «Русский» — файлы ядра не
49
- правятся. Если ядро когда-нибудь узнает `ru` само, расширение не происходит
50
- и всё работает штатно. Запись выбора в настройки идёт через собственный
51
- namespace `russian-lang` (хост-схема ядра знает только `zh/en` и не
52
- принимает `ru`).
53
-
54
- Ничего в установке DSH не патчится; удаление плагина полностью возвращает
55
- интерфейс к исходному состоянию.
56
-
57
- ## Установка
58
-
59
- ```bash
60
- dsh plugin --profile web add @goodandready/dsh-russian-lang
1
+ # 📦 @goodandready/dsh-russian-lang
2
+
3
+ <div align="center">
4
+
5
+ <h3>Полная русская локализация, умная типографика и исправление раскладки клавиатуры для DeepSeek Harness</h3>
6
+
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/npm/v/@goodandready/dsh-russian-lang.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
9
+ <a href="LICENSE"><img src="https://img.shields.io/github/license/GooDAnDReaDY/dsh-russian-lang.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
+ <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
+ <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
12
+ </p>
13
+
14
+ </div>
15
+
16
+ ---
17
+
18
+ ## ⚡ Обзор
19
+
20
+ **`dsh-russian-lang`** — официальный, всеобъемлющий пакет русской локализации для веб-интерфейса [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh).
21
+
22
+ Пакет не просто переводит интерфейс ядра и популярных плагинов, но и добавляет интеллектуальные функции для комфортной русскоязычной работы: **грамматические формы множественного числа (plural)**, автоматическую **расстановку типографики** («ёлочки», длинные тире, неразрывные пробелы) и **исправление ошибочно набранного текста** на неверной раскладке по горячей клавише <kbd>Alt+L</kbd>.
23
+
24
+ ```mermaid
25
+ graph LR
26
+ subgraph DSHCore [Ядро DeepSeek Harness]
27
+ DSH[Web UI Интерфейс] --> Loader[Загрузчик локализации dsh-russian-lang]
28
+ end
29
+
30
+ subgraph TranslationLayer [Слой перевода и адаптации]
31
+ Loader --> CoreDict[30+ Пространств имён ядра DSH / 720+ ключей]
32
+ Loader --> PluginDict[10+ Плагинов экосистемы DSH]
33
+ Loader --> PluralEngine[Движок грамматических Plural-форм]
34
+ end
35
+
36
+ subgraph SmartFeatures [Интеллектуальные модули]
37
+ Loader --> Typo[Модуль типографики: кавычки-«ёлочки» и длинные тире]
38
+ Loader --> LayoutFix[Детектор неверной раскладки + Hotkey Alt+L]
39
+ Loader --> Spell[Активация русской проверки орфографии]
40
+ Loader --> Overrides[Пользовательские переопределения ключей]
41
+ end
42
+
43
+ subgraph Result [Результат]
44
+ CoreDict --> NativeUI[Нативный русский интерфейс]
45
+ PluginDict --> NativeUI
46
+ PluralEngine --> NativeUI
47
+ Typo --> NativeUI
48
+ LayoutFix --> NativeUI
49
+ Spell --> NativeUI
50
+ Overrides --> NativeUI
51
+ end
52
+
53
+ style DSHCore fill:#1e1e2e,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4
54
+ style TranslationLayer fill:#181825,stroke:#cba6f7,stroke-width:2px,color:#cdd6f4
55
+ style SmartFeatures fill:#11111b,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4
56
+ style Result fill:#181825,stroke:#f38ba8,stroke-width:2px,color:#cdd6f4
61
57
  ```
62
58
 
63
- Затем: **Настройки → Общие → Язык → Русский**.
59
+ ---
64
60
 
65
- ## Разработка и проверка
61
+ ## Полный обзор возможностей
66
62
 
67
- ```bash
68
- python3 extract-dicts.py <node_modules ядра> [node_modules профиля] # обновить *-en.json
69
- python3 check-coverage.py # что не переведено / устарело
70
- python3 build.py # собрать lib/client.js
71
- python3 tools/mt_fallback.py --dry-run # непереведённые ключи
72
- python3 tools/mt_fallback.py --review # очередь ручной выверки MT
73
- python3 tools/merge_freq.py # обновить freq-словарь для фикса раскладки
74
- python3 tools/upstream_check.py # ночной апстрим-детектор новых ключей
75
- python3 tools/top100.py <профиль>/node_modules # отчёт покрытия плагинов
76
- python3 test/test_extract.py # smoke для extract-dicts/check-coverage
77
- python3 test/smoke.py # E2E против запущенного контура
78
- ```
63
+ ### 1. 🌐 100% Покрытие ядра DSH (30+ Пространств имён, 720+ ключей)
64
+ * **Диалоги и переписка (`conversation`)**: лента сообщений, ветки обсуждений, карточки вызова инструментов, статус генерации и рассуждений (thinking traces).
65
+ * **Модели и провайдеры (`settings.models`)**: каталог моделей, параметры инференса, управление токенами и ключами API.
66
+ * **Настройки ядра (`settings`, `common`)**: интерфейс настроек, горячие клавиши, системные уведомления, модальные окна и подтверждения.
67
+ * **Рабочие области (`workspace`, `subagent`)**: дерево файлов, управление контекстом, запуск и координация субагентов.
68
+ * **Системные статусы (`status`, `reference`)**: индикаторы сетевого подключения, загрузка файлов и ошибки.
69
+
70
+ ### 2. 🧩 Встроенный перевод 10+ плагинов экосистемы DSH
71
+ Локализация автоматически распространяется на сторонние и экосистемные плагины:
72
+ * `token-dashboard` аналитика и графики расхода токенов;
73
+ * `subscriptions` (`dsh-subscriptions`) карточки подключения персональных подписок;
74
+ * `dshmarket` и `dshmarket-1.13` — маркетплейс моделей и каталоги провайдеров;
75
+ * `better-sidebar` — улучшенное боковое меню навигации;
76
+ * `task-board` и `kanban` — доски управления задачами и канбан-планировщик;
77
+ * `im-hub` — шлюзы интеграции с мессенджерами;
78
+ * `context-doctor` и `plugins-store` — диагностика контекста и магазин расширений.
79
+
80
+ ### 3. 🔢 Русские грамматические формы числительных (Plural)
81
+ Английский язык различает только `1` и `other`. Русский язык требует 3 грамматические формы числительных (`1 файл`, `2 файла`, `5 файлов` / `1 секунда`, `3 секунды`, `10 секунд`). Движок локализации автоматически подставляет правильные окончания в зависимости от числового значения.
82
+
83
+ ### 4. ✍️ Интеллектуальный модуль типографики (`russian-lang.typography`)
84
+ Автоматически приводит тексты сообщений и описаний к правилам русской экранной типографики:
85
+ * Заменяет прямые "лапки" на правильные кавычки-«ёлочки» (а вложенные — на „лапки“);
86
+ * Заменяет дефисы между словами на длинные тире (—);
87
+ * Добавляет неразрывные пробелы после коротких союзов и предлогов, предотвращая висячие строки;
88
+ * **Безопасность кода**: типографика строго изолирована и никогда не затрагивает блоки исходного кода, формулы LaTeX и моноширинные поля ввода.
79
89
 
80
- MT-переводы непереведённых ключей (`mt_fallback.py --apply`) пишутся в
81
- `mt-registry.json` как обычные строки; ручной перевод в `ru/*.json` всегда
82
- имеет приоритет. Очередь ручной выверки `upstream/review-queue.md`.
90
+ ### 5. ⌨️ Исправление ошибочной раскладки клавиатуры (<kbd>Alt+L</kbd>)
91
+ Если вы забыли переключить раскладку и набрали текст латиницей (например, `ghjtrn d gzkmt` вместо `проект в пальто`), плагин мгновенно:
92
+ * Определяет ошибочный ввод в реальном времени;
93
+ * Показывает ненавязчивую плавающую подсказку над полем ввода;
94
+ * При нажатии горячей клавиши <kbd>Alt+L</kbd> мгновенно конвертирует набранный текст в правильную кириллицу.
83
95
 
84
- `smoke.py` требует `websocket-client` (`pip install websocket-client`) и Chrome
85
- на `/usr/bin/google-chrome`. Адрес переопределяется через `DSH_URL`.
96
+ ### 6. ⚙️ Пользовательские переопределения (`russian-lang.overrides`)
97
+ Вы можете переопределить абсолютно любой системный ключ перевода под терминологию вашей команды в **Настройки → Плагины → Russian Lang → Переопределения** без редактирования исходного кода.
86
98
 
87
- ## Скриншоты
99
+ ### 7. 🔤 Нативная интеграция в ядро
100
+ Плагин нативно регистрирует пункт **«Русский»** в меню **Настройки → Общие → Язык**, переключает атрибут `<html lang="ru-RU">` и активирует встроенный браузерный словарь проверки орфографии (`spellcheck`).
88
101
 
89
- | Что | Файл |
90
- |-----|------|
91
- | Интерфейс на русском | `docs/media/ui-russian.png` |
92
- | Список языков в Настройки → Общие | `docs/media/language-selector.png` |
102
+ ---
93
103
 
94
- Скриншоты обновляются через `python3 test/screenshots.py`.
104
+ ## 📦 Установка
95
105
 
96
- ## Ограничения
106
+ ```bash
107
+ dsh plugin --profile web add @goodandready/dsh-russian-lang
108
+ ```
109
+
110
+ После установки откройте веб-интерфейс, перейдите в **Настройки → Общие → Язык**, выберите **«Русский»** и обновите страницу.
111
+
112
+ ---
113
+
114
+ ## ⚙️ Параметры конфигурации (`settings.yaml`)
115
+
116
+ ```yaml
117
+ dsh-russian-lang:
118
+ typography:
119
+ enabled: true
120
+ quotes: true # Преобразование кавычек в «ёлочки»
121
+ dashes: true # Длинные тире
122
+ nbsp: true # Неразрывные пробелы
123
+ layoutFix:
124
+ enabled: true
125
+ hotkey: "Alt+KeyL" # Горячая клавиша исправления раскладки
126
+ spellcheck: true # Браузерная проверка правописания
127
+ overrides: {} # Пользовательские переопределения ключей
128
+ ```
97
129
 
98
- - Переводится только веб-интерфейс. Описания тулов и системные промпты агента
99
- — не locale, плагин их не трогает.
100
- - Плагины, которые рисуют текст инлайном без locale-слотов, не переводятся.
101
- - Текст, добавленный сторонним плагином без `ctx.locale.register`, остаётся на
102
- языке плагина — для перевода нужно обновить сам плагин.
103
- - Фикс раскладки опирается на встроенный частотный словарь (~9k слов) и может
104
- не распознать редкую терминологию; ложных замен нет — только подсказка.
130
+ ---
105
131
 
106
- ## Лицензия
132
+ ## 📄 Лицензия
107
133
 
108
- MIT
134
+ MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
package/lib/client.js CHANGED
@@ -3682,6 +3682,22 @@ window.__ModuleLoader__.load({
3682
3682
  } catch (err) { return {} }
3683
3683
  }
3684
3684
  const fill = (template, params) => template.replace(/\{(\w+)\}/g, (match, name) => name in params ? String(params[name]) : match)
3685
+ // lookup: в ядре 0.1.2 lookup(ns, key, chain) требует третий довод —
3686
+ // цепочку языков; в старых ядрах его два. Спрашиваем у самого метода
3687
+ // (lookup.length), цепочку берём у ядра (fallbackChain приватный, но в
3688
+ // собранном коде доступен), иначе минимальная [active]. Голый вызов без
3689
+ // chain ронял чужой слот sidebar.workspaces (chain is not iterable).
3690
+ const lookupChain = () => {
3691
+ try {
3692
+ const chain = runtime.fallbackChain && runtime.fallbackChain(runtime.getLocale().active)
3693
+ if (Array.isArray(chain) && chain.length) return chain
3694
+ } catch (err) { /* ignore */ }
3695
+ return [runtime.getLocale().active]
3696
+ }
3697
+ const lookup = (ns, key) => {
3698
+ const chain = lookupChain()
3699
+ return runtime.lookup.length >= 3 ? runtime.lookup(ns, key, chain) : runtime.lookup(ns, key)
3700
+ }
3685
3701
  runtime.translate = function (ns, key, params) {
3686
3702
  // 1. Пользовательский override — самый верхний слой.
3687
3703
  const overrides = getOverrides()
@@ -3698,7 +3714,7 @@ window.__ModuleLoader__.load({
3698
3714
  // Ядро выбирает .one/.other по n===1; русскому нужны few/many.
3699
3715
  if (form === 'few' || form === 'many') {
3700
3716
  const pluralKey = m[1] + '.' + form
3701
- const template = this.lookup(ns, pluralKey) ?? this.lookup('common', pluralKey)
3717
+ const template = lookup(ns, pluralKey) ?? lookup('common', pluralKey)
3702
3718
  if (template !== undefined) {
3703
3719
  return fill(template, params)
3704
3720
  }
@@ -3707,7 +3723,7 @@ window.__ModuleLoader__.load({
3707
3723
  // Счётный ключ без суффикса: t('X', {n}). Если словарь даёт формы
3708
3724
  // X.one / X.few / X.many - берём подходящую, иначе как раньше.
3709
3725
  const pluralKey = key + '.' + form
3710
- const template = this.lookup(ns, pluralKey) ?? this.lookup('common', pluralKey)
3726
+ const template = lookup(ns, pluralKey) ?? lookup('common', pluralKey)
3711
3727
  if (template !== undefined) {
3712
3728
  return fill(template, params)
3713
3729
  }
package/lib/index.js CHANGED
@@ -4,7 +4,6 @@
4
4
  // нечего, но у выбора языка есть сохраняемая настройка: регистрируем её схему
5
5
  // в собственном namespace, чтобы запись переживала браузеры и машины через
6
6
  // штатный механизм настроек DSH.
7
- import { settingsNamespace } from '@deepseek-ai/dsh-settings'
8
7
  import z from '@deepseek-ai/schemastery'
9
8
 
10
9
  export const name = '@goodandready/dsh-russian-lang'
@@ -21,14 +20,14 @@ const RussianLangSettingsSchema = z.object({
21
20
 
22
21
  export function apply(ctx) {
23
22
  ctx.inject(['settings'], (settingsCtx) => {
24
- settingsCtx.settings.register(settingsNamespace('russian-lang'), RussianLangSettingsSchema)
23
+ settingsCtx.settings.register('russian-lang', RussianLangSettingsSchema)
25
24
  })
26
25
 
27
26
  // #68: русский системный промпт агента (опционально). Регистрируем секцию
28
27
  // промпта, которая просит отвечать по-русски, когда включён флаг
29
28
  // russian-lang.agentPrompt. Секция — официальная точка расширения ядра.
30
29
  ctx.inject(['settings', 'systemPrompt'], (settingsCtx, prompt) => {
31
- const NS = settingsNamespace('russian-lang')
30
+ const NS = 'russian-lang'
32
31
  const RU_SECTION = 'dsh-russian-lang-agent-prompt'
33
32
  const RU_TEXT = 'Отвечай пользователю на русском языке. Если пользователь пишет на другом языке, отвечай на его языке.'
34
33
  let current = false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-russian-lang",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "description": "Russian localization for the DeepSeek Harness web UI: adds Русский as the third option in the native Settings - General - Language menu. Translates the full core surface (100% coverage of DSH 0.1.1-rc.2) plus 16 community plugin namespaces - 52 namespaces, 2795 strings (many machine-drafted, queued for manual review), with Russian plural forms, count-key plurals, a typography pass (guillemets, em dash, nbsp), a wrong-layout input hint and browser spellcheck. The locale runtime snapshot is extended at runtime on unpatched cores; no files in the DSH installation are modified. The choice is persisted through the plugin-owned russian-lang namespace.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -57,7 +57,7 @@
57
57
  },
58
58
  "peerDependencies": {
59
59
  "@deepseek-ai/cordis": "^4.0.1",
60
- "@deepseek-ai/dsh-settings": "^0.1.1-rc.2"
60
+ "@deepseek-ai/dsh-settings": "^0.1.2-alpha.2"
61
61
  },
62
62
  "repository": {
63
63
  "type": "git",