@goodandready/dsh-russian-lang 0.1.0 → 0.1.2

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
@@ -4,11 +4,13 @@
4
4
 
5
5
  ## Что делает
6
6
 
7
- - Регистрирует русские словари для namespace'ов ядра (`common`, `conversation`,
8
- `settings`, `settings.models`, `workspace`, `subagent`, `reference` и другие —
9
- 30 namespace'ов ядра), а также для ряда популярных плагинов (dsh-market,
10
- better-sidebar, task-board, im-hub и другие).
11
- - Добавляет «Русский» третьей позицией в родной список языков
7
+ - Регистрирует русские словари для namespace'ов ядра (`common`,
8
+ `conversation`, `settings`, `settings.models`, `workspace`, `subagent`,
9
+ `reference` и другие — **30 namespace'ов ядра, 722 ключа, 100%
10
+ покрытия** релизной поверхности DSH 0.1.1-rc.2) и для ряда сторонних
11
+ плагинов (`dsh-market`, `better-sidebar`, `task-board`, `im-hub` и другие
12
+ **9 namespace'ов, 962 ключа**).
13
+ - Добавляет **«Русский» третьей позицией** в родной список языков
12
14
  (**Настройки → Общие → Язык**). Выбор сохраняется штатным механизмом
13
15
  настроек DSH и переживает браузеры.
14
16
  - Синхронизирует `<html lang="ru">` при активном русском.
@@ -23,11 +25,13 @@ namespace'ы через `ctx.locale.register(ns, 'ru', dict)` — конфлик
23
25
  только если пара (namespace, язык) уже занята, а `ru` не занимает никто.
24
26
 
25
27
  Список языков штатного селектора (`Настройки → Общие → Язык`) живёт в snapshot
26
- локаль-runtime; меню строится из него, и `setLocale()` валидирует выбор по нему
27
- же. Если ядро не знает `ru`, плагин расширяет snapshot пунктом «Русский»
28
- файлы ядра не правятся. Запись выбора в настройки идёт через собственный
29
- namespace `russianLang` (хост-схема ядра знает только zh/en). Если ядро
30
- когда-нибудь узнает `ru` само, расширение не происходит и всё работает штатно.
28
+ локаль-runtime; меню строится из него, и `setLocale()` валидирует выбор по
29
+ нему же. На версиях ядра, где `ru` ещё не в списке (DSH 0.1.1-rc.2 из
30
+ коробки), плагин расширяет snapshot пунктом «Русский» файлы ядра не
31
+ правятся. Если ядро когда-нибудь узнает `ru` само, расширение не происходит
32
+ и всё работает штатно. Запись выбора в настройки идёт через собственный
33
+ namespace `russian-lang` (хост-схема ядра знает только `zh/en` и не
34
+ принимает `ru`).
31
35
 
32
36
  Ничего в установке DSH не патчится; удаление плагина полностью возвращает
33
37
  интерфейс к исходному состоянию.
@@ -38,26 +42,39 @@ namespace `russianLang` (хост-схема ядра знает только zh
38
42
  dsh plugin --profile web add @goodandready/dsh-russian-lang
39
43
  ```
40
44
 
41
- Затем: Настройки → Общие → Язык → «Русский».
45
+ Затем: **Настройки → Общие → Язык → Русский**.
42
46
 
43
- ## Обновление перевода после релизов DSH
44
-
45
- Словари — источник истины (`ru/*.json` — ядро, `ru-plugins/*.json` — сторонние
46
- плагины). После обновления dsh извлеките английские оригиналы из бандлов,
47
- сверьте покрытие и перегенерируйте клиентский бандл:
47
+ ## Разработка и проверка
48
48
 
49
49
  ```bash
50
50
  python3 extract-dicts.py <profile>/node_modules # обновить *-en.json
51
51
  python3 check-coverage.py # что не переведено / устарело
52
52
  python3 build.py # собрать lib/client.js
53
+ python3 test/test_extract.py # smoke для extract-dicts/check-coverage
54
+ python3 test/smoke.py # E2E против запущенного стенда
53
55
  ```
54
56
 
57
+ Требует `websocket-client` (`pip install websocket-client`) и Chrome на
58
+ `/usr/bin/google-chrome` для `smoke.py`. По умолчанию ходит на
59
+ `https://192.168.1.111:3082`; переопределяется через `DSH_URL`.
60
+
61
+ ## Скриншоты
62
+
63
+ | Что | Файл |
64
+ |-----|------|
65
+ | Интерфейс на русском | `docs/media/ui-russian.png` |
66
+ | Список языков в Настройки → Общие | `docs/media/language-selector.png` |
67
+
68
+ Скриншоты обновляются через `python3 test/screenshots.py` против
69
+ запущенного стенда с установленным плагином.
70
+
55
71
  ## Ограничения
56
72
 
57
73
  - Переводится только веб-интерфейс. Описания тулов и системные промпты агента
58
74
  — не locale, плагин их не трогает.
59
- - Плагины, которые рисуют текст инлайном без locale-слотов, не переводятся
60
- (словари для известных плагинов с `locale.register` включены).
75
+ - Плагины, которые рисуют текст инлайном без locale-слотов, не переводятся.
76
+ - Текст, добавленный сторонним плагином без `ctx.locale.register`, остаётся на
77
+ языке плагина — для перевода нужно обновить сам плагин.
61
78
 
62
79
  ## Лицензия
63
80
 
Binary file
Binary file
package/lib/client.js CHANGED
@@ -1891,7 +1891,11 @@ window.__ModuleLoader__.load({
1891
1891
  ctx.effect(() => scope.subscribe(tryBoot), 'dsh-russian-lang: boot')
1892
1892
  tryBoot()
1893
1893
 
1894
- ctx.effect(() => runtime.subscribe(syncLang), 'dsh-russian-lang: html-lang')
1894
+ // Подписчик регистрируется синхронно, до первого publish() в tryBoot
1895
+ // ниже - иначе ctx.effect откладывает выполнение, и boot-publish
1896
+ // происходит до того, как syncLang слушатель зарегистрирован.
1897
+ const unsubscribeLang = runtime.subscribe(syncLang)
1898
+ ctx.effect(() => unsubscribeLang, 'dsh-russian-lang: html-lang')
1895
1899
  syncLang()
1896
1900
  }
1897
1901
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-russian-lang",
3
- "version": "0.1.0",
4
- "description": "Russian localization for the DeepSeek Harness web UI: ru dictionaries for core namespaces plus a language switch in Settings - General.",
3
+ "version": "0.1.2",
4
+ "description": "Russian localization for the DeepSeek Harness web UI: adds Русский as the third option in the native Settings - General - Language menu. Translates 30 core namespaces (722 keys, 100% coverage of the DSH 0.1.1-rc.2 surface) and 9 plugin namespaces (962 keys). 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",
7
7
  "exports": {
@@ -16,7 +16,8 @@
16
16
  "ru-plugins",
17
17
  "cordis.patch.yml",
18
18
  "README.md",
19
- "LICENSE"
19
+ "LICENSE",
20
+ "docs/media"
20
21
  ],
21
22
  "dsh": {
22
23
  "bundle": {
@@ -42,6 +43,15 @@
42
43
  "engines": {
43
44
  "node": ">=20"
44
45
  },
46
+ "scripts": {
47
+ "build": "python3 build.py",
48
+ "check": "python3 check-coverage.py",
49
+ "test": "python3 test/test_extract.py",
50
+ "smoke": "python3 test/smoke.py"
51
+ },
52
+ "devDependencies": {
53
+ "websocket-client": "^1.7.0"
54
+ },
45
55
  "dependencies": {
46
56
  "@deepseek-ai/schemastery": "^3.18.1"
47
57
  },