@goodandready/dsh-russian-lang 0.1.7 → 0.1.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.
Files changed (3) hide show
  1. package/README.md +44 -17
  2. package/lib/client.js +25 -148
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -6,23 +6,41 @@
6
6
 
7
7
  - Регистрирует русские словари для namespace'ов ядра (`common`,
8
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 ключа**).
9
+ `reference` и другие — **30 namespace'ов ядра, 722 ключа, 100% покрытия**
10
+ релизной поверхности DSH 0.1.1-rc.2) и для ряда сторонних плагинов.
13
11
  - Добавляет **«Русский» третьей позицией** в родной список языков
14
12
  (**Настройки → Общие → Язык**). Выбор сохраняется штатным механизмом
15
13
  настроек DSH и переживает браузеры.
16
- - Синхронизирует `<html lang="ru">` при активном русском.
14
+ - Синхронизирует `<html lang="ru-RU">` при активном русском.
17
15
 
18
16
  Непереведённые ключи показываются по-английски (штатный fallback ядра), пустых
19
17
  мест в интерфейсе не появляется.
20
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
+
21
38
  ## Как это работает
22
39
 
23
40
  Реестр локалей живёт в браузере: плагин докладывает русские словари в чужие
24
- namespace'ы через `ctx.locale.register(ns, 'ru', dict)` конфликт возможен
25
- только если пара (namespace, язык) уже занята, а `ru` не занимает никто.
41
+ namespace'ы через `ctx.locale.register(ns, 'ru', dict)`. Namespace'ы, которые
42
+ плагины уже локализуют сами на русский, пропускаются (иначе загрузчик падает с
43
+ `already has locale ru`).
26
44
 
27
45
  Список языков штатного селектора (`Настройки → Общие → Язык`) живёт в snapshot
28
46
  локаль-runtime; меню строится из него, и `setLocale()` валидирует выбор по
@@ -47,16 +65,24 @@ dsh plugin --profile web add @goodandready/dsh-russian-lang
47
65
  ## Разработка и проверка
48
66
 
49
67
  ```bash
50
- python3 extract-dicts.py <profile>/node_modules # обновить *-en.json
51
- python3 check-coverage.py # что не переведено / устарело
52
- python3 build.py # собрать lib/client.js
53
- python3 test/test_extract.py # smoke для extract-dicts/check-coverage
54
- python3 test/smoke.py # E2E против запущенного стенда
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 против запущенного контура
55
78
  ```
56
79
 
57
- Требует `websocket-client` (`pip install websocket-client`) и Chrome на
58
- `/usr/bin/google-chrome` для `smoke.py`. По умолчанию ходит на
59
- `https://192.168.1.111:3082`; переопределяется через `DSH_URL`.
80
+ MT-переводы непереведённых ключей (`mt_fallback.py --apply`) пишутся в
81
+ `mt-registry.json` как обычные строки; ручной перевод в `ru/*.json` всегда
82
+ имеет приоритет. Очередь ручной выверки — `upstream/review-queue.md`.
83
+
84
+ `smoke.py` требует `websocket-client` (`pip install websocket-client`) и Chrome
85
+ на `/usr/bin/google-chrome`. Адрес переопределяется через `DSH_URL`.
60
86
 
61
87
  ## Скриншоты
62
88
 
@@ -65,8 +91,7 @@ python3 test/smoke.py # E2E против запущ
65
91
  | Интерфейс на русском | `docs/media/ui-russian.png` |
66
92
  | Список языков в Настройки → Общие | `docs/media/language-selector.png` |
67
93
 
68
- Скриншоты обновляются через `python3 test/screenshots.py` против
69
- запущенного стенда с установленным плагином.
94
+ Скриншоты обновляются через `python3 test/screenshots.py`.
70
95
 
71
96
  ## Ограничения
72
97
 
@@ -75,6 +100,8 @@ python3 test/smoke.py # E2E против запущ
75
100
  - Плагины, которые рисуют текст инлайном без locale-слотов, не переводятся.
76
101
  - Текст, добавленный сторонним плагином без `ctx.locale.register`, остаётся на
77
102
  языке плагина — для перевода нужно обновить сам плагин.
103
+ - Фикс раскладки опирается на встроенный частотный словарь (~9k слов) и может
104
+ не распознать редкую терминологию; ложных замен нет — только подсказка.
78
105
 
79
106
  ## Лицензия
80
107
 
package/lib/client.js CHANGED
@@ -279,7 +279,7 @@ window.__ModuleLoader__.load({
279
279
  "sideChatRetry": "Повторить",
280
280
  "sideChatSave": "Сохранить как новую сессию",
281
281
  "sideChatSaveTitle": "Повысьте этот тред до уровня отдельной сессии в основном списке сессий",
282
- "sideChatSaved": "Сохранено как новая сессия {session}",
282
+ "sideChatSaved": "Сохранено как новая сессия",
283
283
  "sideChatSend": "Отправить",
284
284
  "sideChatThink": "Думаю",
285
285
  "sideChatThinking": "Глубокое погружение…",
@@ -624,25 +624,6 @@ window.__ModuleLoader__.load({
624
624
  "browser.truncated": "Слишком много папок; показано только начало.",
625
625
  "browser.untitledFolder": "Без имени"
626
626
  },
627
- "dsh-gitea": {
628
- "baseUrl": "URL экземпляра",
629
- "baseUrlHint": "например, https://gitea.example.com",
630
- "collapse": "Свернуть",
631
- "description": "Инструменты и учетные данные Gitea или Forgejo.",
632
- "discard": "Отменить",
633
- "expand": "Развернуть",
634
- "intro": "Создайте учетные данные DSH, вставьте туда API-токен, затем введите только название учетных данных ниже (например, GITEA_TOKEN). Никогда не вставляйте токен в эту форму.",
635
- "loading": "Загрузка…",
636
- "save": "Сохранить",
637
- "saveFailed": "Не удалось сохранить",
638
- "saving": "Сохранение…",
639
- "title": "Гитеа",
640
- "tokenEnv": "Имя учетных данных",
641
- "tokenEnvHint": "Название учетных данных DSH, а не самого токена. По умолчанию GITEA_TOKEN.",
642
- "tokenOff": "Токен не настроен",
643
- "tokenOn": "Токен настроен",
644
- "unsaved": "Не сохранено"
645
- },
646
627
  "dsh-image-gen": {
647
628
  "f.apiKeyEnv": "Справка по API-ключу",
648
629
  "f.apiKeyEnvHint": "Ссылка на учетные данные / переменная окружения, содержащая ключ API FAL. Префикс авторизации \"Key \" добавляется автоматически.",
@@ -700,59 +681,6 @@ window.__ModuleLoader__.load({
700
681
  "settings.unavailable": "Обвязка еще не опубликовала настройки этого плагина. Если она только что перезапустилась, раздел появится сам через несколько секунд.",
701
682
  "settings.unsaved": "Несохранённые изменения"
702
683
  },
703
- "dsh-key-rotation": {
704
- "addKey": "+ Добавить ключ",
705
- "addKeyTitle": "Добавить API ключ",
706
- "addProvider": "+ Добавить поставщика",
707
- "brokenKey": "сломано (3× AUTH)",
708
- "cardDesc": "Поворот API-ключей для каждого провайдера: пулы ключей, автоматический переход на резерв при ошибках квоты/ограничения скорости, охлаждение и восстановление.",
709
- "codesTitle": "Включите эти {сбои}",
710
- "cooldown": "Время ожидания после ошибки (мс)",
711
- "desc": "Поворот API-ключей для каждого провайдера. Для каждого провайдера перечислите его API-ключи (имена переменных окружения, хранящиеся в учетных данных DSH). Плагин направляет модель через ключи провайдера по порядку и переключается на следующий при превышении квоты или ограничения скорости.",
712
- "discard": "Отменить",
713
- "exportOne": "Вниз",
714
- "exportPools": "Экспорт",
715
- "hoursAgo": "{n} ч назад",
716
- "importEnv": "Импортировать .env",
717
- "importPools": "Импорт",
718
- "justNow": "только что",
719
- "keyActive": "используется",
720
- "keyCooling": "охлаждение, {s}с",
721
- "keyFromEnv": "из окружения, только для чтения здесь",
722
- "keyHint": "Значение хранится в учетных данных DSH и никогда не отправляется обратно в браузер — отображаются только последние 5 символов. Имена генерируются автоматически; наведите курсор на ключ, чтобы увидеть используемое имя.",
723
- "keyLabel": "Ключ {n}",
724
- "keyMissing": "нет такого учетного {credential}",
725
- "keyReady": "готово",
726
- "keySave": "Сохранить ключ",
727
- "keySaved": "сохранено",
728
- "keyValuePlaceholder": "вставьте ключ, затем {Save}",
729
- "keyWriteFailed": "не удалось сохранить ключ: {msg}",
730
- "loading": "Загрузка…",
731
- "minutesAgo": "{n} мин назад",
732
- "moveDown": "Переместить вниз",
733
- "moveUp": "Переместить вверх",
734
- "noProviders": "Нет зарегистрированных поставщиков в DSH — пока не из чего выбирать.",
735
- "notRegistered": "не зарегистрирован",
736
- "poolExhausted": "пул исчерпан — все ключи охлаждаются",
737
- "providersTitle": "Провайдеры и их ключи",
738
- "removeKey": "Удалить ключ {key}",
739
- "removeProvider": "Удалить провайдера",
740
- "resetCooldown": "Сбросить время восстановления",
741
- "resetting": "Сброс…",
742
- "save": "Сохранить",
743
- "saving": "Сохранение…",
744
- "subtitle": "Поворот API-ключей для каждого провайдера: пулы ключей, автоматический переход на резерв при ошибках квоты/ограничения скорости, охлаждение и восстановление.",
745
- "switchCodes": "Переключить коды (через запятую)",
746
- "switchesNone": "ещё нет переключателей",
747
- "switchesSome": "переключатели: {n} · последний: {reason}, {ago}",
748
- "testAll": "Проверьте все {keys}",
749
- "testFail": "ОШИБКА",
750
- "testKey": "Тест",
751
- "testOk": "ОК",
752
- "testing": "Тестирование…",
753
- "title": "Ротация ключей {placeholders}",
754
- "usedAgo": "{ago} назад"
755
- },
756
684
  "dsh-market": {
757
685
  "actWhy": "Почему не активен?",
758
686
  "agentBusyInstall": "Агент в настоящее время работает — дождитесь завершения (или отмените его) перед установкой. Установка изменяет файлы плагина, поэтому работающий агент может завершиться с ошибкой в процессе.",
@@ -827,7 +755,7 @@ window.__ModuleLoader__.load({
827
755
  "cmdDetails": "Команда установки",
828
756
  "compatRiskBanner": "Обнаружен риск несовместимости — откройте Диагностику перед перезапуском или откатите эту операцию.",
829
757
  "confirm": "Подтвердить",
830
- "confirmInstall": "Подтвердите установку {placeholder}",
758
+ "confirmInstall": "Подтвердить установку",
831
759
  "confirmRemove": "Подтверждаете?",
832
760
  "confirmTitle": "Установка",
833
761
  "confirmWarn": "Плагины — сторонний код сообщества. Устанавливая, вы доверяете этому источнику; сборочные скрипты по умолчанию заблокированы.",
@@ -835,7 +763,7 @@ window.__ModuleLoader__.load({
835
763
  "conflictDeclined": "Вы сохранили установленные плагины; этот не был установлен",
836
764
  "conflictDetails": "Детали",
837
765
  "conflictKeep": "Оставить то, что у меня есть",
838
- "conflictKeepNote": "Создать {count}",
766
+ "conflictKeepNote": "Оставить этот",
839
767
  "conflictOutcomeInstall": "установить",
840
768
  "conflictOutcomeKeep": "оставить",
841
769
  "conflictOutcomeRemove": "удалить",
@@ -843,7 +771,7 @@ window.__ModuleLoader__.load({
843
771
  "conflictReplaceFailed": "Замена не завершена. Перечисленные ниже плагины были удалены и не восстановлены — проверьте их:",
844
772
  "conflictReplacing": "Замена…",
845
773
  "conflictReverted": "Отменено автоматически; ничего не было изменено",
846
- "conflictSwap": "Переключиться на этот {placeholder}",
774
+ "conflictSwap": "Переключиться на этот",
847
775
  "conflictSwapNote": "Настройки удалённых плагинов сохраняются, чтобы вы могли установить их позже",
848
776
  "conflictTitle": "Невозможно установить: конфликт с установленным плагином",
849
777
  "conflictWhy": "cordis отклоняет дерево плагинов, содержащее дублирующиеся идентификаторы записей; сохранение этого плагина предотвратит запуск DeepSeek Harness.",
@@ -950,7 +878,7 @@ window.__ModuleLoader__.load({
950
878
  "nextPage": "Дальше",
951
879
  "noGroups": "Групп пока нет — создайте",
952
880
  "notInstalled": "Не установлен",
953
- "opBlockedCard": "Невозможно установить · {details}",
881
+ "opBlockedCard": "Невозможно установить · подробности",
954
882
  "opClear": "Очистить выполненные",
955
883
  "opClose": "Свернуть",
956
884
  "opDequeue": "Удалить из очереди",
@@ -958,13 +886,13 @@ window.__ModuleLoader__.load({
958
886
  "opDoneRefresh": "Установлено · обновите страницу для применения",
959
887
  "opEmpty": "Нет операций в процессе выполнения",
960
888
  "opEmptyHint": "Здесь отображается прогресс установки, обновления и удаления",
961
- "opInstalling": "Установка {placeholder}",
889
+ "opInstalling": "Установка",
962
890
  "opKind_install": "Установить",
963
- "opKind_uninstall": "Удалить {placeholder}",
891
+ "opKind_uninstall": "Удалить",
964
892
  "opKind_update": "Обновить",
965
893
  "opLeaveHint": "Вы можете покинуть эту страницу; вы получите уведомление, когда процесс завершится",
966
894
  "opNeedsChoice": "Не удалось установить · откат выполнен автоматически, ничего не изменилось",
967
- "opNeedsYou": "нужен {placeholder}",
895
+ "opNeedsYou": "нужен вам",
968
896
  "opQueued": "В очереди",
969
897
  "opQueuedAhead": "впереди:",
970
898
  "opRetry": "Повторить",
@@ -1023,7 +951,7 @@ window.__ModuleLoader__.load({
1023
951
  "restorePreviewDone": "Копия загружена. Проверьте вкладку «Установленные» и запускайте восстановление.",
1024
952
  "restoreStart": "Начать восстановление",
1025
953
  "restoreUnportable": "указывает на абсолютный путь с другой машины, который здесь не существует — перенаправьте его локально или переустановите плагин",
1026
- "rollbackNow": "Откатить {placeholder}",
954
+ "rollbackNow": "Откатить",
1027
955
  "rollingBack": "Откат изменений…",
1028
956
  "searchPh": "Поиск плагинов: уведомления, терминал, память…",
1029
957
  "setCardDesc": "Версия маркета, обновление и удаление.",
@@ -1034,7 +962,7 @@ window.__ModuleLoader__.load({
1034
962
  "setChannelDevHint": "Непроверенные сборки из ветки разработки. Не рекомендуются для общего использования.",
1035
963
  "setChannelStable": "Стабильный",
1036
964
  "setChannelStableHint": "Только выпущенные версии.",
1037
- "setChannelSwitch": "Переключиться на {placeholder}",
965
+ "setChannelSwitch": "Переключиться на",
1038
966
  "setChannelSwitchHint": "Эта версия ниже установленной.",
1039
967
  "setRegion": "Скачать регион",
1040
968
  "setRegionAuto": "Выбрано на основе проверки сети. Можете изменить в любое время.",
@@ -1056,7 +984,7 @@ window.__ModuleLoader__.load({
1056
984
  "setSelfRestartAfter": "Перезапустить DeepSeek Harness сразу после удаления",
1057
985
  "setSelfRestartingHint": "Перезапуск DeepSeek Harness…",
1058
986
  "setSelfUpToDate": "Обновлений нет",
1059
- "setSelfUpToDateHint": "Создать {count} новых {count, plural, one {чат} few {чата} many {чатов}}",
987
+ "setSelfUpToDateHint": "Актуально, обновление не требуется",
1060
988
  "setSelfUpdate": "Обновить",
1061
989
  "setSelfUpdateHint": "Обновление скачает новую версию; она заработает после перезапуска.",
1062
990
  "setSelfUpdateReady": "Доступна новая версия:",
@@ -1126,7 +1054,7 @@ window.__ModuleLoader__.load({
1126
1054
  },
1127
1055
  "dsh-subscriptions": {
1128
1056
  "accountLabel": "Аккаунт",
1129
- "addAccount": "+ Добавить {account}",
1057
+ "addAccount": "+ Добавить аккаунт",
1130
1058
  "cardIntro": "Подписки, ротация и ограничения аккаунтов.",
1131
1059
  "connect": "Подключить",
1132
1060
  "connected": "Подключено",
@@ -1139,30 +1067,30 @@ window.__ModuleLoader__.load({
1139
1067
  "pastePlaceholder": "Вставьте перенаправленный URL или код",
1140
1068
  "plan": "План",
1141
1069
  "reconnect": "Переподключиться",
1142
- "removeSlot": "Удалить слот {slot}",
1070
+ "removeSlot": "Удалить слот",
1143
1071
  "save": "Сохранить",
1144
1072
  "saved": "Сохранено",
1145
1073
  "show": "Показать",
1146
- "storedAs": "Хранится как {placeholder}",
1074
+ "storedAs": "Хранится как",
1147
1075
  "submitCode": "Отправить код",
1148
1076
  "title": "Подписки",
1149
1077
  "usageFull": "Использование 100%",
1150
1078
  "useOrigin": "Используйте этот источник Web UI как redirect_uri для OAuth",
1151
1079
  "useOriginHint": "Не включайте, если вы не зарегистрировали собственный OAuth-клиент для этого источника. CLI-клиенты поставщиков обычно требуют опубликованный URI перенаправления и шаг вставки.",
1152
- "verifyAccount": "Подтвердите {account}",
1080
+ "verifyAccount": "Подтвердить аккаунт",
1153
1081
  "verifyLink": "Откройте ссылку для подтверждения",
1154
1082
  "verifyPrefix": "Google требует одноразовой проверки аккаунта.",
1155
1083
  "verifySuffix": "затем переподключитесь."
1156
1084
  },
1157
1085
  "dsh-tts": {
1158
- "addProvider": "Добавить {provider}",
1159
- "announce": "Объявить одобрения {placeholders}",
1086
+ "addProvider": "Добавить провайдера",
1087
+ "announce": "Объявлять одобрения",
1160
1088
  "announceHint": "Произнесите вслух и воспроизведите мелодию, когда агент остановится для подтверждения или задаст вопрос.",
1161
1089
  "approvalHint": "Сказано, когда запрашивается одобрение; добавляется название инструмента.",
1162
1090
  "approvalText": "Формулировка одобрения",
1163
1091
  "azureHint": "Необходимо для поставщика Azure, например, eastus.",
1164
1092
  "azureRegion": "Регион Azure",
1165
- "bargeIn": "Замолкают, когда вы говорите {placeholder}",
1093
+ "bargeIn": "Замолкать, когда вы говорите",
1166
1094
  "bargeInHint": "Перестаньте читать, как только микрофон откроется.",
1167
1095
  "binHint": "Ищется в PATH, если не указан абсолютный путь.",
1168
1096
  "cardHint": "Цепочка провайдеров, голоса и параметры воспроизведения.",
@@ -1178,7 +1106,7 @@ window.__ModuleLoader__.load({
1178
1106
  "edgeHint": "Python CLI из пакета edge-tts.",
1179
1107
  "espeakBin": "Бинарный файл eSpeak",
1180
1108
  "espeakHint": "Обычно espeak-ng.",
1181
- "fromEnv": "Установлено в окружении {environment}",
1109
+ "fromEnv": "Задано в окружении",
1182
1110
  "general": "Общие",
1183
1111
  "language": "Язык",
1184
1112
  "languageHint": "Подсказка для голосов, которым требуется локаль (eSpeak, Azure SSML).",
@@ -1202,59 +1130,8 @@ window.__ModuleLoader__.load({
1202
1130
  "title": "Речь",
1203
1131
  "up": "Вверх"
1204
1132
  },
1205
- "dsh-vision-bridge": {
1206
- "addChannel": "Добавить канал",
1207
- "advanced": "Продвинутый",
1208
- "apiKey": "API-ключ",
1209
- "auto": "Авто",
1210
- "baseURL": "Базовый URL",
1211
- "channels": "Каналы",
1212
- "channelsHint": "Дополнительные конечные точки зрения (совместимые с OpenAI, Ollama, пользовательские). Пусто — автоматический выбор из каталога.",
1213
- "current": "Текущий: {provider} / {model}",
1214
- "currentAuto": "Авто (автоматический выбор)",
1215
- "describeStrategy": "Опишите стратегию",
1216
- "empty": "Пожалуйста, войдите в свою учетную запись {accountName}",
1217
- "escalation": "Эскалация",
1218
- "escalationAuto": "Автоматическое повышение сложности (повторный анализ сложных изображений)",
1219
- "escalationSimple": "Простой только (один проход)",
1220
- "failed": "Не удалось загрузить/сохранить",
1221
- "keyHidden": "неизвестно",
1222
- "keyMissing": "нет ключа",
1223
- "keyOk": "Ключ ОК",
1224
- "loading": "…",
1225
- "mode": "Режим",
1226
- "modeHybrid": "Гибридный (автоперезапись + инструменты)",
1227
- "modeLlm": "Только LLM (автоперезапись, инструменты всё ещё доступны)",
1228
- "modeTools": "Только инструменты (без авто-перезаписи, модель должна вызывать describe_image)",
1229
- "model": "Модель",
1230
- "modelInvalid": "Модель не принимает изображения",
1231
- "noVisionModels": "В каталоге нет моделей для анализа изображений (ввод: [текст, изображение]) — добавьте их в Настройки → Модели.",
1232
- "protocol": "Протокол",
1233
- "protocolOpenaiChat": "чат OpenAI",
1234
- "protocolOpenaiResponses": "ответы от OpenAI",
1235
- "provider": "Поставщик услуг по зрению",
1236
- "remove": "Удалить",
1237
- "reqBoth": "Выберите и провайдера, и модель, или оставьте оба поля пустыми для автоматического выбора",
1238
- "requestTemplate": "Шаблон запроса",
1239
- "reset": "Сбросить (авто)",
1240
- "responsePath": "Путь ответа",
1241
- "save": "Сохранить",
1242
- "saved": "Сохранено",
1243
- "saving": "Сохранение…",
1244
- "strategyAuto": "Авто (использовать LLM для зрения)",
1245
- "strategyCacheOnly": "Только кэш (без сети)",
1246
- "strategyLlm": "Vision {LLM}",
1247
- "strategyOcrLocal": "Локальное OCR (зарезервировано)",
1248
- "subtitle": "Изображения в чате обрабатываются моделью зрения, которую вы выбираете здесь. Оставьте оба поля пустыми, чтобы автоматически выбрать первую модель с поддержкой зрения из каталога.",
1249
- "testFail": "Ошибка: {err}",
1250
- "testOk": "ОК ({ms}мс)",
1251
- "testVision": "Проверка зрения",
1252
- "testing": "Тестирование…",
1253
- "title": "Зрение",
1254
- "type": "Тип"
1255
- },
1256
1133
  "dsh-voice": {
1257
- "addCustom": "Добавьте своего провайдера {provider}",
1134
+ "addCustom": "Добавить своего провайдера",
1258
1135
  "addProvider": "Добавить поставщика",
1259
1136
  "browserFailed": "Браузер не распознал:",
1260
1137
  "browserHint": "браузер выполняет распознавание, ключ не требуется",
@@ -1301,7 +1178,7 @@ window.__ModuleLoader__.load({
1301
1178
  "openrouterHint": "google/gemini-2.5-flash · ключ OPENROUTER_API_KEY",
1302
1179
  "openrouterWarning": "У OpenRouter нет /audio/transcriptions — используйте там шаблон openai-chat-audio",
1303
1180
  "pauseHint": "Меньшее значение означает более частые фрагменты и быстрый текст, но выше риск разрыва слова",
1304
- "pauseMs": "Пауза, завершающая фразу, {ms}",
1181
+ "pauseMs": "Пауза, завершающая фразу, мс",
1305
1182
  "pressKey": "Нажмите клавишу…",
1306
1183
  "recognitionError": "распознавание не удалось",
1307
1184
  "recordSlot": "Запись голоса",
@@ -1310,18 +1187,18 @@ window.__ModuleLoader__.load({
1310
1187
  "saveFailed": "Некоторые поля не были сохранены —",
1311
1188
  "saved": "Сохранено ✓",
1312
1189
  "secondsShort": "с",
1313
- "sendingIn": "Отправка агенту в {placeholder}",
1190
+ "sendingIn": "Отправка агенту через",
1314
1191
  "siliconflowHint": "FunAudioLLM/SenseVoiceSmall · ключ SILICONFLOW_API_KEY",
1315
1192
  "stop": "Стоп",
1316
1193
  "title": "Голос",
1317
1194
  "transcribing": "Транскрибируем…",
1318
1195
  "undoHint": "Как долго ещё можно отменить автоматическую отправку",
1319
- "undoMs": "Отменить окно, {ms}",
1196
+ "undoMs": "Окно отмены, мс",
1320
1197
  "up": "Вверх",
1321
- "whisperAutostart": "Автозапуск локального {whisper}",
1198
+ "whisperAutostart": "Автозапуск локального whisper",
1322
1199
  "whisperBin": "Локальный шепот: бинарный",
1323
1200
  "whisperBinHint": "используется при включённом автозапуске",
1324
- "whisperEndpoint": "Локальный шепот: {endpoint}",
1201
+ "whisperEndpoint": "Локальный whisper: адрес",
1325
1202
  "whisperEndpointHint": "POST /inference сервера whisper.cpp",
1326
1203
  "whisperModel": "Локальная модель Whisper"
1327
1204
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-russian-lang",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
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",