feat(assistant): add multi-dialog UX, task-aware llm settings, and i18n cleanup
This commit is contained in:
@@ -30,7 +30,7 @@
|
||||
*/
|
||||
function getBreadcrumbs(pathname, maxVisible = 3) {
|
||||
const segments = pathname.split("/").filter(Boolean);
|
||||
const allItems = [{ label: "Home", path: "/" }];
|
||||
const allItems = [{ label: $t.nav?.home || "Home", path: "/" }];
|
||||
|
||||
let currentPath = "";
|
||||
segments.forEach((segment, index) => {
|
||||
@@ -136,7 +136,7 @@
|
||||
|
||||
<nav
|
||||
class="mx-4 md:mx-6"
|
||||
aria-label="Breadcrumb navigation"
|
||||
aria-label={$t.nav?.breadcrumb_nav || "Breadcrumb navigation"}
|
||||
>
|
||||
<div class="inline-flex max-w-full items-center gap-1.5 rounded-xl border border-slate-200/80 bg-white/85 px-2 py-1.5 shadow-sm backdrop-blur">
|
||||
{#each breadcrumbItems as item, index}
|
||||
|
||||
@@ -201,7 +201,7 @@
|
||||
<span class="inline-flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-slate-100 to-slate-200 text-slate-700 ring-1 ring-slate-200">
|
||||
<Icon name="layers" size={14} />
|
||||
</span>
|
||||
Menu
|
||||
{$t.nav?.menu || "Menu"}
|
||||
</span>
|
||||
{:else}
|
||||
<span class="text-xs text-gray-500">M</span>
|
||||
@@ -285,7 +285,7 @@
|
||||
<span class="mr-2 inline-flex h-6 w-6 items-center justify-center rounded-md bg-slate-100 text-slate-600">
|
||||
<Icon name="chevronLeft" size={14} />
|
||||
</span>
|
||||
Collapse
|
||||
{$t.nav?.collapse || "Collapse"}
|
||||
</button>
|
||||
</div>
|
||||
{:else}
|
||||
@@ -293,10 +293,10 @@
|
||||
<button
|
||||
class="flex items-center justify-center w-full px-4 py-2 text-sm text-gray-600 hover:bg-gray-100 rounded-lg transition-colors"
|
||||
on:click={handleToggleClick}
|
||||
aria-label="Expand sidebar"
|
||||
aria-label={$t.nav?.expand_sidebar || "Expand sidebar"}
|
||||
>
|
||||
<Icon name="chevronRight" size={16} />
|
||||
<span class="ml-2">Expand</span>
|
||||
<span class="ml-2">{$t.nav?.expand || "Expand"}</span>
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -201,7 +201,7 @@
|
||||
on:keydown={(e) => e.key === 'Escape' && handleClose()}
|
||||
role="button"
|
||||
tabindex="0"
|
||||
aria-label="Close drawer"
|
||||
aria-label={$t.tasks?.close_drawer || "Close drawer"}
|
||||
>
|
||||
<!-- Drawer Panel -->
|
||||
<div
|
||||
@@ -209,7 +209,7 @@
|
||||
style={`right: ${assistantOffset};`}
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-label="Task drawer"
|
||||
aria-label={$t.tasks?.drawer || "Task drawer"}
|
||||
>
|
||||
<!-- Header -->
|
||||
<div class="flex items-center justify-between border-b border-slate-200 bg-white px-5 py-3.5">
|
||||
@@ -222,13 +222,13 @@
|
||||
<button
|
||||
class="flex items-center justify-center p-1.5 rounded-md text-slate-500 bg-transparent border-none cursor-pointer transition-all hover:text-slate-100 hover:bg-slate-800"
|
||||
on:click={goBackToList}
|
||||
aria-label="Back to task list"
|
||||
aria-label={$t.tasks?.back_to_list || "Back to task list"}
|
||||
>
|
||||
<Icon name="back" size={16} strokeWidth={2} />
|
||||
</button>
|
||||
{/if}
|
||||
<h2 class="text-sm font-semibold tracking-tight text-slate-900">
|
||||
{activeTaskId ? ($t.tasks?.details_logs || 'Task Details & Logs') : 'Recent Tasks'}
|
||||
{activeTaskId ? ($t.tasks?.details_logs || 'Task Details & Logs') : ($t.tasks?.recent || 'Recent Tasks')}
|
||||
</h2>
|
||||
{#if shortTaskId}
|
||||
<span class="text-xs font-mono text-slate-500 bg-slate-800 px-2 py-0.5 rounded">{shortTaskId}…</span>
|
||||
@@ -249,7 +249,7 @@
|
||||
<button
|
||||
class="p-1.5 rounded-md text-slate-500 bg-transparent border-none cursor-pointer transition-all hover:text-slate-100 hover:bg-slate-800"
|
||||
on:click={handleClose}
|
||||
aria-label="Close drawer"
|
||||
aria-label={$t.tasks?.close_drawer || "Close drawer"}
|
||||
>
|
||||
<Icon name="close" size={18} strokeWidth={2} />
|
||||
</button>
|
||||
@@ -268,19 +268,19 @@
|
||||
{:else if loadingTasks}
|
||||
<div class="flex flex-col items-center justify-center p-12 text-slate-500">
|
||||
<div class="mb-4 h-8 w-8 animate-spin rounded-full border-2 border-slate-200 border-t-blue-500"></div>
|
||||
<p>Loading tasks...</p>
|
||||
<p>{$t.tasks?.loading || 'Loading tasks...'}</p>
|
||||
</div>
|
||||
{:else if recentTasks.length > 0}
|
||||
<div class="p-4">
|
||||
<h3 class="text-sm font-semibold text-slate-100 mb-4 pb-2 border-b border-slate-800">Recent Tasks</h3>
|
||||
<h3 class="text-sm font-semibold text-slate-100 mb-4 pb-2 border-b border-slate-800">{$t.tasks?.recent || 'Recent Tasks'}</h3>
|
||||
{#each recentTasks as task}
|
||||
<button
|
||||
class="flex items-center gap-3 w-full p-3 mb-2 bg-slate-800 border border-slate-700 rounded-lg cursor-pointer transition-all hover:bg-slate-700 hover:border-slate-600 text-left"
|
||||
on:click={() => selectTask(task)}
|
||||
>
|
||||
<span class="font-mono text-xs text-slate-500">{task.id?.substring(0, 8) || 'N/A'}...</span>
|
||||
<span class="flex-1 text-sm text-slate-100 font-medium">{task.plugin_id || 'Unknown'}</span>
|
||||
<span class="text-xs font-semibold uppercase px-2 py-1 rounded-full {task.status?.toLowerCase() === 'running' || task.status?.toLowerCase() === 'pending' ? 'bg-cyan-500/15 text-cyan-400' : task.status?.toLowerCase() === 'completed' || task.status?.toLowerCase() === 'success' ? 'bg-green-500/15 text-green-400' : task.status?.toLowerCase() === 'failed' || task.status?.toLowerCase() === 'error' ? 'bg-red-500/15 text-red-400' : 'bg-slate-500/15 text-slate-400'}">{task.status || 'UNKNOWN'}</span>
|
||||
<span class="font-mono text-xs text-slate-500">{task.id?.substring(0, 8) || ($t.common?.not_available || 'N/A')}...</span>
|
||||
<span class="flex-1 text-sm text-slate-100 font-medium">{task.plugin_id || ($t.common?.unknown || 'Unknown')}</span>
|
||||
<span class="text-xs font-semibold uppercase px-2 py-1 rounded-full {task.status?.toLowerCase() === 'running' || task.status?.toLowerCase() === 'pending' ? 'bg-cyan-500/15 text-cyan-400' : task.status?.toLowerCase() === 'completed' || task.status?.toLowerCase() === 'success' ? 'bg-green-500/15 text-green-400' : task.status?.toLowerCase() === 'failed' || task.status?.toLowerCase() === 'error' ? 'bg-red-500/15 text-red-400' : 'bg-slate-500/15 text-slate-400'}">{task.status || ($t.common?.unknown || 'UNKNOWN')}</span>
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
import { auth } from "$lib/auth/store.js";
|
||||
import { toggleAssistantChat } from "$lib/stores/assistantChat.js";
|
||||
import Icon from "$lib/ui/Icon.svelte";
|
||||
import LanguageSwitcher from "$lib/ui/LanguageSwitcher.svelte";
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
@@ -105,7 +106,7 @@
|
||||
<button
|
||||
class="rounded-lg p-2 text-slate-600 transition-colors hover:bg-slate-100 md:hidden"
|
||||
on:click={handleHamburgerClick}
|
||||
aria-label="Toggle menu"
|
||||
aria-label={$t.common?.toggle_menu || "Toggle menu"}
|
||||
>
|
||||
<Icon name="menu" size={22} />
|
||||
</button>
|
||||
@@ -136,6 +137,8 @@
|
||||
|
||||
<!-- Nav Actions -->
|
||||
<div class="flex items-center gap-3 md:gap-4">
|
||||
<LanguageSwitcher />
|
||||
|
||||
<!-- Assistant -->
|
||||
<button
|
||||
class="rounded-lg p-2 text-slate-600 transition-colors hover:bg-slate-100"
|
||||
@@ -154,7 +157,7 @@
|
||||
(e.key === "Enter" || e.key === " ") && handleActivityClick()}
|
||||
role="button"
|
||||
tabindex="0"
|
||||
aria-label="Activity"
|
||||
aria-label={$t.common?.activity || "Activity"}
|
||||
>
|
||||
<Icon name="activity" size={22} />
|
||||
{#if activeCount > 0}
|
||||
@@ -174,7 +177,7 @@
|
||||
(e.key === "Enter" || e.key === " ") && toggleUserMenu(e)}
|
||||
role="button"
|
||||
tabindex="0"
|
||||
aria-label="User menu"
|
||||
aria-label={$t.common?.user_menu || "User menu"}
|
||||
>
|
||||
{#if user}
|
||||
<span
|
||||
@@ -192,7 +195,7 @@
|
||||
: 'hidden'}"
|
||||
>
|
||||
<div class="px-4 py-2 text-sm text-gray-700">
|
||||
<strong>{user?.username || "User"}</strong>
|
||||
<strong>{user?.username || ($t.common?.user || "User")}</strong>
|
||||
</div>
|
||||
<div class="border-t border-gray-200 my-1"></div>
|
||||
<div
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
{
|
||||
"common": {
|
||||
"save": "Save",
|
||||
"close": "Close",
|
||||
"back": "Back",
|
||||
"id": "ID",
|
||||
"cancel": "Cancel",
|
||||
"delete": "Delete",
|
||||
"edit": "Edit",
|
||||
@@ -11,9 +14,25 @@
|
||||
"search": "Search...",
|
||||
"logout": "Logout",
|
||||
"refresh": "Refresh",
|
||||
"retry": "Retry"
|
||||
"retry": "Retry",
|
||||
"toggle_menu": "Toggle menu",
|
||||
"activity": "Activity",
|
||||
"user_menu": "User menu",
|
||||
"user": "User",
|
||||
"unknown": "Unknown",
|
||||
"not_available": "N/A",
|
||||
"first": "First",
|
||||
"last": "Last",
|
||||
"per_page": "per page",
|
||||
"close_modal": "Close modal"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Home",
|
||||
"breadcrumb_nav": "Breadcrumb navigation",
|
||||
"menu": "Menu",
|
||||
"collapse": "Collapse",
|
||||
"expand": "Expand",
|
||||
"expand_sidebar": "Expand sidebar",
|
||||
"dashboard": "Dashboard",
|
||||
"dashboards": "Dashboards",
|
||||
"datasets": "Datasets",
|
||||
@@ -63,6 +82,8 @@
|
||||
"connection_success": "Connection successful!",
|
||||
"connection_failed": "Connection failed: {error}",
|
||||
"no_providers": "No providers configured.",
|
||||
"multimodal": "Multimodal",
|
||||
"text_only": "Text only",
|
||||
"doc_preview_title": "Documentation Preview",
|
||||
"dataset_desc": "Dataset Description",
|
||||
"column_doc": "Column Documentation",
|
||||
@@ -98,6 +119,17 @@
|
||||
"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.",
|
||||
@@ -125,7 +157,31 @@
|
||||
"server": "Git Server",
|
||||
"not_linked": "This dashboard is not yet linked to a Git repository.",
|
||||
"manage": "Manage Git",
|
||||
"generate_message": "Generate"
|
||||
"generate_message": "Generate",
|
||||
"select_dashboard": "Select Dashboard to Manage"
|
||||
,
|
||||
"commit_message_generated": "Commit message generated",
|
||||
"commit_message_failed": "Failed to generate message",
|
||||
"load_changes_failed": "Failed to load changes",
|
||||
"commit_success": "Changes committed successfully",
|
||||
"commit_message": "Commit Message",
|
||||
"generate_with_ai": "Generate with AI",
|
||||
"describe_changes": "Describe your changes...",
|
||||
"changed_files": "Changed Files",
|
||||
"changes_preview": "Changes Preview",
|
||||
"loading_diff": "Loading diff...",
|
||||
"no_changes": "No changes detected",
|
||||
"committing": "Committing...",
|
||||
"deploy_success": "Deployment triggered successfully",
|
||||
"no_deploy_envs": "No deployment environments configured.",
|
||||
"deploying": "Deploying...",
|
||||
"init_validation_error": "Please select a Git server and provide remote URL",
|
||||
"init_success": "Repository initialized successfully",
|
||||
"sync_success": "Dashboard state synced to Git",
|
||||
"push_success": "Changes pushed to remote",
|
||||
"pull_success": "Changes pulled from remote",
|
||||
"no_servers_configured": "No Git servers configured. Go to Settings -> Git to add one.",
|
||||
"remote_url_placeholder": "https://github.com/org/repo.git"
|
||||
},
|
||||
"dashboard": {
|
||||
"search": "Search dashboards...",
|
||||
@@ -199,6 +255,37 @@
|
||||
"last_task": "Last Task",
|
||||
"actions": "Actions",
|
||||
"action_map_columns": "Map Columns",
|
||||
"generate_docs": "Generate Docs",
|
||||
"generate_documentation": "Generate Documentation",
|
||||
"search_placeholder": "Search datasets...",
|
||||
"select_all": "Select All",
|
||||
"deselect_all": "Deselect All",
|
||||
"select_visible": "Select Visible",
|
||||
"deselect_visible": "Deselect Visible",
|
||||
"selected": "selected",
|
||||
"selected_count": "{count} selected",
|
||||
"bulk_map_columns": "Bulk Column Mapping",
|
||||
"bulk_docs_generation": "Bulk Documentation Generation",
|
||||
"source_type": "Source Type",
|
||||
"source_postgresql_comments": "PostgreSQL Comments",
|
||||
"source_xlsx": "XLSX File",
|
||||
"connection_id": "Connection ID",
|
||||
"connection_id_placeholder": "Enter connection ID...",
|
||||
"xlsx_file": "XLSX File",
|
||||
"selected_datasets": "Selected Datasets",
|
||||
"start_mapping": "Start Mapping",
|
||||
"select_llm_provider_option": "Select LLM provider...",
|
||||
"select_llm_provider": "Please select an LLM provider",
|
||||
"mapping_task_failed": "Failed to create mapping task",
|
||||
"docs_task_failed": "Failed to create documentation generation task",
|
||||
"load_failed": "Failed to load datasets",
|
||||
"load_detail_failed": "Failed to load dataset details",
|
||||
"missing_context": "Missing dataset ID or environment ID",
|
||||
"sql_lab_view": "SQL Lab View",
|
||||
"date_time": "Date/Time",
|
||||
"inactive": "Inactive",
|
||||
"mapped": "Mapped",
|
||||
"unmapped": "Unmapped",
|
||||
"view_task": "View task",
|
||||
"task_running": "Running...",
|
||||
"task_done": "Done",
|
||||
@@ -225,7 +312,30 @@
|
||||
"schedule_enabled": "Enabled",
|
||||
"cron_label": "Cron Expression",
|
||||
"cron_hint": "e.g., 0 0 * * * for daily at midnight",
|
||||
"footer_text": "Task continues running in background"
|
||||
"footer_text": "Task continues running in background",
|
||||
"drawer": "Task drawer",
|
||||
"close_drawer": "Close drawer",
|
||||
"back_to_list": "Back to task list"
|
||||
},
|
||||
"migration": {
|
||||
"source_env": "Source Environment",
|
||||
"target_env": "Target Environment",
|
||||
"loading_envs": "Loading environments...",
|
||||
"select_both_envs": "Please select both source and target environments.",
|
||||
"different_envs": "Source and target environments must be different.",
|
||||
"select_dashboards": "Please select at least one dashboard to migrate.",
|
||||
"select_dashboards_title": "Select Dashboards",
|
||||
"replace_db": "Replace Database (Apply Mappings)",
|
||||
"database_mappings": "Database Mappings",
|
||||
"loading_dbs": "Loading databases and suggestions...",
|
||||
"refresh_dbs": "Refresh Databases & Suggestions",
|
||||
"start": "Start Migration",
|
||||
"resume_failed": "Failed to resume task",
|
||||
"mapping_saved": "Mapping saved successfully",
|
||||
"mapping_management": "Database Mapping Management",
|
||||
"fetch_dbs": "Fetch Databases & Suggestions",
|
||||
"mapping_hint": "Select environments and click \"Fetch Databases\" to start mapping.",
|
||||
"task_placeholder_warn": "Could not fetch task details immediately, using placeholder."
|
||||
},
|
||||
"assistant": {
|
||||
"title": "AI Assistant",
|
||||
@@ -257,7 +367,14 @@
|
||||
"create": "Create Connection",
|
||||
"saved": "Saved Connections",
|
||||
"no_saved": "No connections saved yet.",
|
||||
"delete": "Delete"
|
||||
"delete": "Delete",
|
||||
"required_fields": "Please fill in all required fields",
|
||||
"created_success": "Connection created successfully",
|
||||
"fetch_failed": "Failed to fetch connections",
|
||||
"delete_confirm": "Are you sure you want to delete this connection?",
|
||||
"deleted_success": "Connection deleted",
|
||||
"name_placeholder": "e.g. Production DWH",
|
||||
"host_placeholder": "10.0.0.1"
|
||||
},
|
||||
"storage": {
|
||||
"management": "File Storage Management",
|
||||
@@ -307,16 +424,38 @@
|
||||
"excel_path": "Excel File Path",
|
||||
"run": "Run Mapper",
|
||||
"starting": "Starting...",
|
||||
"generating": "Generating...",
|
||||
"errors": {
|
||||
"fetch_failed": "Failed to fetch data",
|
||||
"required_fields": "Please fill in required fields",
|
||||
"postgres_required": "Connection and Table Name are required for postgres source",
|
||||
"excel_required": "Excel path is required for excel source"
|
||||
"excel_required": "Excel path is required for excel source",
|
||||
"no_active_llm_provider": "No active LLM provider found",
|
||||
"docs_start_failed": "Failed to start documentation generation",
|
||||
"docs_apply_failed": "Failed to apply documentation"
|
||||
},
|
||||
"success": {
|
||||
"started": "Mapper task started"
|
||||
"started": "Mapper task started",
|
||||
"docs_started": "Documentation generation started",
|
||||
"docs_applied": "Documentation applied successfully"
|
||||
},
|
||||
"auto_document": "Auto-Document"
|
||||
"auto_document": "Auto-Document",
|
||||
"excel_placeholder": "/path/to/mapping.xlsx"
|
||||
},
|
||||
"debug": {
|
||||
"title": "System Diagnostics",
|
||||
"action": "Debug Action",
|
||||
"test_db_api": "Test Database API (Compare Envs)",
|
||||
"get_dataset_structure": "Get Dataset Structure (JSON)",
|
||||
"source_target_required": "Source and Target environments are required",
|
||||
"env_dataset_required": "Environment and Dataset ID are required",
|
||||
"fetch_env_failed": "Failed to fetch environments",
|
||||
"completed": "Debug task completed",
|
||||
"failed": "Debug task failed",
|
||||
"run": "Run Diagnostics",
|
||||
"output": "Debug Output",
|
||||
"select_source": "-- Select Source --",
|
||||
"select_target": "-- Select Target --"
|
||||
},
|
||||
"admin": {
|
||||
"users": {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
{
|
||||
"common": {
|
||||
"save": "Сохранить",
|
||||
"close": "Закрыть",
|
||||
"back": "Назад",
|
||||
"id": "ID",
|
||||
"cancel": "Отмена",
|
||||
"delete": "Удалить",
|
||||
"edit": "Редактировать",
|
||||
@@ -11,9 +14,25 @@
|
||||
"search": "Поиск...",
|
||||
"logout": "Выйти",
|
||||
"refresh": "Обновить",
|
||||
"retry": "Повторить"
|
||||
"retry": "Повторить",
|
||||
"toggle_menu": "Переключить меню",
|
||||
"activity": "Активность",
|
||||
"user_menu": "Меню пользователя",
|
||||
"user": "Пользователь",
|
||||
"unknown": "Неизвестно",
|
||||
"not_available": "Н/Д",
|
||||
"first": "Первая",
|
||||
"last": "Последняя",
|
||||
"per_page": "на страницу",
|
||||
"close_modal": "Закрыть модальное окно"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Главная",
|
||||
"breadcrumb_nav": "Навигационная цепочка",
|
||||
"menu": "Меню",
|
||||
"collapse": "Свернуть",
|
||||
"expand": "Развернуть",
|
||||
"expand_sidebar": "Развернуть боковую панель",
|
||||
"dashboard": "Панель управления",
|
||||
"dashboards": "Дашборды",
|
||||
"datasets": "Датасеты",
|
||||
@@ -63,6 +82,8 @@
|
||||
"connection_success": "Подключение успешно!",
|
||||
"connection_failed": "Ошибка подключения: {error}",
|
||||
"no_providers": "Провайдеры не настроены.",
|
||||
"multimodal": "Мультимодальная",
|
||||
"text_only": "Только текст",
|
||||
"doc_preview_title": "Предпросмотр документации",
|
||||
"dataset_desc": "Описание датасета",
|
||||
"column_doc": "Документация колонок",
|
||||
@@ -98,6 +119,17 @@
|
||||
"llm_prompt_documentation": "Промпт документации",
|
||||
"llm_prompt_dashboard_validation": "Промпт проверки дашборда",
|
||||
"llm_prompt_git_commit": "Промпт git-коммита",
|
||||
"llm_chatbot_settings_title": "Настройки планировщика чат-бота",
|
||||
"llm_chatbot_settings_description": "Выберите провайдера и опциональную модель для планирования интентов ассистента.",
|
||||
"llm_chatbot_provider": "Провайдер чат-бота",
|
||||
"llm_chatbot_model": "Переопределение модели чат-бота",
|
||||
"llm_chatbot_model_placeholder": "Опционально, например gpt-4.1-mini",
|
||||
"llm_provider_bindings_title": "Назначение провайдеров по задачам",
|
||||
"llm_provider_bindings_description": "Выберите провайдера по умолчанию для каждой LLM-задачи.",
|
||||
"llm_binding_dashboard_validation": "Провайдер проверки дашборда",
|
||||
"llm_binding_documentation": "Провайдер документации",
|
||||
"llm_binding_git_commit": "Провайдер git-коммита",
|
||||
"llm_multimodal_warning": "Для проверки дашборда нужна мультимодальная модель (поддержка изображений).",
|
||||
"save_llm_prompts": "Сохранить промпты LLM",
|
||||
"logging": "Настройка логирования",
|
||||
"logging_description": "Настройка уровней логирования задач.",
|
||||
@@ -125,7 +157,31 @@
|
||||
"server": "Git-сервер",
|
||||
"not_linked": "Этот дашборд еще не привязан к Git-репозиторию.",
|
||||
"manage": "Управление Git",
|
||||
"generate_message": "Сгенерировать"
|
||||
"generate_message": "Сгенерировать",
|
||||
"select_dashboard": "Выберите дашборд для управления"
|
||||
,
|
||||
"commit_message_generated": "Сообщение коммита сгенерировано",
|
||||
"commit_message_failed": "Не удалось сгенерировать сообщение коммита",
|
||||
"load_changes_failed": "Не удалось загрузить изменения",
|
||||
"commit_success": "Изменения успешно закоммичены",
|
||||
"commit_message": "Сообщение коммита",
|
||||
"generate_with_ai": "Сгенерировать с AI",
|
||||
"describe_changes": "Опишите ваши изменения...",
|
||||
"changed_files": "Измененные файлы",
|
||||
"changes_preview": "Предпросмотр изменений",
|
||||
"loading_diff": "Загрузка diff...",
|
||||
"no_changes": "Изменения не обнаружены",
|
||||
"committing": "Коммит...",
|
||||
"deploy_success": "Деплой успешно запущен",
|
||||
"no_deploy_envs": "Окружения для деплоя не настроены.",
|
||||
"deploying": "Деплой...",
|
||||
"init_validation_error": "Выберите Git-сервер и укажите URL удаленного репозитория",
|
||||
"init_success": "Репозиторий успешно инициализирован",
|
||||
"sync_success": "Состояние дашборда синхронизировано с Git",
|
||||
"push_success": "Изменения отправлены в remote",
|
||||
"pull_success": "Изменения получены из remote",
|
||||
"no_servers_configured": "Git-серверы не настроены. Перейдите в Настройки -> Git для добавления.",
|
||||
"remote_url_placeholder": "https://github.com/org/repo.git"
|
||||
},
|
||||
"dashboard": {
|
||||
"search": "Поиск дашбордов...",
|
||||
@@ -198,6 +254,37 @@
|
||||
"last_task": "Последняя задача",
|
||||
"actions": "Действия",
|
||||
"action_map_columns": "Отобразить колонки",
|
||||
"generate_docs": "Сгенерировать документацию",
|
||||
"generate_documentation": "Сгенерировать документацию",
|
||||
"search_placeholder": "Поиск датасетов...",
|
||||
"select_all": "Выбрать все",
|
||||
"deselect_all": "Снять выбор со всех",
|
||||
"select_visible": "Выбрать видимые",
|
||||
"deselect_visible": "Снять выбор с видимых",
|
||||
"selected": "выбрано",
|
||||
"selected_count": "Выбрано: {count}",
|
||||
"bulk_map_columns": "Массовый маппинг колонок",
|
||||
"bulk_docs_generation": "Массовая генерация документации",
|
||||
"source_type": "Тип источника",
|
||||
"source_postgresql_comments": "Комментарии PostgreSQL",
|
||||
"source_xlsx": "XLSX-файл",
|
||||
"connection_id": "ID подключения",
|
||||
"connection_id_placeholder": "Введите ID подключения...",
|
||||
"xlsx_file": "XLSX-файл",
|
||||
"selected_datasets": "Выбранные датасеты",
|
||||
"start_mapping": "Запустить маппинг",
|
||||
"select_llm_provider_option": "Выберите LLM-провайдера...",
|
||||
"select_llm_provider": "Выберите LLM-провайдера",
|
||||
"mapping_task_failed": "Не удалось запустить задачу маппинга",
|
||||
"docs_task_failed": "Не удалось запустить задачу генерации документации",
|
||||
"load_failed": "Не удалось загрузить датасеты",
|
||||
"load_detail_failed": "Не удалось загрузить детали датасета",
|
||||
"missing_context": "Отсутствует ID датасета или окружения",
|
||||
"sql_lab_view": "Представление SQL Lab",
|
||||
"date_time": "Дата/время",
|
||||
"inactive": "Неактивно",
|
||||
"mapped": "Размечено",
|
||||
"unmapped": "Не размечено",
|
||||
"view_task": "Просмотреть задачу",
|
||||
"task_running": "Выполняется...",
|
||||
"task_done": "Готово",
|
||||
@@ -224,7 +311,30 @@
|
||||
"schedule_enabled": "Включено",
|
||||
"cron_label": "Cron-выражение",
|
||||
"cron_hint": "например, 0 0 * * * для ежедневного запуска в полночь",
|
||||
"footer_text": "Задача продолжает работать в фоновом режиме"
|
||||
"footer_text": "Задача продолжает работать в фоновом режиме",
|
||||
"drawer": "Панель задач",
|
||||
"close_drawer": "Закрыть панель задач",
|
||||
"back_to_list": "Назад к списку задач"
|
||||
},
|
||||
"migration": {
|
||||
"source_env": "Исходное окружение",
|
||||
"target_env": "Целевое окружение",
|
||||
"loading_envs": "Загрузка окружений...",
|
||||
"select_both_envs": "Выберите исходное и целевое окружение.",
|
||||
"different_envs": "Исходное и целевое окружения должны отличаться.",
|
||||
"select_dashboards": "Выберите хотя бы один дашборд для миграции.",
|
||||
"select_dashboards_title": "Выберите дашборды",
|
||||
"replace_db": "Заменить БД (применить маппинги)",
|
||||
"database_mappings": "Маппинги баз данных",
|
||||
"loading_dbs": "Загрузка баз данных и подсказок...",
|
||||
"refresh_dbs": "Обновить БД и подсказки",
|
||||
"start": "Запустить миграцию",
|
||||
"resume_failed": "Не удалось возобновить задачу",
|
||||
"mapping_saved": "Маппинг успешно сохранен",
|
||||
"mapping_management": "Управление маппингом БД",
|
||||
"fetch_dbs": "Получить БД и подсказки",
|
||||
"mapping_hint": "Выберите окружения и нажмите «Получить БД и подсказки», чтобы начать маппинг.",
|
||||
"task_placeholder_warn": "Не удалось сразу получить детали задачи, используется временное состояние."
|
||||
},
|
||||
"assistant": {
|
||||
"title": "AI Ассистент",
|
||||
@@ -256,7 +366,14 @@
|
||||
"create": "Создать подключение",
|
||||
"saved": "Сохраненные подключения",
|
||||
"no_saved": "Нет сохраненных подключений.",
|
||||
"delete": "Удалить"
|
||||
"delete": "Удалить",
|
||||
"required_fields": "Заполните все обязательные поля",
|
||||
"created_success": "Подключение успешно создано",
|
||||
"fetch_failed": "Не удалось загрузить подключения",
|
||||
"delete_confirm": "Вы уверены, что хотите удалить это подключение?",
|
||||
"deleted_success": "Подключение удалено",
|
||||
"name_placeholder": "например, Production DWH",
|
||||
"host_placeholder": "10.0.0.1"
|
||||
},
|
||||
"storage": {
|
||||
"management": "Управление хранилищем файлов",
|
||||
@@ -306,16 +423,38 @@
|
||||
"excel_path": "Путь к файлу Excel",
|
||||
"run": "Запустить маппер",
|
||||
"starting": "Запуск...",
|
||||
"generating": "Генерация...",
|
||||
"errors": {
|
||||
"fetch_failed": "Не удалось загрузить данные",
|
||||
"required_fields": "Пожалуйста, заполните обязательные поля",
|
||||
"postgres_required": "Подключение и имя таблицы обязательны для источника PostgreSQL",
|
||||
"excel_required": "Путь к Excel обязателен для источника Excel"
|
||||
"excel_required": "Путь к Excel обязателен для источника Excel",
|
||||
"no_active_llm_provider": "Не найден активный LLM-провайдер",
|
||||
"docs_start_failed": "Не удалось запустить генерацию документации",
|
||||
"docs_apply_failed": "Не удалось применить документацию"
|
||||
},
|
||||
"success": {
|
||||
"started": "Задача маппинга запущена"
|
||||
"started": "Задача маппинга запущена",
|
||||
"docs_started": "Генерация документации запущена",
|
||||
"docs_applied": "Документация успешно применена"
|
||||
},
|
||||
"auto_document": "Авто-документирование"
|
||||
"auto_document": "Авто-документирование",
|
||||
"excel_placeholder": "/path/to/mapping.xlsx"
|
||||
},
|
||||
"debug": {
|
||||
"title": "Системная диагностика",
|
||||
"action": "Действие отладки",
|
||||
"test_db_api": "Проверить Database API (сравнение окружений)",
|
||||
"get_dataset_structure": "Получить структуру датасета (JSON)",
|
||||
"source_target_required": "Требуются исходное и целевое окружения",
|
||||
"env_dataset_required": "Требуются окружение и ID датасета",
|
||||
"fetch_env_failed": "Не удалось загрузить окружения",
|
||||
"completed": "Задача диагностики завершена",
|
||||
"failed": "Задача диагностики завершилась с ошибкой",
|
||||
"run": "Запустить диагностику",
|
||||
"output": "Результат диагностики",
|
||||
"select_source": "-- Выберите источник --",
|
||||
"select_target": "-- Выберите цель --"
|
||||
},
|
||||
"admin": {
|
||||
"users": {
|
||||
|
||||
Reference in New Issue
Block a user