@goodandready/dsh-russian-lang 0.2.12 → 0.2.14

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-russian-lang",
3
- "version": "0.2.12",
4
- "description": "Russian localization for DeepSeek Harness (DSH v0.1.5-rc.1+) web UI: adds Русский as the native language option in Settings - General - Language. 100.0% coverage across 5688 keys (1225 core UI keys + 4463 keys across 40+ ecosystem plugins) with zero machine drafts. Features unified dsh-clinebot visual design standard for Settings Card, Smart Russian UX (localized Markdown export, turn translation, live typography, slash command aliases, Alt+L layout fix), expanded error humanizer (POSIX, HTTP 4xx/5xx), Skin Center & Wallpaper Engine support, Workshop market integration, sidebar previewers, and runtime snapshot extension without modifying core files.",
3
+ "version": "0.2.14",
4
+ "description": "Russian localization for DeepSeek Harness (DSH v0.1.5-rc.1+) web UI: adds Русский as the native language option in Settings - General - Language. 100.0% coverage across 6,002 keys (1,225 core UI keys + 4,777 keys across 40+ ecosystem plugins) with zero machine drafts. Features unified dsh-clinebot visual design standard for Settings Card, full translations for updated ecosystem plugins (Config Manager Overview & Multi-step Import, Remote Workspace Containers & Direct Transfer, Key Rotation Pools & Bulk Actions, Cost Meter Session Budgets & Off-peak Windows, Context, Vision Bridge, BetterSidebar), Smart Russian UX (localized Markdown export, turn translation, live typography, slash command aliases, Alt+L layout fix), expanded error humanizer (POSIX, HTTP 4xx/5xx), Skin Center & Wallpaper Engine support, Workshop market integration, sidebar previewers, and runtime snapshot extension without modifying core files.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -483,6 +483,8 @@
483
483
  "guideDescSidechat": "Независимая ветка диалога, наследующая контекст текущей сессии",
484
484
  "guideDescTerminal": "Полноценный терминал (xterm + pty) с автоматическим переподключением",
485
485
  "guideDescBrowser": "Встроенный браузер для открытия ссылок непосредственно из чата",
486
- "terminalShellNotFound": "Настроенный командный шелл не найден: {name} — проверьте путь к шеллу в Настройки → Боковая карточка → Терминал"
486
+ "terminalShellNotFound": "Настроенный командный шелл не найден: {name} — проверьте путь к шеллу в Настройки → Боковая карточка → Терминал",
487
+ "terminalWaitBanner": "Агент ожидает {needle}",
488
+ "terminalSkipWait": "Пропустить ожидание"
487
489
  }
488
490
  }
@@ -294,6 +294,16 @@
294
294
  "trend.adaptiveHint": "Масштабировать высоту столбцов под видимый диапазон с учётом прокрутки",
295
295
  "timing.reasoning": "Размышление",
296
296
  "timing.text": "Ответ",
297
- "timing.toolArgs": "Аргументы инструментов"
297
+ "timing.toolArgs": "Аргументы инструментов",
298
+ "rich.copy": "Скопировать исходный текст",
299
+ "rich.copied": "Скопировано",
300
+ "stats.humanInputs": "Сообщения пользователя",
301
+ "stats.humanInputsTip": "Сообщения пользователя и ответы на вопросы в текущей сессии.",
302
+ "tokens.total": "Всего",
303
+ "settings.placement": "Варианты размещения",
304
+ "placement.tab": "Вкладка",
305
+ "placement.sidebar": "Боковая панель",
306
+ "placement.all": "Везде",
307
+ "files.preview": "Предпросмотр в боковой панели"
298
308
  }
299
309
  }
@@ -303,6 +303,151 @@
303
303
  "nextSteps.secrets.title": "Re-enter credentials ({count})",
304
304
  "nextSteps.secrets.hint": "These credentials were not exported with the backup; re-enter them on this machine:",
305
305
  "nextSteps.unresolved.title": "Failed / skipped ({count})",
306
- "nextSteps.unresolved.hint": "These items were not applied; you can retry them from the result page:"
306
+ "nextSteps.unresolved.hint": "These items were not applied; you can retry them from the result page:",
307
+ "view.overview": "Обзор",
308
+ "toast.copied": "Скопировано в буфер обмена",
309
+ "toast.copyFailed": "Не удалось скопировать — выделите текст и скопируйте вручную",
310
+ "toast.refreshed": "Обновлено",
311
+ "overview.subtitle": "Здоровье конфигурации и быстрые действия (данные только для чтения из каждого раздела)",
312
+ "overview.refresh": "Обновить",
313
+ "overview.loading": "Загрузка обзора…",
314
+ "overview.health.ok": "Конфигурация в полном порядке",
315
+ "overview.health.noBackup": "Резервных копий пока нет — сначала создайте бэкап или снимок",
316
+ "overview.health.scheduleFailed": "Последний бэкап по расписанию не удался — проверьте настройки",
317
+ "overview.health.recovery": "Неразрешённые элементы восстановления требуют внимания",
318
+ "overview.health.recoveryAction": "Перейти к восстановлению инцидентов",
319
+ "overview.metric.backups": "Файлы бэкапов",
320
+ "overview.metric.snapshots": "Снимки безопасности",
321
+ "overview.metric.schedule": "Бэкап по расписанию",
322
+ "overview.metric.sync": "Удалённая синхронизация",
323
+ "overview.state.on": "Вкл.",
324
+ "overview.state.off": "Выкл.",
325
+ "overview.meta.lastBackup": "Посл.: {time}",
326
+ "overview.meta.noBackup": "Записей пока нет",
327
+ "overview.meta.scheduleOn": "Включено · посл. запуск {time}",
328
+ "overview.meta.scheduleOff": "Отключено (включите для автозащиты)",
329
+ "overview.meta.scheduleFail": "Сбой последнего бэкапа",
330
+ "overview.meta.syncOn": "Настроено · посл. синхронизация {time}",
331
+ "overview.meta.syncOff": "Не настроено",
332
+ "overview.meta.never": "Никогда не запускалось",
333
+ "overview.time.now": "только что",
334
+ "overview.time.min": "{n} мин назад",
335
+ "overview.time.hour": "{n} ч назад",
336
+ "overview.time.day": "{n} дн назад",
337
+ "overview.quick.title": "Быстрые действия",
338
+ "overview.quick.backup": "Создать бэкап",
339
+ "overview.quick.backupHint": "Полный снимок (без секретов), доступный для отката в любой момент",
340
+ "overview.quick.backupDone": "Резервное копирование завершено",
341
+ "overview.quick.backupFailed": "Сбой резервного копирования",
342
+ "overview.quick.export": "Экспорт бэкапа",
343
+ "overview.quick.exportHint": "Создать переносимый ZIP-архив резервной копии",
344
+ "overview.quick.import": "Импорт / восстановление",
345
+ "overview.quick.importHint": "Восстановить конфигурацию из файла бэкапа на этом компьютере",
346
+ "overview.quick.sync": "Удалённая синхронизация",
347
+ "overview.quick.syncHint": "Поддерживать одинаковые настройки на разных устройствах (Git / WebDAV)",
348
+ "overview.activity.title": "Недавняя активность",
349
+ "overview.activity.empty": "Активности пока нет (здесь появятся бэкапы, импорты и синхронизации)",
350
+ "overview.suggest.title": "Рекомендации",
351
+ "overview.suggest.schedule": "Включите бэкап по расписанию для автоматической защиты настроек",
352
+ "overview.suggest.sync": "Настройте удалённую синхронизацию для лёгкого переноса между устройствами",
353
+ "overview.empty.title": "Начните защиту своей конфигурации",
354
+ "overview.empty.body": "После создания первого бэкапа или снимка здесь отобразятся статус здоровья и недавняя активность.",
355
+ "overview.running": "Задач выполняется: {count}",
356
+ "overview.kind.import": "Импорт",
357
+ "overview.kind.restore": "Восстановление",
358
+ "overview.kind.rollback": "Откат",
359
+ "overview.kind.profile-switch": "Переключение профиля",
360
+ "overview.kind.profile-delete": "Удаление профиля",
361
+ "overview.kind.profile-rename": "Переименование профиля",
362
+ "overview.kind.profile-save": "Сохранение профиля",
363
+ "overview.kind.profile-import": "Импорт профиля",
364
+ "overview.kind.sync-apply": "Применение синхронизации",
365
+ "overview.kind.autosync": "Автосинхронизация",
366
+ "overview.kind.recovery": "Восстановление",
367
+ "overview.kind.backup": "Резервное копирование",
368
+ "overview.kind.snapshot-delete": "Удаление снимка",
369
+ "overview.kind.snapshot-prune": "Очистка снимков",
370
+ "overview.kind.other": "Другая операция",
371
+ "import.stage.select": "Выбор",
372
+ "import.stage.analyze": "Анализ",
373
+ "import.stage.decide": "Предпросмотр и решение",
374
+ "import.stage.confirm": "Подтверждение",
375
+ "import.stage.execute": "Выполнение",
376
+ "import.stage.done": "Готово",
377
+ "import.stepper.label": "Шаг {current} из {total}: {label}",
378
+ "snapshots.subTab.schedule": "Расписание",
379
+ "snapshots.empty.title": "Снимков пока нет",
380
+ "snapshots.empty.body": "Снимки создаются автоматически перед импортом и восстановлением для отката в один клик. Вы также можете сделать снимок прямо сейчас.",
381
+ "snapshots.empty.viewFiles": "Просмотр файлов бэкапов",
382
+ "snapshots.empty.runBackup": "Создать снимок сейчас",
383
+ "backupFiles.noteUnreadable": "(примечание не читается)",
384
+ "snapshots.deleted": "Снимок удалён",
385
+ "backupFiles.name": "Файл",
386
+ "backupFiles.source": "Источник",
387
+ "backupFiles.size": "Размер",
388
+ "backupFiles.time": "Изменён",
389
+ "backupFiles.deleted": "Удалён файл бэкапа «{name}»",
390
+ "about.diag.label": "Источник списка плагинов",
391
+ "about.diag.profileDir": "Каталог: {path}",
392
+ "about.diag.profile": "Профиль: {profile}",
393
+ "about.diag.pluginCount": "Обнаружено плагинов: {count}",
394
+ "about.diag.manifestUnreadable": "В каталоге отсутствует читаемый package.json — список плагинов пуст. Проверьте соответствие профиля DSH и переменной DSH_HOME этому пути.",
395
+ "about.diag.bundles": "бандлы: {bundles}",
396
+ "about.diag.hint": "Если данные не совпадают с вашей конфигурацией, проверьте аргумент DSH --profile и переменную DSH_HOME.",
397
+ "profiles.save.done": "Сохранён профиль «{name}»",
398
+ "profiles.delete.done": "Удалён профиль «{name}»",
399
+ "profiles.import.done": "Импортирован профиль «{name}»",
400
+ "import.compatibility.sections": "Разделов: {count}",
401
+ "import.compatibility.plugins": "установлено {installed} · к установке {toInstall}",
402
+ "import.compatibility.paths": "Проблем с путями: {count}",
403
+ "import.compatibility.secrets": "Секретов для повторного ввода: {count}",
404
+ "import.compatibility.score.excellent": "Отличная",
405
+ "import.compatibility.score.good": "Хорошая",
406
+ "import.compatibility.score.partial": "Частичная",
407
+ "import.compatibility.score.unsupported": "Не поддерживается",
408
+ "import.compatibility.sectionsTitle": "Разделы в этой резервной копии",
409
+ "sync.status.lastSync": "Последняя синхронизация",
410
+ "sync.status.sections": "Синхронизируемые разделы",
411
+ "nav.overview": "Обзор",
412
+ "nav.backups": "Бэкапы",
413
+ "nav.export": "Экспорт",
414
+ "nav.import": "Импорт",
415
+ "nav.sync": "Синхронизация",
416
+ "nav.market": "Витрина",
417
+ "nav.profiles": "Профили",
418
+ "nav.activity": "Активность",
419
+ "nav.about": "О плагине",
420
+ "nav.refresh": "Обновить",
421
+ "shell.status.idle": "Ожидание",
422
+ "shell.status.running": "Задач выполняется: {count}",
423
+ "shell.status.recovery": "Ожидает восстановления",
424
+ "shell.version": "Плагин {plugin} · DSH {dsh}",
425
+ "shell.drawer.title": "Активность и информация",
426
+ "overview.result.success": "Успешно",
427
+ "overview.result.failed": "Сбой",
428
+ "overview.result.skipped": "Пропущено",
429
+ "overview.activity.viewAll": "Смотреть все",
430
+ "overview.activity.copy": "Копировать",
431
+ "overview.activity.redacted": "(имя файла скрыто)",
432
+ "overview.location.title": "Хранилище бэкапов",
433
+ "overview.location.dir": "Каталог бэкапов",
434
+ "overview.location.totalSize": "Общий объём",
435
+ "overview.location.retention": "Снимки",
436
+ "overview.location.retentionValue": "{used} / {limit}",
437
+ "overview.location.schedule": "Расписание",
438
+ "overview.location.scheduleOn": "{interval} · посл. {time}",
439
+ "overview.location.scheduleOff": "Выкл.",
440
+ "overview.location.nextRun": "Следующий запуск",
441
+ "overview.location.lastRun": "Последний запуск",
442
+ "overview.sections.title": "Состав разделов",
443
+ "overview.sections.hint": "Оценено по текущей конфигурации (предпросмотр только для чтения, без записи)",
444
+ "overview.sections.total": "Всего",
445
+ "overview.sections.entries": "Элементов: {count}",
446
+ "overview.quick.exportTitle": "Сформировать переносимый ZIP-бэкап и скачать его",
447
+ "overview.quick.importTitle": "Восстановить из файла бэкапа или перенести на этот компьютер",
448
+ "overview.quick.syncTitle": "Синхронизировать конфигурации между устройствами (Git / WebDAV)",
449
+ "overview.quick.backupTitle": "Полный снимок с возможностью отката в любой момент",
450
+ "overview.nav.activity": "Активность",
451
+ "overview.nav.about": "О плагине"
307
452
  }
308
- }
453
+ }
@@ -172,6 +172,25 @@
172
172
  "history.channelWebdav": "WebDAV",
173
173
  "common.close": "Закрыть",
174
174
  "common.retry": "Повторить",
175
- "common.loading": "Загрузка…"
175
+ "common.loading": "Загрузка…",
176
+ "syncStatus.lastSync": "Последняя синхронизация",
177
+ "syncStatus.sections": "Синхронизируемые разделы",
178
+ "syncStatus.state": "Состояние",
179
+ "toast.autosyncLoadFailed": "Не удалось загрузить статус автосинхронизации",
180
+ "toast.configSaveFailed": "Не удалось сохранить настройки канала",
181
+ "toast.configSaved": "Настройки канала сохранены",
182
+ "toast.configNothingToSave": "Введите URL канала перед сохранением",
183
+ "toast.selectionSaveFailed": "Не удалось сохранить настройки синхронизации",
184
+ "toast.pushPreviewFailed": "Не удалось сформировать предпросмотр отправки",
185
+ "toast.pushFailed": "Ошибка отправки",
186
+ "toast.pushDone": "Отправка завершена",
187
+ "toast.pullFailed": "Ошибка получения",
188
+ "toast.pullDone": "Получение завершено",
189
+ "toast.syncStartFailed": "Синхронизация в один клик не удалась",
190
+ "toast.autosyncUpdateFailed": "Не удалось обновить параметры автосинхронизации",
191
+ "toast.autosyncUpdated": "Параметры автосинхронизации обновлены",
192
+ "toast.snapshotsLoadFailed": "Не удалось загрузить удалённые снимки",
193
+ "toast.snapshotsRefreshed": "Список удалённых снимков обновлён",
194
+ "load.failed": "Не удалось загрузить статус синхронизации"
176
195
  }
177
- }
196
+ }
@@ -130,6 +130,13 @@
130
130
  "common.close": "Закрыть",
131
131
  "common.retry": "Повторить",
132
132
  "common.loading": "Загрузка…",
133
- "common.unknownError": "Неизвестная ошибка"
133
+ "common.unknownError": "Неизвестная ошибка",
134
+ "config.refreshed": "Индекс витрины обновлён",
135
+ "list.browsed": "Витрина обновлена",
136
+ "import.done": "Импорт завершён: записано элементов: {count}",
137
+ "import.failed": "Ошибка импорта (сбоев: {count})",
138
+ "import.needsRestart": "Некоторые изменения требуют перезапуска DSH",
139
+ "detail.failed": "Ошибка скачивания — закройте этот диалог и повторите (см. уведомление справа внизу)",
140
+ "myconfigs.install.failed": "Ошибка скачивания — закройте этот диалог и повторите (см. уведомление справа внизу)"
134
141
  }
135
- }
142
+ }
@@ -194,6 +194,13 @@
194
194
  "testing": "Тестирование…",
195
195
  "tileLargeImages": "Фрагментировать большие изображения",
196
196
  "type": "Тип",
197
- "vllm": "vLLM"
197
+ "vllm": "vLLM",
198
+ "secRouting": "Маршрутизация",
199
+ "secImage": "Качество изображений",
200
+ "attachments": "Вложения",
201
+ "attachmentsHint": "Сколько изображений можно опубликовать за один вызов attach, и нужно ли скрывать инструменты бриджа от моделей с нативным зрением.",
202
+ "attachMaxItems": "Макс. вложений за вызов",
203
+ "attachMaxItemsRange": "Количество вложений за вызов должно быть целым числом от 1 до 32",
204
+ "hideRedundantTools": "Скрывать инструменты бриджа у моделей со зрением"
198
205
  }
199
- }
206
+ }
@@ -145,6 +145,57 @@
145
145
  "testOk": "OK",
146
146
  "testing": "Тестирование…",
147
147
  "usedAgo": "{ago} назад",
148
- "weightHint": "вес в round-robin: сколько раз ключ участвует в цикле (1 = равная доля)"
148
+ "weightHint": "вес в round-robin: сколько раз ключ участвует в цикле (1 = равная доля)",
149
+ "sectionStats": "Здоровье пула и телеметрия",
150
+ "sectionStatsDesc": "Телеметрия активных пулов ключей в реальном времени, доступные учётные данные и статус переключения.",
151
+ "sectionFailover": "Триггеры отказа и коды ошибок",
152
+ "sectionFailoverDesc": "Выбор условий и ошибок, вызывающих автоматическое переключение на следующий доступный ключ.",
153
+ "sectionTiming": "Тайминги и расписание ротации",
154
+ "sectionTimingDesc": "Настройка длительности периода охлаждения (cooldown) и окон периодической ротации.",
155
+ "sectionBackup": "Резервные копии и снимки",
156
+ "sectionBackupDesc": "Экспорт и импорт пулов провайдеров и создание полных снимков конфигурации плагина.",
157
+ "statPools": "Настроенных пулов",
158
+ "statKeys": "Всего ключей",
159
+ "statHealthy": "Исправны / Готовы",
160
+ "loadDistribution": "Распределение трафика",
161
+ "statRequests": "запросов",
162
+ "noTrafficYet": "Трафик пока не зафиксирован",
163
+ "confirm": "Подтвердить",
164
+ "cancel": "Отмена",
165
+ "confirmResetTitle": "Сбросить охлаждение для {p}?",
166
+ "confirmResetDesc": "Это немедленно сбросит счётчики сбоев, таймеры охлаждения и переведёт автоматический выключатель (circuit breaker) в исходное состояние.",
167
+ "confirmRemoveProvTitle": "Удалить провайдера {p}?",
168
+ "confirmRemoveProvDesc": "Вы уверены, что хотите удалить этого провайдера и все настроенные ключи из ротации?",
169
+ "undoProvider": "Провайдер удалён",
170
+ "undoKey": "Ключ удалён",
171
+ "undo": "Отменить",
172
+ "header.title": "Ротация ключей и отказоустойчивость",
173
+ "header.sub": "Автоматическая круговая (round-robin) ротация нескольких ключей, экспоненциальные таймауты при ошибках 429/5xx, защита цепи failover и безопасность учётных данных (~/.dsh/.credentials.yaml).",
174
+ "header.pools_badge": "активных пулов",
175
+ "header.keys_badge": "настроенных ключей",
176
+ "emptyTitle": "Пулов пока нет",
177
+ "emptyDesc": "Добавьте провайдера и хотя бы одно имя API-ключа для запуска ротации.",
178
+ "errorTitle": "Не удалось загрузить настройки",
179
+ "retry": "Повторить",
180
+ "unavailableTitle": "Мост настроек недоступен",
181
+ "unavailableDesc": "Хост не предоставил пространство настроек dsh-key-rotation. Откройте «Настройки» заново или проверьте, включён ли плагин.",
182
+ "modalClose": "Закрыть диалог",
183
+ "dialogLabel": "Подтверждение",
184
+ "loadChartAria": "Распределение трафика по ключам",
185
+ "bulkCooldownPlaceholder": "Массовый таймаут (мс)",
186
+ "bulkApply": "Применить к выбранным",
187
+ "bulkRemove": "Удалить выбранные",
188
+ "confirmBulkRemoveTitle": "Удалить выбранных провайдеров ({n})?",
189
+ "confirmBulkRemoveDesc": "Выбранные провайдеры и все их ключи будут исключены из ротации. Действие можно отменить один раз сразу после удаления.",
190
+ "selectProvider": "Выбрать провайдера {p}",
191
+ "activeBadge": "активен",
192
+ "healthScoreTitle": "рейтинг надёжности",
193
+ "totalRequestsTitle": "всего запросов",
194
+ "exportProvider": "Экспортировать этого провайдера",
195
+ "recentFailures": "Недавние сбои ({n})",
196
+ "noActivePools": "Нет активных пулов",
197
+ "headerPoolsTitle": "Пулы ротации ключей",
198
+ "pausedBudget": "приостановлен",
199
+ "sortUsage": "Сортировать по нагрузке"
149
200
  }
150
- }
201
+ }
@@ -37,6 +37,41 @@
37
37
  "settings.saved": "Сохранено",
38
38
  "settings.saving": "Сохранение…",
39
39
  "settings.unavailable": "Настройки недоступны (namespace ещё не зарегистрирован).",
40
- "subtitle": "Стоимость сессии в шапке, тарифы токенов и детализация по моделям"
40
+ "subtitle": "Стоимость сессии в шапке, тарифы токенов и детализация по моделям",
41
+ "header.title": "Счётчик расходов",
42
+ "header.sub": "Мониторинг расхода токенов, автоматический расчёт тарифов и скидочные интервалы",
43
+ "badge.catalog_ok": "Каталог: моделей — {count}",
44
+ "badge.catalog_empty": "Каталог: загрузка…",
45
+ "badge.catalog_off": "Каталог: отключён",
46
+ "badge.catalog_err": "Каталог: ошибка",
47
+ "badge.deepseek": "Тариф DeepSeek: активен",
48
+ "section.general": "Основные параметры",
49
+ "section.general_desc": "Отображение валюты, коэффициент конвертации и настройка часового пояса",
50
+ "section.openrouter": "Каталог тарифов OpenRouter",
51
+ "section.openrouter_desc": "Публичный каталог для динамического расчёта стоимости моделей и скидочных интервалов",
52
+ "section.diagnostics": "Диагностика и статус",
53
+ "section.diagnostics_desc": "Текущее состояние фоновой синхронизации и кэша тарифов",
54
+ "diag.models_count": "Моделей в каталоге",
55
+ "diag.last_sync": "Последняя синхронизация",
56
+ "diag.route": "Активный маршрут",
57
+ "diag.tariff_source": "Источник тарифов",
58
+ "field.useOpenRouter": "Использовать каталог OpenRouter",
59
+ "hint.useOpenRouter": "Динамически получать тарифы и окна скидок через публичный API OpenRouter.",
60
+ "field.refreshHours": "Интервал обновления каталога (в часах)",
61
+ "hint.refreshHours": "Интервал фонового запроса каталога в часах (от 1 до 168).",
62
+ "settings.retry": "Повторить попытку",
63
+ "offpeak": "ночной тариф",
64
+ "badge.catalog_stale": "Кэш: офлайн",
65
+ "field.budgetThreshold": "Порог бюджета сессии (USD)",
66
+ "hint.budgetThreshold": "Предупреждать цветом плашки при превышении расходов в сессии (0 — выключено).",
67
+ "action.sync_now": "Синхронизировать сейчас",
68
+ "action.syncing": "Синхронизация…",
69
+ "action.sync_ok": "Каталог обновлён",
70
+ "action.sync_err": "Синхронизация не удалась",
71
+ "action.sync_rate_limited": "Подождите {seconds} с",
72
+ "action.copy_report": "Скопировать сводку",
73
+ "action.copied": "Скопировано!",
74
+ "savings.hint": "💡 Скидка 50% начнётся через {time} ({clock} {zone})",
75
+ "budget.exceeded": "⚠️ Лимит бюджета превышен: {limit}"
41
76
  }
42
77
  }
@@ -20,6 +20,25 @@
20
20
  "maxFileSizeMbDesc": "Размер, при котором выполняется ротация файла аудита",
21
21
  "retentionDays": "Срок хранения логов (дней)",
22
22
  "retentionDaysDesc": "Удалять записи аудита старше указанного количества дней",
23
- "unavailable": "Настройки аудитора временно недоступны"
23
+ "unavailable": "Настройки аудитора временно недоступны",
24
+ "header.sub": "Аудит безопасности в реальном времени, защита от утечки секретов, перехват деструктивных команд и гейтинг diff-изменений.",
25
+ "sec.guards_title": "Безопасность выполнения и гарды",
26
+ "sec.guards_desc": "Упреждающая проверка границ для перехвата опасных системных операций до выполнения команды.",
27
+ "sec.diff_gate_title": "Контроль изменений кода и SAST",
28
+ "sec.diff_gate_desc": "Многофакторный предварительный анализ изменений исходного кода, уязвимостей SAST и попыток внедрения промптов.",
29
+ "sec.audit_log_title": "Журнал аудита и хранение",
30
+ "sec.audit_log_desc": "Постоянный журнал телеметрии JSONL с автоматической gzip-ротацией и политикой хранения.",
31
+ "diffGateMode": "Политика контроля изменений (Diff Gate)",
32
+ "diffGateModeDesc": "Политика барьера одобрения diff: предупреждение или блокировка при высоком и критическом уровне риска",
33
+ "diffGate.disabled": "Отключено",
34
+ "diffGate.warning": "Предупреждение (Аудит)",
35
+ "diffGate.block": "Блокировка (Строгая)",
36
+ "enableSast": "Небезопасные паттерны кода (SAST)",
37
+ "enableSastDesc": "Проверка diff-изменений на SQL-инъекции, командные инъекции, path traversal и вызовы eval()",
38
+ "enablePromptInjection": "Сканер внедрения промптов",
39
+ "enablePromptInjectionDesc": "Сканирование diff-изменений на попытки переопределения системного промпта и джейлбрейка",
40
+ "shield.green": "Безопасно",
41
+ "shield.yellow": "Внимание",
42
+ "shield.red": "Тревога"
24
43
  }
25
44
  }
@@ -44,6 +44,83 @@
44
44
  "pullBtn": "⬇️ Скачать с сервера (Pull)",
45
45
  "pushBtn": "⬆️ Загрузить на сервер (Push)",
46
46
  "syncSuccess": "Синхронизация успешно выполнена",
47
- "syncFailed": "Ошибка синхронизации: "
47
+ "syncFailed": "Ошибка синхронизации: ",
48
+ "badgeOnline": "Активный хост: {name} ({latency} мс)",
49
+ "badgeOffline": "Хост не выбран",
50
+ "badgeTunnels": "Туннелей: {count}",
51
+ "badgeKey": "🔑 Вход по ключу",
52
+ "badgePassword": "🔒 Вход по паролю",
53
+ "pinBtn": "Закрепить активный",
54
+ "editBtn": "Изменить",
55
+ "delBtn": "Удалить",
56
+ "delConfirm": "Удалить профиль хоста «{name}»?",
57
+ "fKeyPathHint": "Путь к ~/.ssh/id_rsa или /home/user/.ssh/id_ed25519",
58
+ "fLocalMirror": "Локальная папка зеркала",
59
+ "fLocalMirrorHint": "Локальная директория для зеркалирования файлов при быстрой трёхсторонней синхронизации",
60
+ "testOk": "✅ Соединение установлено! Задержка: {latency} мс | ОС: {os}",
61
+ "testFail": "❌ Ошибка подключения: {err}",
62
+ "diagProbeBtn": "⚡ Быстрая диагностика",
63
+ "pulling": "Получение файлов…",
64
+ "pushing": "Отправка файлов…",
65
+ "syncOk": "Синхронизация завершена! Обновлено файлов: {count}.",
66
+ "syncConflict": "Предупреждение о конфликте: изменено с обеих сторон файлов — {count}.",
67
+ "syncErr": "Ошибка синхронизации: {err}",
68
+ "tunnelsTitle": "🔀 Проброс портов SSH (туннели)",
69
+ "tunnelsDesc": "Проброс удалённых портов (базы данных, веб-серверы, API) на локальный компьютер через зашифрованные SSH-туннели.",
70
+ "tLocalPort": "Локальный порт",
71
+ "tRemotePort": "Удалённый порт",
72
+ "tOpenBtn": "+ Открыть туннель",
73
+ "tOpening": "Открытие…",
74
+ "tStopBtn": "Остановить",
75
+ "tNoTunnels": "Нет активных туннелей проброса портов.",
76
+ "tunnelsColId": "ID туннеля",
77
+ "tunnelsColRoute": "Маршрут проброса",
78
+ "tunnelsColActions": "Действия",
79
+ "tOpenOk": "Туннель открыт: 127.0.0.1:{localPort} -> Удалённый:{remotePort}",
80
+ "tOpenErr": "Не удалось открыть туннель: {err}",
81
+ "tabProfiles": "🖥️ Профили хостов",
82
+ "tabContainers": "🐳 Контейнеры",
83
+ "containersTitle": "Удалённый Docker / Podman Engine",
84
+ "containerName": "Контейнер",
85
+ "containerImage": "Образ",
86
+ "containerStatus": "Статус",
87
+ "containerPorts": "Порты",
88
+ "btnLogs": "Логи",
89
+ "btnRestart": "Перезапустить",
90
+ "btnStop": "Остановить",
91
+ "noContainers": "Активных контейнеров не найдено или демон Docker не запущен.",
92
+ "healthCpu": "ЦП: {val}%",
93
+ "healthMem": "ОЗУ: {val}% ({used}/{total} МБ)",
94
+ "healthDisk": "Диск: {val}%",
95
+ "healthUptime": "Аптайм: {val}",
96
+ "autoSyncTitle": "Автосинхронизация при сохранении",
97
+ "autoSyncDesc": "Автоматически отправлять изменённые файлы в удалённое рабочее пространство при локальном сохранении.",
98
+ "btnTransfer": "Передать на хост…",
99
+ "transferTitle": "Прямая передача сервер-сервер",
100
+ "transferDestHost": "Целевой сервер",
101
+ "transferDestPath": "Целевой путь к файлу",
102
+ "transferBtnExec": "Передать напрямую",
103
+ "transferSuccess": "Успешно передано {bytes} байт на {host}:{path}",
104
+ "fJumpHost": "Jump-хост (бастион)",
105
+ "fJumpHostNone": "Прямое подключение (без jump-хоста)",
106
+ "tabTerminal": "⚡ Веб-терминал",
107
+ "tabExplorer": "📂 Проводник файлов",
108
+ "tabTunnels": "🔗 Порт-туннели",
109
+ "tabSync": "🔄 Станция синхронизации",
110
+ "vaultProtectedBadge": "🛡️ Защищено .env Vault",
111
+ "termStart": "Подключить терминал",
112
+ "termStop": "Отключить",
113
+ "termClear": "Очистить",
114
+ "termPlaceholder": "Введите команду и нажмите Enter (напр. htop, ls, docker ps)…",
115
+ "termConnected": "Подключено к PTY-сессии {id} на {host}",
116
+ "termDisconnected": "Терминал отключён.",
117
+ "explorerTitle": "Удалённый файловый менеджер",
118
+ "filePreviewTitle": "Просмотр файла: {path}",
119
+ "fileSize": "{size} КБ",
120
+ "btnSaveFile": "Сохранить изменения",
121
+ "fileSaved": "Файл успешно сохранён.",
122
+ "tunnelTraffic": "Вход: {rx} | Выход: {tx}",
123
+ "tunnelUptime": "Работает: {sec} с",
124
+ "openLocalLink": "🌐 Открыть локальный порт"
48
125
  }
49
- }
126
+ }