## Critical fixes - H1: Fix env_id/env/environment_id triple inconsistency in API route (_action_routes.py now passes 'environment_id', matches scheduler) - H2: Decompose BackupPlugin.execute() — CC 13 → 5 methods, CC ≤ 5 each - H3: Fix unhandled int() ValueError on non-numeric dashboard_ids - H4: Add concurrent guard test with API-style params (env key fallback) - H5: Make RetentionPolicy configurable via StorageConfig (retention_daily/weekly/monthly in config model + backend plugin) - Fix: storage DELETE route missing 'await' on async delete_file (bug) ## UI/UX overhaul - NEW: centralized cron utility (frontend/src/lib/utils/cron.ts) - validateCron(), calcNextCronRun(), formatNextRun() - Used by BackupManager, BackupDashboardModal - BackupManager: replace custom BackupList with shared FileList - Adds: download, delete, bulk actions, search, sort, pagination - Adds: cron next-run preview below schedule input - Adds: auto-open TaskDrawer on backup task creation - BackupDashboardModal: dead 'Cron Help' button removed - Adds: live cron validation + next-run preview - StorageSettings: adds retention daily/weekly/monthly fields - BackupCreateRequest type fixed to match actual API contract - i18n: 7 new keys for en/ru (next_run, retention_*)
100 lines
5.1 KiB
JSON
100 lines
5.1 KiB
JSON
{
|
||
"management": "Управление задачами",
|
||
"run_backup": "Запустить бэкап",
|
||
"recent": "Последние задачи",
|
||
"details_logs": "Детали и логи задачи",
|
||
"select_task": "Выберите задачу для просмотра логов и деталей",
|
||
"loading": "Загрузка задач...",
|
||
"no_tasks": "Задачи не найдены.",
|
||
"started": "Запущено {time}",
|
||
"logs_title": "Логи задачи",
|
||
"refresh": "Обновить",
|
||
"no_logs": "Логи отсутствуют.",
|
||
"manual_backup": "Ручной бэкап",
|
||
"target_env": "Целевое окружение",
|
||
"select_env": "-- Выберите окружение --",
|
||
"start_backup": "Начать бэкап",
|
||
"backup_schedule": "Расписание автоматических бэкапов",
|
||
"schedule_enabled": "Включено",
|
||
"cron_label": "Cron-выражение",
|
||
"cron_hint": "например, 0 0 * * * для ежедневного запуска в полночь",
|
||
"next_run": "След. запуск",
|
||
"footer_text": "Задача продолжает работать в фоновом режиме",
|
||
"drawer": "Панель задач",
|
||
"close_drawer": "Закрыть панель задач",
|
||
"back_to_list": "Назад к списку задач",
|
||
"log_stream_failed": "Не удалось подключиться к потоку логов после нескольких попыток.",
|
||
"mapping_resolved": "Маппинг сохранен, миграция продолжается...",
|
||
"mapping_resolve_failed": "Не удалось сохранить маппинг: {error}",
|
||
"passwords_submitted": "Пароли отправлены, миграция возобновляется...",
|
||
"resume_failed": "Не удалось возобновить задачу: {error}",
|
||
"task_label": "Задача",
|
||
"connecting": "Подключение...",
|
||
"reconnecting": "Переподключение...",
|
||
"live": "Онлайн",
|
||
"completed": "Завершено",
|
||
"awaiting_mapping": "Ожидание маппинга",
|
||
"awaiting_input": "Ожидание ввода",
|
||
"disconnected": "Отключено",
|
||
"details_parameters": "Детали задачи и параметры",
|
||
"started_label": "Запущено",
|
||
"plugin": "Плагин",
|
||
"parameters": "Параметры",
|
||
"waiting_logs": "Ожидание новых логов...",
|
||
"result_select_task": "Выберите задачу, чтобы увидеть результат.",
|
||
"result_not_structured": "Для этой задачи нет структурированного результата.",
|
||
"result_llm_validation": "LLM проверка дашборда",
|
||
"result_no_summary": "Нет summary",
|
||
"issues": "Проблемы",
|
||
"location": "Локация",
|
||
"backup_result": "Результат бэкапа",
|
||
"total": "Всего",
|
||
"successful": "Успешно",
|
||
"failed": "С ошибками",
|
||
"errors": "Ошибки",
|
||
"migration_result": "Результат миграции",
|
||
"selected": "Выбрано",
|
||
"with_errors": "С ошибками",
|
||
"migration_errors": "Ошибки миграции",
|
||
"clear_confirm": "Вы уверены, что хотите очистить задачи?",
|
||
"fetch_task_details_failed": "Не удалось получить полные детали задачи:",
|
||
"clear_tasks": "Очистить задачи",
|
||
"clear_non_running": "Очистить все неактивные",
|
||
"clear_failed": "Очистить ошибки",
|
||
"clear_awaiting_input": "Очистить ожидающие ввода",
|
||
"keys": "ключей",
|
||
"mappings": "Маппинги",
|
||
"summary_report": "Сводный отчет",
|
||
"observability_warnings": "Внимание",
|
||
"open_dashboard_target": "Открыть дашборд в {env}",
|
||
"open_dashboard_target_fallback": "Открыть дашборд",
|
||
"show_diff": "Показать Diff",
|
||
"diff_preview": "Diff предпросмотр",
|
||
"no_diff_available": "Diff недоступен",
|
||
"summary_link_unavailable": "Ссылка или diff недоступны для этой задачи",
|
||
"open_llm_report": "LLM отчет",
|
||
"failure_summary": "Сводка ошибки",
|
||
"filter_by_level": "Фильтр по уровню",
|
||
"filter_by_source": "Фильтр по источнику",
|
||
"log_level_all": "Все",
|
||
"log_level_debug": "Debug",
|
||
"log_level_info": "Info",
|
||
"log_level_warning": "Warn",
|
||
"log_level_error": "Error",
|
||
"all_sources": "Все источники",
|
||
"search_logs": "Поиск в логах...",
|
||
"clear_log_filters": "Сбросить фильтры логов",
|
||
"log_entries": "записей",
|
||
"quick_filter_all": "Все",
|
||
"quick_filter_errors": "Ошибки",
|
||
"quick_filter_warn": "Warn",
|
||
"quick_filter_llm": "LLM",
|
||
"quick_filter_plugin": "Plugin",
|
||
"quick_filter_system": "System",
|
||
"toggle_autoscroll": "Переключить автопрокрутку",
|
||
"auto_scroll": "Автопрокрутка",
|
||
"auto_scroll_on": "вкл",
|
||
"auto_scroll_off": "выкл",
|
||
"result": "Проверка"
|
||
}
|