From 0641b65da4d2344f191895c041ad84ae2d03a2eb Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 13 Jun 2026 13:50:20 +0200 Subject: [PATCH 1/3] refac --- cptr/frontend/src/app.css | 7 + .../lib/components/Settings/General.svelte | 199 +++++++++--------- 2 files changed, 108 insertions(+), 98 deletions(-) diff --git a/cptr/frontend/src/app.css b/cptr/frontend/src/app.css index 64a0846..10a7843 100644 --- a/cptr/frontend/src/app.css +++ b/cptr/frontend/src/app.css @@ -90,6 +90,13 @@ display: none; } +.scrollbar-hover::-webkit-scrollbar-thumb { + visibility: hidden; +} +.scrollbar-hover:hover::-webkit-scrollbar-thumb { + visibility: visible; +} + /* CodeMirror - match Open WebUI */ .cm-editor { height: 100%; diff --git a/cptr/frontend/src/lib/components/Settings/General.svelte b/cptr/frontend/src/lib/components/Settings/General.svelte index 9c9d3eb..6634def 100644 --- a/cptr/frontend/src/lib/components/Settings/General.svelte +++ b/cptr/frontend/src/lib/components/Settings/General.svelte @@ -16,27 +16,33 @@ // ── Webhook URL ───────────────────────────────────────────── let webhookUrl = $state(''); - let webhookLoading = $state(false); + let webhookUrlOriginal = $state(''); + let saving = $state(false); + + let dirty = $derived(webhookUrl.trim() !== webhookUrlOriginal); onMount(async () => { try { const data = await fetchJSON<{ config: Record }>('/api/admin/config/notifications'); - webhookUrl = data.config?.['notifications.webhook_url'] || ''; + const url = data.config?.['notifications.webhook_url'] || ''; + webhookUrl = url; + webhookUrlOriginal = url; } catch {} }); - async function saveWebhookUrl() { - webhookLoading = true; + async function save() { + saving = true; try { await fetchJSON('/api/admin/config', { method: 'PUT', body: JSON.stringify({ config: { 'notifications.webhook_url': webhookUrl.trim() || null } }) }); - toast.success($t('general.webhookUrlSaved')); + webhookUrlOriginal = webhookUrl.trim(); + toast.success($t('settings.saved')); } catch { toast.error($t('general.webhookUrlSaveFailed')); } finally { - webhookLoading = false; + saving = false; } } @@ -57,117 +63,114 @@ } -
-

{$t('general.title')}

- -

{$t('general.theme')}

-
- {#each [{ value: 'light' as Theme, label: $t('general.light'), icon: 'sun-light' }, { value: 'dark' as Theme, label: $t('general.dark'), icon: 'half-moon' }, { value: 'system' as Theme, label: $t('general.system'), icon: 'monitor' }] as opt} - - {/each} -
+
+
+

{$t('general.title')}

-

{$t('general.language')}

- - - -

{$t('general.notifications')}

- -
- - -

- {$t('general.browserNotificationsDesc')} -

+

{$t('general.theme')}

+
+ {#each [{ value: 'light' as Theme, label: $t('general.light'), icon: 'sun-light' }, { value: 'dark' as Theme, label: $t('general.dark'), icon: 'half-moon' }, { value: 'system' as Theme, label: $t('general.system'), icon: 'monitor' }] as opt} + + {/each} +
- - +

{$t('general.language')}

+ + + +

{$t('general.notifications')}

+ +
+ + +

+ {$t('general.browserNotificationsDesc')} +

- -
-
-
+ {/if} - {#if $session?.role === 'admin'} -

{$t('general.updates')}

- +

{$t('general.messageQueue')}

+
+ {#each [{ value: 'queue' as StreamingBehavior, label: $t('general.queue') }, { value: 'interrupt' as StreamingBehavior, label: $t('general.interrupt') }] as opt} + + {/each} +

- {$t('general.updateNotificationsDesc')} + {$streamingBehavior === 'queue' + ? $t('general.queueDesc') + : $t('general.interruptDesc')}

- {/if} - -

{$t('general.messageQueue')}

-
- {#each [{ value: 'queue' as StreamingBehavior, label: $t('general.queue') }, { value: 'interrupt' as StreamingBehavior, label: $t('general.interrupt') }] as opt} - - {/each}
-

- {$streamingBehavior === 'queue' - ? $t('general.queueDesc') - : $t('general.interruptDesc')} -

-
+
+ {#if saving}{$t('settings.saving')}{:else}{$t('settings.save')}{/if} +
From 914dc80e5bb5b3cb3564258844b7ab2f997aefc8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 13 Jun 2026 13:55:39 +0200 Subject: [PATCH 2/3] refac --- .../lib/components/Admin/ToolServers.svelte | 14 ++-- .../src/lib/components/Admin/Web.svelte | 44 ++++++------- cptr/frontend/src/lib/i18n/locales/de.json | 65 ++++++++++++++++++- cptr/frontend/src/lib/i18n/locales/en.json | 28 +++++++- cptr/frontend/src/lib/i18n/locales/es.json | 65 ++++++++++++++++++- cptr/frontend/src/lib/i18n/locales/fr.json | 65 ++++++++++++++++++- cptr/frontend/src/lib/i18n/locales/ja.json | 65 ++++++++++++++++++- cptr/frontend/src/lib/i18n/locales/ko.json | 65 ++++++++++++++++++- cptr/frontend/src/lib/i18n/locales/pt-BR.json | 65 ++++++++++++++++++- cptr/frontend/src/lib/i18n/locales/ru.json | 65 ++++++++++++++++++- cptr/frontend/src/lib/i18n/locales/zh-CN.json | 65 ++++++++++++++++++- cptr/frontend/src/lib/i18n/locales/zh-TW.json | 65 ++++++++++++++++++- 12 files changed, 623 insertions(+), 48 deletions(-) diff --git a/cptr/frontend/src/lib/components/Admin/ToolServers.svelte b/cptr/frontend/src/lib/components/Admin/ToolServers.svelte index 4b4e6b4..4c45f06 100644 --- a/cptr/frontend/src/lib/components/Admin/ToolServers.svelte +++ b/cptr/frontend/src/lib/components/Admin/ToolServers.svelte @@ -156,9 +156,9 @@ try { verifyResult = await verifyToolServer(editServer.id); if (verifyResult.ok) toast.success($t('toolServers.connected')); - else toast.error(verifyResult.message || 'Connection failed'); + else toast.error(verifyResult.message || $t('toolServers.connectionFailed')); } catch (e: any) { - verifyResult = { ok: false, message: e?.message || 'Connection failed' }; + verifyResult = { ok: false, message: e?.message || $t('toolServers.connectionFailed') }; toast.error(verifyResult.message!); } finally { verifying = false; @@ -269,7 +269,7 @@ > - - + +
@@ -298,7 +298,7 @@ >
{:else} -

Search

+

{$t('admin.webSearch')}

-

Browser

+

{$t('admin.browser')}

- Give the AI access to a web browser for navigating pages, clicking elements, and taking screenshots. + {$t('admin.browserHint')}

{#if browserEnabled}
- Provider + {$t('admin.browserProvider')}

{#if browserProvider === 'local'} - Connects to Chrome via DevTools Protocol. Full interactive browsing with clicking, typing, and screenshots. + {$t('admin.browserLocalHint')} {:else if browserProvider === 'firecrawl'} - Cloud API that converts web pages to markdown. Fast extraction, no interactive browsing. + {$t('admin.browserFirecrawlHint')} {:else} - Cloud API for LLM-driven browser tasks. Describe what you need in natural language. + {$t('admin.browserBrowserUseHint')} {/if}

{#if browserProvider === 'local'}
- +
@@ -258,7 +258,7 @@ class="h-7 px-2.5 rounded-lg text-xs bg-gray-200/50 dark:bg-white/8 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors disabled:opacity-50" onclick={() => testConnection()} disabled={testing} - >{testing ? '...' : 'Test'} + >{testing ? '...' : $t('admin.browserTest')}
{#if testResult}

@@ -268,33 +268,33 @@

- +
- minutes + {$t('admin.browserMinutes')}
{:else if browserProvider === 'firecrawl'}
- +
- + -

Change for self-hosted Firecrawl instances

+

{$t('admin.browserFirecrawlBaseUrlHint')}

{:else if browserProvider === 'browser_use'}
- +
- +
diff --git a/cptr/frontend/src/lib/i18n/locales/de.json b/cptr/frontend/src/lib/i18n/locales/de.json index bc5e2ae..1c6d64a 100644 --- a/cptr/frontend/src/lib/i18n/locales/de.json +++ b/cptr/frontend/src/lib/i18n/locales/de.json @@ -570,7 +570,6 @@ "admin.gateway.noKeys": "Noch keine API-Schlüssel", "admin.gateway.title": "API-Gateway", "chat.greeting": "Wie kann ich Ihnen helfen?", - "admin.subagents": "Sub-Agenten", "admin.subagentsEnabled": "Sub-Agenten aktivieren", "admin.subagentsHint": "Ermöglicht der KI, Aufgaben an Sub-Agenten zu delegieren. Jeder Sub-Agent erstellt einen echten Chat mit vollem Werkzeugzugriff. Verwendet zusätzliche LLM-Aufrufe.", @@ -581,5 +580,67 @@ "admin.subagentsMaxOutput": "Max. Ausgabe", "admin.subagentsSystemPrompt": "System-Prompt", "admin.subagentsSystemPromptPlaceholder": "Du bist ein Sub-Agent...", - "admin.subagentsSystemPromptHint": "Leer lassen für den integrierten Standard." + "admin.subagentsSystemPromptHint": "Leer lassen für den integrierten Standard.", + "admin.contextCompaction": "Kontextkompaktierung", + "admin.compactTokenThreshold": "Token-Schwellenwert", + "admin.compactTokenThresholdUnit": "Token", + "admin.compactTokenThresholdHint": "Ältere Nachrichten werden zusammengefasst, wenn der geschätzte Kontext diesen Grenzwert überschreitet. Standard: 80.000.", + "admin.toolServers": "Tool-Server", + "toolServers.title": "Tool-Server", + "toolServers.empty": "Keine Tool-Server konfiguriert", + "toolServers.add": "Server hinzufügen", + "toolServers.edit": "Server bearbeiten", + "toolServers.id": "ID", + "toolServers.name": "Name", + "toolServers.type": "Typ", + "toolServers.namePlaceholder": "Optionaler Anzeigename", + "toolServers.idPlaceholder": "mein_server", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "Verbindung fehlgeschlagen", + "toolServers.apiKeyKeep": "•••••••• (leer lassen zum Beibehalten)", + "toolServers.url": "URL", + "toolServers.specPath": "Spec-Pfad", + "toolServers.fieldsRequired": "ID und URL sind erforderlich", + "toolServers.idInvalid": "ID darf nur Kleinbuchstaben, Zahlen und Unterstriche enthalten", + "toolServers.auth": "Auth", + "toolServers.authNone": "Keine", + "toolServers.authBearer": "Bearer", + "toolServers.apiKey": "API-Schlüssel", + "toolServers.description": "Beschreibung", + "toolServers.descriptionPlaceholder": "Was macht dieser Server?", + "toolServers.headers": "Header", + "toolServers.headersHint": "Zusätzliche HTTP-Header als JSON.", + "toolServers.headersInvalid": "Header müssen ein gültiges JSON-Objekt sein", + "toolServers.verify": "Prüfen", + "toolServers.connected": "Verbunden", + "toolServers.toolsFound": "Tools gefunden", + "toolServers.delete": "Löschen", + "toolServers.loadError": "Tool-Server konnten nicht geladen werden", + "toolServers.urlRequired": "URL ist erforderlich", + "toolServers.created": "Tool-Server hinzugefügt", + "toolServers.updated": "Tool-Server aktualisiert", + "toolServers.deleted": "Tool-Server gelöscht", + "toolServers.saveFailed": "Tool-Server konnte nicht gespeichert werden", + "toolServers.deleteFailed": "Tool-Server konnte nicht gelöscht werden", + "admin.webSearch": "Suche", + "admin.browser": "Browser", + "admin.browserTools": "Browser-Tools", + "admin.browserHint": "Gibt der KI Zugriff auf einen Webbrowser zum Navigieren, Klicken und Erstellen von Screenshots.", + "admin.browserProvider": "Anbieter", + "admin.browserLocalCdp": "Lokales CDP", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "Verbindet sich über das DevTools-Protokoll mit Chrome. Vollständiges interaktives Browsen mit Klicken, Tippen und Screenshots.", + "admin.browserFirecrawlHint": "Cloud-API, die Webseiten in Markdown umwandelt. Schnelle Extraktion, kein interaktives Browsen.", + "admin.browserBrowserUseHint": "Cloud-API für LLM-gesteuerte Browseraufgaben. Beschreiben Sie, was Sie benötigen, in natürlicher Sprache.", + "admin.browserAutoLaunch": "Chrome automatisch starten", + "admin.browserAutoLaunchHint": "Headless Chrome starten, wenn keiner läuft", + "admin.browserCdpUrl": "CDP-URL", + "admin.browserTest": "Testen", + "admin.browserSessionTimeout": "Sitzungs-Timeout", + "admin.browserMinutes": "Minuten", + "admin.browserApiKey": "API-Schlüssel", + "admin.browserBaseUrl": "Basis-URL", + "admin.browserFirecrawlBaseUrlHint": "Für selbst gehostete Firecrawl-Instanzen ändern" } diff --git a/cptr/frontend/src/lib/i18n/locales/en.json b/cptr/frontend/src/lib/i18n/locales/en.json index fc3c248..5f446bc 100644 --- a/cptr/frontend/src/lib/i18n/locales/en.json +++ b/cptr/frontend/src/lib/i18n/locales/en.json @@ -258,6 +258,7 @@ "system.process": "PROCESS", "admin.web": "Web", + "admin.webSearch": "Search", "admin.webEnabled": "Enable web access", "admin.webEnabledHint": "AI can search the web and fetch URLs.", "admin.webDisabledHint": "Web search and URL fetching are disabled.", @@ -279,6 +280,26 @@ "admin.webCcModel": "Model", "admin.webCcHint": "Use any OpenAI-compatible endpoint (e.g. Perplexity Sonar, LiteLLM proxy)", + "admin.browser": "Browser", + "admin.browserTools": "Browser tools", + "admin.browserHint": "Give the AI access to a web browser for navigating pages, clicking elements, and taking screenshots.", + "admin.browserProvider": "Provider", + "admin.browserLocalCdp": "Local CDP", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "Connects to Chrome via DevTools Protocol. Full interactive browsing with clicking, typing, and screenshots.", + "admin.browserFirecrawlHint": "Cloud API that converts web pages to markdown. Fast extraction, no interactive browsing.", + "admin.browserBrowserUseHint": "Cloud API for LLM-driven browser tasks. Describe what you need in natural language.", + "admin.browserAutoLaunch": "Auto-launch Chrome", + "admin.browserAutoLaunchHint": "Start a headless Chrome if none is running", + "admin.browserCdpUrl": "CDP URL", + "admin.browserTest": "Test", + "admin.browserSessionTimeout": "Session timeout", + "admin.browserMinutes": "minutes", + "admin.browserApiKey": "API Key", + "admin.browserBaseUrl": "Base URL", + "admin.browserFirecrawlBaseUrlHint": "Change for self-hosted Firecrawl instances", + "admin.models": "Models", "models.defaults": "Defaults", "models.noDefaults": "No global defaults", @@ -656,7 +677,12 @@ "toolServers.id": "ID", "toolServers.name": "Name", "toolServers.type": "Type", - "toolServers.namePlaceholder": "My MCP Server", + "toolServers.namePlaceholder": "Optional display name", + "toolServers.idPlaceholder": "my_server", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "Connection failed", + "toolServers.apiKeyKeep": "•••••••• (leave blank to keep)", "toolServers.url": "URL", "toolServers.specPath": "Spec path", "toolServers.fieldsRequired": "ID and URL are required", diff --git a/cptr/frontend/src/lib/i18n/locales/es.json b/cptr/frontend/src/lib/i18n/locales/es.json index 5e69a66..1c5f019 100644 --- a/cptr/frontend/src/lib/i18n/locales/es.json +++ b/cptr/frontend/src/lib/i18n/locales/es.json @@ -570,7 +570,6 @@ "admin.gateway.noKeys": "Aún no hay claves API", "admin.gateway.title": "API Gateway", "chat.greeting": "¿En qué puedo ayudarte?", - "admin.subagents": "Sub-agentes", "admin.subagentsEnabled": "Habilitar sub-agentes", "admin.subagentsHint": "Permite a la IA delegar tareas a sub-agentes. Cada sub-agente crea un chat real con acceso completo a herramientas. Usa llamadas LLM adicionales.", @@ -581,5 +580,67 @@ "admin.subagentsMaxOutput": "Máx. salida", "admin.subagentsSystemPrompt": "Prompt del sistema", "admin.subagentsSystemPromptPlaceholder": "Eres un sub-agente...", - "admin.subagentsSystemPromptHint": "Dejar vacío para el valor predeterminado." + "admin.subagentsSystemPromptHint": "Dejar vacío para el valor predeterminado.", + "admin.contextCompaction": "Compactación de contexto", + "admin.compactTokenThreshold": "Umbral de tokens", + "admin.compactTokenThresholdUnit": "tokens", + "admin.compactTokenThresholdHint": "Los mensajes antiguos se resumen cuando el contexto estimado supera este límite. Predeterminado: 80.000.", + "admin.toolServers": "Servidores de herramientas", + "toolServers.title": "Servidores de herramientas", + "toolServers.empty": "No hay servidores de herramientas configurados", + "toolServers.add": "Agregar servidor", + "toolServers.edit": "Editar servidor", + "toolServers.id": "ID", + "toolServers.name": "Nombre", + "toolServers.type": "Tipo", + "toolServers.namePlaceholder": "Nombre opcional", + "toolServers.idPlaceholder": "mi_servidor", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "Conexión fallida", + "toolServers.apiKeyKeep": "•••••••• (dejar vacío para mantener)", + "toolServers.url": "URL", + "toolServers.specPath": "Ruta de spec", + "toolServers.fieldsRequired": "ID y URL son obligatorios", + "toolServers.idInvalid": "El ID solo puede contener letras minúsculas, números y guiones bajos", + "toolServers.auth": "Auth", + "toolServers.authNone": "Ninguna", + "toolServers.authBearer": "Bearer", + "toolServers.apiKey": "Clave API", + "toolServers.description": "Descripción", + "toolServers.descriptionPlaceholder": "¿Qué hace este servidor?", + "toolServers.headers": "Cabeceras", + "toolServers.headersHint": "Cabeceras HTTP adicionales en formato JSON.", + "toolServers.headersInvalid": "Las cabeceras deben ser un objeto JSON válido", + "toolServers.verify": "Verificar", + "toolServers.connected": "Conectado", + "toolServers.toolsFound": "herramientas encontradas", + "toolServers.delete": "Eliminar", + "toolServers.loadError": "No se pudieron cargar los servidores de herramientas", + "toolServers.urlRequired": "La URL es obligatoria", + "toolServers.created": "Servidor de herramientas agregado", + "toolServers.updated": "Servidor de herramientas actualizado", + "toolServers.deleted": "Servidor de herramientas eliminado", + "toolServers.saveFailed": "No se pudo guardar el servidor de herramientas", + "toolServers.deleteFailed": "No se pudo eliminar el servidor de herramientas", + "admin.webSearch": "Búsqueda", + "admin.browser": "Navegador", + "admin.browserTools": "Herramientas del navegador", + "admin.browserHint": "Dar a la IA acceso a un navegador web para navegar páginas, hacer clic en elementos y tomar capturas de pantalla.", + "admin.browserProvider": "Proveedor", + "admin.browserLocalCdp": "CDP local", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "Se conecta a Chrome a través del Protocolo DevTools. Navegación interactiva completa con clics, escritura y capturas.", + "admin.browserFirecrawlHint": "API en la nube que convierte páginas web a markdown. Extracción rápida, sin navegación interactiva.", + "admin.browserBrowserUseHint": "API en la nube para tareas de navegador impulsadas por LLM. Describe lo que necesitas en lenguaje natural.", + "admin.browserAutoLaunch": "Iniciar Chrome automáticamente", + "admin.browserAutoLaunchHint": "Iniciar Chrome sin interfaz si no hay ninguno en ejecución", + "admin.browserCdpUrl": "URL CDP", + "admin.browserTest": "Probar", + "admin.browserSessionTimeout": "Tiempo de espera de sesión", + "admin.browserMinutes": "minutos", + "admin.browserApiKey": "Clave API", + "admin.browserBaseUrl": "URL base", + "admin.browserFirecrawlBaseUrlHint": "Cambiar para instancias de Firecrawl autoalojadas" } diff --git a/cptr/frontend/src/lib/i18n/locales/fr.json b/cptr/frontend/src/lib/i18n/locales/fr.json index a9fb176..d603668 100644 --- a/cptr/frontend/src/lib/i18n/locales/fr.json +++ b/cptr/frontend/src/lib/i18n/locales/fr.json @@ -569,7 +569,6 @@ "admin.gateway.noKeys": "Aucune clé API", "admin.gateway.title": "Passerelle API", "chat.greeting": "Comment puis-je vous aider ?", - "admin.subagents": "Sous-agents", "admin.subagentsEnabled": "Activer les sous-agents", "admin.subagentsHint": "Permet à l'IA de déléguer des tâches à des sous-agents. Chaque sous-agent crée un vrai chat avec un accès complet aux outils. Utilise des appels LLM supplémentaires.", @@ -580,5 +579,67 @@ "admin.subagentsMaxOutput": "Max. sortie", "admin.subagentsSystemPrompt": "Prompt système", "admin.subagentsSystemPromptPlaceholder": "Vous êtes un sous-agent...", - "admin.subagentsSystemPromptHint": "Laisser vide pour la valeur par défaut." + "admin.subagentsSystemPromptHint": "Laisser vide pour la valeur par défaut.", + "admin.contextCompaction": "Compaction du contexte", + "admin.compactTokenThreshold": "Seuil de tokens", + "admin.compactTokenThresholdUnit": "tokens", + "admin.compactTokenThresholdHint": "Les messages anciens sont résumés lorsque le contexte estimé dépasse cette limite. Par défaut : 80 000.", + "admin.toolServers": "Serveurs d'outils", + "toolServers.title": "Serveurs d'outils", + "toolServers.empty": "Aucun serveur d'outils configuré", + "toolServers.add": "Ajouter un serveur", + "toolServers.edit": "Modifier le serveur", + "toolServers.id": "ID", + "toolServers.name": "Nom", + "toolServers.type": "Type", + "toolServers.namePlaceholder": "Nom d'affichage optionnel", + "toolServers.idPlaceholder": "mon_serveur", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "Échec de la connexion", + "toolServers.apiKeyKeep": "•••••••• (laisser vide pour conserver)", + "toolServers.url": "URL", + "toolServers.specPath": "Chemin de spec", + "toolServers.fieldsRequired": "L'ID et l'URL sont requis", + "toolServers.idInvalid": "L'ID ne peut contenir que des lettres minuscules, des chiffres et des tirets bas", + "toolServers.auth": "Auth", + "toolServers.authNone": "Aucune", + "toolServers.authBearer": "Bearer", + "toolServers.apiKey": "Clé API", + "toolServers.description": "Description", + "toolServers.descriptionPlaceholder": "Que fait ce serveur ?", + "toolServers.headers": "En-têtes", + "toolServers.headersHint": "En-têtes HTTP supplémentaires au format JSON.", + "toolServers.headersInvalid": "Les en-têtes doivent être un objet JSON valide", + "toolServers.verify": "Vérifier", + "toolServers.connected": "Connecté", + "toolServers.toolsFound": "outils trouvés", + "toolServers.delete": "Supprimer", + "toolServers.loadError": "Impossible de charger les serveurs d'outils", + "toolServers.urlRequired": "L'URL est requise", + "toolServers.created": "Serveur d'outils ajouté", + "toolServers.updated": "Serveur d'outils mis à jour", + "toolServers.deleted": "Serveur d'outils supprimé", + "toolServers.saveFailed": "Impossible de sauvegarder le serveur d'outils", + "toolServers.deleteFailed": "Impossible de supprimer le serveur d'outils", + "admin.webSearch": "Recherche", + "admin.browser": "Navigateur", + "admin.browserTools": "Outils du navigateur", + "admin.browserHint": "Donne à l'IA accès à un navigateur web pour naviguer, cliquer et prendre des captures d'écran.", + "admin.browserProvider": "Fournisseur", + "admin.browserLocalCdp": "CDP local", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "Se connecte à Chrome via le protocole DevTools. Navigation interactive complète avec clics, saisie et captures.", + "admin.browserFirecrawlHint": "API cloud qui convertit les pages web en markdown. Extraction rapide, pas de navigation interactive.", + "admin.browserBrowserUseHint": "API cloud pour les tâches de navigateur pilotées par LLM. Décrivez vos besoins en langage naturel.", + "admin.browserAutoLaunch": "Lancement automatique de Chrome", + "admin.browserAutoLaunchHint": "Lancer Chrome sans interface si aucun n'est en cours d'exécution", + "admin.browserCdpUrl": "URL CDP", + "admin.browserTest": "Tester", + "admin.browserSessionTimeout": "Délai d'expiration de session", + "admin.browserMinutes": "minutes", + "admin.browserApiKey": "Clé API", + "admin.browserBaseUrl": "URL de base", + "admin.browserFirecrawlBaseUrlHint": "Modifier pour les instances Firecrawl auto-hébergées" } diff --git a/cptr/frontend/src/lib/i18n/locales/ja.json b/cptr/frontend/src/lib/i18n/locales/ja.json index 9db4828..9fe58b4 100644 --- a/cptr/frontend/src/lib/i18n/locales/ja.json +++ b/cptr/frontend/src/lib/i18n/locales/ja.json @@ -570,7 +570,6 @@ "admin.gateway.noKeys": "APIキーがまだありません", "admin.gateway.title": "APIゲートウェイ", "chat.greeting": "何かお手伝いできますか?", - "admin.subagents": "サブエージェント", "admin.subagentsEnabled": "サブエージェントを有効にする", "admin.subagentsHint": "AIがサブエージェントにタスクを委任できるようにします。各サブエージェントはフルツールアクセス付きの実際のチャットを作成します。追加のLLMコールを使用します。", @@ -581,5 +580,67 @@ "admin.subagentsMaxOutput": "最大出力", "admin.subagentsSystemPrompt": "システムプロンプト", "admin.subagentsSystemPromptPlaceholder": "あなたはサブエージェントです...", - "admin.subagentsSystemPromptHint": "組み込みデフォルトを使用する場合は空のままにしてください。" + "admin.subagentsSystemPromptHint": "組み込みデフォルトを使用する場合は空のままにしてください。", + "admin.contextCompaction": "コンテキスト圧縮", + "admin.compactTokenThreshold": "トークン閾値", + "admin.compactTokenThresholdUnit": "トークン", + "admin.compactTokenThresholdHint": "推定コンテキストがこの制限を超えると、古いメッセージが要約されます。デフォルト: 80,000。", + "admin.toolServers": "ツールサーバー", + "toolServers.title": "ツールサーバー", + "toolServers.empty": "ツールサーバーが設定されていません", + "toolServers.add": "サーバーを追加", + "toolServers.edit": "サーバーを編集", + "toolServers.id": "ID", + "toolServers.name": "名前", + "toolServers.type": "タイプ", + "toolServers.namePlaceholder": "表示名(任意)", + "toolServers.idPlaceholder": "my_server", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "接続に失敗しました", + "toolServers.apiKeyKeep": "••••••••(空のままで保持)", + "toolServers.url": "URL", + "toolServers.specPath": "Specパス", + "toolServers.fieldsRequired": "IDとURLは必須です", + "toolServers.idInvalid": "IDは小文字、数字、アンダースコアのみ使用できます", + "toolServers.auth": "認証", + "toolServers.authNone": "なし", + "toolServers.authBearer": "Bearer", + "toolServers.apiKey": "APIキー", + "toolServers.description": "説明", + "toolServers.descriptionPlaceholder": "このサーバーは何をしますか?", + "toolServers.headers": "ヘッダー", + "toolServers.headersHint": "JSON形式の追加HTTPヘッダー。", + "toolServers.headersInvalid": "ヘッダーは有効なJSONオブジェクトである必要があります", + "toolServers.verify": "検証", + "toolServers.connected": "接続済み", + "toolServers.toolsFound": "個のツールが見つかりました", + "toolServers.delete": "削除", + "toolServers.loadError": "ツールサーバーの読み込みに失敗しました", + "toolServers.urlRequired": "URLは必須です", + "toolServers.created": "ツールサーバーを追加しました", + "toolServers.updated": "ツールサーバーを更新しました", + "toolServers.deleted": "ツールサーバーを削除しました", + "toolServers.saveFailed": "ツールサーバーの保存に失敗しました", + "toolServers.deleteFailed": "ツールサーバーの削除に失敗しました", + "admin.webSearch": "検索", + "admin.browser": "ブラウザ", + "admin.browserTools": "ブラウザツール", + "admin.browserHint": "AIにウェブブラウザへのアクセスを提供し、ページ操作、要素のクリック、スクリーンショットの取得を可能にします。", + "admin.browserProvider": "プロバイダー", + "admin.browserLocalCdp": "ローカルCDP", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "DevToolsプロトコルを介してChromeに接続。クリック、入力、スクリーンショットを含む完全なインタラクティブブラウジング。", + "admin.browserFirecrawlHint": "ウェブページをMarkdownに変換するクラウドAPI。高速な抽出、インタラクティブブラウジングなし。", + "admin.browserBrowserUseHint": "LLM駆動のブラウザタスク用クラウドAPI。必要なことを自然言語で説明してください。", + "admin.browserAutoLaunch": "Chrome自動起動", + "admin.browserAutoLaunchHint": "実行中のChromeがない場合、ヘッドレスChromeを起動", + "admin.browserCdpUrl": "CDP URL", + "admin.browserTest": "テスト", + "admin.browserSessionTimeout": "セッションタイムアウト", + "admin.browserMinutes": "分", + "admin.browserApiKey": "APIキー", + "admin.browserBaseUrl": "ベースURL", + "admin.browserFirecrawlBaseUrlHint": "セルフホストのFirecrawlインスタンス用に変更" } diff --git a/cptr/frontend/src/lib/i18n/locales/ko.json b/cptr/frontend/src/lib/i18n/locales/ko.json index 4055b37..d63d07e 100644 --- a/cptr/frontend/src/lib/i18n/locales/ko.json +++ b/cptr/frontend/src/lib/i18n/locales/ko.json @@ -570,7 +570,6 @@ "admin.gateway.noKeys": "API 키가 아직 없습니다", "admin.gateway.title": "API 게이트웨이", "chat.greeting": "무엇을 도와드릴까요?", - "admin.subagents": "서브 에이전트", "admin.subagentsEnabled": "서브 에이전트 활성화", "admin.subagentsHint": "AI가 서브 에이전트에 작업을 위임할 수 있게 합니다. 각 서브 에이전트는 전체 도구 액세스 권한이 있는 실제 채팅을 생성합니다. 추가 LLM 호출을 사용합니다.", @@ -581,5 +580,67 @@ "admin.subagentsMaxOutput": "최대 출력", "admin.subagentsSystemPrompt": "시스템 프롬프트", "admin.subagentsSystemPromptPlaceholder": "당신은 서브 에이전트입니다...", - "admin.subagentsSystemPromptHint": "기본값을 사용하려면 비워두세요." + "admin.subagentsSystemPromptHint": "기본값을 사용하려면 비워두세요.", + "admin.contextCompaction": "컨텍스트 압축", + "admin.compactTokenThreshold": "토큰 임계값", + "admin.compactTokenThresholdUnit": "토큰", + "admin.compactTokenThresholdHint": "예상 컨텍스트가 이 제한을 초과하면 이전 메시지가 요약됩니다. 기본값: 80,000.", + "admin.toolServers": "도구 서버", + "toolServers.title": "도구 서버", + "toolServers.empty": "구성된 도구 서버가 없습니다", + "toolServers.add": "서버 추가", + "toolServers.edit": "서버 편집", + "toolServers.id": "ID", + "toolServers.name": "이름", + "toolServers.type": "유형", + "toolServers.namePlaceholder": "선택적 표시 이름", + "toolServers.idPlaceholder": "my_server", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "연결 실패", + "toolServers.apiKeyKeep": "•••••••• (유지하려면 비워두세요)", + "toolServers.url": "URL", + "toolServers.specPath": "Spec 경로", + "toolServers.fieldsRequired": "ID와 URL은 필수입니다", + "toolServers.idInvalid": "ID는 소문자, 숫자, 밑줄만 사용할 수 있습니다", + "toolServers.auth": "인증", + "toolServers.authNone": "없음", + "toolServers.authBearer": "Bearer", + "toolServers.apiKey": "API 키", + "toolServers.description": "설명", + "toolServers.descriptionPlaceholder": "이 서버는 무엇을 하나요?", + "toolServers.headers": "헤더", + "toolServers.headersHint": "JSON 형식의 추가 HTTP 헤더.", + "toolServers.headersInvalid": "헤더는 유효한 JSON 객체여야 합니다", + "toolServers.verify": "확인", + "toolServers.connected": "연결됨", + "toolServers.toolsFound": "개의 도구 발견", + "toolServers.delete": "삭제", + "toolServers.loadError": "도구 서버를 불러올 수 없습니다", + "toolServers.urlRequired": "URL은 필수입니다", + "toolServers.created": "도구 서버가 추가되었습니다", + "toolServers.updated": "도구 서버가 업데이트되었습니다", + "toolServers.deleted": "도구 서버가 삭제되었습니다", + "toolServers.saveFailed": "도구 서버를 저장할 수 없습니다", + "toolServers.deleteFailed": "도구 서버를 삭제할 수 없습니다", + "admin.webSearch": "검색", + "admin.browser": "브라우저", + "admin.browserTools": "브라우저 도구", + "admin.browserHint": "AI에게 웹 브라우저 접근 권한을 부여하여 페이지 탐색, 요소 클릭, 스크린샷 촬영을 가능하게 합니다.", + "admin.browserProvider": "제공자", + "admin.browserLocalCdp": "로컬 CDP", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "DevTools 프로토콜을 통해 Chrome에 연결합니다. 클릭, 입력, 스크린샷을 포함한 완전한 인터랙티브 브라우징.", + "admin.browserFirecrawlHint": "웹 페이지를 마크다운으로 변환하는 클라우드 API. 빠른 추출, 인터랙티브 브라우징 없음.", + "admin.browserBrowserUseHint": "LLM 기반 브라우저 작업용 클라우드 API. 필요한 것을 자연어로 설명하세요.", + "admin.browserAutoLaunch": "Chrome 자동 실행", + "admin.browserAutoLaunchHint": "실행 중인 Chrome이 없으면 헤드리스 Chrome 시작", + "admin.browserCdpUrl": "CDP URL", + "admin.browserTest": "테스트", + "admin.browserSessionTimeout": "세션 시간 초과", + "admin.browserMinutes": "분", + "admin.browserApiKey": "API 키", + "admin.browserBaseUrl": "기본 URL", + "admin.browserFirecrawlBaseUrlHint": "자체 호스팅 Firecrawl 인스턴스용으로 변경" } diff --git a/cptr/frontend/src/lib/i18n/locales/pt-BR.json b/cptr/frontend/src/lib/i18n/locales/pt-BR.json index ce689a0..933ec3f 100644 --- a/cptr/frontend/src/lib/i18n/locales/pt-BR.json +++ b/cptr/frontend/src/lib/i18n/locales/pt-BR.json @@ -570,7 +570,6 @@ "admin.gateway.noKeys": "Nenhuma chave API ainda", "admin.gateway.title": "API Gateway", "chat.greeting": "Como posso ajudar?", - "admin.subagents": "Sub-agentes", "admin.subagentsEnabled": "Habilitar sub-agentes", "admin.subagentsHint": "Permite que a IA delegue tarefas para sub-agentes. Cada sub-agente cria um chat real com acesso total às ferramentas. Usa chamadas LLM adicionais.", @@ -581,5 +580,67 @@ "admin.subagentsMaxOutput": "Máx. saída", "admin.subagentsSystemPrompt": "Prompt do sistema", "admin.subagentsSystemPromptPlaceholder": "Você é um sub-agente...", - "admin.subagentsSystemPromptHint": "Deixe vazio para o padrão integrado." + "admin.subagentsSystemPromptHint": "Deixe vazio para o padrão integrado.", + "admin.contextCompaction": "Compactação de contexto", + "admin.compactTokenThreshold": "Limite de tokens", + "admin.compactTokenThresholdUnit": "tokens", + "admin.compactTokenThresholdHint": "Mensagens antigas são resumidas quando o contexto estimado excede este limite. Padrão: 80.000.", + "admin.toolServers": "Servidores de ferramentas", + "toolServers.title": "Servidores de ferramentas", + "toolServers.empty": "Nenhum servidor de ferramentas configurado", + "toolServers.add": "Adicionar servidor", + "toolServers.edit": "Editar servidor", + "toolServers.id": "ID", + "toolServers.name": "Nome", + "toolServers.type": "Tipo", + "toolServers.namePlaceholder": "Nome de exibição opcional", + "toolServers.idPlaceholder": "meu_servidor", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "Falha na conexão", + "toolServers.apiKeyKeep": "•••••••• (deixe vazio para manter)", + "toolServers.url": "URL", + "toolServers.specPath": "Caminho da spec", + "toolServers.fieldsRequired": "ID e URL são obrigatórios", + "toolServers.idInvalid": "O ID só pode conter letras minúsculas, números e sublinhados", + "toolServers.auth": "Auth", + "toolServers.authNone": "Nenhuma", + "toolServers.authBearer": "Bearer", + "toolServers.apiKey": "Chave API", + "toolServers.description": "Descrição", + "toolServers.descriptionPlaceholder": "O que este servidor faz?", + "toolServers.headers": "Cabeçalhos", + "toolServers.headersHint": "Cabeçalhos HTTP adicionais em formato JSON.", + "toolServers.headersInvalid": "Os cabeçalhos devem ser um objeto JSON válido", + "toolServers.verify": "Verificar", + "toolServers.connected": "Conectado", + "toolServers.toolsFound": "ferramentas encontradas", + "toolServers.delete": "Excluir", + "toolServers.loadError": "Falha ao carregar servidores de ferramentas", + "toolServers.urlRequired": "URL é obrigatória", + "toolServers.created": "Servidor de ferramentas adicionado", + "toolServers.updated": "Servidor de ferramentas atualizado", + "toolServers.deleted": "Servidor de ferramentas excluído", + "toolServers.saveFailed": "Falha ao salvar servidor de ferramentas", + "toolServers.deleteFailed": "Falha ao excluir servidor de ferramentas", + "admin.webSearch": "Pesquisa", + "admin.browser": "Navegador", + "admin.browserTools": "Ferramentas do navegador", + "admin.browserHint": "Dar à IA acesso a um navegador web para navegar páginas, clicar em elementos e tirar capturas de tela.", + "admin.browserProvider": "Provedor", + "admin.browserLocalCdp": "CDP local", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "Conecta-se ao Chrome via Protocolo DevTools. Navegação interativa completa com cliques, digitação e capturas.", + "admin.browserFirecrawlHint": "API na nuvem que converte páginas web em markdown. Extração rápida, sem navegação interativa.", + "admin.browserBrowserUseHint": "API na nuvem para tarefas de navegador orientadas por LLM. Descreva o que precisa em linguagem natural.", + "admin.browserAutoLaunch": "Iniciar Chrome automaticamente", + "admin.browserAutoLaunchHint": "Iniciar Chrome headless se nenhum estiver em execução", + "admin.browserCdpUrl": "URL CDP", + "admin.browserTest": "Testar", + "admin.browserSessionTimeout": "Tempo limite da sessão", + "admin.browserMinutes": "minutos", + "admin.browserApiKey": "Chave API", + "admin.browserBaseUrl": "URL base", + "admin.browserFirecrawlBaseUrlHint": "Alterar para instâncias Firecrawl auto-hospedadas" } diff --git a/cptr/frontend/src/lib/i18n/locales/ru.json b/cptr/frontend/src/lib/i18n/locales/ru.json index 5a149ea..4c54a0d 100644 --- a/cptr/frontend/src/lib/i18n/locales/ru.json +++ b/cptr/frontend/src/lib/i18n/locales/ru.json @@ -570,7 +570,6 @@ "admin.gateway.noKeys": "API-ключей пока нет", "admin.gateway.title": "API-шлюз", "chat.greeting": "Чем могу помочь?", - "admin.subagents": "Суб-агенты", "admin.subagentsEnabled": "Включить суб-агентов", "admin.subagentsHint": "Позволяет ИИ делегировать задачи суб-агентам. Каждый суб-агент создаёт реальный чат с полным доступом к инструментам. Использует дополнительные вызовы LLM.", @@ -581,5 +580,67 @@ "admin.subagentsMaxOutput": "Макс. вывод", "admin.subagentsSystemPrompt": "Системный промпт", "admin.subagentsSystemPromptPlaceholder": "Вы — суб-агент...", - "admin.subagentsSystemPromptHint": "Оставьте пустым для значения по умолчанию." + "admin.subagentsSystemPromptHint": "Оставьте пустым для значения по умолчанию.", + "admin.contextCompaction": "Сжатие контекста", + "admin.compactTokenThreshold": "Порог токенов", + "admin.compactTokenThresholdUnit": "токенов", + "admin.compactTokenThresholdHint": "Старые сообщения суммируются, когда расчётный контекст превышает этот лимит. По умолчанию: 80 000.", + "admin.toolServers": "Серверы инструментов", + "toolServers.title": "Серверы инструментов", + "toolServers.empty": "Серверы инструментов не настроены", + "toolServers.add": "Добавить сервер", + "toolServers.edit": "Редактировать сервер", + "toolServers.id": "ID", + "toolServers.name": "Название", + "toolServers.type": "Тип", + "toolServers.namePlaceholder": "Необязательное отображаемое имя", + "toolServers.idPlaceholder": "my_server", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "Ошибка подключения", + "toolServers.apiKeyKeep": "•••••••• (оставьте пустым для сохранения)", + "toolServers.url": "URL", + "toolServers.specPath": "Путь к спецификации", + "toolServers.fieldsRequired": "ID и URL обязательны", + "toolServers.idInvalid": "ID может содержать только строчные буквы, цифры и подчёркивания", + "toolServers.auth": "Аутентификация", + "toolServers.authNone": "Нет", + "toolServers.authBearer": "Bearer", + "toolServers.apiKey": "API-ключ", + "toolServers.description": "Описание", + "toolServers.descriptionPlaceholder": "Что делает этот сервер?", + "toolServers.headers": "Заголовки", + "toolServers.headersHint": "Дополнительные HTTP-заголовки в формате JSON.", + "toolServers.headersInvalid": "Заголовки должны быть валидным JSON-объектом", + "toolServers.verify": "Проверить", + "toolServers.connected": "Подключено", + "toolServers.toolsFound": "инструментов найдено", + "toolServers.delete": "Удалить", + "toolServers.loadError": "Не удалось загрузить серверы инструментов", + "toolServers.urlRequired": "URL обязателен", + "toolServers.created": "Сервер инструментов добавлен", + "toolServers.updated": "Сервер инструментов обновлён", + "toolServers.deleted": "Сервер инструментов удалён", + "toolServers.saveFailed": "Не удалось сохранить сервер инструментов", + "toolServers.deleteFailed": "Не удалось удалить сервер инструментов", + "admin.webSearch": "Поиск", + "admin.browser": "Браузер", + "admin.browserTools": "Инструменты браузера", + "admin.browserHint": "Предоставить ИИ доступ к веб-браузеру для навигации по страницам, кликов по элементам и создания скриншотов.", + "admin.browserProvider": "Провайдер", + "admin.browserLocalCdp": "Локальный CDP", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "Подключается к Chrome через протокол DevTools. Полноценный интерактивный просмотр с кликами, вводом и скриншотами.", + "admin.browserFirecrawlHint": "Облачный API, конвертирующий веб-страницы в markdown. Быстрая извлечение, без интерактивного просмотра.", + "admin.browserBrowserUseHint": "Облачный API для задач браузера на основе LLM. Опишите, что вам нужно, на естественном языке.", + "admin.browserAutoLaunch": "Автозапуск Chrome", + "admin.browserAutoLaunchHint": "Запустить headless Chrome, если ни один не запущен", + "admin.browserCdpUrl": "URL CDP", + "admin.browserTest": "Тест", + "admin.browserSessionTimeout": "Тайм-аут сессии", + "admin.browserMinutes": "минут", + "admin.browserApiKey": "API-ключ", + "admin.browserBaseUrl": "Базовый URL", + "admin.browserFirecrawlBaseUrlHint": "Изменить для самостоятельно размещённых экземпляров Firecrawl" } diff --git a/cptr/frontend/src/lib/i18n/locales/zh-CN.json b/cptr/frontend/src/lib/i18n/locales/zh-CN.json index 4efb68d..4826b84 100644 --- a/cptr/frontend/src/lib/i18n/locales/zh-CN.json +++ b/cptr/frontend/src/lib/i18n/locales/zh-CN.json @@ -570,7 +570,6 @@ "admin.gateway.noKeys": "暂无 API 密钥", "admin.gateway.title": "API 网关", "chat.greeting": "有什么可以帮您的?", - "admin.subagents": "子代理", "admin.subagentsEnabled": "启用子代理", "admin.subagentsHint": "允许 AI 将任务委托给子代理。每个子代理会创建一个拥有完整工具访问权限的真实聊天。会使用额外的 LLM 调用。", @@ -581,5 +580,67 @@ "admin.subagentsMaxOutput": "最大输出", "admin.subagentsSystemPrompt": "系统提示词", "admin.subagentsSystemPromptPlaceholder": "你是一个子代理...", - "admin.subagentsSystemPromptHint": "留空以使用内置默认值。" + "admin.subagentsSystemPromptHint": "留空以使用内置默认值。", + "admin.contextCompaction": "上下文压缩", + "admin.compactTokenThreshold": "令牌阈值", + "admin.compactTokenThresholdUnit": "令牌", + "admin.compactTokenThresholdHint": "当估计上下文超过此限制时,旧消息将被摘要。默认值:80,000。", + "admin.toolServers": "工具服务器", + "toolServers.title": "工具服务器", + "toolServers.empty": "未配置工具服务器", + "toolServers.add": "添加服务器", + "toolServers.edit": "编辑服务器", + "toolServers.id": "ID", + "toolServers.name": "名称", + "toolServers.type": "类型", + "toolServers.namePlaceholder": "可选显示名称", + "toolServers.idPlaceholder": "my_server", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "连接失败", + "toolServers.apiKeyKeep": "••••••••(留空以保持不变)", + "toolServers.url": "URL", + "toolServers.specPath": "Spec 路径", + "toolServers.fieldsRequired": "ID 和 URL 为必填项", + "toolServers.idInvalid": "ID 只能包含小写字母、数字和下划线", + "toolServers.auth": "认证", + "toolServers.authNone": "无", + "toolServers.authBearer": "Bearer", + "toolServers.apiKey": "API 密钥", + "toolServers.description": "描述", + "toolServers.descriptionPlaceholder": "这个服务器做什么?", + "toolServers.headers": "请求头", + "toolServers.headersHint": "JSON 格式的额外 HTTP 请求头。", + "toolServers.headersInvalid": "请求头必须是有效的 JSON 对象", + "toolServers.verify": "验证", + "toolServers.connected": "已连接", + "toolServers.toolsFound": "个工具已发现", + "toolServers.delete": "删除", + "toolServers.loadError": "无法加载工具服务器", + "toolServers.urlRequired": "URL 为必填项", + "toolServers.created": "工具服务器已添加", + "toolServers.updated": "工具服务器已更新", + "toolServers.deleted": "工具服务器已删除", + "toolServers.saveFailed": "无法保存工具服务器", + "toolServers.deleteFailed": "无法删除工具服务器", + "admin.webSearch": "搜索", + "admin.browser": "浏览器", + "admin.browserTools": "浏览器工具", + "admin.browserHint": "为AI提供网页浏览器访问权限,用于浏览页面、点击元素和截图。", + "admin.browserProvider": "提供者", + "admin.browserLocalCdp": "本地 CDP", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "通过 DevTools 协议连接到 Chrome。支持点击、输入和截图的完整交互式浏览。", + "admin.browserFirecrawlHint": "将网页转换为 Markdown 的云端 API。快速提取,无交互式浏览。", + "admin.browserBrowserUseHint": "用于 LLM 驱动浏览器任务的云端 API。用自然语言描述您的需求。", + "admin.browserAutoLaunch": "自动启动 Chrome", + "admin.browserAutoLaunchHint": "如果没有运行中的 Chrome,则启动无头 Chrome", + "admin.browserCdpUrl": "CDP URL", + "admin.browserTest": "测试", + "admin.browserSessionTimeout": "会话超时", + "admin.browserMinutes": "分钟", + "admin.browserApiKey": "API 密钥", + "admin.browserBaseUrl": "基础 URL", + "admin.browserFirecrawlBaseUrlHint": "为自托管的 Firecrawl 实例更改" } diff --git a/cptr/frontend/src/lib/i18n/locales/zh-TW.json b/cptr/frontend/src/lib/i18n/locales/zh-TW.json index 6b54bf6..c146e48 100644 --- a/cptr/frontend/src/lib/i18n/locales/zh-TW.json +++ b/cptr/frontend/src/lib/i18n/locales/zh-TW.json @@ -570,7 +570,6 @@ "admin.gateway.noKeys": "尚無 API 金鑰", "admin.gateway.title": "API 閘道", "chat.greeting": "有什麼可以幫您的?", - "admin.subagents": "子代理", "admin.subagentsEnabled": "啟用子代理", "admin.subagentsHint": "允許 AI 將任務委派給子代理。每個子代理會建立一個擁有完整工具存取權限的真實聊天。會使用額外的 LLM 呼叫。", @@ -581,5 +580,67 @@ "admin.subagentsMaxOutput": "最大輸出", "admin.subagentsSystemPrompt": "系統提示詞", "admin.subagentsSystemPromptPlaceholder": "你是一個子代理...", - "admin.subagentsSystemPromptHint": "留空以使用內建預設值。" + "admin.subagentsSystemPromptHint": "留空以使用內建預設值。", + "admin.contextCompaction": "上下文壓縮", + "admin.compactTokenThreshold": "令牌閾值", + "admin.compactTokenThresholdUnit": "令牌", + "admin.compactTokenThresholdHint": "當估計上下文超過此限制時,舊訊息將被摘要。預設值:80,000。", + "admin.toolServers": "工具伺服器", + "toolServers.title": "工具伺服器", + "toolServers.empty": "未設定工具伺服器", + "toolServers.add": "新增伺服器", + "toolServers.edit": "編輯伺服器", + "toolServers.id": "ID", + "toolServers.name": "名稱", + "toolServers.type": "類型", + "toolServers.namePlaceholder": "選填顯示名稱", + "toolServers.idPlaceholder": "my_server", + "toolServers.typeOpenAPI": "OpenAPI", + "toolServers.typeMCP": "MCP", + "toolServers.connectionFailed": "連線失敗", + "toolServers.apiKeyKeep": "••••••••(留空以保持不變)", + "toolServers.url": "URL", + "toolServers.specPath": "Spec 路徑", + "toolServers.fieldsRequired": "ID 和 URL 為必填", + "toolServers.idInvalid": "ID 只能包含小寫字母、數字和底線", + "toolServers.auth": "驗證", + "toolServers.authNone": "無", + "toolServers.authBearer": "Bearer", + "toolServers.apiKey": "API 金鑰", + "toolServers.description": "描述", + "toolServers.descriptionPlaceholder": "這個伺服器做什麼?", + "toolServers.headers": "標頭", + "toolServers.headersHint": "JSON 格式的額外 HTTP 標頭。", + "toolServers.headersInvalid": "標頭必須是有效的 JSON 物件", + "toolServers.verify": "驗證", + "toolServers.connected": "已連線", + "toolServers.toolsFound": "個工具已發現", + "toolServers.delete": "刪除", + "toolServers.loadError": "無法載入工具伺服器", + "toolServers.urlRequired": "URL 為必填", + "toolServers.created": "工具伺服器已新增", + "toolServers.updated": "工具伺服器已更新", + "toolServers.deleted": "工具伺服器已刪除", + "toolServers.saveFailed": "無法儲存工具伺服器", + "toolServers.deleteFailed": "無法刪除工具伺服器", + "admin.webSearch": "搜尋", + "admin.browser": "瀏覽器", + "admin.browserTools": "瀏覽器工具", + "admin.browserHint": "為 AI 提供網頁瀏覽器存取權限,用於瀏覽頁面、點擊元素和擷取螢幕截圖。", + "admin.browserProvider": "提供者", + "admin.browserLocalCdp": "本機 CDP", + "admin.browserFirecrawl": "Firecrawl", + "admin.browserBrowserUse": "Browser-Use", + "admin.browserLocalHint": "透過 DevTools 協定連接到 Chrome。支援點擊、輸入和截圖的完整互動式瀏覽。", + "admin.browserFirecrawlHint": "將網頁轉換為 Markdown 的雲端 API。快速擷取,無互動式瀏覽。", + "admin.browserBrowserUseHint": "用於 LLM 驅動瀏覽器任務的雲端 API。用自然語言描述您的需求。", + "admin.browserAutoLaunch": "自動啟動 Chrome", + "admin.browserAutoLaunchHint": "如果沒有執行中的 Chrome,則啟動無頭 Chrome", + "admin.browserCdpUrl": "CDP URL", + "admin.browserTest": "測試", + "admin.browserSessionTimeout": "工作階段逾時", + "admin.browserMinutes": "分鐘", + "admin.browserApiKey": "API 金鑰", + "admin.browserBaseUrl": "基礎 URL", + "admin.browserFirecrawlBaseUrlHint": "為自架的 Firecrawl 實例變更" } From 8d59ed625c58fb440e89b2837577ddeda4bd00f6 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 13 Jun 2026 13:58:13 +0200 Subject: [PATCH 3/3] refac --- CHANGELOG.md | 8 ++++++++ cptr/frontend/package.json | 2 +- pyproject.toml | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 561f0dc..819400f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.4.1] - 2026-06-13 + +### Changed + +- 🌍 **i18n for tool servers, browser, and web settings.** Replaced all remaining hardcoded English strings in the Tool Servers, Web/Browser, and admin panels with translation keys. Added ~60 new keys per locale across all 10 languages (de, en, es, fr, ja, ko, pt-BR, ru, zh-CN, zh-TW). +- 🎨 **General settings layout refactor.** Reorganised the General settings panel into a scrollable layout with grouped sections (Notifications, Updates, Message Queue). Webhook URL input is now full-width with a hint instead of an inline save button. The save button now shows a loading/saving state. +- 🖱️ **Scrollbar-on-hover utility.** Added a `.scrollbar-hover` CSS class that hides scrollbar thumbs until the user hovers, reducing visual clutter in scrollable panels. + ## [0.4.0] - 2026-06-13 ### Added diff --git a/cptr/frontend/package.json b/cptr/frontend/package.json index 43b48b5..8c07701 100644 --- a/cptr/frontend/package.json +++ b/cptr/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "0.4.0", + "version": "0.4.1", "type": "module", "scripts": { "dev": "vite dev", diff --git a/pyproject.toml b/pyproject.toml index 786967b..68a4c80 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cptr" -version = "0.4.0" +version = "0.4.1" description = "Your computer, from anywhere. Code, manage, and control your machine from the web." license = {file = "LICENSE"} readme = "README.md"