@goodandready/dsh-russian-lang 0.2.13 → 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/README.md +7 -7
- package/docs/media/banner.jpg +0 -0
- package/lib/client.js +4 -4
- package/package.json +2 -2
- package/ru-plugins/07-better-sidebar.json +3 -1
- package/ru-plugins/17-dsh-context.json +9 -1
- package/ru-plugins/26-config-manager.json +147 -2
- package/ru-plugins/27-config-manager-sync.json +21 -2
- package/ru-plugins/28-config-manager-market.json +9 -2
- package/ru-plugins/32-vision-bridge.json +9 -2
- package/ru-plugins/34-key-rotation.json +29 -1
- package/ru-plugins/36-cost-meter.json +13 -1
- package/ru-plugins/53-remote-workspace.json +45 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goodandready/dsh-russian-lang",
|
|
3
|
-
"version": "0.2.
|
|
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
|
|
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
|
}
|
|
@@ -296,6 +296,14 @@
|
|
|
296
296
|
"timing.text": "Ответ",
|
|
297
297
|
"timing.toolArgs": "Аргументы инструментов",
|
|
298
298
|
"rich.copy": "Скопировать исходный текст",
|
|
299
|
-
"rich.copied": "Скопировано"
|
|
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": "Предпросмотр в боковой панели"
|
|
300
308
|
}
|
|
301
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
|
+
}
|
|
@@ -168,6 +168,34 @@
|
|
|
168
168
|
"confirmRemoveProvDesc": "Вы уверены, что хотите удалить этого провайдера и все настроенные ключи из ротации?",
|
|
169
169
|
"undoProvider": "Провайдер удалён",
|
|
170
170
|
"undoKey": "Ключ удалён",
|
|
171
|
-
"undo": "Отменить"
|
|
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": "Сортировать по нагрузке"
|
|
172
200
|
}
|
|
173
201
|
}
|
|
@@ -60,6 +60,18 @@
|
|
|
60
60
|
"field.refreshHours": "Интервал обновления каталога (в часах)",
|
|
61
61
|
"hint.refreshHours": "Интервал фонового запроса каталога в часах (от 1 до 168).",
|
|
62
62
|
"settings.retry": "Повторить попытку",
|
|
63
|
-
"offpeak": "ночной тариф"
|
|
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}"
|
|
64
76
|
}
|
|
65
77
|
}
|
|
@@ -77,6 +77,50 @@
|
|
|
77
77
|
"tunnelsColRoute": "Маршрут проброса",
|
|
78
78
|
"tunnelsColActions": "Действия",
|
|
79
79
|
"tOpenOk": "Туннель открыт: 127.0.0.1:{localPort} -> Удалённый:{remotePort}",
|
|
80
|
-
"tOpenErr": "Не удалось открыть туннель: {err}"
|
|
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": "🌐 Открыть локальный порт"
|
|
81
125
|
}
|
|
82
126
|
}
|