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
280 lines
15 KiB
JSON
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..."
|
|
}
|
|
}
|