Files
ss-tools/frontend/src/lib/i18n/locales/en/settings.json
busya e1b0175ec4 feat(security): add encryption health inventory and key recovery wizard
Backend:
  - GET /api/security/encryption/health — inventory of all stored encrypted
    secrets (LLM providers, DB connections, profile Git tokens) with
    decrypt attempt and structured broken/healthy status
  - GET /api/security/encryption/fingerprint — non-secret key fingerprint
  - POST /api/security/encryption/recover — bulk replacement of
    undecryptable secrets with partial_success semantics

Frontend:
  - KeyRecoveryModel.svelte.ts — state machine (idle→scanning→
    healthy/needs_recovery→editing→saving→complete/partial_success/error)
  - KeyRecoveryWizard.svelte — tabbed dialog with LLM/DB/Git sections,
    security guidance, re-encrypt command display, edit/save flow
  - SystemSettings entry point — 'Check encrypted secrets' card with
    fingerprint and broken count
  - API methods: getEncryptionHealth, recoverEncryptedSecrets
  - Types: EncryptionRecoveryTypes
  - i18n: en/ru strings for recovery flow

Tests: 226 passed
2026-07-06 18:05:05 +03:00

280 lines
15 KiB
JSON

{
"title": "Settings",
"language": "Language",
"appearance": "Appearance",
"llm": "LLM",
"storage": "Storage",
"environments": "Environments",
"global_title": "Global Settings",
"env_title": "Superset Environments",
"env_warning": "No Superset environments configured. You must add at least one environment to perform backups or migrations.",
"env_add": "Add Environment",
"env_edit": "Edit Environment",
"env_default": "Default Environment",
"env_production": "Production environment",
"env_test": "Test",
"env_delete": "Delete",
"storage_title": "File Storage Configuration",
"storage_root": "Storage Root Path",
"storage_backup_pattern": "Backup Directory Pattern",
"storage_repo_pattern": "Repository Directory Pattern",
"storage_filename_pattern": "Filename Pattern",
"storage_preview": "Path Preview",
"env_description": "Configure Superset environments for dashboards and datasets.",
"env_actions": "Actions",
"llm_description": "Configure LLM providers for dataset documentation.",
"llm_prompts_title": "LLM Prompt Templates",
"llm_prompts_description": "Edit reusable prompts used for documentation, dashboard validation, and git commit generation.",
"llm_prompt_documentation": "Documentation Prompt",
"llm_prompt_dashboard_validation": "Dashboard Validation Prompt",
"llm_prompt_git_commit": "Git Commit Prompt",
"llm_chatbot_settings_title": "Chatbot Planner Settings",
"llm_chatbot_settings_description": "Select provider and optional model override for assistant intent planning.",
"llm_chatbot_provider": "Chatbot Provider",
"llm_chatbot_model": "Chatbot Model Override",
"llm_chatbot_model_placeholder": "Optional, e.g. gpt-4.1-mini",
"llm_provider_bindings_title": "Provider Bindings by Task",
"llm_provider_bindings_description": "Select which provider is used by default for each LLM task.",
"llm_binding_dashboard_validation": "Dashboard Validation Provider",
"llm_binding_documentation": "Documentation Provider",
"llm_binding_git_commit": "Git Commit Provider",
"llm_multimodal_warning": "Dashboard validation requires a multimodal model (image input support).",
"save_llm_prompts": "Save LLM Prompts",
"logging": "Logging Configuration",
"logging_description": "Configure logging and task log levels.",
"storage_description": "Configure file storage paths and patterns.",
"synchronized_resources": "Synchronized Resources",
"save_storage_config": "Save Storage Config",
"save_success": "Settings saved",
"save_failed": "Failed to save settings",
"load_failed": "Failed to load settings",
"testing_connection": "Testing connection...",
"connection_success": "Connection successful",
"connection_failed": "Connection failed: {error}",
"connection_failed_short": "Connection failed",
"connection_test_failed": "Failed to test connection",
"env_required_fields": "Please fill in all required fields (ID, Name, URL)",
"env_updated": "Environment updated",
"env_added": "Environment added",
"env_deleted": "Environment deleted",
"env_save_failed": "Failed to save environment",
"env_delete_failed": "Failed to delete environment",
"env_delete_confirm": "Are you sure you want to delete this environment?",
"migration_sync": "Migration Sync",
"migration_sync_title": "Cross-Environment ID Synchronization",
"migration_sync_description": "Configure the background synchronization schedule and view mapped Dashboard, Chart, and Dataset IDs.",
"migration_sync_failed": "Sync failed",
"sync_schedule": "Sync Schedule (Cron)",
"migration_cron_placeholder": "0 2 * * *",
"migration_cron_hint": "Example: 0 2 * * * (daily at 2 AM UTC)",
"saving": "Saving...",
"syncing": "Syncing...",
"sync_now": "Sync Now",
"no_matching_resources": "No matching resources found.",
"search_by_name_or_uuid": "Search by name or UUID...",
"all_environments": "All Environments",
"all_types": "All Types",
"type_chart": "Chart",
"resource_name": "Resource Name",
"type": "Type",
"target_id": "Target ID",
"loading_mappings": "Loading mappings...",
"no_synchronized_resources": "No synchronized resources found.",
"cron_placeholder": "0 0 * * *",
"enable_auto_backups": "Enable Automatic Backups",
"env_url": "URL",
"default": "Default",
"warning": "Warning",
"log_level": "Log Level",
"log_file_path": "Log File Path",
"log_file_path_placeholder": "logs/app.log",
"max_file_size_mb": "Max File Size (MB)",
"backup_count": "Backup Count",
"task_log_level": "Task Log Level",
"enable_belief_state": "Enable Belief State Logging (Beta)",
"belief_state_hint": "Logs agent reasoning and internal state changes for debugging.",
"save_logging": "Save Logging Config",
"save_global_settings": "Save Global Settings",
"name": "Name",
"username": "Username",
"password": "Password",
"backup_schedule": "Backup Schedule",
"cron_expression": "Cron Expression",
"cron_example": "Example: 0 0 * * * (daily at midnight), */5 * * * * (every 5 minutes)",
"env_update": "Update Environment",
"features": "Features",
"features_description": "Enable or disable top-level application features.",
"feature_dataset_review": "Dataset Review",
"feature_dataset_review_hint": "Automatic dataset review, clarification workflow, and SQL execution.",
"feature_health_monitor": "Health Monitor",
"feature_health_monitor_hint": "Dashboard health monitoring and validation report aggregation.",
"save_features": "Save feature settings",
"git_config_saved": "Configuration saved",
"git_config_deleted": "Configuration deleted",
"git_delete_confirm": "Are you sure you want to delete this Git configuration?",
"configured_servers": "Configured Servers",
"add_git_server": "Add Git Server",
"display_name": "Display Name",
"display_name_placeholder": "e.g. My GitHub",
"server_url": "Server URL",
"personal_access_token": "Personal Access Token (PAT)",
"default_repository_optional": "Default Repository (Optional)",
"save_configuration": "Save Configuration",
"languages": "Languages",
"languages_description": "Choose which languages are available for translation jobs, dictionary entries, and language selection components.",
"languages_count": "{count} of {total} selected",
"languages_hint": "These codes follow the BCP-47 standard (e.g., \"ru\" for Russian, \"en\" for English, \"de\" for German). Only checked languages will appear in language dropdowns across the application.",
"save_languages": "Save language settings",
"system": "System",
"system_description": "Application-wide system settings including timezone.",
"app_timezone": "Timezone",
"app_timezone_hint": "All schedule times and timestamps will be displayed and executed in this timezone.",
"save_system": "Save system settings",
"help_git_display_name": "A friendly name to identify this Git server configuration.",
"help_git_provider": "Git provider type: GitHub, GitLab, or Gitea (self-hosted).",
"help_git_server_url": "Base URL of the Git server. For GitHub: https://github.com. For self-hosted GitLab/Gitea: your instance URL.",
"help_git_pat": "Personal Access Token with repository access permissions. Used for authentication with the Git server.",
"help_git_default_repo": "Default repository in 'owner/repo' format. Optional — can be overridden per dashboard.",
"help_git_default_branch": "Default branch for new repositories. Use 'prod' for dashboard GitFlow.",
"help_llm_chatbot_provider": "LLM provider used by the AI assistant for intent planning and conversation routing.",
"help_llm_chatbot_model": "Optional model name override. Leave empty to use the provider's default model. Example: gpt-4.1-mini.",
"help_llm_binding_dashboard_validation": "Provider used for automated dashboard validation. Requires a multimodal model (image input support) for visual checks.",
"help_llm_binding_documentation": "Provider used for generating dataset and dashboard documentation.",
"help_llm_binding_git_commit": "Provider used for generating git commit messages.",
"help_llm_prompt_documentation": "System prompt template for documentation generation. Defines how the LLM should structure dataset descriptions.",
"help_llm_prompt_dashboard_validation": "System prompt template for dashboard validation. Instructs the LLM how to analyze dashboard screenshots and data.",
"help_llm_prompt_git_commit": "System prompt template for commit message generation. Guides the style and format of commit messages.",
"help_migration_cron": "Cron expression for automatic cross-environment ID synchronization. Format: minute hour day month weekday. Example: 0 2 * * * (daily at 2 AM UTC).",
"help_migration_sync_now": "Triggers an immediate synchronization of Dashboard, Chart, and Dataset IDs across all configured environments.",
"help_feature_dataset_review": "Enable the Dataset Review workflow: automatic review, clarification sessions, and SQL execution for imported datasets.",
"help_feature_health_monitor": "Enable dashboard health monitoring: validation reports, status aggregation, and health summary display.",
"automation_policies": "Automation Policies",
"automation_policies_subtitle": "Manage scheduled validation rules and execution windows.",
"create_policy": "Create Policy",
"edit_policy": "Edit Policy",
"new_policy": "New Policy",
"back_to_list": "Back to list",
"no_policies": "No policies",
"no_policies_desc": "Get started by creating a new automation policy.",
"translation_schedules": "Translation Schedules",
"policy_name": "Policy Name",
"policy_name_placeholder": "e.g., Production Morning Check",
"environment": "Environment",
"schedule_days": "Schedule Days",
"window_start": "Window Start",
"window_end": "Window End",
"alert_condition": "Alert Condition",
"alert_fail_only": "Only on Failure",
"alert_warn_and_fail": "On Warning or Failure",
"alert_always": "Always",
"notify_owners": "Auto-notify Dashboard Owners",
"cancel": "Cancel",
"save_policy": "Save Policy",
"saving_policy": "Saving...",
"policy_created": "Policy created successfully",
"policy_updated": "Policy updated successfully",
"policy_deleted": "Policy deleted successfully",
"policy_save_failed": "Failed to save policy",
"policy_delete_failed": "Failed to delete policy",
"policy_load_failed": "Failed to load automation data",
"delete_confirm": "Are you sure you want to delete this policy?",
"dashboards_count": "{count} Dashboards",
"active": "Active",
"inactive": "Inactive",
"last_run": "Last: {date}",
"distribution_info": "System will automatically distribute {count} checks within this {hours}h {minutes}m window.",
"window_warning": "Window might be too narrow for {count} dashboards.",
"day_sun": "Sun",
"day_mon": "Mon",
"day_tue": "Tue",
"day_wed": "Wed",
"day_thu": "Thu",
"day_fri": "Fri",
"day_sat": "Sat",
"connections_title": "Database Connections",
"connections_description": "Manage database connection configurations for direct INSERT execution.",
"connections_add": "+ Add Connection",
"connections_empty": "No database connections configured.",
"connections_empty_hint": "Add a connection to enable direct database inserts for translation jobs.",
"connections_name": "Name",
"connections_host": "Host:Port",
"connections_database": "Database",
"connections_dialect": "Dialect",
"connections_used_by": "Used By",
"connections_actions": "Actions",
"connections_edit": "Edit",
"connections_delete": "Delete",
"connections_add_title": "Add Connection",
"connections_edit_title": "Edit Connection",
"connections_name_label": "Name *",
"connections_dialect_label": "Dialect *",
"connections_host_label": "Host *",
"connections_port_label": "Port *",
"connections_db_label": "Database *",
"connections_user_label": "Username *",
"connections_password_label": "Password *",
"connections_password_keep": "Password (leave empty to keep) *",
"connections_pool_label": "Pool Size",
"connections_extra_label": "Extra Params (JSON, optional)",
"connections_extra_placeholder": "{\"sslmode\": \"require\"}",
"connections_required_name": "Name is required",
"connections_required_host": "Host is required",
"connections_required_db": "Database is required",
"connections_required_user": "Username is required",
"connections_required_password": "Password is required",
"connections_invalid_port": "Port must be between 1 and 65535",
"connections_invalid_pool": "Pool size must be 1-100",
"connections_invalid_json": "Extra params must be valid JSON",
"connections_save": "Save Connection",
"connections_update": "Update Connection",
"connections_test": "Test Connection",
"connections_cancel": "Cancel",
"connections_delete_confirm": "Are you sure you want to delete this connection?",
"connections_save_unsaved_test": "Save the connection first to test it",
"connections_created": "Connection created",
"connections_updated": "Connection updated",
"connections_deleted": "Connection deleted",
"connections_delete_blocked": "Cannot delete — connection is in use",
"connections_delete_blocked_title": "Cannot delete connection",
"connections_delete_blocked_hint": "This connection is used by {count} active job(s):",
"connections_delete_blocked_help": "Detach or reassign these jobs before deleting.",
"connections_save_failed": "Save failed",
"connections_test_failed": "Test failed",
"connections_test_success": "Connected — {latency}ms",
"connections_test_error": "Connection test failed",
"connections_load_failed": "Failed to load connections",
"connections_dismiss": "Dismiss",
"encryption_recovery_title": "Encryption Key Recovery",
"encryption_recovery_desc": "Check whether all stored encrypted credentials can be decrypted with the current ENCRYPTION_KEY. If credentials were encrypted with a different key, they must be re-entered or re-encrypted.",
"encryption_recovery_scan": "Check encrypted secrets",
"encryption_recovery_healthy": "All credentials healthy",
"encryption_recovery_broken": "{count} saved credential(s) need attention",
"encryption_recovery_scanning": "Checking all stored secrets...",
"encryption_recovery_llm_tab": "LLM Providers",
"encryption_recovery_db_tab": "DB Connections",
"encryption_recovery_git_tab": "Git Tokens",
"encryption_recovery_cannot_decrypt": "Cannot decrypt",
"encryption_recovery_reenter_key": "Enter new API key...",
"encryption_recovery_reenter_password": "Enter new password...",
"encryption_recovery_save_secrets": "Save entered secrets",
"encryption_recovery_cancel": "Cancel",
"encryption_recovery_close": "Close",
"encryption_recovery_rescan": "Rescan",
"encryption_recovery_retry": "Retry scan",
"encryption_recovery_complete": "Recovery complete",
"encryption_recovery_key_fingerprint": "Key fingerprint",
"encryption_recovery_auth_vs_encryption": "Changing AUTH_SECRET_KEY logs users out. Changing ENCRYPTION_KEY requires re-entering stored secrets or running re-encryption.",
"encryption_recovery_recommended": "Recommended if old key is available:",
"encryption_recovery_reencrypt_cmd": "OLD_ENCRYPTION_KEY=<old> NEW_ENCRYPTION_KEY=<new> \\\n python -m src.scripts.reencrypt --dry-run",
"encryption_recovery_enter_values": "Enter replacement values",
"encryption_recovery_git_token_hint": "Git tokens are personal. Each user must open Profile → Git token and enter a new PAT.",
"encryption_recovery_partial_success": "Some secrets saved, some failed. Check failed items above and re-enter.",
"encryption_recovery_saving": "Saving..."
}
}