From 2b63715282dbc2e1d490da0c4c431e2cf867b446 Mon Sep 17 00:00:00 2001 From: chengyongru Date: Mon, 3 Aug 2026 16:03:31 +0800 Subject: [PATCH] fix(webui): complete i18n audit --- webui/index.html | 6 +- webui/src/App.tsx | 3 +- webui/src/components/AttachmentTile.tsx | 4 +- webui/src/components/CliAppMentionText.tsx | 7 +- webui/src/components/MarkdownTextRenderer.tsx | 3 +- webui/src/components/UserMessageText.tsx | 4 +- .../src/components/settings/SettingsView.tsx | 2 +- .../settings/channels/ChannelSetupParts.tsx | 7 +- webui/src/components/thread/PromptRail.tsx | 6 +- webui/src/components/ui/dialog.tsx | 50 +- webui/src/components/ui/sheet.tsx | 64 +-- webui/src/i18n/locales/en/common.json | 52 ++- webui/src/i18n/locales/es/common.json | 292 +++++++----- webui/src/i18n/locales/fr/common.json | 240 ++++++---- webui/src/i18n/locales/id/common.json | 442 ++++++++++-------- webui/src/i18n/locales/ja/common.json | 172 ++++--- webui/src/i18n/locales/ko/common.json | 182 +++++--- webui/src/i18n/locales/pt-BR/common.json | 248 ++++++---- webui/src/i18n/locales/vi/common.json | 370 ++++++++------- webui/src/i18n/locales/zh-CN/common.json | 192 +++++--- webui/src/i18n/locales/zh-TW/common.json | 94 +++- webui/src/tests/i18n.test.tsx | 89 +++- 22 files changed, 1535 insertions(+), 994 deletions(-) diff --git a/webui/index.html b/webui/index.html index de9ce997f..d642c8d98 100644 --- a/webui/index.html +++ b/webui/index.html @@ -135,15 +135,15 @@ }, "pt-BR": { boot: "Carregando nanobot…", - description: "Interface web do nanobot — converse com o seu workspace do nanobot." + description: "Interface web do nanobot — converse com o seu espaço de trabalho do nanobot." }, vi: { boot: "Đang tải nanobot…", - description: "Giao diện web nanobot — trò chuyện với workspace nanobot của bạn." + description: "Giao diện web nanobot — trò chuyện với không gian làm việc nanobot của bạn." }, id: { boot: "Memuat nanobot…", - description: "UI web nanobot — ngobrol dengan workspace nanobot Anda." + description: "UI web nanobot — ngobrol dengan ruang kerja nanobot Anda." } }; diff --git a/webui/src/App.tsx b/webui/src/App.tsx index 90b550cb3..cedea6473 100644 --- a/webui/src/App.tsx +++ b/webui/src/App.tsx @@ -116,12 +116,13 @@ const RenameChatDialog = lazy(async () => { }); function SurfaceLoadingFallback() { + const { t } = useTranslation(); return (
- Loading + {t("settings.status.loading")}
diff --git a/webui/src/components/AttachmentTile.tsx b/webui/src/components/AttachmentTile.tsx index 158ea389e..3249147ea 100644 --- a/webui/src/components/AttachmentTile.tsx +++ b/webui/src/components/AttachmentTile.tsx @@ -31,7 +31,9 @@ export function AttachmentTile({ attachment, className, inline = false, variant target="_blank" rel="noreferrer noopener" className="block bg-muted/20" - aria-label={attachment.name ? `Open ${attachment.name}` : t("lightbox.open", { defaultValue: "Open image" })} + aria-label={attachment.name + ? t("message.openAttachment", { name: attachment.name }) + : t("lightbox.open", { defaultValue: "Open image" })} > logoFallbackUrls(app.logo_url), [app.logo_url]); @@ -150,7 +152,7 @@ export function CliAppMentionToken({ return ( logoFallbackUrls(preset.logo_url), [preset.logo_url]); @@ -205,7 +208,7 @@ export function McpPresetMentionToken({ return ( @@ -80,7 +82,7 @@ export function UserMessageText({ diff --git a/webui/src/components/settings/SettingsView.tsx b/webui/src/components/settings/SettingsView.tsx index 6f3d20e1d..b205e6ae6 100644 --- a/webui/src/components/settings/SettingsView.tsx +++ b/webui/src/components/settings/SettingsView.tsx @@ -7678,7 +7678,7 @@ function McpAppsCatalogRow({ onClick={() => setSetupOpen(false)} className="h-7 rounded-full px-2.5 text-[11.5px] font-semibold text-muted-foreground" > - {tx("actions.cancel", "Cancel")} + {tx("settings.actions.cancel", "Cancel")}
diff --git a/webui/src/components/settings/channels/ChannelSetupParts.tsx b/webui/src/components/settings/channels/ChannelSetupParts.tsx index de7f742aa..a358d81ed 100644 --- a/webui/src/components/settings/channels/ChannelSetupParts.tsx +++ b/webui/src/components/settings/channels/ChannelSetupParts.tsx @@ -304,10 +304,13 @@ export function ChannelValidationDetails({ validation }: { validation: ChannelVa } export function ChannelValidationChecks({ validation }: { validation: ChannelValidationPayload }) { + const { t } = useTranslation(); if (!validation.checks.length) return null; return (
-
Connection checks
+
+ {t("settings.channels.connectionChecks")} +
{validation.checks.slice(0, 6).map((check) => (
@@ -326,7 +329,7 @@ export function ChannelValidationChecks({ validation }: { validation: ChannelVal rel="noreferrer" className="inline-flex items-center gap-1 text-foreground underline decoration-border underline-offset-4" > - Open + {t("settings.channels.open")} ) : null} diff --git a/webui/src/components/thread/PromptRail.tsx b/webui/src/components/thread/PromptRail.tsx index 3fc6c9012..9bee73b20 100644 --- a/webui/src/components/thread/PromptRail.tsx +++ b/webui/src/components/thread/PromptRail.tsx @@ -1,4 +1,5 @@ import { type RefObject, useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; import { cn } from "@/lib/utils"; import type { UIMessage } from "@/lib/types"; @@ -49,6 +50,7 @@ export function PromptRail({ onJumpToPrompt, scrollRef, }: PromptRailProps) { + const { t } = useTranslation(); const railRef = useRef(null); const measuredPromptsRef = useRef([]); const promptAnchors = useMemo(() => userPromptAnchors(messages), [messages]); @@ -142,7 +144,7 @@ export function PromptRail({ return (
onJumpToPrompt(marker.ids[marker.ids.length - 1])} onBlur={() => setFocusedMarkerIndex(null)} onFocus={() => setFocusedMarkerIndex(index)} diff --git a/webui/src/components/ui/dialog.tsx b/webui/src/components/ui/dialog.tsx index a647b6558..ebc3fd0e3 100644 --- a/webui/src/components/ui/dialog.tsx +++ b/webui/src/components/ui/dialog.tsx @@ -1,6 +1,7 @@ import * as React from "react"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { X } from "lucide-react"; +import { useTranslation } from "react-i18next"; import { cn } from "@/lib/utils"; @@ -30,29 +31,32 @@ interface DialogContentProps const DialogContent = React.forwardRef< React.ElementRef, DialogContentProps ->(({ className, children, showCloseButton = true, ...props }, ref) => ( - - -
- - {children} - {showCloseButton ? ( - - - Close - - ) : null} - -
-
-)); +>(({ className, children, showCloseButton = true, ...props }, ref) => { + const { t } = useTranslation(); + return ( + + +
+ + {children} + {showCloseButton ? ( + + + {t("common.close")} + + ) : null} + +
+
+ ); +}); DialogContent.displayName = DialogPrimitive.Content.displayName; const DialogHeader = ({ diff --git a/webui/src/components/ui/sheet.tsx b/webui/src/components/ui/sheet.tsx index 459a53865..88538e982 100644 --- a/webui/src/components/ui/sheet.tsx +++ b/webui/src/components/ui/sheet.tsx @@ -2,6 +2,7 @@ import * as React from "react"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { X } from "lucide-react"; import { cva, type VariantProps } from "class-variance-authority"; +import { useTranslation } from "react-i18next"; import { cn } from "@/lib/utils"; @@ -74,36 +75,39 @@ const SheetContent = React.forwardRef< ...props }, ref, -) => ( - - - - {children} - {showCloseButton ? ( - - - Close - - ) : null} - - -)); +) => { + const { t } = useTranslation(); + return ( + + + + {children} + {showCloseButton ? ( + + + {t("common.close")} + + ) : null} + + + ); +}); SheetContent.displayName = DialogPrimitive.Content.displayName; const SheetTitle = React.forwardRef< diff --git a/webui/src/i18n/locales/en/common.json b/webui/src/i18n/locales/en/common.json index ddcf3f425..855930624 100644 --- a/webui/src/i18n/locales/en/common.json +++ b/webui/src/i18n/locales/en/common.json @@ -38,6 +38,15 @@ }, "meta": { "description": "nanobot web UI — chat with your nanobot workspace." + }, + "pairing": { + "title": "Pair a chat user", + "description": "Enter the pairing code shown in the chat.", + "code": "Pairing code", + "matched": "Matched {{channel}}. Connecting...", + "expiresInline": "Code expires {{expires}}.", + "queueCount": "{{count}} pending", + "noMatch": "No pending request matches this code." } }, "sidebar": { @@ -340,6 +349,7 @@ "statusMissingCredentials": "Needs key", "statusMissingDependency": "Needs dependency", "statusComingSoon": "Coming soon", + "comingSoon": "Coming soon", "statusNotInstalled": "Not enabled", "toolScope": "Tools", "allTools": "All", @@ -372,7 +382,10 @@ "configured": "Configured", "notConfigured": "Not configured", "pending": "Pending", - "restartingEngine": "Restarting" + "restartingEngine": "Restarting", + "checking": "Checking", + "running": "Running", + "needsSetup": "Needs setup" }, "status": { "loading": "Loading settings...", @@ -400,6 +413,7 @@ "delete": "Delete", "deleting": "Deleting...", "cancel": "Cancel", + "dismiss": "Dismiss", "open": "Open", "export": "Export", "opening": "Opening...", @@ -509,9 +523,19 @@ "selectProvider": "Select provider", "selectAspect": "Select aspect", "selectSize": "Select size", + "selectModel": "Select image model", + "searchOrTypeModel": "Search or type model ID", + "typeModelId": "Type the model ID supported by this provider.", "configureProvider": "Configure provider", "missingCredential": "Configure this provider before enabling image generation." }, + "capabilities": { + "providerSupport": "Provider support", + "providerInstallOnSave": "Required support will be installed automatically when you save this provider.", + "searchSupport": "Search provider support", + "searchInstallOnSave": "Olostep support will be installed automatically when you save.", + "installing": "Installing support..." + }, "api": { "title": "API server", "openaiCompatible": "OpenAI-compatible API", @@ -579,6 +603,8 @@ "advanced": "Advanced", "checkAndEnable": "Check and enable", "checkConnection": "Check connection", + "connectionChecks": "Connection checks", + "open": "Open", "checkedAndEnabled": "Checked and enabled.", "checking": "Checking...", "checkOnly": "Check only", @@ -674,6 +700,8 @@ "protected": "Protected", "editTitle": "Edit automation", "save": "Save", + "commandCopied": "Copied", + "copyCommand": "Copy", "deleteTitle": "Delete automation", "deleteDescription": "This removes {{name}} from the cron store. Past chat messages stay in the session.", "cancel": "Cancel", @@ -733,6 +761,7 @@ "fields": { "name": "Name", "message": "Message", + "command": "Command", "scheduleType": "Schedule type", "every": "Every", "unit": "Unit", @@ -1193,7 +1222,9 @@ "cliBadge": "CLI", "mcpBadge": "MCP", "cliDescription": "Use @{{name}} as a local CLI app", - "mcpDescription": "Use @{{name}} as an MCP server" + "mcpDescription": "Use @{{name}} as an MCP server", + "cliTitle": "CLI app: {{name}}", + "mcpTitle": "MCP server: {{name}}" }, "encoding": "Encoding…", "remove": "Remove attachment", @@ -1229,7 +1260,8 @@ "title": "Prompts", "search": "Search prompts", "noResults": "No matching prompts.", - "jumpTo": "Jump to prompt: {{label}}" + "jumpTo": "Jump to prompt: {{label}}", + "railAria": "User prompt navigation" } }, "message": { @@ -1268,6 +1300,14 @@ "cliRunRan": "Used", "cliRunFailed": "Failed", "imageAttachment": "Image attachment", + "videoAttachment": "Video attachment", + "fileAttachment": "File attachment", + "attachmentUnavailable": "Attachment unavailable", + "dataTable": "Data table", + "fileEditPreparing": "Preparing file edit…", + "openLink": "Open link: {{label}}", + "openAttachment": "Open {{name}}", + "skill": "Skill: {{name}}", "automationSourceFallback": "Automation", "automationTriggered": "Triggered automatically", "askAboutSelection": "Ask about this", @@ -1293,6 +1333,7 @@ }, "filePreview": { "aria": "File preview", + "breadcrumb": "File path", "close": "Close file preview", "loading": "Loading preview...", "failed": "Could not preview this file.", @@ -1307,7 +1348,10 @@ "copied": "Copied" }, "common": { - "dismiss": "Dismiss" + "dismiss": "Dismiss", + "close": "Close", + "current": "Current", + "cancel": "Cancel" }, "errors": { "messageTooBig": { diff --git a/webui/src/i18n/locales/es/common.json b/webui/src/i18n/locales/es/common.json index 54b627dfc..f44e87a17 100644 --- a/webui/src/i18n/locales/es/common.json +++ b/webui/src/i18n/locales/es/common.json @@ -38,6 +38,15 @@ }, "meta": { "description": "Interfaz web de nanobot: conversa con tu espacio de trabajo de nanobot." + }, + "pairing": { + "title": "Vincular a un usuario del chat", + "description": "Introduce el código de vinculación que aparece en el chat.", + "code": "Código de vinculación", + "matched": "Coincidencia: {{channel}}. Conectando...", + "expiresInline": "El código caduca {{expires}}.", + "queueCount": "{{count}} pendientes", + "noMatch": "No hay ninguna solicitud pendiente que coincida con este código." } }, "sidebar": { @@ -54,7 +63,7 @@ "label": "Idioma", "ariaLabel": "Cambiar idioma" }, - "apps": "Apps", + "apps": "Aplicaciones", "automations": "Automatizaciones", "skills": { "title": "Habilidades" @@ -79,7 +88,7 @@ "channels": "Canales", "runtime": "Sistema", "advanced": "Seguridad", - "cliApps": "Apps CLI", + "cliApps": "Aplicaciones CLI", "mcp": "MCP", "apps": "Aplicaciones", "automations": "Automatizaciones", @@ -137,7 +146,7 @@ "maxImagesPerTurn": "Máx. imágenes por turno", "imageSaveDir": "Directorio de guardado", "timezone": "Zona horaria", - "workspacePath": "Workspace predeterminado", + "workspacePath": "Espacio de trabajo predeterminado", "localServiceAccess": "Servicios locales", "webuiDefaultAccess": "Acceso predeterminado", "currentModel": "Configuración actual", @@ -148,12 +157,12 @@ "logs": "Registros", "diagnostics": "Diagnóstico", "contextWindow": "Ventana de contexto", - "transcription": "Transcripcion", + "transcription": "Transcripción", "transcriptionProvider": "Proveedor", - "transcriptionProviderStatus": "Estado del proveedor", + "transcriptionProviderStatus": "Estado del proveedor de transcripción", "transcriptionModel": "Modelo", "transcriptionLanguage": "Idioma", - "voiceLimits": "Limites" + "voiceLimits": "Límites" }, "help": { "theme": "Cambia entre apariencia clara y oscura.", @@ -162,40 +171,40 @@ "model": "Elige el modelo que usa este preajuste.", "configPath": "Archivo de configuración que usa actualmente el gateway.", "selectedPreset": "Los preajustes con nombre son de solo lectura aquí; edítalos en config.json.", - "presetModel": "Cambia a Default para editar modelo y proveedor desde WebUI.", + "presetModel": "Cambia a Predeterminado para editar el modelo y el proveedor desde WebUI.", "density": "Solo se guarda en este navegador.", "activityMode": "Elige cuánto detalle de actividad del agente se muestra por defecto.", - "fileEditDisplay": "Elige si la actividad de edición muestra recuentos de líneas o el diff.", + "fileEditDisplay": "Elige si la actividad de edición muestra recuentos de líneas o diferencias.", "codeWrap": "Mantiene legibles las líneas largas de código en pantallas pequeñas.", "maxResults": "Resultados devueltos por cada llamada web_search.", "timeout": "Segundos antes de que una solicitud de búsqueda expire.", "jinaReader": "Usa Jina Reader para web_fetch cuando esté disponible.", "imageGeneration": "Expone generate_image en chats cuando hay un proveedor de imagen configurado.", "imageProvider": "Elige el proveedor registrado usado por generate_image.", - "imageProviderStatus": "La generación de imágenes reutiliza credenciales de Proveedores.", + "imageProviderStatus": "La generación de imágenes reutiliza las credenciales de los proveedores.", "imageModel": "Nombre del modelo enviado al proveedor de imágenes seleccionado.", - "defaultAspectRatio": "Se usa cuando el prompt no elige una proporción.", + "defaultAspectRatio": "Se usa cuando la instrucción no elige una proporción.", "defaultImageSize": "Pista de tamaño enviada a proveedores compatibles.", "maxImagesPerTurn": "Límite superior para una solicitud generate_image.", "timezone": "Se usa para horarios y respuestas con conciencia temporal.", - "localServiceAccess": "Permite que comandos shell con Full Access alcancen servicios localhost.", + "localServiceAccess": "Permite que los comandos shell con acceso completo alcancen servicios locales.", "webuiDefaultAccess": "Usado por chats web sin permiso específico de proyecto.", "securityManagedControls": "Las capturas web siempre protegen servicios locales, privados y metadata. La seguridad de canales core se gestiona en config.json.", "currentModel": "Se usa para nuevas respuestas.", "selectedModelProvider": "Definido por el modelo seleccionado.", "selectedModelValue": "Definido por el modelo seleccionado.", "brandLogos": "Muestra logos de proveedores de terceros y CLI en Ajustes.", - "cliAppsCatalog": "Instala solo adaptadores CLI de apps que nanobot puede ejecutar localmente; las apps nativas no se modifican.", - "cliAppsFilter": "Busca por app, categoría o capacidad.", + "cliAppsCatalog": "Instala solo adaptadores CLI de aplicaciones que nanobot puede ejecutar localmente; las aplicaciones nativas no se modifican.", + "cliAppsFilter": "Busca por aplicación, categoría o capacidad.", "logs": "Abre la carpeta de registros del motor nativo.", - "diagnostics": "Exporta un pequeño informe de runtime para soporte.", - "localServiceAccessNative": "Permite que comandos shell con Full Access alcancen servicios en este Mac.", + "diagnostics": "Exporta un pequeño informe del tiempo de ejecución para soporte.", + "localServiceAccessNative": "Permite que los comandos shell con acceso completo alcancen servicios en este Mac.", "webuiDefaultAccessNative": "Usado por chats nativos sin permiso específico de proyecto.", "contextWindow": "Elige el presupuesto de contexto predeterminado para esta configuración de modelo.", - "transcription": "Transcribe la entrada del microfono antes de enviarla. Los mensajes de voz de los canales usan la misma configuracion.", - "transcriptionProvider": "Usa las credenciales del proveedor correspondiente en Proveedores.", - "transcriptionProviderStatus": "Las claves API permanecen en proveedores, no en la configuracion de transcripcion.", - "transcriptionModel": "Dejalo como el valor predeterminado resuelto salvo que el proveedor necesite un id de modelo personalizado.", + "transcription": "Transcribe la entrada del micrófono antes de enviarla. Los mensajes de voz de los canales usan la misma configuración.", + "transcriptionProvider": "Usa las credenciales del proveedor correspondiente en la sección Proveedores.", + "transcriptionProviderStatus": "Las claves API permanecen en los proveedores, no en la configuración de transcripción.", + "transcriptionModel": "Déjalo como el valor predeterminado resuelto, salvo que el proveedor necesite un identificador de modelo personalizado.", "transcriptionLanguage": "Pista ISO-639 opcional, como en, zh, ja o ko." }, "values": { @@ -215,7 +224,7 @@ "expanded": "Expandido", "default": "Predeterminado", "summary": "Resumen", - "diff": "Diff", + "diff": "Diferencias", "collapsedDiff": "Diff contraído", "on": "Activado", "off": "Desactivado", @@ -224,7 +233,10 @@ "configured": "Configurado", "notConfigured": "Sin configurar", "pending": "Pendiente", - "restartingEngine": "Reiniciando" + "restartingEngine": "Reiniciando", + "checking": "Comprobando", + "running": "En ejecución", + "needsSetup": "Requiere configuración" }, "status": { "loading": "Cargando ajustes...", @@ -252,6 +264,7 @@ "deleting": "Eliminando...", "edit": "Editar", "cancel": "Cancelar", + "dismiss": "Descartar", "open": "Abrir", "export": "Exportar", "opening": "Abriendo...", @@ -265,15 +278,15 @@ "notConfiguredSection": "Sin configurar", "showMore": "Mostrar {{count}} más", "showLess": "Mostrar menos", - "apiKey": "API key", - "apiBase": "API base", - "apiKeyPlaceholder": "Introduce la API key", - "apiKeyConfiguredPlaceholder": "Deja vacío para conservar la key actual", + "apiKey": "Clave API", + "apiBase": "Base de la API", + "apiKeyPlaceholder": "Introduce la clave API", + "apiKeyConfiguredPlaceholder": "Déjalo vacío para conservar la clave actual", "configuredKeyHint": "Key configurada", "apiBasePlaceholder": "Usar el valor predeterminado del proveedor", - "apiKeyRequired": "Se requiere una API key para configurar este proveedor.", - "showApiKey": "Mostrar API key", - "hideApiKey": "Ocultar API key", + "apiKeyRequired": "Se requiere una clave API para configurar este proveedor.", + "showApiKey": "Mostrar clave API", + "hideApiKey": "Ocultar clave API", "noConfiguredProviders": "No hay proveedores configurados", "configureFirst": "Configura primero un proveedor en BYOK.", "openByok": "Abrir BYOK", @@ -284,19 +297,19 @@ }, "webSearch": { "provider": "Proveedor de búsqueda", - "providerHelp": "Elige el backend que usará la herramienta web search.", + "providerHelp": "Elige el backend que usará la herramienta de búsqueda web.", "selectProvider": "Seleccionar proveedor", "credentials": "Credenciales", - "noCredentialRequired": "No requiere key", + "noCredentialRequired": "No requiere clave", "noCredentialHelp": "DuckDuckGo funciona sin guardar una API key.", "apiKeyHelp": "Se guarda en config y se muestra enmascarada después de guardar.", - "baseUrl": "Base URL", + "baseUrl": "URL base", "baseUrlHelp": "SearXNG necesita la URL de tu propia instancia.", "baseUrlPlaceholder": "https://search.example.com", - "apiKeyRequired": "Este proveedor de búsqueda requiere una API key.", - "baseUrlRequired": "SearXNG requiere una Base URL.", + "apiKeyRequired": "Este proveedor de búsqueda requiere una clave API.", + "baseUrlRequired": "SearXNG requiere una URL base.", "missingCredential": "Añade la credencial requerida antes de guardar.", - "saveHint": "Los cambios se aplican a nuevas solicitudes de web search." + "saveHint": "Los cambios se aplican a nuevas solicitudes de búsqueda web." } }, "overview": { @@ -311,7 +324,7 @@ }, "usage": { "title": "Actividad de tokens", - "shortTitle": "Token Usage", + "shortTitle": "Uso de tokens", "subtitle": "Uso reportado por el proveedor durante los últimos 12 meses.", "empty": "La actividad de tokens aparecerá después de nuevas respuestas del modelo.", "totalTokens": "Tokens totales", @@ -358,9 +371,19 @@ "selectProvider": "Seleccionar proveedor", "selectAspect": "Seleccionar proporción", "selectSize": "Seleccionar tamaño", + "selectModel": "Seleccionar modelo de imagen", + "searchOrTypeModel": "Buscar o escribir ID del modelo", + "typeModelId": "Escribe el ID de modelo compatible con este proveedor.", "configureProvider": "Configurar proveedor", "missingCredential": "Configura este proveedor antes de activar la generación de imágenes." }, + "capabilities": { + "providerSupport": "Compatibilidad del proveedor", + "providerInstallOnSave": "La compatibilidad necesaria se instalará automáticamente al guardar este proveedor.", + "searchSupport": "Compatibilidad del proveedor de búsqueda", + "searchInstallOnSave": "La compatibilidad con Olostep se instalará automáticamente al guardar.", + "installing": "Instalando compatibilidad..." + }, "models": { "selectModel": "Seleccionar modelo", "addConfiguration": "Agregar configuración", @@ -433,8 +456,8 @@ "statusUnsupported": "No compatible", "statusNotInstalled": "No instalada", "unsupported": "No compatible", - "loading": "Cargando apps CLI...", - "empty": "Ninguna app CLI coincide con este filtro.", + "loading": "Cargando aplicaciones CLI...", + "empty": "Ninguna aplicación CLI coincide con este filtro.", "readyTitle": "@{{name}} está listo", "readyStatus": "Listo", "readyPrompt": "Usa @{{name}} para ver qué puede hacer este CLI.", @@ -458,11 +481,11 @@ }, "mcp": { "allCategories": "Todas las categorías", - "summary": "{{installed}} de {{total}} presets habilitados", + "summary": "{{installed}} de {{total}} preajustes habilitados", "filterAll": "Todos", "filterInstalled": "Habilitados", "filterNotInstalled": "No habilitados", - "searchPlaceholder": "Buscar presets MCP", + "searchPlaceholder": "Buscar preajustes MCP", "moreOptions": "Más opciones de MCP", "moreOptionsSubtitle": "Añade un servidor personalizado o importa mcp.json.", "customTitle": "MCP personalizado", @@ -473,9 +496,9 @@ "serverUrl": "URL", "transport": "Transporte", "command": "Comando", - "args": "Args JSON", - "headers": "Headers JSON", - "env": "Env JSON", + "args": "Argumentos JSON", + "headers": "Encabezados JSON", + "env": "Entorno JSON", "timeout": "Tiempo límite de herramienta", "advancedOptions": "Opciones avanzadas", "hideAdvanced": "Ocultar avanzado", @@ -484,8 +507,8 @@ "importConfig": "Importar", "restartRequired": "Reinicia nanobot para conectar las herramientas MCP actualizadas.", "toolsFound": "{{count}} herramientas", - "loading": "Cargando presets MCP...", - "empty": "Ningún preset MCP coincide con este filtro.", + "loading": "Cargando preajustes MCP...", + "empty": "Ningún preajuste MCP coincide con este filtro.", "openDocs": "Abrir docs", "test": "Probar", "remove": "Eliminar", @@ -503,6 +526,7 @@ "statusMissingCredentials": "Necesita clave", "statusMissingDependency": "Necesita dependencia", "statusComingSoon": "Próximamente", + "comingSoon": "Próximamente", "statusNotInstalled": "No habilitado", "toolScope": "Herramientas", "allTools": "Todas", @@ -528,24 +552,24 @@ }, "apps": { "description": "Añade herramientas a nanobot y luego úsalas con @ en el chat.", - "cliLabel": "App", + "cliLabel": "Aplicación", "mcpLabel": "Integración", "channelLabel": "Canal", "featureLabel": "Función", "filterAll": "Listo", "filterPlugins": "Complementos", - "filterCli": "Apps", + "filterCli": "Aplicaciones", "filterMcp": "Integraciones", "enabledSummary": "{{count}} listos", - "caption": "{{cli}} apps · {{mcp}} integraciones", - "searchPlaceholder": "Buscar apps", + "caption": "{{cli}} aplicaciones · {{mcp}} integraciones", + "searchPlaceholder": "Buscar aplicaciones", "featured": "Herramientas", - "loading": "Cargando apps...", + "loading": "Cargando aplicaciones...", "empty": "Ninguna herramienta coincide con esta vista.", - "restartRequired": "Reinicia nanobot para aplicar apps y funciones actualizadas." + "restartRequired": "Reinicia nanobot para aplicar las aplicaciones y funciones actualizadas." }, "channels": { - "description": "Conecta nanobot con apps de chat. Instalar soporte solo añade el paquete de integración; la mayoría de canales aún necesitan tokens o configuración del espacio de trabajo.", + "description": "Conecta nanobot con aplicaciones de chat. Instalar el soporte solo añade el paquete de integración; la mayoría de canales aún necesitan tokens o configuración del espacio de trabajo.", "caption": "{{enabled}} activados · {{total}} canales", "searchPlaceholder": "Buscar canales", "backToChannels": "Todos los canales", @@ -566,6 +590,8 @@ "advanced": "Avanzado", "checkAndEnable": "Comprobar y activar", "checkConnection": "Comprobar conexión", + "connectionChecks": "Comprobaciones de conexión", + "open": "Abrir", "checkedAndEnabled": "Comprobado y activado.", "checking": "Comprobando...", "checkOnly": "Solo comprobar", @@ -661,6 +687,8 @@ "protected": "Protegida", "editTitle": "Editar automatización", "save": "Guardar", + "commandCopied": "Copiado", + "copyCommand": "Copiar", "deleteTitle": "Eliminar automatización", "deleteDescription": "Esto elimina {{name}} del almacén cron. Los mensajes de chat anteriores permanecen en la sesión.", "cancel": "Cancelar", @@ -720,6 +748,7 @@ "fields": { "name": "Nombre", "message": "Mensaje", + "command": "Comando", "scheduleType": "Tipo de programación", "every": "Cada", "unit": "Unidad", @@ -785,48 +814,48 @@ "customGroup": "Personalizadas", "builtinGroup": "Integradas", "otherGroup": "Otras", - "searchInstalled": "Buscar skills instaladas", + "searchInstalled": "Buscar habilidades instaladas", "filterAll": "Todas", "filterEnabled": "Activadas", "filterDisabled": "Desactivadas", - "noMatching": "No hay skills coincidentes.", + "noMatching": "No hay habilidades coincidentes.", "statusDisabled": "Desactivada", "statusEnabled": "Activada", "statusNeedsSetup": "Requiere configuración", "showLess": "Mostrar menos", "showMore": "Mostrar más", - "enabledControl": "Usar esta skill", - "enabledDescription": "Permite que el agente cargue esta skill cuando sus requisitos estén listos.", + "enabledControl": "Usar esta habilidad", + "enabledDescription": "Permite que el agente cargue esta habilidad cuando sus requisitos estén listos.", "enableSkill": "Activar {{name}}", "disableSkill": "Desactivar {{name}}", - "updateFailed": "No se pudo actualizar esta skill.", - "deleteTitle": "Eliminar skill", - "deleteDescription": "Elimina esta skill del espacio de trabajo actual.", + "updateFailed": "No se pudo actualizar esta habilidad.", + "deleteTitle": "Eliminar habilidad", + "deleteDescription": "Elimina esta habilidad del espacio de trabajo actual.", "deleteAction": "Eliminar", - "deleteFailed": "No se pudo eliminar esta skill.", + "deleteFailed": "No se pudo eliminar esta habilidad.", "deleteConfirmTitle": "¿Eliminar {{name}}?", - "deleteConfirmDescription": "Esto elimina los archivos de la skill del espacio de trabajo actual. Esta acción no se puede deshacer.", - "deleteConfirmAction": "Eliminar skill", - "instructionsTitle": "Instrucciones de la skill", + "deleteConfirmDescription": "Esto elimina los archivos de la habilidad del espacio de trabajo actual. Esta acción no se puede deshacer.", + "deleteConfirmAction": "Eliminar habilidad", + "instructionsTitle": "Instrucciones de la habilidad", "setupRequired": "Requiere configuración", "setupDescription": "Instala la dependencia que falta en el equipo donde se ejecuta nanobot y vuelve a comprobarlo.", "copySetupCommand": "Copiar comando de configuración", "checkAgain": "Comprobar de nuevo", - "marketplaceSearchFailed": "No se pudieron buscar los mercados de skills.", - "marketplaceInstallFailed": "No se pudo instalar este skill.", - "marketplaceSearchPlaceholder": "Buscar skills", - "marketplaceSearchLabel": "Buscar skills", + "marketplaceSearchFailed": "No se pudieron buscar los mercados de habilidades.", + "marketplaceInstallFailed": "No se pudo instalar esta habilidad.", + "marketplaceSearchPlaceholder": "Buscar habilidades", + "marketplaceSearchLabel": "Buscar habilidades", "marketplaceSearching": "Buscando", - "marketplaceProviderFilter": "Origen del skill", + "marketplaceProviderFilter": "Origen de la habilidad", "marketplaceProviderAll": "Todos", "marketplaceTrendingTitle": "Tendencias por mercado", "marketplaceTrendingDescription": "Cada mercado conserva su propio ranking y métricas de instalación.", "marketplaceViewAll": "Ver todos", - "marketplaceTrendingUnavailable": "Los skills populares no están disponibles temporalmente.", - "marketplaceEmpty": "No se encontraron skills para “{{query}}”.", + "marketplaceTrendingUnavailable": "Las habilidades populares no están disponibles temporalmente.", + "marketplaceEmpty": "No se encontraron habilidades para “{{query}}”.", "marketplaceConfirmTitle": "¿Instalar {{name}}?", - "marketplaceConfirmDescription": "Este skill de terceros procede de {{provider}} ({{source}}) y puede incluir instrucciones o scripts ejecutables.", - "marketplaceConfirmInstall": "Instalar skill", + "marketplaceConfirmDescription": "Esta habilidad de terceros procede de {{provider}} ({{source}}) y puede incluir instrucciones o scripts ejecutables.", + "marketplaceConfirmInstall": "Instalar habilidad", "marketplaceOpen": "Abrir {{name}} en {{provider}}", "marketplaceOpenProvider": "Abrir {{provider}}", "marketplaceInstalls24h": "{{formattedCount}} instalaciones / 24 h", @@ -864,7 +893,7 @@ "voice": { "selectProvider": "Seleccionar proveedor", "configureProvider": "Configurar proveedor", - "languageAuto": "Auto" + "languageAuto": "Automático" } }, "chat": { @@ -878,34 +907,34 @@ "actions": "Acciones del tema {{title}}", "newInProject": "Iniciar un tema nuevo en {{project}}", "activity": { - "running": "Agent running", - "complete": "Agent finished", - "updated": "New activity" + "running": "Agente en ejecución", + "complete": "Agente terminado", + "updated": "Nueva actividad" }, - "pin": "Pin", - "unpin": "Unpin", - "rename": "Rename", + "pin": "Fijar", + "unpin": "Desfijar", + "rename": "Renombrar", "renameTitle": "Renombrar tema", "renameDescription": "Elige un nombre local de la barra lateral para este tema.", "renamePlaceholder": "Nombre del tema", - "renameProjectTitle": "Rename project", - "renameProjectDescription": "Choose a local sidebar name for this project.", - "renameProjectPlaceholder": "Project name", - "renameSave": "Save", - "archive": "Archive", - "unarchive": "Unarchive", - "showArchived": "Show archived", - "hideArchived": "Hide archived", + "renameProjectTitle": "Renombrar proyecto", + "renameProjectDescription": "Elige un nombre local para este proyecto en la barra lateral.", + "renameProjectPlaceholder": "Nombre del proyecto", + "renameSave": "Guardar", + "archive": "Archivar", + "unarchive": "Desarchivar", + "showArchived": "Mostrar archivados", + "hideArchived": "Ocultar archivados", "delete": "Eliminar", "newChat": "Nuevo tema", "groups": { - "pinned": "Pinned", + "pinned": "Fijados", "all": "Temas", - "projects": "Projects", - "today": "Today", - "yesterday": "Yesterday", - "earlier": "Earlier", - "archived": "Archived" + "projects": "Proyectos", + "today": "Hoy", + "yesterday": "Ayer", + "earlier": "Anteriores", + "archived": "Archivados" } }, "deleteConfirm": { @@ -971,25 +1000,25 @@ }, "more": { "title": "Más", - "prompt": "Muéstrame algunas formas útiles en las que puedes ayudar en este workspace." + "prompt": "Muéstrame algunas formas útiles en las que puedes ayudar en este espacio de trabajo." } }, "imageQuickActions": { "icon": { - "title": "Diseñar un icono de app", - "prompt": "Genera un icono de app 1:1 limpio para nanobot: robot amigable, estilo vectorial simple, paleta suave azul y blanca, sin texto." + "title": "Diseñar un icono de aplicación", + "prompt": "Genera un icono de aplicación 1:1 limpio para nanobot: robot amigable, estilo vectorial simple, paleta suave azul y blanca, sin texto." }, "sticker": { - "title": "Crear un sticker", - "prompt": "Genera una imagen estilo sticker de un pequeño asistente robot, con fondo de apariencia transparente, expresivo y divertido." + "title": "Crear una pegatina", + "prompt": "Genera una imagen estilo pegatina de un pequeño asistente robot, con fondo de apariencia transparente, expresivo y divertido." }, "poster": { "title": "Crear un póster", - "prompt": "Genera un concepto de póster pulido para un asistente personal de IA, composición moderna, jerarquía visual fuerte, apto para una landing page." + "prompt": "Genera un concepto de póster pulido para un asistente personal de IA, composición moderna, jerarquía visual fuerte, apto para una página de destino." }, "product": { - "title": "Mockup de producto", - "prompt": "Genera una imagen limpia de mockup de producto para una app web de IA conversacional, interfaz mínima, iluminación premium, marco de dispositivo realista." + "title": "Maqueta de producto", + "prompt": "Genera una imagen limpia de maqueta de producto para una aplicación web de IA conversacional, interfaz mínima, iluminación premium, marco de dispositivo realista." }, "portrait": { "title": "Retrato estilizado", @@ -1067,7 +1096,7 @@ "aspectAria": "Relación de aspecto de imagen", "aspectLabel": "Formato de imagen", "aspect": { - "auto": "Auto", + "auto": "Automático", "1_1": "Cuadrado 1:1", "3_4": "Vertical 3:4", "9_16": "Historia 9:16", @@ -1110,7 +1139,7 @@ }, "stop": { "title": "Detener tarea actual", - "description": "Cancela el turno activo del agent en este chat." + "description": "Cancela el turno activo del agente en este chat." }, "restart": { "title": "Reiniciar nanobot", @@ -1118,11 +1147,11 @@ }, "status": { "title": "Mostrar estado", - "description": "Muestra el estado del runtime, provider y channels." + "description": "Muestra el estado del tiempo de ejecución, proveedor y canales." }, "model": { "title": "Modelo", - "description": "Muestra o cambia el preset de modelo activo." + "description": "Muestra o cambia el preajuste de modelo activo." }, "history": { "title": "Mostrar historial", @@ -1149,8 +1178,8 @@ "description": "Indica al agente que trate esto como un objetivo sostenido en varios pasos." }, "trigger": { - "title": "Crear trigger local", - "description": "Crea un trigger de CLI vinculado a esta sesion de chat." + "title": "Crear un activador local", + "description": "Crea un activador de CLI vinculado a esta sesión de chat." }, "help": { "title": "Mostrar ayuda", @@ -1174,7 +1203,7 @@ }, "encoding": "Procesando…", "remove": "Quitar adjunto", - "normalizedSizeHint": "{{orig}} → {{current}} (auto)", + "normalizedSizeHint": "{{orig}} → {{current}} (automático)", "textTooLarge": "El texto del mensaje es demasiado grande (máximo {{max}})", "imageRejected": { "unsupported_type": "Tipo de archivo no compatible", @@ -1189,14 +1218,16 @@ "io": "No se pudo leer este archivo" }, "mentions": { - "ariaLabel": "Apps", - "label": "Apps", - "cliGroup": "Apps CLI", + "ariaLabel": "Aplicaciones", + "label": "Aplicaciones", + "cliGroup": "Aplicaciones CLI", "mcpGroup": "Servicios MCP", "cliBadge": "CLI", "mcpBadge": "MCP", - "cliDescription": "Usar @{{name}} como app CLI local", - "mcpDescription": "Usar @{{name}} como servidor MCP" + "cliDescription": "Usar @{{name}} como aplicación CLI local", + "mcpDescription": "Usar @{{name}} como servidor MCP", + "cliTitle": "Aplicación CLI: {{name}}", + "mcpTitle": "Servidor MCP: {{name}}" }, "workspace": { "accessAria": "Modo de acceso al espacio de trabajo", @@ -1212,11 +1243,12 @@ "loadEarlier": "Cargar mensajes anteriores", "forkedFromHistory": "Bifurcado desde el historial", "promptNavigator": { - "open": "Abrir navegador de prompts", - "title": "Prompts", - "search": "Buscar prompts", - "noResults": "No hay prompts coincidentes.", - "jumpTo": "Ir al prompt: {{label}}" + "open": "Abrir el navegador de instrucciones", + "title": "Instrucciones", + "search": "Buscar instrucciones", + "noResults": "No hay instrucciones coincidentes.", + "jumpTo": "Ir a la instrucción: {{label}}", + "railAria": "Navegación por instrucciones del usuario" } }, "message": { @@ -1240,19 +1272,27 @@ "agentActivityLiveSummary": "En curso… · {{reasoning}} pasos · {{tools}} llamadas a herramientas", "agentActivityLiveToolsOnly": "En curso… · {{tools}} llamadas a herramientas", "imageAttachment": "Imagen adjunta", + "videoAttachment": "Archivo de vídeo", + "fileAttachment": "Archivo adjunto", + "attachmentUnavailable": "Adjunto no disponible", + "dataTable": "Tabla de datos", + "fileEditPreparing": "Preparando la edición del archivo…", + "openLink": "Abrir enlace: {{label}}", + "openAttachment": "Abrir {{name}}", + "skill": "Habilidad: {{name}}", "askAboutSelection": "Preguntar sobre esto", "forkFromHere": "Bifurcar", "copyReply": "Copiar", "copiedReply": "Copiado", "turnLatencyTitle": "Tiempo de respuesta (extremo a extremo)", - "fileEditViewDiff": "Ver diff", - "fileEditViewLargeDiff": "Ver diff grande", + "fileEditViewDiff": "Ver diferencias", + "fileEditViewLargeDiff": "Ver diferencias grandes", "fileEditDiffLineCount": "{{count}} líneas", "fileEditUnchangedLinesHidden": "{{count}} líneas sin cambios ocultas", "fileEditShowMoreLines": "Mostrar {{count}} líneas más", "fileEditShowFewerLines": "Mostrar menos líneas", "fileEditOpenFile": "Abrir archivo", - "fileEditDiffTruncated": "Diff truncado. Abre el archivo para ver el cambio completo.", + "fileEditDiffTruncated": "Diferencias truncadas. Abre el archivo para ver el cambio completo.", "activityThinkingFor": "Pensando durante {{duration}}", "activityThought": "Pensamiento completado", "activityThoughtFor": "Pensó durante {{duration}}", @@ -1262,9 +1302,9 @@ "cliActivityRunningOne": "Usando {{name}}", "cliActivityRanOne": "Usó {{name}}", "cliActivityFailedOne": "Falló {{name}}", - "cliActivityRunningMany": "Usando {{count}} apps CLI", - "cliActivityRanMany": "Usó {{count}} apps CLI", - "cliActivityFailedMany": "Fallaron {{count}} apps CLI", + "cliActivityRunningMany": "Usando {{count}} aplicaciones CLI", + "cliActivityRanMany": "Usó {{count}} aplicaciones CLI", + "cliActivityFailedMany": "Fallaron {{count}} aplicaciones CLI", "cliRunRunning": "Usando", "cliRunRan": "Usado", "cliRunFailed": "Falló", @@ -1280,6 +1320,7 @@ }, "filePreview": { "aria": "Vista previa de archivo", + "breadcrumb": "Ruta del archivo", "close": "Cerrar vista previa de archivo", "loading": "Cargando vista previa...", "failed": "No se pudo previsualizar este archivo.", @@ -1294,7 +1335,10 @@ "copied": "Copiado" }, "common": { - "dismiss": "Cerrar" + "dismiss": "Cerrar", + "close": "Cerrar", + "current": "Actual", + "cancel": "Cancelar" }, "errors": { "messageTooBig": { diff --git a/webui/src/i18n/locales/fr/common.json b/webui/src/i18n/locales/fr/common.json index 476349448..ac3e38d19 100644 --- a/webui/src/i18n/locales/fr/common.json +++ b/webui/src/i18n/locales/fr/common.json @@ -38,6 +38,15 @@ }, "meta": { "description": "Interface web nanobot — discutez avec votre espace de travail nanobot." + }, + "pairing": { + "title": "Associer un utilisateur du chat", + "description": "Saisissez le code d’association affiché dans le chat.", + "code": "Code d’association", + "matched": "Correspondance {{channel}}. Connexion...", + "expiresInline": "Le code expire {{expires}}.", + "queueCount": "{{count}} en attente", + "noMatch": "Aucune demande en attente ne correspond à ce code." } }, "sidebar": { @@ -54,7 +63,7 @@ "label": "Langue", "ariaLabel": "Changer de langue" }, - "apps": "Apps", + "apps": "Applications", "automations": "Automatisations", "skills": { "title": "Compétences" @@ -79,7 +88,7 @@ "channels": "Canaux", "runtime": "Système", "advanced": "Sécurité", - "cliApps": "Apps CLI", + "cliApps": "Applications CLI", "mcp": "MCP", "apps": "Applications", "automations": "Automatisations", @@ -150,8 +159,8 @@ "contextWindow": "Fenêtre de contexte", "transcription": "Transcription", "transcriptionProvider": "Fournisseur", - "transcriptionProviderStatus": "Etat du fournisseur", - "transcriptionModel": "Modele", + "transcriptionProviderStatus": "État du fournisseur", + "transcriptionModel": "Modèle", "transcriptionLanguage": "Langue", "voiceLimits": "Limites" }, @@ -162,10 +171,10 @@ "model": "Choisissez le modèle utilisé par ce préréglage.", "configPath": "Le fichier de configuration actuellement utilisé par la passerelle.", "selectedPreset": "Les préréglages nommés sont en lecture seule ici ; modifiez-les dans config.json.", - "presetModel": "Passez à Default pour modifier le modèle et le fournisseur depuis WebUI.", + "presetModel": "Passez à la valeur par défaut pour modifier le modèle et le fournisseur depuis la WebUI.", "density": "Enregistré seulement dans ce navigateur.", - "activityMode": "Choisissez le niveau de détail d’activité agent affiché par défaut.", - "fileEditDisplay": "Choisissez si l’activité de modification affiche le nombre de lignes ou le diff.", + "activityMode": "Choisissez le niveau de détail de l’activité de l’agent affiché par défaut.", + "fileEditDisplay": "Choisissez si l’activité de modification affiche le nombre de lignes ou les différences.", "codeWrap": "Garde les longues lignes de code lisibles sur les petits écrans.", "maxResults": "Résultats renvoyés par chaque appel web_search.", "timeout": "Nombre de secondes avant l’expiration d’une requête de recherche.", @@ -174,28 +183,28 @@ "imageProvider": "Choisissez le fournisseur inscrit utilisé par generate_image.", "imageProviderStatus": "La génération d’images réutilise les identifiants des fournisseurs.", "imageModel": "Nom du modèle envoyé au fournisseur d’images sélectionné.", - "defaultAspectRatio": "Utilisé lorsque le prompt ne choisit pas de ratio.", + "defaultAspectRatio": "Utilisé lorsque l’instruction ne choisit pas de ratio.", "defaultImageSize": "Indication de taille envoyée aux fournisseurs compatibles.", "maxImagesPerTurn": "Limite supérieure pour une requête generate_image.", "timezone": "Utilisé pour les horaires et les réponses tenant compte du temps.", - "localServiceAccess": "Autorise les commandes shell Full Access à atteindre les services localhost.", + "localServiceAccess": "Autorise les commandes shell avec accès complet à atteindre les services localhost.", "webuiDefaultAccess": "Utilisé par les chats web sans permission propre au projet.", "securityManagedControls": "Les récupérations web protègent toujours les services locaux, privés et de métadonnées. La sécurité des canaux principaux reste gérée dans config.json.", "currentModel": "Utilisée pour les nouvelles réponses.", "selectedModelProvider": "Défini par le modèle sélectionné.", "selectedModelValue": "Défini par le modèle sélectionné.", "brandLogos": "Affiche les logos de fournisseurs tiers et CLI dans les Réglages.", - "cliAppsCatalog": "Installe uniquement les adaptateurs CLI d’apps que nanobot peut exécuter localement ; les apps natives restent inchangées.", - "cliAppsFilter": "Recherchez par app, catégorie ou capacité.", + "cliAppsCatalog": "Installe uniquement les adaptateurs CLI d’applications que nanobot peut exécuter localement ; les applications natives restent inchangées.", + "cliAppsFilter": "Recherchez par application, catégorie ou capacité.", "logs": "Ouvre le dossier des journaux du moteur natif.", "diagnostics": "Exporte un petit rapport d’exécution pour le support.", - "localServiceAccessNative": "Autorise les commandes shell Full Access à atteindre les services sur ce Mac.", + "localServiceAccessNative": "Autorise les commandes shell avec accès complet à atteindre les services sur ce Mac.", "webuiDefaultAccessNative": "Utilisé par les chats natifs sans permission propre au projet.", "contextWindow": "Choisissez le budget de contexte par défaut pour cette configuration de modèle.", - "transcription": "Transcrit l'entree micro avant l'envoi. Les messages vocaux des canaux utilisent les memes reglages.", - "transcriptionProvider": "Utilise les identifiants du fournisseur correspondant dans Fournisseurs.", - "transcriptionProviderStatus": "Les cles API restent dans les fournisseurs, pas dans les reglages de transcription.", - "transcriptionModel": "Laissez le modele resolu par defaut sauf si votre fournisseur exige un id personnalise.", + "transcription": "Transcrit l’entrée du micro avant l’envoi. Les messages vocaux des canaux utilisent les mêmes réglages.", + "transcriptionProvider": "Utilise les identifiants du fournisseur correspondant dans la section Fournisseurs.", + "transcriptionProviderStatus": "Les clés API restent dans les fournisseurs, pas dans les réglages de transcription.", + "transcriptionModel": "Laissez le modèle résolu par défaut, sauf si votre fournisseur exige un identifiant personnalisé.", "transcriptionLanguage": "Indice ISO-639 facultatif, comme en, zh, ja ou ko." }, "values": { @@ -215,7 +224,7 @@ "expanded": "Développé", "default": "Par défaut", "summary": "Résumé", - "diff": "Diff", + "diff": "Différences", "collapsedDiff": "Diff replié", "on": "Activé", "off": "Désactivé", @@ -224,7 +233,10 @@ "configured": "Configuré", "notConfigured": "Non configuré", "pending": "En attente", - "restartingEngine": "Redémarrage" + "restartingEngine": "Redémarrage", + "checking": "Vérification", + "running": "En cours", + "needsSetup": "Configuration requise" }, "status": { "loading": "Chargement des réglages...", @@ -252,6 +264,7 @@ "deleting": "Suppression...", "edit": "Modifier", "cancel": "Annuler", + "dismiss": "Ignorer", "open": "Ouvrir", "export": "Exporter", "opening": "Ouverture...", @@ -265,15 +278,15 @@ "notConfiguredSection": "Non configurés", "showMore": "Afficher {{count}} de plus", "showLess": "Afficher moins", - "apiKey": "API key", - "apiBase": "API base", - "apiKeyPlaceholder": "Saisir l'API key", - "apiKeyConfiguredPlaceholder": "Laisser vide pour conserver la key actuelle", + "apiKey": "Clé API", + "apiBase": "URL de base de l’API", + "apiKeyPlaceholder": "Saisir la clé API", + "apiKeyConfiguredPlaceholder": "Laisser vide pour conserver la clé actuelle", "configuredKeyHint": "Key configurée", "apiBasePlaceholder": "Utiliser la valeur par défaut du fournisseur", - "apiKeyRequired": "Une API key est requise pour configurer ce fournisseur.", - "showApiKey": "Afficher l'API key", - "hideApiKey": "Masquer l'API key", + "apiKeyRequired": "Une clé API est requise pour configurer ce fournisseur.", + "showApiKey": "Afficher la clé API", + "hideApiKey": "Masquer la clé API", "noConfiguredProviders": "Aucun fournisseur configuré", "configureFirst": "Configurez d'abord un fournisseur dans BYOK.", "openByok": "Ouvrir BYOK", @@ -284,19 +297,19 @@ }, "webSearch": { "provider": "Fournisseur de recherche", - "providerHelp": "Choisissez le backend utilisé par l'outil web search.", + "providerHelp": "Choisissez le service utilisé par l’outil de recherche web.", "selectProvider": "Choisir un fournisseur", "credentials": "Identifiants", - "noCredentialRequired": "Aucune key requise", - "noCredentialHelp": "DuckDuckGo fonctionne sans API key enregistrée.", + "noCredentialRequired": "Aucune clé requise", + "noCredentialHelp": "DuckDuckGo fonctionne sans clé API enregistrée.", "apiKeyHelp": "Enregistrée dans la config et masquée après l'enregistrement.", - "baseUrl": "Base URL", + "baseUrl": "URL de base", "baseUrlHelp": "SearXNG nécessite l'URL de votre propre instance.", "baseUrlPlaceholder": "https://search.example.com", - "apiKeyRequired": "Ce fournisseur de recherche nécessite une API key.", - "baseUrlRequired": "SearXNG nécessite une Base URL.", + "apiKeyRequired": "Ce fournisseur de recherche nécessite une clé API.", + "baseUrlRequired": "SearXNG nécessite une URL de base.", "missingCredential": "Ajoutez l'identifiant requis avant d'enregistrer.", - "saveHint": "Les changements s'appliquent aux nouvelles requêtes web search." + "saveHint": "Les changements s’appliquent aux nouvelles requêtes de recherche web." } }, "overview": { @@ -311,7 +324,7 @@ }, "usage": { "title": "Activité des tokens", - "shortTitle": "Token Usage", + "shortTitle": "Utilisation des tokens", "subtitle": "Usage signalé par le fournisseur sur les 12 derniers mois.", "empty": "L’activité des tokens apparaîtra après les nouvelles réponses du modèle.", "totalTokens": "Tokens cumulés", @@ -358,8 +371,18 @@ "selectProvider": "Choisir un fournisseur", "selectAspect": "Choisir un ratio", "selectSize": "Choisir une taille", + "selectModel": "Choisir un modèle d’image", + "searchOrTypeModel": "Rechercher ou saisir l’ID du modèle", + "typeModelId": "Saisissez l’ID de modèle pris en charge par ce fournisseur.", "configureProvider": "Configurer le fournisseur", - "missingCredential": "Configura este proveedor antes de activar la generación de imágenes." + "missingCredential": "Configurez ce fournisseur avant d’activer la génération d’images." + }, + "capabilities": { + "providerSupport": "Prise en charge du fournisseur", + "providerInstallOnSave": "La prise en charge requise sera installée automatiquement lors de l’enregistrement de ce fournisseur.", + "searchSupport": "Prise en charge du fournisseur de recherche", + "searchInstallOnSave": "La prise en charge d’Olostep sera installée automatiquement lors de l’enregistrement.", + "installing": "Installation de la prise en charge..." }, "models": { "selectModel": "Choisir un modèle", @@ -433,8 +456,8 @@ "statusUnsupported": "Non compatible", "statusNotInstalled": "Non installée", "unsupported": "Non compatible", - "loading": "Chargement des apps CLI...", - "empty": "Aucune app CLI ne correspond à ce filtre.", + "loading": "Chargement des applications CLI...", + "empty": "Aucune application CLI ne correspond à ce filtre.", "readyTitle": "@{{name}} est prêt", "readyStatus": "Prêt", "readyPrompt": "Utilisez @{{name}} pour voir ce que ce CLI peut faire.", @@ -458,11 +481,11 @@ }, "mcp": { "allCategories": "Toutes les catégories", - "summary": "{{installed}} presets activés sur {{total}}", + "summary": "{{installed}} préréglages activés sur {{total}}", "filterAll": "Tout", "filterInstalled": "Activés", "filterNotInstalled": "Non activés", - "searchPlaceholder": "Rechercher des presets MCP", + "searchPlaceholder": "Rechercher des préréglages MCP", "moreOptions": "Plus d'options MCP", "moreOptionsSubtitle": "Ajoutez un serveur personnalisé ou importez mcp.json.", "customTitle": "MCP personnalisé", @@ -473,9 +496,9 @@ "serverUrl": "URL", "transport": "Transport", "command": "Commande", - "args": "Args JSON", - "headers": "Headers JSON", - "env": "Env JSON", + "args": "Arguments JSON", + "headers": "En-têtes JSON", + "env": "Environnement JSON", "timeout": "Délai d'outil", "advancedOptions": "Options avancées", "hideAdvanced": "Masquer les options avancées", @@ -484,8 +507,8 @@ "importConfig": "Importer", "restartRequired": "Redémarrez nanobot pour connecter les outils MCP mis à jour.", "toolsFound": "{{count}} outils", - "loading": "Chargement des presets MCP...", - "empty": "Aucun preset MCP ne correspond à ce filtre.", + "loading": "Chargement des préréglages MCP...", + "empty": "Aucun préréglage MCP ne correspond à ce filtre.", "openDocs": "Ouvrir la doc", "test": "Tester", "remove": "Supprimer", @@ -503,6 +526,7 @@ "statusMissingCredentials": "Clé requise", "statusMissingDependency": "Dépendance requise", "statusComingSoon": "Bientôt disponible", + "comingSoon": "Bientôt disponible", "statusNotInstalled": "Non activé", "toolScope": "Outils", "allTools": "Tous", @@ -527,24 +551,24 @@ }, "apps": { "description": "Ajoutez des outils à nanobot, puis utilisez-les avec @ dans le chat.", - "cliLabel": "App", + "cliLabel": "Application", "mcpLabel": "Intégration", "channelLabel": "Canal", "featureLabel": "Fonction", "filterAll": "Prêts", "filterPlugins": "Extensions", - "filterCli": "Apps", + "filterCli": "Applications", "filterMcp": "Intégrations", "enabledSummary": "{{count}} prêts", - "caption": "{{cli}} apps · {{mcp}} intégrations", - "searchPlaceholder": "Rechercher des apps", + "caption": "{{cli}} applications · {{mcp}} intégrations", + "searchPlaceholder": "Rechercher des applications", "featured": "Outils", - "loading": "Chargement des apps...", + "loading": "Chargement des applications...", "empty": "Aucun outil ne correspond à cette vue.", - "restartRequired": "Redémarrez nanobot pour appliquer les apps et fonctions mises à jour." + "restartRequired": "Redémarrez nanobot pour appliquer les applications et fonctions mises à jour." }, "channels": { - "description": "Connectez nanobot aux apps de discussion. L'installation du support ajoute seulement le paquet d'intégration ; la plupart des canaux nécessitent encore des tokens ou des réglages d'espace de travail.", + "description": "Connectez nanobot aux applications de discussion. L'installation du support ajoute seulement le paquet d'intégration ; la plupart des canaux nécessitent encore des jetons ou des réglages d'espace de travail.", "caption": "{{enabled}} activés · {{total}} canaux", "searchPlaceholder": "Rechercher des canaux", "backToChannels": "Tous les canaux", @@ -565,6 +589,8 @@ "advanced": "Avancé", "checkAndEnable": "Vérifier et activer", "checkConnection": "Vérifier la connexion", + "connectionChecks": "Vérifications de connexion", + "open": "Ouvrir", "checkedAndEnabled": "Vérifié et activé.", "checking": "Vérification...", "checkOnly": "Vérifier uniquement", @@ -660,6 +686,8 @@ "protected": "Protégée", "editTitle": "Modifier l’automatisation", "save": "Enregistrer", + "commandCopied": "Copié", + "copyCommand": "Copier", "deleteTitle": "Supprimer l’automatisation", "deleteDescription": "Cela supprime {{name}} du stockage cron. Les anciens messages de chat restent dans la session.", "cancel": "Annuler", @@ -719,6 +747,7 @@ "fields": { "name": "Nom", "message": "Message", + "command": "Commande", "scheduleType": "Type de planning", "every": "Toutes les", "unit": "Unité", @@ -753,7 +782,7 @@ "signInAgain": "Se reconnecter", "signOut": "Se déconnecter", "signedInAs": "Connecté en tant que {{account}}", - "signInHelp": "Inicia sesión desde este dispositivo; no se guarda API key en config.", + "signInHelp": "Connectez-vous depuis cet appareil ; aucune clé API n’est enregistrée dans la configuration.", "remoteSignInHelp": "Sélectionnez Se connecter pour ouvrir xAI sur votre ordinateur, puis collez le code d’autorisation affiché après la connexion.", "codexRemoteSignInHelp": "Connectez-vous dans ce navigateur, puis recollez dans nanobot l’URL complète de rappel localhost.", "signInRequired": "Connexion requise", @@ -836,7 +865,7 @@ "marketplaceInstall": "Installer", "marketplaceNoTrend": "Pas encore de tendance", "marketplaceTrendLabel": "Tendance des installations sur 8 semaines", - "featured": "Compétences agent", + "featured": "Compétences de l’agent", "empty": "Aucune compétence disponible.", "sourceWorkspace": "Personnalisée", "sourceBuiltin": "Intégrée", @@ -863,7 +892,7 @@ "voice": { "selectProvider": "Choisir un fournisseur", "configureProvider": "Configurer le fournisseur", - "languageAuto": "Auto" + "languageAuto": "Automatique" } }, "chat": { @@ -877,34 +906,34 @@ "actions": "Actions du sujet {{title}}", "newInProject": "Démarrer un nouveau sujet dans {{project}}", "activity": { - "running": "Agent running", - "complete": "Agent finished", - "updated": "New activity" + "running": "Agent en cours", + "complete": "Agent terminé", + "updated": "Nouvelle activité" }, - "pin": "Pin", - "unpin": "Unpin", - "rename": "Rename", + "pin": "Épingler", + "unpin": "Désépingler", + "rename": "Renommer", "renameTitle": "Renommer le sujet", "renameDescription": "Choisissez un nom local dans la barre latérale pour ce sujet.", "renamePlaceholder": "Nom du sujet", - "renameProjectTitle": "Rename project", - "renameProjectDescription": "Choose a local sidebar name for this project.", - "renameProjectPlaceholder": "Project name", - "renameSave": "Save", - "archive": "Archive", - "unarchive": "Unarchive", - "showArchived": "Show archived", - "hideArchived": "Hide archived", + "renameProjectTitle": "Renommer le projet", + "renameProjectDescription": "Choisissez un nom local dans la barre latérale pour ce projet.", + "renameProjectPlaceholder": "Nom du projet", + "renameSave": "Enregistrer", + "archive": "Archiver", + "unarchive": "Désarchiver", + "showArchived": "Afficher les archives", + "hideArchived": "Masquer les archives", "delete": "Supprimer", "newChat": "Nouveau sujet", "groups": { - "pinned": "Pinned", + "pinned": "Épinglés", "all": "Sujets", - "projects": "Projects", - "today": "Today", - "yesterday": "Yesterday", - "earlier": "Earlier", - "archived": "Archived" + "projects": "Projets", + "today": "Aujourd’hui", + "yesterday": "Hier", + "earlier": "Plus anciens", + "archived": "Archivés" } }, "deleteConfirm": { @@ -980,11 +1009,11 @@ }, "sticker": { "title": "Créer un sticker", - "prompt": "Générez une image façon sticker d’un petit assistant robot, avec un fond d’apparence transparente, expressive et ludique." + "prompt": "Générez une image façon autocollant d’un petit assistant robot, avec un fond d’apparence transparente, expressive et ludique." }, "poster": { "title": "Créer une affiche", - "prompt": "Générez un concept d’affiche soigné pour un assistant IA personnel, composition moderne, hiérarchie visuelle forte, adapté à une landing page." + "prompt": "Générez un concept d’affiche soigné pour un assistant IA personnel, composition moderne, hiérarchie visuelle forte, adapté à une page de destination." }, "product": { "title": "Maquette produit", @@ -1066,7 +1095,7 @@ "aspectAria": "Format de l’image", "aspectLabel": "Format de l’image", "aspect": { - "auto": "Auto", + "auto": "Automatique", "1_1": "Carré 1:1", "3_4": "Portrait 3:4", "9_16": "Story 9:16", @@ -1109,7 +1138,7 @@ }, "stop": { "title": "Arrêter la tâche en cours", - "description": "Annuler le tour agent actif pour cette discussion." + "description": "Annuler le tour actif de l’agent pour cette discussion." }, "restart": { "title": "Redémarrer nanobot", @@ -1117,7 +1146,7 @@ }, "status": { "title": "Afficher l’état", - "description": "Afficher l’état du runtime, du provider et des channels." + "description": "Afficher l’état du temps d’exécution, du fournisseur et des canaux." }, "model": { "title": "Modèle", @@ -1148,8 +1177,8 @@ "description": "Demandez à l’agent de traiter ceci comme un objectif multi‑étapes durable." }, "trigger": { - "title": "Créer un trigger local", - "description": "Crée un trigger CLI lié à cette session de chat." + "title": "Créer un déclencheur local", + "description": "Crée un déclencheur CLI lié à cette session de chat." }, "help": { "title": "Afficher l’aide", @@ -1173,7 +1202,7 @@ }, "encoding": "Traitement…", "remove": "Retirer la pièce jointe", - "normalizedSizeHint": "{{orig}} → {{current}} (auto)", + "normalizedSizeHint": "{{orig}} → {{current}} (automatique)", "textTooLarge": "Le texte du message est trop volumineux (maximum {{max}})", "imageRejected": { "unsupported_type": "Type de fichier non pris en charge", @@ -1188,14 +1217,16 @@ "io": "Impossible de lire ce fichier" }, "mentions": { - "ariaLabel": "Apps", - "label": "Apps", - "cliGroup": "Apps CLI", + "ariaLabel": "Applications", + "label": "Applications", + "cliGroup": "Applications CLI", "mcpGroup": "Services MCP", "cliBadge": "CLI", "mcpBadge": "MCP", - "cliDescription": "Utiliser @{{name}} comme app CLI locale", - "mcpDescription": "Utiliser @{{name}} comme serveur MCP" + "cliDescription": "Utiliser @{{name}} comme application CLI locale", + "mcpDescription": "Utiliser @{{name}} comme serveur MCP", + "cliTitle": "Application CLI : {{name}}", + "mcpTitle": "Serveur MCP : {{name}}" }, "workspace": { "accessAria": "Mode d’accès à l’espace de travail", @@ -1211,11 +1242,12 @@ "loadEarlier": "Charger les messages précédents", "forkedFromHistory": "Bifurqué depuis l'historique", "promptNavigator": { - "open": "Ouvrir le navigateur de prompts", - "title": "Prompts", - "search": "Rechercher des prompts", - "noResults": "Aucun prompt correspondant.", - "jumpTo": "Aller au prompt : {{label}}" + "open": "Ouvrir le navigateur d’instructions", + "title": "Instructions", + "search": "Rechercher des instructions", + "noResults": "Aucune instruction correspondante.", + "jumpTo": "Aller à l’instruction : {{label}}", + "railAria": "Navigation dans les instructions utilisateur" } }, "message": { @@ -1239,19 +1271,27 @@ "agentActivityLiveSummary": "En cours… · {{reasoning}} étapes · {{tools}} appels d’outils", "agentActivityLiveToolsOnly": "En cours… · {{tools}} appels d’outils", "imageAttachment": "Pièce jointe image", + "videoAttachment": "Pièce jointe vidéo", + "fileAttachment": "Pièce jointe", + "attachmentUnavailable": "Pièce jointe indisponible", + "dataTable": "Tableau de données", + "fileEditPreparing": "Préparation de la modification du fichier…", + "openLink": "Ouvrir le lien : {{label}}", + "openAttachment": "Ouvrir {{name}}", + "skill": "Compétence : {{name}}", "askAboutSelection": "Poser une question à ce sujet", "forkFromHere": "Bifurquer", "copyReply": "Copier", "copiedReply": "Copié", "turnLatencyTitle": "Temps de réponse (de bout en bout)", - "fileEditViewDiff": "Voir le diff", - "fileEditViewLargeDiff": "Voir le grand diff", + "fileEditViewDiff": "Voir les différences", + "fileEditViewLargeDiff": "Voir les grandes différences", "fileEditDiffLineCount": "{{count}} lignes", "fileEditUnchangedLinesHidden": "{{count}} lignes inchangées masquées", "fileEditShowMoreLines": "Afficher {{count}} lignes de plus", "fileEditShowFewerLines": "Afficher moins de lignes", "fileEditOpenFile": "Ouvrir le fichier", - "fileEditDiffTruncated": "Diff tronqué. Ouvrez le fichier pour voir la modification complète.", + "fileEditDiffTruncated": "Différences tronquées. Ouvrez le fichier pour voir la modification complète.", "activityThinkingFor": "Réflexion pendant {{duration}}", "activityThought": "Réflexion terminée", "activityThoughtFor": "Réflexion terminée en {{duration}}", @@ -1261,9 +1301,9 @@ "cliActivityRunningOne": "Utilisation de {{name}}", "cliActivityRanOne": "{{name}} utilisé", "cliActivityFailedOne": "Échec de {{name}}", - "cliActivityRunningMany": "Utilisation de {{count}} apps CLI", - "cliActivityRanMany": "{{count}} apps CLI utilisées", - "cliActivityFailedMany": "Échec de {{count}} apps CLI", + "cliActivityRunningMany": "Utilisation de {{count}} applications CLI", + "cliActivityRanMany": "{{count}} applications CLI utilisées", + "cliActivityFailedMany": "Échec de {{count}} applications CLI", "cliRunRunning": "Utilisation", "cliRunRan": "Utilisé", "cliRunFailed": "Échec", @@ -1279,6 +1319,7 @@ }, "filePreview": { "aria": "Aperçu du fichier", + "breadcrumb": "Chemin du fichier", "close": "Fermer l’aperçu du fichier", "loading": "Chargement de l’aperçu...", "failed": "Impossible de prévisualiser ce fichier.", @@ -1293,7 +1334,10 @@ "copied": "Copié" }, "common": { - "dismiss": "Fermer" + "dismiss": "Fermer", + "close": "Fermer", + "current": "Actuel", + "cancel": "Annuler" }, "errors": { "messageTooBig": { diff --git a/webui/src/i18n/locales/id/common.json b/webui/src/i18n/locales/id/common.json index 9c7eae2b5..6e9f892e3 100644 --- a/webui/src/i18n/locales/id/common.json +++ b/webui/src/i18n/locales/id/common.json @@ -26,8 +26,8 @@ "restartHint": "Mulai ulang nanobot untuk menerapkan perubahan runtime.", "restart": "Mulai ulang nanobot", "restarting": "Memulai ulang...", - "restartEngine": "Mulai ulang engine", - "restartingEngine": "Memulai ulang engine..." + "restartEngine": "Mulai ulang mesin", + "restartingEngine": "Memulai ulang mesin..." }, "restart": { "completed": "Mulai ulang selesai dalam {{seconds}} dtk." @@ -37,7 +37,16 @@ "chat": "{{title}} · nanobot" }, "meta": { - "description": "UI web nanobot — ngobrol dengan workspace nanobot Anda." + "description": "UI web nanobot — ngobrol dengan ruang kerja nanobot Anda." + }, + "pairing": { + "title": "Hubungkan pengguna chat", + "description": "Masukkan kode pairing yang ditampilkan di chat.", + "code": "Kode pairing", + "matched": "Cocok dengan {{channel}}. Menghubungkan...", + "expiresInline": "Kode kedaluwarsa {{expires}}.", + "queueCount": "{{count}} menunggu", + "noMatch": "Tidak ada permintaan tertunda yang cocok dengan kode ini." } }, "sidebar": { @@ -57,7 +66,7 @@ "apps": "Aplikasi", "automations": "Otomasi", "skills": { - "title": "Skill" + "title": "Keterampilan" } }, "settings": { @@ -83,7 +92,7 @@ "mcp": "MCP", "apps": "Aplikasi", "automations": "Otomasi", - "skills": "Skill" + "skills": "Keterampilan" }, "sections": { "interface": "Antarmuka", @@ -92,9 +101,9 @@ "about": "Tentang", "status": "Status", "localPreferences": "Preferensi lokal", - "presets": "Preset", + "presets": "Prasetel", "imageGeneration": "Pembuatan gambar", - "imageDefaults": "Default", + "imageDefaults": "Bawaan", "webSearch": "Pencarian web", "webBehavior": "Perilaku", "regional": "Regional", @@ -103,7 +112,7 @@ "cliApps": "Aplikasi CLI", "mcp": "Layanan MCP", "apps": "Aplikasi", - "nativeHost": "Host native", + "nativeHost": "Host asli", "hostSafety": "Keamanan aplikasi", "voiceInput": "Input suara" }, @@ -114,15 +123,15 @@ "model": "Model", "restart": "Mulai ulang nanobot", "configPath": "Path konfigurasi", - "activePreset": "Preset aktif", + "activePreset": "Prasetel aktif", "gateway": "Gerbang", "restartState": "Status mulai ulang", "pendingChanges": "Perubahan tertunda", - "selectedPreset": "Preset terpilih", - "presetModel": "Model preset", + "selectedPreset": "Prasetel terpilih", + "presetModel": "Model prasetel", "density": "Kerapatan", "activityMode": "Detail aktivitas", - "fileEditDisplay": "Tampilan edit file", + "fileEditDisplay": "Tampilan perubahan file", "codeWrap": "Bungkus kode", "maxResults": "Hasil maksimum", "timeout": "Batas waktu", @@ -132,14 +141,14 @@ "imageProviderStatus": "Status penyedia", "imageProviderBase": "Basis penyedia", "imageModel": "Model gambar", - "defaultAspectRatio": "Rasio default", - "defaultImageSize": "Ukuran default", + "defaultAspectRatio": "Rasio bawaan", + "defaultImageSize": "Ukuran bawaan", "maxImagesPerTurn": "Maks. gambar per giliran", "imageSaveDir": "Direktori simpan", "timezone": "Zona waktu", - "workspacePath": "Workspace default", + "workspacePath": "Ruang kerja bawaan", "localServiceAccess": "Layanan lokal", - "webuiDefaultAccess": "Akses default", + "webuiDefaultAccess": "Akses bawaan", "currentModel": "Konfigurasi saat ini", "brandLogos": "Logo merek", "cliAppsCatalog": "Katalog", @@ -158,44 +167,44 @@ "help": { "theme": "Beralih antara tampilan terang dan gelap.", "language": "Pilih bahasa yang digunakan WebUI.", - "provider": "Selecciona el proveedor para nuevas solicitudes de modelo.", - "model": "Pilih model yang digunakan oleh preset ini.", - "configPath": "Archivo de configuración que usa actualmente el gateway.", - "selectedPreset": "Los preajustes con nombre son de solo lectura aquí; edítalos en config.json.", - "presetModel": "Beralih ke Default untuk mengedit model dan penyedia dari WebUI.", + "provider": "Pilih penyedia untuk permintaan model baru.", + "model": "Pilih model yang digunakan oleh prasetel ini.", + "configPath": "File konfigurasi gateway yang sedang digunakan.", + "selectedPreset": "Prasetel bernama hanya-baca di sini; ubah di config.json.", + "presetModel": "Beralih ke Bawaan untuk mengubah model dan penyedia dari WebUI.", "density": "Hanya disimpan di browser ini.", "activityMode": "Pilih seberapa banyak detail aktivitas agen yang ditampilkan secara default.", - "fileEditDisplay": "Pilih aktivitas edit file dibuka sebagai jumlah baris atau diff.", + "fileEditDisplay": "Pilih apakah aktivitas perubahan file ditampilkan sebagai jumlah baris atau perbedaan.", "codeWrap": "Menjaga baris kode panjang tetap terbaca di layar kecil.", - "maxResults": "Resultados devueltos por cada llamada web_search.", - "timeout": "Segundos antes de que una solicitud de búsqueda expire.", - "jinaReader": "Usa Jina Reader para web_fetch cuando esté disponible.", - "imageGeneration": "Expone generate_image en chats cuando hay un proveedor de imagen configurado.", - "imageProvider": "Elige el proveedor registrado usado por generate_image.", - "imageProviderStatus": "La generación de imágenes reutiliza credenciales de Proveedores.", - "imageModel": "Nombre del modelo enviado al proveedor de imágenes seleccionado.", - "defaultAspectRatio": "Se usa cuando el prompt no elige una proporción.", + "maxResults": "Hasil yang dikembalikan oleh setiap panggilan web_search.", + "timeout": "Detik sebelum permintaan penyedia pencarian mencapai batas waktu.", + "jinaReader": "Gunakan Jina Reader untuk web_fetch jika tersedia.", + "imageGeneration": "Tampilkan generate_image di chat saat penyedia gambar yang dikonfigurasi tersedia.", + "imageProvider": "Pilih penyedia registry yang digunakan oleh generate_image.", + "imageProviderStatus": "Pembuatan gambar menggunakan kembali kredensial penyedia dari bagian Penyedia.", + "imageModel": "Nama model yang dikirim ke penyedia gambar yang dipilih.", + "defaultAspectRatio": "Digunakan saat instruksi tidak memilih rasio aspek.", "defaultImageSize": "Petunjuk ukuran yang dikirim ke penyedia yang mendukungnya.", "maxImagesPerTurn": "Batas atas untuk satu permintaan generate_image.", - "timezone": "Se usa para horarios y respuestas con conciencia temporal.", - "localServiceAccess": "Izinkan perintah shell Full Access menjangkau layanan localhost.", + "timezone": "Dipakai untuk jadwal dan balasan yang peka waktu.", + "localServiceAccess": "Izinkan perintah shell dengan akses penuh menjangkau layanan lokal.", "webuiDefaultAccess": "Digunakan oleh chat web tanpa izin khusus proyek.", - "securityManagedControls": "Las capturas web siempre protegen servicios locales, privados y metadata. La seguridad de canales core se gestiona en config.json.", + "securityManagedControls": "Pengambilan web selalu melindungi layanan lokal, privat, dan metadata. Keamanan kanal inti tetap dikelola di config.json.", "currentModel": "Digunakan untuk balasan baru.", - "selectedModelProvider": "Definido por el modelo seleccionado.", - "selectedModelValue": "Definido por el modelo seleccionado.", + "selectedModelProvider": "Ditentukan oleh model yang dipilih.", + "selectedModelValue": "Ditentukan oleh model yang dipilih.", "brandLogos": "Tampilkan logo penyedia pihak ketiga dan CLI di Pengaturan.", - "cliAppsCatalog": "Instala solo adaptadores CLI de apps que nanobot puede ejecutar localmente; las apps nativas no se modifican.", - "cliAppsFilter": "Busca por app, categoría o capacidad.", - "logs": "Abre la carpeta de registros del motor nativo.", - "diagnostics": "Exporta un pequeño informe de runtime para soporte.", - "localServiceAccessNative": "Permite que comandos shell con Full Access alcancen servicios en este Mac.", - "webuiDefaultAccessNative": "Usado por chats nativos sin permiso específico de proyecto.", - "contextWindow": "Pilih anggaran konteks default untuk konfigurasi model ini.", - "transcription": "Transkripsikan input mikrofon sebelum dikirim. Pesan suara channel memakai pengaturan yang sama.", - "transcriptionProvider": "Menggunakan kredensial penyedia yang sesuai dari Providers.", - "transcriptionProviderStatus": "API key tetap berada di providers, bukan di pengaturan transkripsi.", - "transcriptionModel": "Biarkan memakai default yang teresolusi kecuali penyedia membutuhkan id model khusus.", + "cliAppsCatalog": "Instal hanya adaptor CLI aplikasi yang dapat dijalankan nanobot secara lokal; aplikasi asli tidak diubah.", + "cliAppsFilter": "Cari berdasarkan aplikasi, kategori, atau kemampuan.", + "logs": "Buka folder log mesin asli.", + "diagnostics": "Ekspor laporan waktu proses singkat untuk dukungan.", + "localServiceAccessNative": "Izinkan perintah shell dengan akses penuh mengakses layanan di Mac ini.", + "webuiDefaultAccessNative": "Digunakan oleh chat bawaan tanpa izin khusus proyek.", + "contextWindow": "Pilih anggaran konteks bawaan untuk konfigurasi model ini.", + "transcription": "Transkripsikan input mikrofon sebelum dikirim. Pesan suara kanal memakai pengaturan yang sama.", + "transcriptionProvider": "Menggunakan kredensial penyedia yang sesuai dari Penyedia.", + "transcriptionProviderStatus": "Kunci API tetap berada di bagian penyedia, bukan di pengaturan transkripsi.", + "transcriptionModel": "Biarkan memakai bawaan yang ter-resolve kecuali penyedia membutuhkan ID model khusus.", "transcriptionLanguage": "Petunjuk ISO-639 opsional, seperti en, zh, ja, atau ko." }, "values": { @@ -208,74 +217,78 @@ "ready": "Siap", "privateEngine": "Mesin privat", "unixSocket": "Soket Unix", - "defaultWorkspace": "Workspace default", + "defaultWorkspace": "Ruang kerja bawaan", "comfortable": "Nyaman", "compact": "Ringkas", "auto": "Otomatis", "expanded": "Diperluas", - "default": "Default", + "default": "Bawaan", "summary": "Ringkasan", - "diff": "Diff", - "collapsedDiff": "Diff diciutkan", + "diff": "Perbedaan", + "collapsedDiff": "Perbedaan diciutkan", "on": "Aktif", "off": "Nonaktif", - "defaultPermission": "Izin default", + "defaultPermission": "Izin bawaan", "fullAccess": "Akses penuh", "configured": "Terkonfigurasi", "notConfigured": "Belum dikonfigurasi", "pending": "Tertunda", - "restartingEngine": "Memulai ulang" + "restartingEngine": "Memulai ulang", + "checking": "Memeriksa", + "running": "Berjalan", + "needsSetup": "Perlu penyiapan" }, "status": { "loading": "Memuat pengaturan...", "loadError": "Tidak dapat memuat pengaturan", "unsaved": "Perubahan belum disimpan.", "upToDate": "Sudah terbaru.", - "savedRestart": "Guardado. Reinicia nanobot para aplicar.", - "restartAfterSaving": "Guarda los cambios y reinicia cuando puedas.", - "savedRestartApply": "Guardado. Reinicia cuando puedas.", - "imageProviderRestart": "Cambios del proveedor de imagen guardados. Reinicia cuando puedas.", - "hostRestartAfterSaving": "Al guardar, nanobot reiniciará su motor.", - "hostRestartPending": "Guardado. El motor se reiniciará cuando esté listo.", - "hostApiUnavailable": "Las acciones del host solo están disponibles en la app nativa.", - "logsOpened": "Carpeta de registros abierta.", - "logsOpenFailed": "No se pudo abrir la carpeta de registros.", - "diagnosticsExported": "Diagnóstico exportado a {{path}}.", - "diagnosticsExportFailed": "No se pudo exportar el diagnóstico." + "savedRestart": "Tersimpan. Mulai ulang nanobot untuk menerapkan.", + "restartAfterSaving": "Simpan perubahan, lalu mulai ulang saat siap.", + "savedRestartApply": "Tersimpan. Mulai ulang saat siap.", + "imageProviderRestart": "Perubahan penyedia gambar tersimpan. Mulai ulang saat siap.", + "hostRestartAfterSaving": "Saat disimpan, nanobot akan memulai ulang mesinnya.", + "hostRestartPending": "Tersimpan. Mesin akan dimulai ulang saat siap.", + "hostApiUnavailable": "Tindakan host hanya tersedia di aplikasi asli.", + "logsOpened": "Folder log dibuka.", + "logsOpenFailed": "Tidak dapat membuka folder log.", + "diagnosticsExported": "Diagnostik diekspor ke {{path}}.", + "diagnosticsExportFailed": "Tidak dapat mengekspor diagnostik." }, "actions": { "save": "Simpan", "saving": "Menyimpan", "saveOrder": "Simpan urutan", - "savePreset": "Simpan preset", + "savePreset": "Simpan prasetel", "delete": "Hapus", "deleting": "Menghapus...", - "edit": "Edit", + "edit": "Ubah", "cancel": "Batal", + "dismiss": "Abaikan", "open": "Buka", "export": "Ekspor", "opening": "Membuka...", "exporting": "Mengekspor..." }, "byok": { - "description": "Gunakan kunci provider Anda sendiri. Nanobot membaca nilai ini dari config saat ini dan hanya provider yang sudah dikonfigurasi yang dapat digunakan dalam preset model.", + "description": "Gunakan kunci penyedia Anda sendiri. Nanobot membaca nilai ini dari konfigurasi saat ini dan hanya penyedia yang sudah dikonfigurasi yang dapat digunakan dalam prasetel model.", "configured": "Terkonfigurasi", "notConfigured": "Belum dikonfigurasi", "configuredSection": "Terkonfigurasi", "notConfiguredSection": "Belum dikonfigurasi", "showMore": "Tampilkan {{count}} lagi", "showLess": "Tampilkan lebih sedikit", - "apiKey": "API key", - "apiBase": "API base", - "apiKeyPlaceholder": "Masukkan API key", - "apiKeyConfiguredPlaceholder": "Kosongkan untuk mempertahankan key saat ini", - "configuredKeyHint": "Key terkonfigurasi", - "apiBasePlaceholder": "Gunakan default provider", - "apiKeyRequired": "API key diperlukan untuk mengonfigurasi provider ini.", - "showApiKey": "Tampilkan API key", - "hideApiKey": "Sembunyikan API key", - "noConfiguredProviders": "Belum ada provider terkonfigurasi", - "configureFirst": "Konfigurasikan provider di BYOK terlebih dahulu.", + "apiKey": "Kunci API", + "apiBase": "Basis API", + "apiKeyPlaceholder": "Masukkan kunci API", + "apiKeyConfiguredPlaceholder": "Kosongkan untuk mempertahankan kunci saat ini", + "configuredKeyHint": "Kunci yang dikonfigurasi", + "apiBasePlaceholder": "Gunakan nilai bawaan penyedia", + "apiKeyRequired": "Kunci API diperlukan untuk mengonfigurasi penyedia ini.", + "showApiKey": "Tampilkan kunci API", + "hideApiKey": "Sembunyikan kunci API", + "noConfiguredProviders": "Belum ada penyedia yang dikonfigurasi", + "configureFirst": "Konfigurasikan penyedia di BYOK terlebih dahulu.", "openByok": "Buka BYOK", "tabs": { "ariaLabel": "Jenis kredensial BYOK", @@ -284,19 +297,19 @@ }, "webSearch": { "provider": "Penyedia pencarian", - "providerHelp": "Pilih backend yang digunakan alat web search.", - "selectProvider": "Pilih provider", + "providerHelp": "Pilih backend yang digunakan alat pencarian web.", + "selectProvider": "Pilih penyedia", "credentials": "Kredensial", - "noCredentialRequired": "Tidak perlu key", - "noCredentialHelp": "DuckDuckGo berfungsi tanpa menyimpan API key.", + "noCredentialRequired": "Tidak perlu kunci", + "noCredentialHelp": "DuckDuckGo berfungsi tanpa menyimpan kunci API.", "apiKeyHelp": "Disimpan di config dan ditampilkan tersamarkan setelah disimpan.", - "baseUrl": "Base URL", + "baseUrl": "URL dasar", "baseUrlHelp": "SearXNG memerlukan URL instance Anda sendiri.", "baseUrlPlaceholder": "https://search.example.com", - "apiKeyRequired": "Provider pencarian ini memerlukan API key.", - "baseUrlRequired": "SearXNG memerlukan Base URL.", + "apiKeyRequired": "Penyedia pencarian ini memerlukan kunci API.", + "baseUrlRequired": "SearXNG memerlukan URL dasar.", "missingCredential": "Tambahkan kredensial yang diperlukan sebelum menyimpan.", - "saveHint": "Perubahan berlaku untuk permintaan web search baru." + "saveHint": "Perubahan berlaku untuk permintaan pencarian web baru." } }, "overview": { @@ -311,7 +324,7 @@ }, "usage": { "title": "Aktivitas token", - "shortTitle": "Token Usage", + "shortTitle": "Penggunaan token", "subtitle": "Penggunaan yang dilaporkan penyedia selama 12 bulan terakhir.", "empty": "Aktivitas token akan muncul setelah balasan model baru.", "totalTokens": "Total token", @@ -358,8 +371,18 @@ "selectProvider": "Pilih penyedia", "selectAspect": "Pilih rasio", "selectSize": "Pilih ukuran", + "selectModel": "Pilih model gambar", + "searchOrTypeModel": "Cari atau ketik ID model", + "typeModelId": "Ketik ID model yang didukung penyedia ini.", "configureProvider": "Konfigurasi penyedia", - "missingCredential": "Configura este proveedor antes de activar la generación de imágenes." + "missingCredential": "Konfigurasikan penyedia ini sebelum mengaktifkan pembuatan gambar." + }, + "capabilities": { + "providerSupport": "Dukungan penyedia", + "providerInstallOnSave": "Dukungan yang diperlukan akan dipasang otomatis saat Anda menyimpan penyedia ini.", + "searchSupport": "Dukungan penyedia pencarian", + "searchInstallOnSave": "Dukungan Olostep akan dipasang otomatis saat Anda menyimpan.", + "installing": "Memasang dukungan..." }, "models": { "selectModel": "Pilih model", @@ -372,12 +395,12 @@ "callOrder": "Urutan pemanggilan model", "primary": "Utama", "fallbackNumber": "Cadangan {{number}}", - "addToOrder": "Aktifkan preset", - "newPreset": "Preset model baru", + "addToOrder": "Aktifkan prasetel", + "newPreset": "Prasetel model baru", "newPresetHelp": "Simpan model yang dapat digunakan kembali beserta pengaturan generasinya.", - "presets": "Preset model", - "editPreset": "Edit preset", - "presetName": "Nama preset", + "presets": "Prasetel model", + "editPreset": "Ubah prasetel", + "presetName": "Nama prasetel", "presetNameHelp": "Nama singkat yang digunakan di pengaturan model.", "presetNamePlaceholder": "Menulis cepat", "advancedOptions": "Opsi lanjutan", @@ -386,22 +409,22 @@ "temperature": "Temperatur", "reasoningEffort": "Upaya penalaran", "convertTitle": "Konversi pengaturan model saat ini", - "convertHelp": "Ubah model utama dan cadangan yang ada menjadi preset agar urutannya dapat dikelola di sini.", + "convertHelp": "Ubah model utama dan cadangan yang ada menjadi prasetel agar urutannya dapat dikelola di sini.", "converting": "Mengonversi...", - "convertAction": "Konversi ke preset", + "convertAction": "Konversi ke prasetel", "dragToReorder": "Seret untuk mengurutkan ulang", "moveUp": "Naikkan", "moveDown": "Turunkan", - "removeFromOrder": "Nonaktifkan preset", + "removeFromOrder": "Nonaktifkan prasetel", "inCallOrder": "Dalam urutan pemanggilan", "disabled": "Nonaktif", - "noPresets": "Belum ada preset model", - "noPresetsHelp": "Buat preset, lalu tambahkan ke urutan pemanggilan.", - "removeBeforeDelete": "Hapus preset ini dari urutan pemanggilan sebelum menghapusnya.", + "noPresets": "Belum ada prasetel model", + "noPresetsHelp": "Buat prasetel, lalu tambahkan ke urutan pemanggilan.", + "removeBeforeDelete": "Hapus prasetel ini dari urutan pemanggilan sebelum menghapusnya.", "providerSetupRequired": "Penyedia perlu dikonfigurasi", - "configureProviderBeforeSaving": "Konfigurasikan penyedia ini sebelum menyimpan preset.", - "deletePresetTitle": "Hapus preset model?", - "deletePresetHelp": "Preset “{{name}}” akan dihapus. Kredensial penyedia tidak terpengaruh.", + "configureProviderBeforeSaving": "Konfigurasikan penyedia ini sebelum menyimpan prasetel.", + "deletePresetTitle": "Hapus prasetel model?", + "deletePresetHelp": "Prasetel “{{name}}” akan dihapus. Kredensial penyedia tidak terpengaruh.", "searchModels": "Cari atau ketik ID model", "useCustomModel": "Gunakan", "loadingModels": "Memuat model...", @@ -458,11 +481,11 @@ }, "mcp": { "allCategories": "Semua kategori", - "summary": "{{installed}} dari {{total}} preset diaktifkan", + "summary": "{{installed}} dari {{total}} prasetel diaktifkan", "filterAll": "Semua", "filterInstalled": "Aktif", "filterNotInstalled": "Tidak aktif", - "searchPlaceholder": "Cari preset MCP", + "searchPlaceholder": "Cari prasetel MCP", "moreOptions": "Opsi MCP lainnya", "moreOptionsSubtitle": "Tambahkan server khusus atau impor mcp.json.", "customTitle": "MCP khusus", @@ -473,9 +496,9 @@ "serverUrl": "URL", "transport": "Transport", "command": "Perintah", - "args": "Args JSON", - "headers": "Headers JSON", - "env": "Env JSON", + "args": "Argumen JSON", + "headers": "Header JSON", + "env": "Lingkungan JSON", "timeout": "Batas waktu alat", "advancedOptions": "Opsi lanjutan", "hideAdvanced": "Sembunyikan lanjutan", @@ -484,8 +507,8 @@ "importConfig": "Impor", "restartRequired": "Mulai ulang nanobot untuk menyambungkan alat MCP yang diperbarui.", "toolsFound": "{{count}} alat", - "loading": "Memuat preset MCP...", - "empty": "Tidak ada preset MCP yang cocok dengan filter ini.", + "loading": "Memuat prasetel MCP...", + "empty": "Tidak ada prasetel MCP yang cocok dengan filter ini.", "openDocs": "Buka dokumentasi", "test": "Uji", "remove": "Hapus", @@ -503,6 +526,7 @@ "statusMissingCredentials": "Butuh kunci", "statusMissingDependency": "Butuh dependensi", "statusComingSoon": "Segera hadir", + "comingSoon": "Segera hadir", "statusNotInstalled": "Tidak aktif", "toolScope": "Alat", "allTools": "Semua", @@ -544,7 +568,7 @@ "restartRequired": "Mulai ulang nanobot untuk menerapkan aplikasi dan fitur yang diperbarui." }, "channels": { - "description": "Hubungkan nanobot ke aplikasi chat. Memasang dukungan hanya menambahkan paket integrasi; sebagian besar kanal tetap memerlukan token atau pengaturan workspace.", + "description": "Hubungkan nanobot ke aplikasi chat. Memasang dukungan hanya menambahkan paket integrasi; sebagian besar kanal tetap memerlukan token atau pengaturan ruang kerja.", "caption": "{{enabled}} aktif · {{total}} kanal", "searchPlaceholder": "Cari kanal", "backToChannels": "Semua kanal", @@ -554,7 +578,7 @@ "restartRequired": "Mulai ulang nanobot untuk menerapkan dukungan kanal yang diperbarui.", "requires": "Memerlukan: {{requirements}}", "setUp": "Siapkan", - "setupGuide": "Panduan setup", + "setupGuide": "Panduan penyiapan", "setupSummary": "Mengaktifkan hanya menyalakan dukungan nanobot. Tambahkan kredensial platform, lalu mulai ulang nanobot.", "configKeys": "Kunci konfigurasi", "enable": "Aktifkan kanal", @@ -565,6 +589,8 @@ "advanced": "Lanjutan", "checkAndEnable": "Periksa dan aktifkan", "checkConnection": "Periksa koneksi", + "connectionChecks": "Pemeriksaan koneksi", + "open": "Buka", "checkedAndEnabled": "Sudah diperiksa dan diaktifkan.", "checking": "Memeriksa...", "checkOnly": "Periksa saja", @@ -655,11 +681,13 @@ "runNow": "Jalankan sekarang", "pause": "Jeda", "resume": "Lanjutkan", - "edit": "Edit", + "edit": "Ubah", "delete": "Hapus", "protected": "Terlindungi", - "editTitle": "Edit otomasi", + "editTitle": "Ubah otomasi", "save": "Simpan", + "commandCopied": "Disalin", + "copyCommand": "Salin", "deleteTitle": "Hapus otomasi", "deleteDescription": "Ini menghapus {{name}} dari penyimpanan cron. Pesan chat sebelumnya tetap ada di sesi.", "cancel": "Batal", @@ -719,6 +747,7 @@ "fields": { "name": "Nama", "message": "Pesan", + "command": "Perintah", "scheduleType": "Jenis jadwal", "every": "Setiap", "unit": "Unit", @@ -753,11 +782,11 @@ "signInAgain": "Masuk lagi", "signOut": "Keluar", "signedInAs": "Masuk sebagai {{account}}", - "signInHelp": "Inicia sesión desde este dispositivo; no se guarda API key en config.", + "signInHelp": "Masuk dari perangkat ini; kunci API tidak disimpan di config.", "remoteSignInHelp": "Pilih Masuk untuk membuka xAI di komputer Anda, lalu tempel kode otorisasi yang ditampilkan setelah masuk.", "codexRemoteSignInHelp": "Masuk melalui browser ini, lalu tempel URL callback localhost lengkap kembali ke nanobot.", "signInRequired": "Perlu masuk", - "signInBeforeSaving": "Masuk ke penyedia ini sebelum menyimpan preset.", + "signInBeforeSaving": "Masuk ke penyedia ini sebelum menyimpan prasetel.", "signedIn": "Sudah masuk", "notSignedIn": "Belum masuk", "proxyLabel": "Proksi jaringan", @@ -776,56 +805,56 @@ "finishSignIn": "Selesaikan masuk" }, "skills": { - "description": "Tinjau skill instruksi yang dapat dimuat agent ini selama percakapan.", + "description": "Tinjau keterampilan instruksi yang dapat dimuat agen ini selama percakapan.", "caption": "{{available}} tersedia · {{total}} total", - "views": "Tampilan skill", + "views": "Tampilan keterampilan", "installedTab": "Terpasang", "discoverTab": "Temukan", "customGroup": "Kustom", "builtinGroup": "Bawaan", "otherGroup": "Lainnya", - "searchInstalled": "Cari skill terpasang", + "searchInstalled": "Cari keterampilan terpasang", "filterAll": "Semua", "filterEnabled": "Aktif", "filterDisabled": "Nonaktif", - "noMatching": "Tidak ada skill yang cocok.", + "noMatching": "Tidak ada keterampilan yang cocok.", "statusDisabled": "Nonaktif", "statusEnabled": "Aktif", "statusNeedsSetup": "Perlu penyiapan", "showLess": "Tampilkan lebih sedikit", "showMore": "Tampilkan lebih banyak", - "enabledControl": "Gunakan skill ini", - "enabledDescription": "Izinkan agen memuat skill ini saat persyaratannya terpenuhi.", + "enabledControl": "Gunakan keterampilan ini", + "enabledDescription": "Izinkan agen memuat keterampilan ini saat persyaratannya terpenuhi.", "enableSkill": "Aktifkan {{name}}", "disableSkill": "Nonaktifkan {{name}}", - "updateFailed": "Skill ini tidak dapat diperbarui.", - "deleteTitle": "Hapus skill", - "deleteDescription": "Hapus skill ini dari workspace saat ini.", + "updateFailed": "Keterampilan ini tidak dapat diperbarui.", + "deleteTitle": "Hapus keterampilan", + "deleteDescription": "Hapus keterampilan ini dari ruang kerja saat ini.", "deleteAction": "Hapus", - "deleteFailed": "Skill ini tidak dapat dihapus.", + "deleteFailed": "Keterampilan ini tidak dapat dihapus.", "deleteConfirmTitle": "Hapus {{name}}?", - "deleteConfirmDescription": "Tindakan ini menghapus file skill dari workspace saat ini dan tidak dapat dibatalkan.", - "deleteConfirmAction": "Hapus skill", - "instructionsTitle": "Petunjuk skill", + "deleteConfirmDescription": "Tindakan ini menghapus file keterampilan dari ruang kerja saat ini dan tidak dapat dibatalkan.", + "deleteConfirmAction": "Hapus keterampilan", + "instructionsTitle": "Petunjuk keterampilan", "setupRequired": "Perlu penyiapan", "setupDescription": "Instal dependensi yang belum tersedia di mesin yang menjalankan nanobot, lalu periksa lagi.", "copySetupCommand": "Salin perintah penyiapan", "checkAgain": "Periksa lagi", - "marketplaceSearchFailed": "Tidak dapat mencari marketplace skill.", - "marketplaceInstallFailed": "Tidak dapat memasang skill ini.", - "marketplaceSearchPlaceholder": "Cari skill", - "marketplaceSearchLabel": "Cari skill", + "marketplaceSearchFailed": "Tidak dapat mencari marketplace keterampilan.", + "marketplaceInstallFailed": "Tidak dapat memasang keterampilan ini.", + "marketplaceSearchPlaceholder": "Cari keterampilan", + "marketplaceSearchLabel": "Cari keterampilan", "marketplaceSearching": "Mencari", - "marketplaceProviderFilter": "Sumber skill", + "marketplaceProviderFilter": "Sumber keterampilan", "marketplaceProviderAll": "Semua", "marketplaceTrendingTitle": "Tren per marketplace", "marketplaceTrendingDescription": "Setiap marketplace mempertahankan peringkat dan metrik pemasangannya sendiri.", "marketplaceViewAll": "Lihat semua", - "marketplaceTrendingUnavailable": "Skill populer sementara tidak tersedia.", - "marketplaceEmpty": "Tidak ada skill yang ditemukan untuk “{{query}}”.", + "marketplaceTrendingUnavailable": "Keterampilan populer sementara tidak tersedia.", + "marketplaceEmpty": "Tidak ada keterampilan yang ditemukan untuk “{{query}}”.", "marketplaceConfirmTitle": "Pasang {{name}}?", - "marketplaceConfirmDescription": "Skill pihak ketiga ini berasal dari {{provider}} ({{source}}) dan mungkin berisi instruksi atau skrip yang dapat dijalankan.", - "marketplaceConfirmInstall": "Pasang skill", + "marketplaceConfirmDescription": "Keterampilan pihak ketiga ini berasal dari {{provider}} ({{source}}) dan mungkin berisi instruksi atau skrip yang dapat dijalankan.", + "marketplaceConfirmInstall": "Pasang keterampilan", "marketplaceOpen": "Buka {{name}} di {{provider}}", "marketplaceOpenProvider": "Buka {{provider}}", "marketplaceInstalls24h": "{{formattedCount}} pemasangan / 24 jam", @@ -836,16 +865,16 @@ "marketplaceInstall": "Pasang", "marketplaceNoTrend": "Belum ada tren", "marketplaceTrendLabel": "Tren pemasangan 8 minggu", - "featured": "Skill agent", - "empty": "Tidak ada skill yang tersedia.", + "featured": "Keterampilan agen", + "empty": "Tidak ada keterampilan yang tersedia.", "sourceWorkspace": "Kustom", "sourceBuiltin": "Bawaan", "statusAvailable": "Tersedia", "statusUnavailable": "Tidak tersedia", "unavailableReason": "Kurang: {{reason}}", "openDetails": "Buka detail {{name}}", - "loadingDetail": "Memuat detail skill...", - "loadFailed": "Tidak dapat memuat detail skill.", + "loadingDetail": "Memuat detail keterampilan...", + "loadFailed": "Tidak dapat memuat detail keterampilan.", "descriptionTitle": "Deskripsi", "source": "Sumber", "status": "Status", @@ -863,7 +892,7 @@ "voice": { "selectProvider": "Pilih penyedia", "configureProvider": "Konfigurasi penyedia", - "languageAuto": "Auto" + "languageAuto": "Otomatis" } }, "chat": { @@ -877,34 +906,34 @@ "actions": "Aksi topik untuk {{title}}", "newInProject": "Mulai topik baru di {{project}}", "activity": { - "running": "Agent running", - "complete": "Agent finished", - "updated": "New activity" + "running": "Agen sedang berjalan", + "complete": "Agen selesai", + "updated": "Aktivitas baru" }, - "pin": "Pin", - "unpin": "Unpin", - "rename": "Rename", + "pin": "Sematkan", + "unpin": "Lepas sematan", + "rename": "Ganti nama", "renameTitle": "Ganti nama topik", "renameDescription": "Pilih nama lokal di bilah sisi untuk topik ini.", "renamePlaceholder": "Nama topik", - "renameProjectTitle": "Rename project", - "renameProjectDescription": "Choose a local sidebar name for this project.", - "renameProjectPlaceholder": "Project name", - "renameSave": "Save", - "archive": "Archive", - "unarchive": "Unarchive", - "showArchived": "Show archived", - "hideArchived": "Hide archived", + "renameProjectTitle": "Ganti nama proyek", + "renameProjectDescription": "Pilih nama lokal untuk proyek ini di bilah sisi.", + "renameProjectPlaceholder": "Nama proyek", + "renameSave": "Simpan", + "archive": "Arsipkan", + "unarchive": "Batalkan arsip", + "showArchived": "Tampilkan yang diarsipkan", + "hideArchived": "Sembunyikan yang diarsipkan", "delete": "Hapus", "newChat": "Topik baru", "groups": { - "pinned": "Pinned", + "pinned": "Disematkan", "all": "Topik", - "projects": "Projects", - "today": "Today", - "yesterday": "Yesterday", - "earlier": "Earlier", - "archived": "Archived" + "projects": "Proyek", + "today": "Hari ini", + "yesterday": "Kemarin", + "earlier": "Sebelumnya", + "archived": "Diarsipkan" } }, "deleteConfirm": { @@ -931,7 +960,7 @@ } }, "connection": { - "idle": "Idle", + "idle": "Tidak aktif", "connecting": "Menghubungkan…", "open": "Terhubung", "reconnecting": "Menyambung ulang…", @@ -957,8 +986,8 @@ "prompt": "Bantu saya menganalisis data ini dan soroti pola yang paling penting." }, "brainstorm": { - "title": "Brainstorm ide", - "prompt": "Brainstorm beberapa ide praktis dan tradeoff untuk masalah ini." + "title": "Curah gagasan", + "prompt": "Curahkan beberapa ide praktis dan pertimbangannya untuk masalah ini." }, "code": { "title": "Tulis kode", @@ -970,7 +999,7 @@ }, "more": { "title": "Lainnya", - "prompt": "Tunjukkan beberapa cara berguna Anda dapat membantu di workspace ini." + "prompt": "Tunjukkan beberapa cara berguna Anda dapat membantu di ruang kerja ini." } }, "imageQuickActions": { @@ -984,19 +1013,19 @@ }, "poster": { "title": "Buat poster", - "prompt": "Buat konsep poster yang rapi untuk asisten AI pribadi, komposisi modern, hierarki visual kuat, cocok untuk landing page." + "prompt": "Buat konsep poster yang rapi untuk asisten AI pribadi, komposisi modern, hierarki visual kuat, cocok untuk halaman arahan." }, "product": { - "title": "Mockup produk", - "prompt": "Buat gambar mockup produk yang bersih untuk aplikasi web AI percakapan, antarmuka minimal, pencahayaan premium, bingkai perangkat realistis." + "title": "Maket produk", + "prompt": "Buat gambar maket produk yang bersih untuk aplikasi web AI percakapan, antarmuka minimal, pencahayaan premium, bingkai perangkat realistis." }, "portrait": { "title": "Potret bergaya", "prompt": "Buat potret bergaya dari pendamping AI yang ramah, pencahayaan lembut, detail tetapi tetap mudah didekati, gaya ilustrasi modern." }, "edit": { - "title": "Edit gambar", - "prompt": "Bantu saya mengedit gambar. Minta saya mengunggah atau menyebutkan gambar terlebih dahulu, lalu buat hasil editnya." + "title": "Ubah gambar", + "prompt": "Bantu saya mengubah gambar. Minta saya mengunggah atau menyebutkan gambar terlebih dahulu, lalu buat hasil ubahannya." } } }, @@ -1055,21 +1084,21 @@ "label": "Panduan antrean", "guide": "Pandu", "delete": "Hapus panduan", - "edit": "Edit panduan", + "edit": "Ubah panduan", "drag": "Seret untuk mengurutkan" }, "attachImage": "Lampirkan file", "imageMode": { "label": "Buat gambar", "toggle": "Alihkan mode pembuatan gambar", - "placeholder": "Deskripsikan atau edit gambar…", + "placeholder": "Deskripsikan atau ubah gambar…", "aspectAria": "Rasio aspek gambar", "aspectLabel": "Rasio gambar", "aspect": { "auto": "Otomatis", "1_1": "Persegi 1:1", "3_4": "Potret 3:4", - "9_16": "Story 9:16", + "9_16": "Cerita 9:16", "4_3": "Lanskap 4:3", "16_9": "Lebar 16:9" } @@ -1109,7 +1138,7 @@ }, "stop": { "title": "Hentikan tugas saat ini", - "description": "Batalkan giliran agent yang sedang aktif di chat ini." + "description": "Batalkan giliran agen yang sedang aktif di chat ini." }, "restart": { "title": "Mulai ulang nanobot", @@ -1117,11 +1146,11 @@ }, "status": { "title": "Tampilkan status", - "description": "Tampilkan status runtime, provider, dan channel." + "description": "Tampilkan status waktu proses, penyedia, dan kanal." }, "model": { "title": "Model", - "description": "Tampilkan atau ganti preset model aktif." + "description": "Tampilkan atau ganti prasetel model aktif." }, "history": { "title": "Tampilkan riwayat", @@ -1141,15 +1170,15 @@ }, "dream_prompt": { "title": "Memori Dream", - "description": "Atur cara Dream menyusun memori workspace ini." + "description": "Atur cara Dream menyusun memori ruang kerja ini." }, "goal": { "title": "Tujuan jangka panjang", "description": "Instruksikan agen memperlakukan ini sebagai tujuan multi-langkah yang berkelanjutan." }, "trigger": { - "title": "Buat trigger lokal", - "description": "Buat trigger CLI yang terikat ke sesi chat ini." + "title": "Buat pemicu lokal", + "description": "Buat pemicu CLI yang terikat ke sesi chat ini." }, "help": { "title": "Tampilkan bantuan", @@ -1173,7 +1202,7 @@ }, "encoding": "Memproses…", "remove": "Hapus lampiran", - "normalizedSizeHint": "{{orig}} → {{current}} (auto)", + "normalizedSizeHint": "{{orig}} → {{current}} (otomatis)", "textTooLarge": "Teks pesan terlalu besar (maksimum {{max}})", "imageRejected": { "unsupported_type": "Tipe file tidak didukung", @@ -1190,32 +1219,35 @@ "mentions": { "ariaLabel": "Aplikasi", "label": "Aplikasi", - "cliGroup": "App CLI", + "cliGroup": "Aplikasi CLI", "mcpGroup": "Layanan MCP", "cliBadge": "CLI", "mcpBadge": "MCP", "cliDescription": "Gunakan @{{name}} sebagai aplikasi CLI lokal", - "mcpDescription": "Gunakan @{{name}} sebagai server MCP" + "mcpDescription": "Gunakan @{{name}} sebagai server MCP", + "cliTitle": "Aplikasi CLI: {{name}}", + "mcpTitle": "Server MCP: {{name}}" }, "workspace": { - "accessAria": "Mode akses workspace", + "accessAria": "Mode akses ruang kerja", "projectAria": "Pilih proyek", "projectPlaceholder": "Pilih proyek", - "default": "Izin default", - "defaultShort": "Default", + "default": "Izin bawaan", + "defaultShort": "Bawaan", "full": "Akses penuh", "fullShort": "Penuh" } }, "scrollToBottom": "Gulir ke bawah", "loadEarlier": "Muat pesan sebelumnya", - "forkedFromHistory": "Fork dari riwayat", + "forkedFromHistory": "Cabang dari riwayat", "promptNavigator": { - "open": "Buka navigator prompt", - "title": "Prompt", - "search": "Cari prompt", - "noResults": "Tidak ada prompt yang cocok.", - "jumpTo": "Lompat ke prompt: {{label}}" + "open": "Buka navigasi instruksi", + "title": "Instruksi", + "search": "Cari instruksi", + "noResults": "Tidak ada instruksi yang cocok.", + "jumpTo": "Lompat ke instruksi: {{label}}", + "railAria": "Navigasi instruksi pengguna" } }, "message": { @@ -1239,19 +1271,27 @@ "agentActivityLiveSummary": "Berjalan… · {{reasoning}} langkah · {{tools}} panggilan alat", "agentActivityLiveToolsOnly": "Berjalan… · {{tools}} panggilan alat", "imageAttachment": "Lampiran gambar", + "videoAttachment": "Lampiran video", + "fileAttachment": "Lampiran file", + "attachmentUnavailable": "Lampiran tidak tersedia", + "dataTable": "Tabel data", + "fileEditPreparing": "Menyiapkan perubahan file…", + "openLink": "Buka tautan: {{label}}", + "openAttachment": "Buka {{name}}", + "skill": "Keterampilan: {{name}}", "askAboutSelection": "Tanyakan tentang ini", - "forkFromHere": "Fork", + "forkFromHere": "Buat cabang", "copyReply": "Salin", "copiedReply": "Disalin", "turnLatencyTitle": "Waktu respons (ujung ke ujung)", - "fileEditViewDiff": "Lihat diff", - "fileEditViewLargeDiff": "Lihat diff besar", + "fileEditViewDiff": "Lihat perbedaan", + "fileEditViewLargeDiff": "Lihat perbedaan besar", "fileEditDiffLineCount": "{{count}} baris", "fileEditUnchangedLinesHidden": "{{count}} baris tidak berubah disembunyikan", "fileEditShowMoreLines": "Tampilkan {{count}} baris lagi", "fileEditShowFewerLines": "Tampilkan lebih sedikit baris", "fileEditOpenFile": "Buka file", - "fileEditDiffTruncated": "Diff dipotong. Buka file untuk melihat perubahan lengkap.", + "fileEditDiffTruncated": "Perbedaan dipotong. Buka file untuk melihat perubahan lengkap.", "activityThinkingFor": "Berpikir selama {{duration}}", "activityThought": "Selesai berpikir", "activityThoughtFor": "Selesai berpikir dalam {{duration}}", @@ -1279,6 +1319,7 @@ }, "filePreview": { "aria": "Pratinjau file", + "breadcrumb": "Jalur file", "close": "Tutup pratinjau file", "loading": "Memuat pratinjau...", "failed": "Tidak dapat mempratinjau file ini.", @@ -1293,7 +1334,10 @@ "copied": "Tersalin" }, "common": { - "dismiss": "Tutup" + "dismiss": "Tutup", + "close": "Tutup", + "current": "Saat ini", + "cancel": "Batal" }, "errors": { "messageTooBig": { @@ -1301,8 +1345,8 @@ "body": "Server menolak pesan terakhir karena melebihi batas ukuran. Hapus beberapa gambar atau gunakan berkas yang lebih kecil, lalu coba lagi." }, "workspaceScopeRejected": { - "title": "Workspace tidak berubah", - "body": "Gateway menolak proyek atau mode akses yang diminta, jadi Nanobot tetap memakai workspace sebelumnya." + "title": "Ruang kerja tidak berubah", + "body": "Gateway menolak proyek atau mode akses yang diminta, jadi Nanobot tetap memakai ruang kerja sebelumnya." }, "turnRejected": { "title": "Pesan tidak terkirim", @@ -1311,7 +1355,7 @@ }, "workspace": { "dialog": { - "defaultProject": "Workspace default", + "defaultProject": "Ruang kerja bawaan", "manual": "Tempel path", "manualPlaceholder": "/Users/name/project", "usePath": "Gunakan path", diff --git a/webui/src/i18n/locales/ja/common.json b/webui/src/i18n/locales/ja/common.json index 7abd1984d..fd3a809e6 100644 --- a/webui/src/i18n/locales/ja/common.json +++ b/webui/src/i18n/locales/ja/common.json @@ -38,6 +38,15 @@ }, "meta": { "description": "nanobot Web UI — nanobot ワークスペースと会話します。" + }, + "pairing": { + "title": "チャットユーザーをペアリング", + "description": "チャットに表示されたペアリングコードを入力してください。", + "code": "ペアリングコード", + "matched": "{{channel}} と一致しました。接続中…", + "expiresInline": "コードの有効期限: {{expires}}。", + "queueCount": "{{count}} 件待機中", + "noMatch": "このコードに一致する保留中のリクエストはありません。" } }, "sidebar": { @@ -162,9 +171,9 @@ "model": "このプリセットで使用するモデルを選択します。", "configPath": "現在ゲートウェイが使用している設定ファイルです。", "selectedPreset": "名前付きプリセットはここでは読み取り専用です。編集するには config.json を変更してください。", - "presetModel": "Default に切り替えると、WebUI からモデルとプロバイダーを編集できます。", + "presetModel": "既定に切り替えると、WebUI からモデルとプロバイダーを編集できます。", "density": "このブラウザーにのみ保存されます。", - "activityMode": "既定で表示する agent アクティビティの詳細量を選択します。", + "activityMode": "既定で表示するエージェントアクティビティの詳細量を選択します。", "fileEditDisplay": "ファイル編集アクティビティを行数または差分で表示します。", "codeWrap": "小さな画面でも長いコード行を読みやすくします。", "maxResults": "各 web_search 呼び出しで返す結果数です。", @@ -172,13 +181,13 @@ "jinaReader": "利用可能な場合、web_fetch に Jina Reader を使います。", "imageGeneration": "画像プロバイダーが設定済みのとき、チャットで generate_image を有効にします。", "imageProvider": "generate_image で使用する登録済みプロバイダーを選択します。", - "imageProviderStatus": "画像生成は「プロバイダー」の認証情報を再利用します。", + "imageProviderStatus": "画像生成はプロバイダー設定の認証情報を再利用します。", "imageModel": "選択した画像プロバイダーへ送信するモデル名です。", "defaultAspectRatio": "プロンプトで比率が指定されていない場合に使用します。", "defaultImageSize": "対応しているプロバイダーへ送信するサイズ指定です。", "maxImagesPerTurn": "1 回の generate_image リクエストで生成できる画像数の上限です。", "timezone": "スケジュールと時刻を考慮する返信に使用します。", - "localServiceAccess": "Full Access の shell コマンドが localhost サービスにアクセスできるようにします。", + "localServiceAccess": "フルアクセスの shell コマンドが localhost サービスにアクセスできるようにします。", "webuiDefaultAccess": "プロジェクト固有の権限がない Web チャットで使用します。", "securityManagedControls": "Web 取得は常にローカル、プライベート、メタデータサービスを保護します。コアチャネルの安全性は config.json で管理されます。", "currentModel": "新しい返信に使用します。", @@ -189,7 +198,7 @@ "cliAppsFilter": "アプリ、カテゴリ、機能で検索します。", "logs": "ネイティブエンジンのログフォルダーを開きます。", "diagnostics": "サポート用の小さなランタイムレポートを書き出します。", - "localServiceAccessNative": "Full Access の shell コマンドがこの Mac 上のサービスにアクセスできるようにします。", + "localServiceAccessNative": "フルアクセスの shell コマンドがこの Mac 上のサービスにアクセスできるようにします。", "webuiDefaultAccessNative": "プロジェクト固有の権限がないネイティブチャットで使用します。", "contextWindow": "このモデル設定で使う既定のコンテキスト予算を選択します。", "transcription": "マイク入力を送信前に文字起こしします。チャネルの音声メッセージも同じ設定を使います。", @@ -208,12 +217,12 @@ "ready": "準備完了", "privateEngine": "プライベートエンジン", "unixSocket": "Unix ソケット", - "defaultWorkspace": "デフォルトワークスペース", + "defaultWorkspace": "既定のワークスペース", "comfortable": "標準", "compact": "コンパクト", "auto": "自動", "expanded": "展開", - "default": "デフォルト", + "default": "既定", "summary": "概要", "diff": "差分", "collapsedDiff": "折りたたみ差分", @@ -224,7 +233,10 @@ "configured": "設定済み", "notConfigured": "未設定", "pending": "保留中", - "restartingEngine": "再起動中" + "restartingEngine": "再起動中", + "checking": "確認中", + "running": "実行中", + "needsSetup": "設定が必要" }, "status": { "loading": "設定を読み込んでいます...", @@ -252,30 +264,31 @@ "deleting": "削除中...", "edit": "編集", "cancel": "キャンセル", + "dismiss": "閉じる", "open": "開く", "export": "書き出す", "opening": "開いています...", "exporting": "書き出しています..." }, "byok": { - "description": "自分の provider キーを使います。Nanobot は現在の config から値を読み込み、設定済みの provider だけをモデルプリセットで使用できます。", + "description": "自分のプロバイダーキーを使います。Nanobot は現在の設定から値を読み込み、設定済みのプロバイダーだけをモデルプリセットで使用できます。", "configured": "設定済み", "notConfigured": "未設定", "configuredSection": "設定済み", "notConfiguredSection": "未設定", "showMore": "さらに {{count}} 件表示", "showLess": "折りたたむ", - "apiKey": "API key", - "apiBase": "API base", - "apiKeyPlaceholder": "API key を入力", + "apiKey": "API キー", + "apiBase": "API ベース", + "apiKeyPlaceholder": "API キーを入力", "apiKeyConfiguredPlaceholder": "空欄のままなら現在の key を保持", "configuredKeyHint": "設定済み key", - "apiBasePlaceholder": "provider の既定値を使用", - "apiKeyRequired": "この provider を設定するには API key が必要です。", - "showApiKey": "API key を表示", - "hideApiKey": "API key を隠す", - "noConfiguredProviders": "設定済み provider がありません", - "configureFirst": "先に BYOK で provider を設定してください。", + "apiBasePlaceholder": "プロバイダーの既定値を使用", + "apiKeyRequired": "このプロバイダーを設定するには API キーが必要です。", + "showApiKey": "API キーを表示", + "hideApiKey": "API キーを隠す", + "noConfiguredProviders": "設定済みプロバイダーがありません", + "configureFirst": "先に BYOK でプロバイダーを設定してください。", "openByok": "BYOK を開く", "tabs": { "ariaLabel": "BYOK 認証情報タイプ", @@ -283,20 +296,20 @@ "webSearch": "ウェブ検索" }, "webSearch": { - "provider": "検索 provider", - "providerHelp": "web search ツールで使うバックエンドを選択します。", - "selectProvider": "provider を選択", + "provider": "検索プロバイダー", + "providerHelp": "Web 検索ツールで使うバックエンドを選択します。", + "selectProvider": "プロバイダーを選択", "credentials": "認証情報", "noCredentialRequired": "key は不要", - "noCredentialHelp": "DuckDuckGo は API key を保存せずに使えます。", + "noCredentialHelp": "DuckDuckGo は API キーを保存せずに使えます。", "apiKeyHelp": "config に保存され、保存後はマスク表示されます。", - "baseUrl": "Base URL", + "baseUrl": "ベース URL", "baseUrlHelp": "SearXNG には自分のインスタンス URL が必要です。", "baseUrlPlaceholder": "https://search.example.com", - "apiKeyRequired": "この検索 provider には API key が必要です。", - "baseUrlRequired": "SearXNG には Base URL が必要です。", + "apiKeyRequired": "この検索プロバイダーには API キーが必要です。", + "baseUrlRequired": "SearXNG にはベース URL が必要です。", "missingCredential": "保存する前に必要な認証情報を入力してください。", - "saveHint": "変更は新しい web search リクエストに適用されます。" + "saveHint": "変更は新しい Web 検索リクエストに適用されます。" } }, "overview": { @@ -310,13 +323,13 @@ "workspace": "ワークスペース" }, "usage": { - "title": "Token アクティビティ", - "shortTitle": "Token Usage", - "subtitle": "直近 12 か月にプロバイダーが報告した使用量。", - "empty": "新しいモデル返信の後に token アクティビティが表示されます。", - "totalTokens": "累計 Token 数", - "peakTokens": "ピーク Token 数", - "thirtyDayTokens": "30 日 Token 数", + "title": "トークンアクティビティ", + "shortTitle": "トークン使用量", + "subtitle": "直近 12 か月にプロバイダーが報告したトークン使用量。", + "empty": "新しいモデル返信の後にトークンアクティビティが表示されます。", + "totalTokens": "累計トークン数", + "peakTokens": "ピークトークン数", + "thirtyDayTokens": "30 日間のトークン数", "currentStreak": "現在の連続日数", "longestStreak": "最長連続日数", "daysValue": "{{count}} 日", @@ -325,7 +338,7 @@ "requests": "リクエスト", "estimated": "推定", "includesEstimates": "推定を含む", - "cellTitle": "{{date}}: {{tokens}} tokens, {{requests}} 件のリクエスト", + "cellTitle": "{{date}}: {{tokens}} トークン、{{requests}} 件のリクエスト", "sources": { "user": "チャット", "api": "API", @@ -358,9 +371,19 @@ "selectProvider": "プロバイダーを選択", "selectAspect": "比率を選択", "selectSize": "サイズを選択", + "selectModel": "画像モデルを選択", + "searchOrTypeModel": "モデル ID を検索または入力", + "typeModelId": "このプロバイダーが対応するモデル ID を入力してください。", "configureProvider": "プロバイダーを設定", "missingCredential": "画像生成を有効にする前に、このプロバイダーを設定してください。" }, + "capabilities": { + "providerSupport": "プロバイダーサポート", + "providerInstallOnSave": "このプロバイダーを保存すると、必要なサポートが自動的にインストールされます。", + "searchSupport": "検索プロバイダーサポート", + "searchInstallOnSave": "保存時に Olostep のサポートが自動的にインストールされます。", + "installing": "サポートをインストール中..." + }, "models": { "selectModel": "モデルを選択", "addConfiguration": "設定を追加", @@ -383,7 +406,7 @@ "advancedOptions": "詳細オプション", "advancedSummary": "コンテキスト {{context}} · 最大 {{max}} トークン", "maxTokens": "最大出力トークン", - "temperature": "Temperature", + "temperature": "温度", "reasoningEffort": "推論の強度", "convertTitle": "現在のモデル設定を変換", "convertHelp": "既存のプライマリモデルとフォールバックモデルをプリセットに変換し、ここで順序を管理できるようにします。", @@ -473,9 +496,9 @@ "serverUrl": "URL", "transport": "トランスポート", "command": "コマンド", - "args": "Args JSON", - "headers": "Headers JSON", - "env": "Env JSON", + "args": "引数 JSON", + "headers": "ヘッダー JSON", + "env": "環境変数 JSON", "timeout": "ツールのタイムアウト", "advancedOptions": "詳細オプション", "hideAdvanced": "詳細を隠す", @@ -503,6 +526,7 @@ "statusMissingCredentials": "キーが必要", "statusMissingDependency": "依存関係が必要", "statusComingSoon": "近日公開", + "comingSoon": "近日公開", "statusNotInstalled": "未有効", "toolScope": "ツール", "allTools": "すべて", @@ -565,6 +589,8 @@ "advanced": "詳細設定", "checkAndEnable": "確認して有効化", "checkConnection": "接続を確認", + "connectionChecks": "接続チェック", + "open": "開く", "checkedAndEnabled": "確認して有効化しました。", "checking": "確認中...", "checkOnly": "確認のみ", @@ -660,6 +686,8 @@ "protected": "保護済み", "editTitle": "自動タスクを編集", "save": "保存", + "commandCopied": "コピーしました", + "copyCommand": "コピー", "deleteTitle": "自動タスクを削除", "deleteDescription": "{{name}} を cron ストアから削除します。過去のチャットメッセージはセッションに残ります。", "cancel": "キャンセル", @@ -719,6 +747,7 @@ "fields": { "name": "名前", "message": "メッセージ", + "command": "コマンド", "scheduleType": "スケジュール種別", "every": "間隔", "unit": "単位", @@ -753,7 +782,7 @@ "signInAgain": "再度サインイン", "signOut": "サインアウト", "signedInAs": "{{account}} としてサインイン済み", - "signInHelp": "このデバイスからサインインします。API key は config に保存されません。", + "signInHelp": "このデバイスからサインインします。API キーは設定に保存されません。", "remoteSignInHelp": "「サインイン」を選択して自分のコンピューターで xAI を開き、サインイン後に表示される認証コードを貼り付けてください。", "codexRemoteSignInHelp": "このブラウザーでサインインし、localhost の完全なコールバック URL を nanobot に貼り付けてください。", "signInRequired": "サインインが必要です", @@ -877,34 +906,34 @@ "actions": "「{{title}}」のトピック操作", "newInProject": "「{{project}}」で新しいトピックを開始", "activity": { - "running": "Agent running", - "complete": "Agent finished", - "updated": "New activity" + "running": "エージェント実行中", + "complete": "エージェント完了", + "updated": "新しいアクティビティ" }, - "pin": "Pin", - "unpin": "Unpin", - "rename": "Rename", + "pin": "ピン留め", + "unpin": "ピン留めを解除", + "rename": "名前を変更", "renameTitle": "トピック名を変更", "renameDescription": "このトピックのサイドバー表示名を選択します。", "renamePlaceholder": "トピック名", - "renameProjectTitle": "Rename project", - "renameProjectDescription": "Choose a local sidebar name for this project.", - "renameProjectPlaceholder": "Project name", - "renameSave": "Save", - "archive": "Archive", - "unarchive": "Unarchive", - "showArchived": "Show archived", - "hideArchived": "Hide archived", + "renameProjectTitle": "プロジェクト名を変更", + "renameProjectDescription": "このプロジェクトのサイドバー表示名を選択します。", + "renameProjectPlaceholder": "プロジェクト名", + "renameSave": "保存", + "archive": "アーカイブ", + "unarchive": "アーカイブを解除", + "showArchived": "アーカイブ済みを表示", + "hideArchived": "アーカイブ済みを隠す", "delete": "削除", "newChat": "新しいトピック", "groups": { - "pinned": "Pinned", + "pinned": "ピン留め", "all": "トピック", - "projects": "Projects", - "today": "Today", - "yesterday": "Yesterday", - "earlier": "Earlier", - "archived": "Archived" + "projects": "プロジェクト", + "today": "今日", + "yesterday": "昨日", + "earlier": "以前", + "archived": "アーカイブ済み" } }, "deleteConfirm": { @@ -1109,7 +1138,7 @@ }, "stop": { "title": "現在のタスクを停止", - "description": "このチャットで実行中の agent ターンをキャンセルします。" + "description": "このチャットで実行中のエージェントのターンをキャンセルします。" }, "restart": { "title": "nanobot を再起動", @@ -1117,7 +1146,7 @@ }, "status": { "title": "ステータスを表示", - "description": "ランタイム、provider、channel の状態を表示します。" + "description": "ランタイム、プロバイダー、チャンネルの状態を表示します。" }, "model": { "title": "モデル", @@ -1195,7 +1224,9 @@ "cliBadge": "CLI", "mcpBadge": "MCP", "cliDescription": "@{{name}} をローカル CLI アプリとして使用", - "mcpDescription": "@{{name}} を MCP サーバーとして使用" + "mcpDescription": "@{{name}} を MCP サーバーとして使用", + "cliTitle": "CLI アプリ: {{name}}", + "mcpTitle": "MCP サーバー: {{name}}" }, "workspace": { "accessAria": "ワークスペースのアクセスモード", @@ -1215,7 +1246,8 @@ "title": "プロンプト", "search": "プロンプトを検索", "noResults": "一致するプロンプトがありません。", - "jumpTo": "プロンプトへ移動: {{label}}" + "jumpTo": "プロンプトへ移動: {{label}}", + "railAria": "ユーザープロンプトのナビゲーション" } }, "message": { @@ -1239,6 +1271,14 @@ "agentActivityLiveSummary": "実行中… · {{reasoning}} ステップ · ツール呼び出し {{tools}} 回", "agentActivityLiveToolsOnly": "実行中… · ツール呼び出し {{tools}} 回", "imageAttachment": "画像の添付", + "videoAttachment": "動画の添付", + "fileAttachment": "ファイルの添付", + "attachmentUnavailable": "添付ファイルを利用できません", + "dataTable": "データテーブル", + "fileEditPreparing": "ファイル編集を準備中…", + "openLink": "リンクを開く: {{label}}", + "openAttachment": "開く: {{name}}", + "skill": "スキル: {{name}}", "askAboutSelection": "この内容について質問", "forkFromHere": "分岐", "copyReply": "コピー", @@ -1279,6 +1319,7 @@ }, "filePreview": { "aria": "ファイルプレビュー", + "breadcrumb": "ファイルパス", "close": "ファイルプレビューを閉じる", "loading": "プレビューを読み込み中...", "failed": "このファイルをプレビューできませんでした。", @@ -1293,7 +1334,10 @@ "copied": "コピーしました" }, "common": { - "dismiss": "閉じる" + "dismiss": "閉じる", + "close": "閉じる", + "current": "現在", + "cancel": "キャンセル" }, "errors": { "messageTooBig": { diff --git a/webui/src/i18n/locales/ko/common.json b/webui/src/i18n/locales/ko/common.json index cfc0bdf5e..196fcde97 100644 --- a/webui/src/i18n/locales/ko/common.json +++ b/webui/src/i18n/locales/ko/common.json @@ -38,6 +38,15 @@ }, "meta": { "description": "nanobot 웹 UI — nanobot 작업공간과 대화하세요." + }, + "pairing": { + "title": "채팅 사용자 연결", + "description": "채팅에 표시된 연결 코드를 입력하세요.", + "code": "연결 코드", + "matched": "{{channel}} 일치. 연결 중...", + "expiresInline": "코드 만료: {{expires}}.", + "queueCount": "{{count}}개 대기 중", + "noMatch": "이 코드와 일치하는 대기 중인 요청이 없습니다." } }, "sidebar": { @@ -162,10 +171,10 @@ "model": "이 프리셋에서 사용할 모델을 선택하세요.", "configPath": "현재 게이트웨이가 사용하는 설정 파일입니다.", "selectedPreset": "이름 있는 프리셋은 여기서 읽기 전용입니다. config.json에서 편집하세요.", - "presetModel": "Default로 전환하면 WebUI에서 모델과 제공자를 편집할 수 있습니다.", + "presetModel": "기본값으로 전환하면 WebUI에서 모델과 제공자를 편집할 수 있습니다.", "density": "이 브라우저에만 저장됩니다.", - "activityMode": "기본으로 표시할 agent 활동 세부 수준을 선택합니다.", - "fileEditDisplay": "파일 편집 활동을 줄 수 또는 diff로 표시할지 선택합니다.", + "activityMode": "기본으로 표시할 에이전트 활동 세부 수준을 선택합니다.", + "fileEditDisplay": "파일 편집 활동을 줄 수 또는 변경 사항으로 표시할지 선택합니다.", "codeWrap": "작은 화면에서도 긴 코드 줄을 읽기 쉽게 유지합니다.", "maxResults": "각 web_search 호출에서 반환되는 결과 수입니다.", "timeout": "검색 제공자 요청이 타임아웃되기 전의 초입니다.", @@ -178,8 +187,8 @@ "defaultImageSize": "지원하는 제공자에 보낼 크기 힌트입니다.", "maxImagesPerTurn": "한 번의 generate_image 요청에서 생성할 수 있는 이미지 상한입니다.", "timezone": "일정과 시간 인식 답변에 사용됩니다.", - "localServiceAccess": "Full Access shell 명령이 localhost 서비스에 접근할 수 있게 합니다.", - "webuiDefaultAccess": "프로젝트별 권한이 없는 Web 채팅에 사용됩니다.", + "localServiceAccess": "전체 접근 권한 shell 명령이 localhost 서비스에 접근할 수 있게 합니다.", + "webuiDefaultAccess": "프로젝트별 권한이 없는 웹 채팅에 사용됩니다.", "securityManagedControls": "웹 가져오기는 항상 로컬, 사설, 메타데이터 서비스를 보호합니다. 핵심 채널 보안은 config.json에서 관리됩니다.", "currentModel": "새 응답에 사용됩니다.", "selectedModelProvider": "선택한 모델에 의해 설정됩니다.", @@ -189,12 +198,12 @@ "cliAppsFilter": "앱, 카테고리 또는 기능으로 검색합니다.", "logs": "네이티브 엔진 로그 폴더를 엽니다.", "diagnostics": "지원용 작은 런타임 보고서를 내보냅니다.", - "localServiceAccessNative": "Full Access shell 명령이 이 Mac의 서비스에 접근할 수 있게 합니다.", + "localServiceAccessNative": "전체 접근 권한 shell 명령이 이 Mac의 서비스에 접근할 수 있게 합니다.", "webuiDefaultAccessNative": "프로젝트별 권한이 없는 네이티브 채팅에 사용됩니다.", "contextWindow": "이 모델 구성의 기본 컨텍스트 예산을 선택합니다.", "transcription": "마이크 입력을 보내기 전에 텍스트로 변환합니다. 채널 음성 메시지도 같은 설정을 사용합니다.", - "transcriptionProvider": "Providers에 저장된 해당 제공자의 인증 정보를 사용합니다.", - "transcriptionProviderStatus": "API 키는 transcription 설정이 아니라 providers 아래에 유지됩니다.", + "transcriptionProvider": "제공자 설정에 저장된 해당 제공자의 인증 정보를 사용합니다.", + "transcriptionProviderStatus": "API 키는 음성 변환 설정이 아니라 제공자 설정에 유지됩니다.", "transcriptionModel": "제공자가 사용자 지정 모델 ID를 요구하지 않으면 해석된 기본값을 사용하세요.", "transcriptionLanguage": "en, zh, ja, ko 같은 선택적 ISO-639 힌트입니다." }, @@ -215,8 +224,8 @@ "expanded": "펼침", "default": "기본값", "summary": "요약", - "diff": "Diff", - "collapsedDiff": "접힌 diff", + "diff": "변경 사항", + "collapsedDiff": "접힌 변경 사항", "on": "켜짐", "off": "꺼짐", "defaultPermission": "기본 권한", @@ -224,7 +233,10 @@ "configured": "구성됨", "notConfigured": "미구성", "pending": "대기 중", - "restartingEngine": "재시작 중" + "restartingEngine": "재시작 중", + "checking": "확인 중", + "running": "실행 중", + "needsSetup": "설정 필요" }, "status": { "loading": "설정을 불러오는 중...", @@ -252,30 +264,31 @@ "deleting": "삭제 중...", "edit": "편집", "cancel": "취소", + "dismiss": "닫기", "open": "열기", "export": "내보내기", "opening": "여는 중...", "exporting": "내보내는 중..." }, "byok": { - "description": "직접 provider 키를 가져옵니다. Nanobot은 현재 config에서 값을 읽고, 설정된 provider만 모델 프리셋에서 사용할 수 있습니다.", + "description": "직접 제공자 키를 사용합니다. Nanobot은 현재 구성에서 값을 읽고, 설정된 제공자만 모델 프리셋에서 사용할 수 있습니다.", "configured": "설정됨", "notConfigured": "설정 안 됨", "configuredSection": "설정됨", "notConfiguredSection": "설정 안 됨", "showMore": "{{count}}개 더 보기", "showLess": "접기", - "apiKey": "API key", - "apiBase": "API base", - "apiKeyPlaceholder": "API key 입력", + "apiKey": "API 키", + "apiBase": "API 기본 주소", + "apiKeyPlaceholder": "API 키 입력", "apiKeyConfiguredPlaceholder": "비워 두면 현재 key 유지", "configuredKeyHint": "설정된 key", - "apiBasePlaceholder": "provider 기본값 사용", - "apiKeyRequired": "이 provider를 설정하려면 API key가 필요합니다.", - "showApiKey": "API key 표시", - "hideApiKey": "API key 숨기기", - "noConfiguredProviders": "설정된 provider가 없습니다", - "configureFirst": "먼저 BYOK에서 provider를 설정하세요.", + "apiBasePlaceholder": "제공자 기본값 사용", + "apiKeyRequired": "이 제공자를 설정하려면 API 키가 필요합니다.", + "showApiKey": "API 키 표시", + "hideApiKey": "API 키 숨기기", + "noConfiguredProviders": "설정된 제공자가 없습니다", + "configureFirst": "먼저 BYOK에서 제공자를 설정하세요.", "openByok": "BYOK 열기", "tabs": { "ariaLabel": "BYOK 자격 증명 유형", @@ -283,20 +296,20 @@ "webSearch": "웹 검색" }, "webSearch": { - "provider": "검색 provider", - "providerHelp": "web search 도구가 사용할 백엔드를 선택합니다.", - "selectProvider": "provider 선택", + "provider": "검색 제공자", + "providerHelp": "웹 검색 도구가 사용할 백엔드를 선택합니다.", + "selectProvider": "제공자 선택", "credentials": "자격 증명", "noCredentialRequired": "key 필요 없음", - "noCredentialHelp": "DuckDuckGo는 API key를 저장하지 않고 사용할 수 있습니다.", + "noCredentialHelp": "DuckDuckGo는 API 키를 저장하지 않고 사용할 수 있습니다.", "apiKeyHelp": "config에 저장되며 저장 후에는 마스킹되어 표시됩니다.", - "baseUrl": "Base URL", + "baseUrl": "기본 URL", "baseUrlHelp": "SearXNG에는 자체 인스턴스 URL이 필요합니다.", "baseUrlPlaceholder": "https://search.example.com", - "apiKeyRequired": "이 검색 provider에는 API key가 필요합니다.", - "baseUrlRequired": "SearXNG에는 Base URL이 필요합니다.", + "apiKeyRequired": "이 검색 제공자에는 API 키가 필요합니다.", + "baseUrlRequired": "SearXNG에는 기본 URL이 필요합니다.", "missingCredential": "저장하기 전에 필요한 자격 증명을 입력하세요.", - "saveHint": "변경 사항은 새 web search 요청에 적용됩니다." + "saveHint": "변경 사항은 새 웹 검색 요청에 적용됩니다." } }, "overview": { @@ -310,13 +323,13 @@ "workspace": "작업공간" }, "usage": { - "title": "Token 활동", - "shortTitle": "Token Usage", + "title": "토큰 활동", + "shortTitle": "토큰 사용량", "subtitle": "최근 12개월 동안 제공자가 보고한 사용량입니다.", - "empty": "새 모델 응답 이후 token 활동이 표시됩니다.", - "totalTokens": "누적 Token 수", - "peakTokens": "최고 Token 수", - "thirtyDayTokens": "30일 Token 수", + "empty": "새 모델 응답 이후 토큰 활동이 표시됩니다.", + "totalTokens": "누적 토큰 수", + "peakTokens": "최고 토큰 수", + "thirtyDayTokens": "30일 토큰 수", "currentStreak": "현재 연속 일수", "longestStreak": "최장 연속 일수", "daysValue": "{{count}}일", @@ -325,7 +338,7 @@ "requests": "요청", "estimated": "추정", "includesEstimates": "추정 포함", - "cellTitle": "{{date}}: {{tokens}} tokens, 요청 {{requests}}회", + "cellTitle": "{{date}}: {{tokens}} 토큰, 요청 {{requests}}회", "sources": { "user": "채팅", "api": "API", @@ -358,9 +371,19 @@ "selectProvider": "제공자 선택", "selectAspect": "비율 선택", "selectSize": "크기 선택", + "selectModel": "이미지 모델 선택", + "searchOrTypeModel": "모델 ID 검색 또는 입력", + "typeModelId": "이 제공자가 지원하는 모델 ID를 입력하세요.", "configureProvider": "제공자 구성", "missingCredential": "이미지 생성을 활성화하기 전에 이 제공자를 구성하세요." }, + "capabilities": { + "providerSupport": "제공자 지원", + "providerInstallOnSave": "이 제공자를 저장하면 필요한 지원이 자동으로 설치됩니다.", + "searchSupport": "검색 제공자 지원", + "searchInstallOnSave": "저장하면 Olostep 지원이 자동으로 설치됩니다.", + "installing": "지원 설치 중..." + }, "models": { "selectModel": "모델 선택", "addConfiguration": "구성 추가", @@ -383,7 +406,7 @@ "advancedOptions": "고급 옵션", "advancedSummary": "컨텍스트 {{context}} · 최대 {{max}} 토큰", "maxTokens": "최대 출력 토큰", - "temperature": "Temperature", + "temperature": "온도", "reasoningEffort": "추론 강도", "convertTitle": "현재 모델 설정 변환", "convertHelp": "기존 기본 및 대체 모델을 프리셋으로 변환하여 여기서 순서를 관리합니다.", @@ -473,9 +496,9 @@ "serverUrl": "URL", "transport": "전송 방식", "command": "명령", - "args": "Args JSON", - "headers": "Headers JSON", - "env": "Env JSON", + "args": "인자 JSON", + "headers": "헤더 JSON", + "env": "환경 변수 JSON", "timeout": "도구 제한 시간", "advancedOptions": "고급 옵션", "hideAdvanced": "고급 숨기기", @@ -503,6 +526,7 @@ "statusMissingCredentials": "키 필요", "statusMissingDependency": "의존성 필요", "statusComingSoon": "곧 제공", + "comingSoon": "곧 제공", "statusNotInstalled": "비활성", "toolScope": "도구", "allTools": "전체", @@ -565,6 +589,8 @@ "advanced": "고급", "checkAndEnable": "확인 후 활성화", "checkConnection": "연결 확인", + "connectionChecks": "연결 확인", + "open": "열기", "checkedAndEnabled": "확인 후 활성화했습니다.", "checking": "확인 중...", "checkOnly": "확인만", @@ -660,6 +686,8 @@ "protected": "보호됨", "editTitle": "자동화 편집", "save": "저장", + "commandCopied": "복사됨", + "copyCommand": "복사", "deleteTitle": "자동화 삭제", "deleteDescription": "{{name}}을 cron 저장소에서 삭제합니다. 이전 채팅 메시지는 세션에 남습니다.", "cancel": "취소", @@ -719,6 +747,7 @@ "fields": { "name": "이름", "message": "메시지", + "command": "명령", "scheduleType": "일정 유형", "every": "간격", "unit": "단위", @@ -753,7 +782,7 @@ "signInAgain": "다시 로그인", "signOut": "로그아웃", "signedInAs": "{{account}}로 로그인됨", - "signInHelp": "이 기기에서 로그인합니다. API key는 config에 저장되지 않습니다.", + "signInHelp": "이 기기에서 로그인합니다. API 키는 구성에 저장되지 않습니다.", "remoteSignInHelp": "로그인을 선택하여 사용자 컴퓨터에서 xAI를 연 다음, 로그인 후 표시되는 인증 코드를 붙여 넣으세요.", "codexRemoteSignInHelp": "이 브라우저에서 로그인한 다음 전체 localhost 콜백 URL을 nanobot에 붙여 넣으세요.", "signInRequired": "로그인이 필요합니다", @@ -877,34 +906,34 @@ "actions": "{{title}} 주제 작업", "newInProject": "{{project}}에서 새 주제 시작", "activity": { - "running": "Agent running", - "complete": "Agent finished", - "updated": "New activity" + "running": "에이전트 실행 중", + "complete": "에이전트 완료", + "updated": "새 활동" }, - "pin": "Pin", - "unpin": "Unpin", - "rename": "Rename", + "pin": "고정", + "unpin": "고정 해제", + "rename": "이름 변경", "renameTitle": "주제 이름 변경", "renameDescription": "이 주제에 사용할 사이드바 이름을 선택하세요.", "renamePlaceholder": "주제 이름", - "renameProjectTitle": "Rename project", - "renameProjectDescription": "Choose a local sidebar name for this project.", - "renameProjectPlaceholder": "Project name", - "renameSave": "Save", - "archive": "Archive", - "unarchive": "Unarchive", - "showArchived": "Show archived", - "hideArchived": "Hide archived", + "renameProjectTitle": "프로젝트 이름 변경", + "renameProjectDescription": "이 프로젝트에 사용할 사이드바 이름을 선택하세요.", + "renameProjectPlaceholder": "프로젝트 이름", + "renameSave": "저장", + "archive": "보관", + "unarchive": "보관 해제", + "showArchived": "보관된 항목 표시", + "hideArchived": "보관된 항목 숨기기", "delete": "삭제", "newChat": "새 주제", "groups": { - "pinned": "Pinned", + "pinned": "고정됨", "all": "주제", - "projects": "Projects", - "today": "Today", - "yesterday": "Yesterday", - "earlier": "Earlier", - "archived": "Archived" + "projects": "프로젝트", + "today": "오늘", + "yesterday": "어제", + "earlier": "이전", + "archived": "보관됨" } }, "deleteConfirm": { @@ -1109,7 +1138,7 @@ }, "stop": { "title": "현재 작업 중지", - "description": "이 채팅에서 실행 중인 agent 턴을 취소합니다." + "description": "이 채팅에서 실행 중인 에이전트 턴을 취소합니다." }, "restart": { "title": "nanobot 재시작", @@ -1117,7 +1146,7 @@ }, "status": { "title": "상태 보기", - "description": "런타임, provider, channel 상태를 표시합니다." + "description": "런타임, 제공자, 채널 상태를 표시합니다." }, "model": { "title": "모델", @@ -1195,7 +1224,9 @@ "cliBadge": "CLI", "mcpBadge": "MCP", "cliDescription": "@{{name}}을 로컬 CLI 앱으로 사용", - "mcpDescription": "@{{name}}을 MCP 서버로 사용" + "mcpDescription": "@{{name}}을 MCP 서버로 사용", + "cliTitle": "CLI 앱: {{name}}", + "mcpTitle": "MCP 서버: {{name}}" }, "workspace": { "accessAria": "작업공간 접근 모드", @@ -1215,7 +1246,8 @@ "title": "프롬프트", "search": "프롬프트 검색", "noResults": "일치하는 프롬프트가 없습니다.", - "jumpTo": "프롬프트로 이동: {{label}}" + "jumpTo": "프롬프트로 이동: {{label}}", + "railAria": "사용자 프롬프트 탐색" } }, "message": { @@ -1239,19 +1271,27 @@ "agentActivityLiveSummary": "진행 중… · {{reasoning}}단계 · 도구 호출 {{tools}}회", "agentActivityLiveToolsOnly": "진행 중… · 도구 호출 {{tools}}회", "imageAttachment": "이미지 첨부", + "videoAttachment": "동영상 첨부", + "fileAttachment": "파일 첨부", + "attachmentUnavailable": "첨부 파일을 사용할 수 없음", + "dataTable": "데이터 표", + "fileEditPreparing": "파일 편집 준비 중…", + "openLink": "링크 열기: {{label}}", + "openAttachment": "{{name}} 열기", + "skill": "스킬: {{name}}", "askAboutSelection": "이 내용에 대해 질문하기", "forkFromHere": "분기", "copyReply": "복사", "copiedReply": "복사됨", "turnLatencyTitle": "응답 시간(엔드투엔드)", - "fileEditViewDiff": "Diff 보기", - "fileEditViewLargeDiff": "큰 diff 보기", + "fileEditViewDiff": "변경 사항 보기", + "fileEditViewLargeDiff": "큰 변경 사항 보기", "fileEditDiffLineCount": "{{count}}줄", "fileEditUnchangedLinesHidden": "변경되지 않은 {{count}}줄 숨김", "fileEditShowMoreLines": "{{count}}줄 더 보기", "fileEditShowFewerLines": "줄 줄이기", "fileEditOpenFile": "파일 열기", - "fileEditDiffTruncated": "Diff가 잘렸습니다. 전체 변경은 파일을 열어 확인하세요.", + "fileEditDiffTruncated": "변경 사항이 잘렸습니다. 전체 변경은 파일을 열어 확인하세요.", "activityThinkingFor": "{{duration}} 동안 생각 중", "activityThought": "생각함", "activityThoughtFor": "{{duration}} 동안 생각함", @@ -1279,6 +1319,7 @@ }, "filePreview": { "aria": "파일 미리보기", + "breadcrumb": "파일 경로", "close": "파일 미리보기 닫기", "loading": "미리보기 로딩 중...", "failed": "이 파일을 미리 볼 수 없습니다.", @@ -1293,7 +1334,10 @@ "copied": "복사됨" }, "common": { - "dismiss": "닫기" + "dismiss": "닫기", + "close": "닫기", + "current": "현재", + "cancel": "취소" }, "errors": { "messageTooBig": { diff --git a/webui/src/i18n/locales/pt-BR/common.json b/webui/src/i18n/locales/pt-BR/common.json index 9b29b1a88..03a722ca7 100644 --- a/webui/src/i18n/locales/pt-BR/common.json +++ b/webui/src/i18n/locales/pt-BR/common.json @@ -23,7 +23,7 @@ }, "system": { "section": "Sistema", - "restartHint": "Reinicie o nanobot para aplicar as alterações de runtime.", + "restartHint": "Reinicie o nanobot para aplicar as alterações de tempo de execução.", "restart": "Reiniciar nanobot", "restarting": "Reiniciando nanobot...", "restartEngine": "Reiniciar motor", @@ -37,7 +37,16 @@ "chat": "{{title}} · nanobot" }, "meta": { - "description": "Interface web do nanobot — converse com o seu workspace do nanobot." + "description": "Interface web do nanobot — converse com o seu espaço de trabalho do nanobot." + }, + "pairing": { + "title": "Vincular usuário do chat", + "description": "Digite o código de vinculação exibido no chat.", + "code": "Código de vinculação", + "matched": "Correspondência com {{channel}}. Conectando...", + "expiresInline": "O código expira {{expires}}.", + "queueCount": "{{count}} pendentes", + "noMatch": "Nenhuma solicitação pendente corresponde a este código." } }, "sidebar": { @@ -54,10 +63,10 @@ "label": "Idioma", "ariaLabel": "Trocar idioma" }, - "apps": "Apps", + "apps": "Aplicativos", "automations": "Automações", "skills": { - "title": "Skills" + "title": "Habilidades" } }, "settings": { @@ -77,13 +86,13 @@ "voice": "Voz", "browser": "Web", "channels": "Canais", - "cliApps": "Apps CLI", + "cliApps": "Aplicativos CLI", "mcp": "MCP", "runtime": "Sistema", "advanced": "Segurança", "apps": "Aplicativos", "automations": "Automações", - "skills": "Skills" + "skills": "Habilidades" }, "sections": { "interface": "Interface do usuário", @@ -97,7 +106,7 @@ "imageDefaults": "Padrões", "webSearch": "Busca na web", "webBehavior": "Comportamento", - "cliApps": "Apps CLI", + "cliApps": "Aplicativos CLI", "mcp": "Servidores MCP", "regional": "Regional", "webuiSafety": "Segurança da WebUI", @@ -191,7 +200,7 @@ "maxImagesPerTurn": "Máx. de imagens por turno", "imageSaveDir": "Diretório de salvamento", "timezone": "Fuso horário", - "workspacePath": "Workspace padrão", + "workspacePath": "Espaço de trabalho padrão", "localServiceAccess": "Serviços locais", "webuiDefaultAccess": "Acesso padrão", "cliAppsCatalog": "Catálogo", @@ -217,10 +226,10 @@ "selectedModelProvider": "Definido pelo modelo selecionado.", "selectedModelValue": "Definido pelo modelo selecionado.", "selectedPreset": "As predefinições nomeadas são somente leitura aqui; edite-as em config.json.", - "presetModel": "Mude para Default para editar modelo e provedor pela WebUI.", + "presetModel": "Mude para Padrão para editar o modelo e o provedor pela WebUI.", "density": "Armazenado apenas neste navegador.", "activityMode": "Escolha quanto detalhe de atividade do agente é exibido por padrão.", - "fileEditDisplay": "Escolha se a atividade de edição de arquivo é exibida como contagem de linhas ou como diff.", + "fileEditDisplay": "Escolha se a atividade de edição de arquivo é exibida como contagem de linhas ou como diferenças.", "codeWrap": "Mantém linhas longas de código legíveis em telas menores.", "brandLogos": "Mostra logotipos de provedores terceiros e de CLIs em Configurações.", "maxResults": "Resultados retornados por cada chamada de web_search.", @@ -228,20 +237,20 @@ "jinaReader": "Usa o Jina Reader para web_fetch quando disponível.", "imageGeneration": "Expõe generate_image nas conversas quando há um provedor de imagem configurado.", "imageProvider": "Escolha o provedor do registro usado por generate_image.", - "imageProviderStatus": "A geração de imagens reaproveita as credenciais de Provedores.", + "imageProviderStatus": "A geração de imagens reaproveita as credenciais dos provedores.", "imageModel": "Nome do modelo enviado ao provedor de imagem selecionado.", - "defaultAspectRatio": "Usado quando o prompt não escolhe uma proporção.", + "defaultAspectRatio": "Usado quando a instrução não escolhe uma proporção.", "defaultImageSize": "Dica de tamanho enviada a provedores compatíveis.", "maxImagesPerTurn": "Limite superior para uma requisição de generate_image.", "timezone": "Usado para agendamentos e respostas sensíveis ao horário.", - "cliAppsCatalog": "Instale apenas os adaptadores CLI de apps que o nanobot pode executar localmente; apps nativos permanecem intactos.", - "cliAppsFilter": "Busque por app, categoria ou capacidade.", - "localServiceAccess": "Permite que comandos shell com Acesso Total alcancem serviços localhost.", + "cliAppsCatalog": "Instale apenas os adaptadores CLI de aplicativos que o nanobot pode executar localmente; aplicativos nativos permanecem intactos.", + "cliAppsFilter": "Busque por aplicativo, categoria ou capacidade.", + "localServiceAccess": "Permite que comandos shell com acesso completo alcancem serviços locais.", "webuiDefaultAccess": "Usado por chats web sem permissão específica de projeto.", "securityManagedControls": "As buscas na web sempre protegem serviços locais, privados e de metadados. A segurança essencial dos canais fica em config.json.", "logs": "Abre a pasta de logs do motor nativo.", - "diagnostics": "Exporta um pequeno relatório de runtime para o suporte.", - "localServiceAccessNative": "Permite que comandos shell com Acesso Total alcancem serviços neste Mac.", + "diagnostics": "Exporta um pequeno relatório de tempo de execução para o suporte.", + "localServiceAccessNative": "Permite que comandos shell com acesso completo alcancem serviços neste Mac.", "webuiDefaultAccessNative": "Usado por chats nativos sem permissão específica de projeto.", "contextWindow": "Escolha o orçamento de contexto padrão para esta configuração de modelo.", "transcription": "Transcreve a entrada do microfone antes de enviá-la. Mensagens de voz dos canais de chat usam as mesmas configurações.", @@ -257,25 +266,25 @@ }, "cliApps": { "allCategories": "Todas as categorias", - "availableCount": "{{count}} apps", + "availableCount": "{{count}} aplicativos", "installedCount": "{{count}} CLIs instaladas", "summary": "{{installed}} de {{total}} CLIs instaladas", "filterAll": "Todos", "filterInstalled": "CLIs instaladas", "filterNotInstalled": "Não instaladas", "searchPlaceholder": "Buscar CLIs", - "loading": "Carregando Apps CLI...", - "empty": "Nenhum App CLI corresponde a este filtro.", - "statusInstalled": "App pronto", + "loading": "Carregando aplicativos CLI...", + "empty": "Nenhum aplicativo CLI corresponde a este filtro.", + "statusInstalled": "Aplicativo pronto", "statusMissing": "Faltando", "statusAvailable": "Disponível", "statusUnsupported": "Não compatível", - "statusNotInstalled": "App não instalado", + "statusNotInstalled": "Aplicativo não instalado", "requires": "Requer", - "test": "Testar app", - "update": "Atualizar app", - "uninstall": "Desinstalar app", - "install": "Instalar app", + "test": "Testar aplicativo", + "update": "Atualizar aplicativo", + "uninstall": "Desinstalar aplicativo", + "install": "Instalar aplicativo", "readyTitle": "@{{name}} está pronto", "readyStatus": "Pronto", "readyTry": "Experimentar @{{name}}", @@ -310,9 +319,9 @@ "serverUrl": "URL", "transport": "Transporte", "command": "Comando", - "args": "Args JSON", - "headers": "Headers JSON", - "env": "Env JSON", + "args": "Argumentos JSON", + "headers": "Cabeçalhos JSON", + "env": "Ambiente JSON", "timeout": "Tempo limite da ferramenta", "advancedOptions": "Opções avançadas", "hideAdvanced": "Ocultar avançado", @@ -340,6 +349,7 @@ "statusMissingCredentials": "Precisa de chave", "statusMissingDependency": "Precisa de dependência", "statusComingSoon": "Em breve", + "comingSoon": "Em breve", "statusNotInstalled": "Não habilitado", "toolScope": "Ferramentas", "allTools": "Todas", @@ -356,15 +366,15 @@ "ready": "Pronto", "privateEngine": "Motor privado", "unixSocket": "Socket Unix", - "defaultWorkspace": "Workspace padrão", + "defaultWorkspace": "Espaço de trabalho padrão", "comfortable": "Confortável", "compact": "Compacto", "auto": "Automático", "expanded": "Expandido", "default": "Padrão", "summary": "Resumo", - "diff": "Diff", - "collapsedDiff": "Diff recolhido", + "diff": "Diferenças", + "collapsedDiff": "Diferenças recolhidas", "on": "Ligado", "off": "Desligado", "defaultPermission": "Permissão padrão", @@ -372,7 +382,10 @@ "configured": "Configurado", "notConfigured": "Não configurado", "pending": "Pendente", - "restartingEngine": "Reiniciando" + "restartingEngine": "Reiniciando", + "checking": "Verificando", + "running": "Em execução", + "needsSetup": "Requer configuração" }, "status": { "loading": "Carregando configurações...", @@ -400,6 +413,7 @@ "deleting": "Excluindo...", "edit": "Editar", "cancel": "Cancelar", + "dismiss": "Dispensar", "open": "Abrir", "export": "Exportar", "opening": "Abrindo...", @@ -455,7 +469,7 @@ "webSearch": "Busca na web", "imageGeneration": "Geração de imagens", "voiceInput": "Entrada de voz", - "workspace": "Workspace" + "workspace": "Espaço de trabalho" }, "usage": { "title": "Atividade de tokens", @@ -509,9 +523,19 @@ "selectProvider": "Selecionar provedor", "selectAspect": "Selecionar proporção", "selectSize": "Selecionar tamanho", + "selectModel": "Selecionar modelo de imagem", + "searchOrTypeModel": "Pesquisar ou digitar ID do modelo", + "typeModelId": "Digite o ID de modelo compatível com este provedor.", "configureProvider": "Configurar provedor", "missingCredential": "Configure o provedor antes de habilitar a geração de imagens." }, + "capabilities": { + "providerSupport": "Suporte do provedor", + "providerInstallOnSave": "O suporte necessário será instalado automaticamente ao salvar este provedor.", + "searchSupport": "Suporte do provedor de pesquisa", + "searchInstallOnSave": "O suporte ao Olostep será instalado automaticamente ao salvar.", + "installing": "Instalando suporte..." + }, "api": { "title": "Servidor de API", "openaiCompatible": "API compatível com OpenAI", @@ -541,29 +565,29 @@ }, "apps": { "description": "Adicione ferramentas ao nanobot e mencione-as com @ na conversa.", - "cliLabel": "App", + "cliLabel": "Aplicativo", "mcpLabel": "Integração", "channelLabel": "Canal", "featureLabel": "Recurso", "filterAll": "Prontos", "filterPlugins": "Complementos", - "filterCli": "Apps", + "filterCli": "Aplicativos", "filterMcp": "Integrações", "enabledSummary": "{{count}} prontos", - "caption": "{{cli}} apps · {{mcp}} integrações", + "caption": "{{cli}} aplicativos · {{mcp}} integrações", "searchPlaceholder": "Buscar ferramentas", "featured": "Ferramentas", - "loading": "Carregando Apps...", + "loading": "Carregando aplicativos...", "empty": "Nenhuma ferramenta corresponde a esta visualização.", - "restartRequired": "Reinicie o nanobot para aplicar os apps e integrações atualizados." + "restartRequired": "Reinicie o nanobot para aplicar os aplicativos e integrações atualizados." }, "channels": { - "description": "Conecte apps de chat, e-mail e WebUI ao nanobot.", + "description": "Conecte aplicativos de chat, e-mail e WebUI ao nanobot.", "caption": "{{enabled}} habilitados · {{total}} canais", "searchPlaceholder": "Buscar canais", "backToChannels": "Todos os canais", "catalog": "Canais", - "loading": "Carregando Canais...", + "loading": "Carregando canais...", "empty": "Nenhum canal corresponde a este filtro.", "restartRequired": "Reinicie o nanobot para aplicar o suporte de canais atualizado.", "requires": "Requer: {{requirements}}", @@ -579,6 +603,8 @@ "advanced": "Avançado", "checkAndEnable": "Verificar e ativar", "checkConnection": "Verificar conexão", + "connectionChecks": "Verificações de conexão", + "open": "Abrir", "checkedAndEnabled": "Verificado e ativado.", "checking": "Verificando...", "checkOnly": "Apenas verificar", @@ -674,6 +700,8 @@ "protected": "Protegida", "editTitle": "Editar automação", "save": "Salvar", + "commandCopied": "Copiado", + "copyCommand": "Copiar", "deleteTitle": "Excluir automação", "deleteDescription": "Isso remove {{name}} do armazenamento do cron. As mensagens anteriores da conversa permanecem na sessão.", "cancel": "Cancelar", @@ -733,6 +761,7 @@ "fields": { "name": "Nome", "message": "Mensagem", + "command": "Comando", "scheduleType": "Tipo de agendamento", "every": "A cada", "unit": "Unidade", @@ -790,56 +819,56 @@ "finishSignIn": "Concluir login" }, "skills": { - "description": "Revise as skills de instrução que este agente pode carregar durante uma conversa.", + "description": "Revise as habilidades de instrução que este agente pode carregar durante uma conversa.", "caption": "{{available}} disponíveis · {{total}} no total", - "views": "Visualizações de skills", + "views": "Visualizações de habilidades", "installedTab": "Instaladas", "discoverTab": "Descobrir", "customGroup": "Personalizadas", "builtinGroup": "Integradas", "otherGroup": "Outras", - "searchInstalled": "Buscar skills instaladas", + "searchInstalled": "Buscar habilidades instaladas", "filterAll": "Todas", "filterEnabled": "Ativadas", "filterDisabled": "Desativadas", - "noMatching": "Nenhuma skill correspondente.", + "noMatching": "Nenhuma habilidade correspondente.", "statusDisabled": "Desativada", "statusEnabled": "Ativada", "statusNeedsSetup": "Requer configuração", "showLess": "Mostrar menos", "showMore": "Mostrar mais", - "enabledControl": "Usar esta skill", - "enabledDescription": "Permite que o agente carregue esta skill quando os requisitos estiverem prontos.", + "enabledControl": "Usar esta habilidade", + "enabledDescription": "Permite que o agente carregue esta habilidade quando os requisitos estiverem prontos.", "enableSkill": "Ativar {{name}}", "disableSkill": "Desativar {{name}}", - "updateFailed": "Não foi possível atualizar esta skill.", - "deleteTitle": "Excluir skill", - "deleteDescription": "Remove esta skill do workspace atual.", + "updateFailed": "Não foi possível atualizar esta habilidade.", + "deleteTitle": "Excluir habilidade", + "deleteDescription": "Remove esta habilidade do espaço de trabalho atual.", "deleteAction": "Excluir", - "deleteFailed": "Não foi possível excluir esta skill.", + "deleteFailed": "Não foi possível excluir esta habilidade.", "deleteConfirmTitle": "Excluir {{name}}?", - "deleteConfirmDescription": "Isso remove os arquivos da skill do workspace atual. Esta ação não pode ser desfeita.", - "deleteConfirmAction": "Excluir skill", - "instructionsTitle": "Instruções da skill", + "deleteConfirmDescription": "Isso remove os arquivos da habilidade do espaço de trabalho atual. Esta ação não pode ser desfeita.", + "deleteConfirmAction": "Excluir habilidade", + "instructionsTitle": "Instruções da habilidade", "setupRequired": "Requer configuração", "setupDescription": "Instale a dependência ausente na máquina que executa o nanobot e verifique novamente.", "copySetupCommand": "Copiar comando de configuração", "checkAgain": "Verificar novamente", - "marketplaceSearchFailed": "Não foi possível pesquisar nos mercados de skills.", - "marketplaceInstallFailed": "Não foi possível instalar esta skill.", - "marketplaceSearchPlaceholder": "Pesquisar skills", - "marketplaceSearchLabel": "Pesquisar skills", + "marketplaceSearchFailed": "Não foi possível pesquisar nos mercados de habilidades.", + "marketplaceInstallFailed": "Não foi possível instalar esta habilidade.", + "marketplaceSearchPlaceholder": "Pesquisar habilidades", + "marketplaceSearchLabel": "Pesquisar habilidades", "marketplaceSearching": "Pesquisando", - "marketplaceProviderFilter": "Origem da skill", + "marketplaceProviderFilter": "Origem da habilidade", "marketplaceProviderAll": "Todas", "marketplaceTrendingTitle": "Tendências por mercado", "marketplaceTrendingDescription": "Cada mercado mantém seu próprio ranking e métricas de instalação.", "marketplaceViewAll": "Ver todas", - "marketplaceTrendingUnavailable": "As skills em alta estão temporariamente indisponíveis.", - "marketplaceEmpty": "Nenhuma skill encontrada para “{{query}}”.", + "marketplaceTrendingUnavailable": "As habilidades em alta estão temporariamente indisponíveis.", + "marketplaceEmpty": "Nenhuma habilidade encontrada para “{{query}}”.", "marketplaceConfirmTitle": "Instalar {{name}}?", - "marketplaceConfirmDescription": "Esta skill de terceiros vem de {{provider}} ({{source}}) e pode incluir instruções ou scripts executáveis.", - "marketplaceConfirmInstall": "Instalar skill", + "marketplaceConfirmDescription": "Esta habilidade de terceiros vem de {{provider}} ({{source}}) e pode incluir instruções ou scripts executáveis.", + "marketplaceConfirmInstall": "Instalar habilidade", "marketplaceOpen": "Abrir {{name}} no {{provider}}", "marketplaceOpenProvider": "Abrir {{provider}}", "marketplaceInstalls24h": "{{formattedCount}} instalações / 24 h", @@ -850,16 +879,16 @@ "marketplaceInstall": "Instalar", "marketplaceNoTrend": "Ainda sem tendência", "marketplaceTrendLabel": "Tendência de instalações em 8 semanas", - "featured": "Skills do agente", - "empty": "Nenhuma skill disponível.", + "featured": "Habilidades do agente", + "empty": "Nenhuma habilidade disponível.", "sourceWorkspace": "Personalizada", "sourceBuiltin": "Embutida", "statusAvailable": "Disponível", "statusUnavailable": "Indisponível", "unavailableReason": "Faltando: {{reason}}", "openDetails": "Abrir detalhes de {{name}}", - "loadingDetail": "Carregando detalhes da skill...", - "loadFailed": "Não foi possível carregar os detalhes da skill.", + "loadingDetail": "Carregando detalhes da habilidade...", + "loadFailed": "Não foi possível carregar os detalhes da habilidade.", "descriptionTitle": "Descrição", "source": "Origem", "status": "Status", @@ -877,12 +906,12 @@ "voice": { "selectProvider": "Selecionar provedor", "configureProvider": "Configurar provedor", - "languageAuto": "Auto" + "languageAuto": "Automático" } }, "chat": { "fallbackTitle": "Tópico {{id}}", - "forkTitle": "Fork: {{title}}", + "forkTitle": "Bifurcação: {{title}}", "loading": "Carregando…", "noSessions": "Nenhuma sessão ainda.", "showMore": "Mostrar mais {{count}}", @@ -972,7 +1001,7 @@ }, "brainstorm": { "title": "Fazer um brainstorming", - "prompt": "Sugira algumas ideias práticas e tradeoffs para este problema." + "prompt": "Sugira algumas ideias práticas e seus compromissos para este problema." }, "code": { "title": "Escrever código", @@ -984,25 +1013,25 @@ }, "more": { "title": "Mais", - "prompt": "Mostre-me algumas formas úteis com as quais você pode ajudar neste workspace." + "prompt": "Mostre-me algumas formas úteis com as quais você pode ajudar neste espaço de trabalho." } }, "imageQuickActions": { "icon": { - "title": "Desenhar um ícone de app", - "prompt": "Gere um ícone de app 1:1 limpo para o nanobot: robô amigável, estilo vetorial simples, paleta suave em azul e branco, sem texto." + "title": "Desenhar um ícone de aplicativo", + "prompt": "Gere um ícone de aplicativo 1:1 limpo para o nanobot: robô amigável, estilo vetorial simples, paleta suave em azul e branco, sem texto." }, "sticker": { "title": "Criar um sticker", - "prompt": "Gere uma imagem estilo sticker de um pequeno assistente robô, com fundo de aparência transparente, expressivo e divertido." + "prompt": "Gere uma imagem estilo adesivo de um pequeno assistente robô, com fundo de aparência transparente, expressivo e divertido." }, "poster": { "title": "Criar um pôster", - "prompt": "Gere um conceito de pôster polido para um assistente pessoal de IA, composição moderna, hierarquia visual forte, adequado para uma landing page." + "prompt": "Gere um conceito de pôster polido para um assistente pessoal de IA, composição moderna, hierarquia visual forte, adequado para uma página de destino." }, "product": { - "title": "Mockup de produto", - "prompt": "Gere uma imagem limpa de mockup de produto para um app web de IA conversacional, interface mínima, iluminação premium, moldura de dispositivo realista." + "title": "Maquete de produto", + "prompt": "Gere uma imagem limpa de maquete de produto para um aplicativo web de IA conversacional, interface mínima, iluminação premium, moldura de dispositivo realista." }, "portrait": { "title": "Retrato estilizado", @@ -1141,7 +1170,7 @@ }, "status": { "title": "Mostrar status", - "description": "Exibe o status de runtime, provedor e canais." + "description": "Exibe o status de tempo de execução, provedor e canais." }, "model": { "title": "Modelo", @@ -1165,7 +1194,7 @@ }, "dream_prompt": { "title": "Memória do Dream", - "description": "Diz ao Dream como organizar a memória deste workspace." + "description": "Diz ao Dream como organizar a memória deste espaço de trabalho." }, "goal": { "title": "Objetivo de longa duração", @@ -1186,18 +1215,20 @@ } }, "mentions": { - "ariaLabel": "Apps", - "label": "Apps", - "cliGroup": "Apps CLI", + "ariaLabel": "Aplicativos", + "label": "Aplicativos", + "cliGroup": "Aplicativos CLI", "mcpGroup": "Serviços MCP", "cliBadge": "CLI", "mcpBadge": "MCP", - "cliDescription": "Usar @{{name}} como app CLI local", - "mcpDescription": "Usar @{{name}} como servidor MCP" + "cliDescription": "Usar @{{name}} como aplicativo CLI local", + "mcpDescription": "Usar @{{name}} como servidor MCP", + "cliTitle": "Aplicativo CLI: {{name}}", + "mcpTitle": "Servidor MCP: {{name}}" }, "encoding": "Codificando…", "remove": "Remover anexo", - "normalizedSizeHint": "{{orig}} → {{current}} (auto)", + "normalizedSizeHint": "{{orig}} → {{current}} (automático)", "textTooLarge": "O texto da mensagem é grande demais (máximo de {{max}})", "imageRejected": { "unsupported_type": "Tipo de arquivo não compatível", @@ -1212,7 +1243,7 @@ "io": "Não foi possível ler este arquivo" }, "workspace": { - "accessAria": "Modo de acesso ao workspace", + "accessAria": "Modo de acesso ao espaço de trabalho", "projectAria": "Escolher projeto", "projectPlaceholder": "Selecionar projeto", "default": "Permissão padrão", @@ -1223,13 +1254,14 @@ }, "scrollToBottom": "Rolar para o final", "loadEarlier": "Carregar mensagens anteriores", - "forkedFromHistory": "Fork a partir do histórico", + "forkedFromHistory": "Bifurcado a partir do histórico", "promptNavigator": { - "open": "Abrir navegador de prompts", - "title": "Prompts", - "search": "Buscar prompts", - "noResults": "Nenhum prompt correspondente.", - "jumpTo": "Ir para o prompt: {{label}}" + "open": "Abrir navegador de instruções", + "title": "Instruções", + "search": "Buscar instruções", + "noResults": "Nenhuma instrução correspondente.", + "jumpTo": "Ir para a instrução: {{label}}", + "railAria": "Navegação pelas instruções do usuário" } }, "message": { @@ -1261,13 +1293,21 @@ "cliActivityRunningOne": "Usando {{name}}", "cliActivityRanOne": "Usou {{name}}", "cliActivityFailedOne": "Falhou em {{name}}", - "cliActivityRunningMany": "Usando {{count}} apps CLI", - "cliActivityRanMany": "Usou {{count}} apps CLI", - "cliActivityFailedMany": "{{count}} apps CLI falharam", + "cliActivityRunningMany": "Usando {{count}} aplicativos CLI", + "cliActivityRanMany": "Usou {{count}} aplicativos CLI", + "cliActivityFailedMany": "{{count}} aplicativos CLI falharam", "cliRunRunning": "Usando", "cliRunRan": "Usou", "cliRunFailed": "Falhou", "imageAttachment": "Anexo de imagem", + "videoAttachment": "Anexo de vídeo", + "fileAttachment": "Anexo de arquivo", + "attachmentUnavailable": "Anexo indisponível", + "dataTable": "Tabela de dados", + "fileEditPreparing": "Preparando a edição do arquivo…", + "openLink": "Abrir link: {{label}}", + "openAttachment": "Abrir {{name}}", + "skill": "Habilidade: {{name}}", "automationSourceFallback": "Automação", "automationTriggered": "Acionada automaticamente", "askAboutSelection": "Perguntar sobre isto", @@ -1275,14 +1315,14 @@ "copyReply": "Copiar", "copiedReply": "Copiado", "turnLatencyTitle": "Tempo de resposta (ponta a ponta)", - "fileEditViewDiff": "Ver diff", - "fileEditViewLargeDiff": "Ver diff grande", + "fileEditViewDiff": "Ver diferenças", + "fileEditViewLargeDiff": "Ver diferenças grandes", "fileEditDiffLineCount": "{{count}} linhas", "fileEditUnchangedLinesHidden": "{{count}} linhas inalteradas ocultas", "fileEditShowMoreLines": "Mostrar mais {{count}} linhas", "fileEditShowFewerLines": "Mostrar menos linhas", "fileEditOpenFile": "Abrir arquivo", - "fileEditDiffTruncated": "Diff truncado. Abra o arquivo para ver a alteração completa." + "fileEditDiffTruncated": "Diferenças truncadas. Abra o arquivo para ver a alteração completa." }, "lightbox": { "title": "Pré-visualização de imagem", @@ -1293,6 +1333,7 @@ }, "filePreview": { "aria": "Pré-visualização de arquivo", + "breadcrumb": "Caminho do arquivo", "close": "Fechar pré-visualização de arquivo", "loading": "Carregando pré-visualização...", "failed": "Não foi possível pré-visualizar este arquivo.", @@ -1307,7 +1348,10 @@ "copied": "Copiado" }, "common": { - "dismiss": "Descartar" + "dismiss": "Descartar", + "close": "Fechar", + "current": "Atual", + "cancel": "Cancelar" }, "errors": { "messageTooBig": { @@ -1315,8 +1359,8 @@ "body": "O servidor rejeitou sua última mensagem porque ela excedeu o limite de tamanho. Remova algumas imagens ou tente arquivos menores e envie novamente." }, "workspaceScopeRejected": { - "title": "O workspace não foi alterado", - "body": "O nanobot manteve o workspace anterior porque o projeto ou modo de acesso solicitado foi rejeitado pelo gateway." + "title": "O espaço de trabalho não foi alterado", + "body": "O nanobot manteve o espaço de trabalho anterior porque o projeto ou modo de acesso solicitado foi rejeitado pelo gateway." }, "turnRejected": { "title": "A mensagem não foi enviada", @@ -1325,7 +1369,7 @@ }, "workspace": { "dialog": { - "defaultProject": "Workspace padrão", + "defaultProject": "Espaço de trabalho padrão", "manual": "Colar caminho", "manualPlaceholder": "/Users/nome/projeto", "usePath": "Usar caminho", diff --git a/webui/src/i18n/locales/vi/common.json b/webui/src/i18n/locales/vi/common.json index cbf79ff78..bf8389f52 100644 --- a/webui/src/i18n/locales/vi/common.json +++ b/webui/src/i18n/locales/vi/common.json @@ -23,11 +23,11 @@ }, "system": { "section": "Hệ thống", - "restartHint": "Khởi động lại nanobot để áp dụng thay đổi runtime.", + "restartHint": "Khởi động lại nanobot để áp dụng thay đổi thời gian chạy.", "restart": "Khởi động lại nanobot", "restarting": "Đang khởi động lại...", - "restartEngine": "Khởi động lại engine", - "restartingEngine": "Đang khởi động lại engine..." + "restartEngine": "Khởi động lại bộ máy", + "restartingEngine": "Đang khởi động lại bộ máy..." }, "restart": { "completed": "Khởi động lại hoàn tất sau {{seconds}} giây." @@ -37,7 +37,16 @@ "chat": "{{title}} · nanobot" }, "meta": { - "description": "Giao diện web nanobot — trò chuyện với workspace nanobot của bạn." + "description": "Giao diện web nanobot — trò chuyện với không gian làm việc nanobot của bạn." + }, + "pairing": { + "title": "Liên kết người dùng chat", + "description": "Nhập mã liên kết hiển thị trong cuộc trò chuyện.", + "code": "Mã liên kết", + "matched": "Đã khớp với {{channel}}. Đang kết nối...", + "expiresInline": "Mã hết hạn {{expires}}.", + "queueCount": "{{count}} đang chờ", + "noMatch": "Không có yêu cầu đang chờ nào khớp với mã này." } }, "sidebar": { @@ -92,7 +101,7 @@ "about": "Giới thiệu", "status": "Trạng thái", "localPreferences": "Tùy chọn cục bộ", - "presets": "Preset", + "presets": "Cấu hình đặt trước", "imageGeneration": "Tạo hình ảnh", "imageDefaults": "Mặc định", "webSearch": "Tìm kiếm web", @@ -103,9 +112,9 @@ "cliApps": "Ứng dụng CLI", "mcp": "Dịch vụ MCP", "apps": "Ứng dụng", - "nativeHost": "Host gốc", + "nativeHost": "Máy chủ gốc", "hostSafety": "An toàn ứng dụng", - "voiceInput": "Nhap giong noi" + "voiceInput": "Nhập bằng giọng nói" }, "rows": { "theme": "Chủ đề", @@ -114,12 +123,12 @@ "model": "Mô hình", "restart": "Khởi động lại nanobot", "configPath": "Đường dẫn cấu hình", - "activePreset": "Preset đang dùng", + "activePreset": "Cấu hình đặt trước đang dùng", "gateway": "Cổng", "restartState": "Trạng thái khởi động lại", "pendingChanges": "Thay đổi chờ áp dụng", - "selectedPreset": "Preset đã chọn", - "presetModel": "Mô hình preset", + "selectedPreset": "Cấu hình đặt trước đã chọn", + "presetModel": "Mô hình cấu hình đặt trước", "density": "Mật độ", "activityMode": "Chi tiết hoạt động", "fileEditDisplay": "Hiển thị sửa tệp", @@ -137,7 +146,7 @@ "maxImagesPerTurn": "Ảnh tối đa mỗi lượt", "imageSaveDir": "Thư mục lưu", "timezone": "Múi giờ", - "workspacePath": "Workspace mặc định", + "workspacePath": "Không gian làm việc mặc định", "localServiceAccess": "Dịch vụ cục bộ", "webuiDefaultAccess": "Quyền mặc định", "currentModel": "Cấu hình hiện tại", @@ -148,55 +157,55 @@ "logs": "Nhật ký", "diagnostics": "Chẩn đoán", "contextWindow": "Cửa sổ ngữ cảnh", - "transcription": "Phien am", - "transcriptionProvider": "Nha cung cap", - "transcriptionProviderStatus": "Trang thai nha cung cap", - "transcriptionModel": "Mo hinh", - "transcriptionLanguage": "Ngon ngu", - "voiceLimits": "Gioi han" + "transcription": "Chuyển giọng nói thành văn bản", + "transcriptionProvider": "Nhà cung cấp chuyển giọng nói", + "transcriptionProviderStatus": "Trạng thái nhà cung cấp chuyển giọng nói", + "transcriptionModel": "Mô hình chuyển giọng nói", + "transcriptionLanguage": "Ngôn ngữ", + "voiceLimits": "Giới hạn" }, "help": { "theme": "Chuyển giữa giao diện sáng và tối.", "language": "Chọn ngôn ngữ dùng trong WebUI.", - "provider": "Selecciona el proveedor para nuevas solicitudes de modelo.", + "provider": "Chọn nhà cung cấp cho các yêu cầu mô hình mới.", "model": "Chọn mô hình mà cấu hình sẵn này sử dụng.", - "configPath": "Archivo de configuración que usa actualmente el gateway.", - "selectedPreset": "Los preajustes con nombre son de solo lectura aquí; edítalos en config.json.", - "presetModel": "Chuyển sang Default để chỉnh sửa mô hình và nhà cung cấp từ WebUI.", + "configPath": "Tệp cấu hình gateway hiện đang dùng.", + "selectedPreset": "Cấu hình đặt trước có tên chỉ đọc tại đây; hãy chỉnh sửa trong config.json.", + "presetModel": "Chuyển sang Mặc định để chỉnh sửa mô hình và nhà cung cấp trong WebUI.", "density": "Chỉ lưu trong trình duyệt này.", - "activityMode": "Chọn mức chi tiết hoạt động agent hiển thị mặc định.", - "fileEditDisplay": "Chọn hoạt động sửa tệp hiển thị số dòng hay diff.", + "activityMode": "Chọn mức chi tiết hoạt động của tác nhân hiển thị mặc định.", + "fileEditDisplay": "Chọn hoạt động sửa tệp hiển thị số dòng hay khác biệt.", "codeWrap": "Giữ các dòng mã dài dễ đọc trên màn hình nhỏ.", - "maxResults": "Resultados devueltos por cada llamada web_search.", - "timeout": "Segundos antes de que una solicitud de búsqueda expire.", - "jinaReader": "Usa Jina Reader para web_fetch cuando esté disponible.", - "imageGeneration": "Expone generate_image en chats cuando hay un proveedor de imagen configurado.", - "imageProvider": "Elige el proveedor registrado usado por generate_image.", - "imageProviderStatus": "La generación de imágenes reutiliza credenciales de Proveedores.", - "imageModel": "Nombre del modelo enviado al proveedor de imágenes seleccionado.", - "defaultAspectRatio": "Se usa cuando el prompt no elige una proporción.", + "maxResults": "Số kết quả được trả về sau mỗi lần gọi web_search.", + "timeout": "Số giây trước khi yêu cầu của nhà cung cấp tìm kiếm hết thời gian.", + "jinaReader": "Dùng Jina Reader cho web_fetch khi có thể.", + "imageGeneration": "Hiển thị generate_image trong chat khi đã cấu hình nhà cung cấp hình ảnh.", + "imageProvider": "Chọn nhà cung cấp registry được generate_image sử dụng.", + "imageProviderStatus": "Tạo ảnh dùng lại thông tin xác thực từ mục Nhà cung cấp.", + "imageModel": "Tên mô hình gửi tới nhà cung cấp ảnh đã chọn.", + "defaultAspectRatio": "Được dùng khi lời nhắc không chọn tỷ lệ khung hình.", "defaultImageSize": "Gợi ý kích thước gửi tới nhà cung cấp hỗ trợ.", "maxImagesPerTurn": "Giới hạn trên cho một yêu cầu generate_image.", - "timezone": "Se usa para horarios y respuestas con conciencia temporal.", - "localServiceAccess": "Cho phép lệnh shell Full Access truy cập dịch vụ localhost.", + "timezone": "Dùng cho lịch và các câu trả lời có yếu tố thời gian.", + "localServiceAccess": "Cho phép lệnh shell có quyền truy cập đầy đủ truy cập các dịch vụ cục bộ.", "webuiDefaultAccess": "Dùng cho chat web không có quyền riêng theo dự án.", - "securityManagedControls": "Las capturas web siempre protegen servicios locales, privados y metadata. La seguridad de canales core se gestiona en config.json.", + "securityManagedControls": "Việc tải nội dung web luôn bảo vệ các dịch vụ cục bộ, riêng tư và siêu dữ liệu. Tính an toàn của các kênh cốt lõi vẫn do config.json quản lý.", "currentModel": "Dùng cho các phản hồi mới.", - "selectedModelProvider": "Definido por el modelo seleccionado.", - "selectedModelValue": "Definido por el modelo seleccionado.", + "selectedModelProvider": "Được đặt bởi mô hình đã chọn.", + "selectedModelValue": "Được đặt bởi mô hình đã chọn.", "brandLogos": "Hiển thị logo nhà cung cấp bên thứ ba và CLI trong Cài đặt.", - "cliAppsCatalog": "Instala solo adaptadores CLI de apps que nanobot puede ejecutar localmente; las apps nativas no se modifican.", - "cliAppsFilter": "Busca por app, categoría o capacidad.", - "logs": "Abre la carpeta de registros del motor nativo.", - "diagnostics": "Exporta un pequeño informe de runtime para soporte.", - "localServiceAccessNative": "Permite que comandos shell con Full Access alcancen servicios en este Mac.", - "webuiDefaultAccessNative": "Usado por chats nativos sin permiso específico de proyecto.", + "cliAppsCatalog": "Chỉ cài đặt các bộ chuyển đổi CLI ứng dụng mà nanobot có thể chạy cục bộ; ứng dụng gốc không bị thay đổi.", + "cliAppsFilter": "Tìm theo ứng dụng, danh mục hoặc khả năng.", + "logs": "Mở thư mục nhật ký của bộ máy gốc.", + "diagnostics": "Xuất báo cáo thời gian chạy ngắn để hỗ trợ.", + "localServiceAccessNative": "Cho phép lệnh shell có quyền truy cập đầy đủ truy cập các dịch vụ trên máy Mac này.", + "webuiDefaultAccessNative": "Dùng cho chat gốc không có quyền riêng theo dự án.", "contextWindow": "Chọn ngân sách ngữ cảnh mặc định cho cấu hình mô hình này.", - "transcription": "Phien am dau vao micro truoc khi gui. Tin nhan giong noi tu kenh chat dung cung cai dat.", - "transcriptionProvider": "Dung thong tin xac thuc cua nha cung cap tu Providers.", - "transcriptionProviderStatus": "API key nam trong providers, khong nam trong cai dat transcription.", - "transcriptionModel": "Giu mac dinh da resolve tru khi nha cung cap can id model tuy chinh.", - "transcriptionLanguage": "Goi y ISO-639 tuy chon, nhu en, zh, ja hoac ko." + "transcription": "Chuyển giọng nói từ micrô thành văn bản trước khi gửi. Tin nhắn thoại từ các kênh chat cũng dùng cùng cài đặt.", + "transcriptionProvider": "Dùng thông tin xác thực của nhà cung cấp tương ứng trong mục Nhà cung cấp.", + "transcriptionProviderStatus": "Khóa API nằm trong mục nhà cung cấp, không nằm trong cài đặt chuyển giọng nói.", + "transcriptionModel": "Giữ mô hình mặc định đã phân giải, trừ khi nhà cung cấp yêu cầu ID mô hình tùy chỉnh.", + "transcriptionLanguage": "Gợi ý ISO-639 tùy chọn, chẳng hạn en, zh, ja hoặc ko." }, "values": { "light": "Sáng", @@ -208,15 +217,15 @@ "ready": "Sẵn sàng", "privateEngine": "Bộ máy riêng", "unixSocket": "Socket Unix", - "defaultWorkspace": "Workspace mặc định", + "defaultWorkspace": "Không gian làm việc mặc định", "comfortable": "Thoải mái", "compact": "Gọn", "auto": "Tự động", "expanded": "Mở rộng", "default": "Mặc định", "summary": "Tóm tắt", - "diff": "Diff", - "collapsedDiff": "Diff thu gọn", + "diff": "Khác biệt", + "collapsedDiff": "Khác biệt đã thu gọn", "on": "Bật", "off": "Tắt", "defaultPermission": "Quyền mặc định", @@ -224,24 +233,27 @@ "configured": "Đã cấu hình", "notConfigured": "Chưa cấu hình", "pending": "Đang chờ", - "restartingEngine": "Đang khởi động lại" + "restartingEngine": "Đang khởi động lại", + "checking": "Đang kiểm tra", + "running": "Đang chạy", + "needsSetup": "Cần thiết lập" }, "status": { "loading": "Đang tải cài đặt...", "loadError": "Không thể tải cài đặt", "unsaved": "Có thay đổi chưa lưu.", "upToDate": "Đã cập nhật.", - "savedRestart": "Guardado. Reinicia nanobot para aplicar.", - "restartAfterSaving": "Guarda los cambios y reinicia cuando puedas.", - "savedRestartApply": "Guardado. Reinicia cuando puedas.", - "imageProviderRestart": "Cambios del proveedor de imagen guardados. Reinicia cuando puedas.", - "hostRestartAfterSaving": "Al guardar, nanobot reiniciará su motor.", - "hostRestartPending": "Guardado. El motor se reiniciará cuando esté listo.", - "hostApiUnavailable": "Las acciones del host solo están disponibles en la app nativa.", - "logsOpened": "Carpeta de registros abierta.", - "logsOpenFailed": "No se pudo abrir la carpeta de registros.", - "diagnosticsExported": "Diagnóstico exportado a {{path}}.", - "diagnosticsExportFailed": "No se pudo exportar el diagnóstico." + "savedRestart": "Đã lưu. Khởi động lại nanobot để áp dụng.", + "restartAfterSaving": "Lưu thay đổi, rồi khởi động lại khi sẵn sàng.", + "savedRestartApply": "Đã lưu. Khởi động lại khi sẵn sàng.", + "imageProviderRestart": "Đã lưu thay đổi nhà cung cấp ảnh. Khởi động lại khi sẵn sàng.", + "hostRestartAfterSaving": "Sau khi lưu, nanobot sẽ khởi động lại bộ máy.", + "hostRestartPending": "Đã lưu. Bộ máy sẽ khởi động lại khi sẵn sàng.", + "hostApiUnavailable": "Các thao tác máy chủ chỉ khả dụng trong ứng dụng gốc.", + "logsOpened": "Đã mở thư mục nhật ký.", + "logsOpenFailed": "Không thể mở thư mục nhật ký.", + "diagnosticsExported": "Đã xuất chẩn đoán tới {{path}}.", + "diagnosticsExportFailed": "Không thể xuất chẩn đoán." }, "actions": { "save": "Lưu", @@ -252,30 +264,31 @@ "deleting": "Đang xóa...", "edit": "Sửa", "cancel": "Hủy", + "dismiss": "Bỏ qua", "open": "Mở", "export": "Xuất", "opening": "Đang mở...", "exporting": "Đang xuất..." }, "byok": { - "description": "Dùng key provider của riêng bạn. Nanobot đọc các giá trị này từ config hiện tại và chỉ provider đã cấu hình mới có thể dùng trong cấu hình mô hình đặt trước.", + "description": "Dùng khóa nhà cung cấp của riêng bạn. Nanobot đọc các giá trị này từ cấu hình hiện tại và chỉ nhà cung cấp đã cấu hình mới có thể dùng trong cấu hình mô hình đặt trước.", "configured": "Đã cấu hình", "notConfigured": "Chưa cấu hình", "configuredSection": "Đã cấu hình", "notConfiguredSection": "Chưa cấu hình", "showMore": "Hiển thị thêm {{count}}", "showLess": "Thu gọn", - "apiKey": "API key", - "apiBase": "API base", - "apiKeyPlaceholder": "Nhập API key", - "apiKeyConfiguredPlaceholder": "Để trống để giữ key hiện tại", - "configuredKeyHint": "Key đã cấu hình", - "apiBasePlaceholder": "Dùng mặc định của provider", - "apiKeyRequired": "Cần API key để cấu hình provider này.", - "showApiKey": "Hiển thị API key", - "hideApiKey": "Ẩn API key", - "noConfiguredProviders": "Chưa có provider đã cấu hình", - "configureFirst": "Hãy cấu hình provider trong BYOK trước.", + "apiKey": "Khóa API", + "apiBase": "Cơ sở API", + "apiKeyPlaceholder": "Nhập khóa API", + "apiKeyConfiguredPlaceholder": "Để trống để giữ khóa hiện tại", + "configuredKeyHint": "Khóa đã cấu hình", + "apiBasePlaceholder": "Dùng giá trị mặc định của nhà cung cấp", + "apiKeyRequired": "Cần khóa API để cấu hình nhà cung cấp này.", + "showApiKey": "Hiển thị khóa API", + "hideApiKey": "Ẩn khóa API", + "noConfiguredProviders": "Chưa có nhà cung cấp nào được cấu hình", + "configureFirst": "Hãy cấu hình nhà cung cấp trong BYOK trước.", "openByok": "Mở BYOK", "tabs": { "ariaLabel": "Loại thông tin xác thực BYOK", @@ -284,19 +297,19 @@ }, "webSearch": { "provider": "Nhà cung cấp tìm kiếm", - "providerHelp": "Chọn backend mà công cụ web search sẽ dùng.", - "selectProvider": "Chọn provider", + "providerHelp": "Chọn hệ thống phụ trợ mà công cụ tìm kiếm web sẽ dùng.", + "selectProvider": "Chọn nhà cung cấp", "credentials": "Thông tin xác thực", - "noCredentialRequired": "Không cần key", - "noCredentialHelp": "DuckDuckGo hoạt động mà không cần lưu API key.", + "noCredentialRequired": "Không cần khóa", + "noCredentialHelp": "DuckDuckGo hoạt động mà không cần lưu khóa API.", "apiKeyHelp": "Được lưu trong config và chỉ hiện dạng che sau khi lưu.", - "baseUrl": "Base URL", + "baseUrl": "URL cơ sở", "baseUrlHelp": "SearXNG cần URL instance của bạn.", "baseUrlPlaceholder": "https://search.example.com", - "apiKeyRequired": "Provider tìm kiếm này cần API key.", - "baseUrlRequired": "SearXNG cần Base URL.", + "apiKeyRequired": "Nhà cung cấp tìm kiếm này cần khóa API.", + "baseUrlRequired": "SearXNG cần URL cơ sở.", "missingCredential": "Thêm thông tin bắt buộc trước khi lưu.", - "saveHint": "Thay đổi áp dụng cho các yêu cầu web search mới." + "saveHint": "Thay đổi áp dụng cho các yêu cầu tìm kiếm trên web mới." } }, "overview": { @@ -311,7 +324,7 @@ }, "usage": { "title": "Hoạt động token", - "shortTitle": "Token Usage", + "shortTitle": "Mức dùng token", "subtitle": "Mức dùng do nhà cung cấp báo cáo trong 12 tháng gần nhất.", "empty": "Hoạt động token sẽ xuất hiện sau các phản hồi mô hình mới.", "totalTokens": "Tổng token", @@ -358,8 +371,18 @@ "selectProvider": "Chọn nhà cung cấp", "selectAspect": "Chọn tỷ lệ", "selectSize": "Chọn kích thước", + "selectModel": "Chọn mô hình ảnh", + "searchOrTypeModel": "Tìm kiếm hoặc nhập ID mô hình", + "typeModelId": "Nhập ID mô hình được nhà cung cấp này hỗ trợ.", "configureProvider": "Cấu hình nhà cung cấp", - "missingCredential": "Configura este proveedor antes de activar la generación de imágenes." + "missingCredential": "Cấu hình nhà cung cấp này trước khi bật tạo ảnh." + }, + "capabilities": { + "providerSupport": "Hỗ trợ nhà cung cấp", + "providerInstallOnSave": "Hỗ trợ cần thiết sẽ được cài đặt tự động khi bạn lưu nhà cung cấp này.", + "searchSupport": "Hỗ trợ nhà cung cấp tìm kiếm", + "searchInstallOnSave": "Hỗ trợ Olostep sẽ được cài đặt tự động khi bạn lưu.", + "installing": "Đang cài đặt hỗ trợ..." }, "models": { "selectModel": "Chọn mô hình", @@ -383,7 +406,7 @@ "advancedOptions": "Tùy chọn nâng cao", "advancedSummary": "Ngữ cảnh {{context}} · Tối đa {{max}} token", "maxTokens": "Token đầu ra tối đa", - "temperature": "Temperature", + "temperature": "Nhiệt độ", "reasoningEffort": "Mức suy luận", "convertTitle": "Chuyển đổi thiết lập mô hình hiện tại", "convertHelp": "Chuyển mô hình chính và các mô hình dự phòng hiện có thành cấu hình đặt trước để quản lý thứ tự tại đây.", @@ -458,11 +481,11 @@ }, "mcp": { "allCategories": "Tất cả danh mục", - "summary": "Đã bật {{installed}} / {{total}} preset", + "summary": "Đã bật {{installed}} / {{total}} cấu hình đặt trước", "filterAll": "Tất cả", "filterInstalled": "Đã bật", "filterNotInstalled": "Chưa bật", - "searchPlaceholder": "Tìm preset MCP", + "searchPlaceholder": "Tìm cấu hình đặt trước MCP", "moreOptions": "Tùy chọn MCP khác", "moreOptionsSubtitle": "Thêm máy chủ tùy chỉnh hoặc nhập mcp.json.", "customTitle": "MCP tùy chỉnh", @@ -473,9 +496,9 @@ "serverUrl": "URL", "transport": "Giao thức truyền", "command": "Lệnh", - "args": "Args JSON", - "headers": "Headers JSON", - "env": "Env JSON", + "args": "Đối số JSON", + "headers": "Header JSON", + "env": "Môi trường JSON", "timeout": "Thời gian chờ công cụ", "advancedOptions": "Tùy chọn nâng cao", "hideAdvanced": "Ẩn nâng cao", @@ -484,8 +507,8 @@ "importConfig": "Nhập", "restartRequired": "Khởi động lại nanobot để kết nối các công cụ MCP đã cập nhật.", "toolsFound": "{{count}} công cụ", - "loading": "Đang tải preset MCP...", - "empty": "Không có preset MCP nào khớp bộ lọc này.", + "loading": "Đang tải cấu hình đặt trước MCP...", + "empty": "Không có cấu hình đặt trước MCP nào khớp bộ lọc này.", "openDocs": "Mở tài liệu", "test": "Kiểm tra", "remove": "Xóa", @@ -503,6 +526,7 @@ "statusMissingCredentials": "Cần khóa", "statusMissingDependency": "Cần phụ thuộc", "statusComingSoon": "Sắp ra mắt", + "comingSoon": "Sắp ra mắt", "statusNotInstalled": "Chưa bật", "toolScope": "Công cụ", "allTools": "Tất cả", @@ -510,7 +534,7 @@ "testForTools": "Chạy Kiểm tra để xem và chọn từng công cụ." }, "api": { - "title": "Máy chủ API", "openaiCompatible": "API tương thích OpenAI", "description": "Kết nối SDK và agent qua endpoint /v1 cục bộ.", + "title": "Máy chủ API", "openaiCompatible": "API tương thích OpenAI", "description": "Kết nối SDK và tác nhân qua điểm cuối /v1 cục bộ.", "start": "Khởi động API", "starting": "Đang khởi động...", "stop": "Dừng", "stopping": "Đang dừng...", "access": "Truy cập", "thisDevice": "Thiết bị này", "localNetwork": "Mạng nội bộ", "localHelp": "Chỉ thiết bị này có thể kết nối.", "networkHelp": "Thiết bị khác có thể kết nối; cần khóa API.", @@ -544,7 +568,7 @@ "restartRequired": "Khởi động lại nanobot để áp dụng ứng dụng và tính năng đã cập nhật." }, "channels": { - "description": "Kết nối nanobot với các ứng dụng chat. Cài đặt hỗ trợ chỉ thêm gói tích hợp; hầu hết kênh vẫn cần token hoặc cấu hình workspace.", + "description": "Kết nối nanobot với các ứng dụng chat. Cài đặt hỗ trợ chỉ thêm gói tích hợp; hầu hết kênh vẫn cần token hoặc cấu hình không gian làm việc.", "caption": "{{enabled}} đã bật · {{total}} kênh", "searchPlaceholder": "Tìm kênh", "backToChannels": "Tất cả kênh", @@ -565,6 +589,8 @@ "advanced": "Nâng cao", "checkAndEnable": "Kiểm tra và bật", "checkConnection": "Kiểm tra kết nối", + "connectionChecks": "Kiểm tra kết nối", + "open": "Mở", "checkedAndEnabled": "Đã kiểm tra và bật.", "checking": "Đang kiểm tra...", "checkOnly": "Chỉ kiểm tra", @@ -660,6 +686,8 @@ "protected": "Được bảo vệ", "editTitle": "Sửa tự động hóa", "save": "Lưu", + "commandCopied": "Đã sao chép", + "copyCommand": "Sao chép", "deleteTitle": "Xóa tự động hóa", "deleteDescription": "Thao tác này xóa {{name}} khỏi kho cron. Tin nhắn chat trước đó vẫn ở trong phiên.", "cancel": "Hủy", @@ -719,6 +747,7 @@ "fields": { "name": "Tên", "message": "Tin nhắn", + "command": "Lệnh", "scheduleType": "Loại lịch", "every": "Mỗi", "unit": "Đơn vị", @@ -753,7 +782,7 @@ "signInAgain": "Đăng nhập lại", "signOut": "Đăng xuất", "signedInAs": "Đã đăng nhập bằng {{account}}", - "signInHelp": "Inicia sesión desde este dispositivo; no se guarda API key en config.", + "signInHelp": "Đăng nhập từ thiết bị này; khóa API không được lưu trong config.", "remoteSignInHelp": "Chọn Đăng nhập để mở xAI trên máy tính của bạn, sau đó dán mã ủy quyền được hiển thị sau khi đăng nhập.", "codexRemoteSignInHelp": "Đăng nhập trong trình duyệt này, sau đó dán lại URL callback localhost đầy đủ vào nanobot.", "signInRequired": "Cần đăng nhập", @@ -776,7 +805,7 @@ "finishSignIn": "Hoàn tất đăng nhập" }, "skills": { - "description": "Xem các kỹ năng chỉ dẫn mà agent này có thể tải trong cuộc trò chuyện.", + "description": "Xem các kỹ năng chỉ dẫn mà tác nhân này có thể tải trong cuộc trò chuyện.", "caption": "{{available}} khả dụng · tổng {{total}}", "views": "Chế độ xem kỹ năng", "installedTab": "Đã cài đặt", @@ -784,34 +813,34 @@ "customGroup": "Tùy chỉnh", "builtinGroup": "Tích hợp sẵn", "otherGroup": "Khác", - "searchInstalled": "Tìm skill đã cài đặt", + "searchInstalled": "Tìm kỹ năng đã cài đặt", "filterAll": "Tất cả", "filterEnabled": "Đã bật", "filterDisabled": "Đã tắt", - "noMatching": "Không có skill phù hợp.", + "noMatching": "Không có kỹ năng phù hợp.", "statusDisabled": "Đã tắt", "statusEnabled": "Đã bật", "statusNeedsSetup": "Cần thiết lập", "showLess": "Thu gọn", "showMore": "Hiển thị thêm", - "enabledControl": "Sử dụng skill này", - "enabledDescription": "Cho phép agent tải skill này khi các yêu cầu đã sẵn sàng.", + "enabledControl": "Sử dụng kỹ năng này", + "enabledDescription": "Cho phép tác nhân tải kỹ năng này khi các yêu cầu đã sẵn sàng.", "enableSkill": "Bật {{name}}", "disableSkill": "Tắt {{name}}", - "updateFailed": "Không thể cập nhật skill này.", - "deleteTitle": "Xóa skill", - "deleteDescription": "Xóa skill này khỏi workspace hiện tại.", + "updateFailed": "Không thể cập nhật kỹ năng này.", + "deleteTitle": "Xóa kỹ năng", + "deleteDescription": "Xóa kỹ năng này khỏi không gian làm việc hiện tại.", "deleteAction": "Xóa", - "deleteFailed": "Không thể xóa skill này.", + "deleteFailed": "Không thể xóa kỹ năng này.", "deleteConfirmTitle": "Xóa {{name}}?", - "deleteConfirmDescription": "Thao tác này xóa các tệp skill khỏi workspace hiện tại và không thể hoàn tác.", - "deleteConfirmAction": "Xóa skill", - "instructionsTitle": "Hướng dẫn skill", + "deleteConfirmDescription": "Thao tác này xóa các tệp kỹ năng khỏi không gian làm việc hiện tại và không thể hoàn tác.", + "deleteConfirmAction": "Xóa kỹ năng", + "instructionsTitle": "Hướng dẫn kỹ năng", "setupRequired": "Cần thiết lập", "setupDescription": "Cài đặt phần phụ thuộc còn thiếu trên máy chạy nanobot rồi kiểm tra lại.", "copySetupCommand": "Sao chép lệnh thiết lập", "checkAgain": "Kiểm tra lại", - "marketplaceSearchFailed": "Không thể tìm kiếm các kho kỹ năng.", + "marketplaceSearchFailed": "Không thể tìm kiếm các chợ kỹ năng.", "marketplaceInstallFailed": "Không thể cài đặt kỹ năng này.", "marketplaceSearchPlaceholder": "Tìm kiếm kỹ năng", "marketplaceSearchLabel": "Tìm kiếm kỹ năng", @@ -824,7 +853,7 @@ "marketplaceTrendingUnavailable": "Các kỹ năng thịnh hành tạm thời không khả dụng.", "marketplaceEmpty": "Không tìm thấy kỹ năng cho “{{query}}”.", "marketplaceConfirmTitle": "Cài đặt {{name}}?", - "marketplaceConfirmDescription": "Kỹ năng bên thứ ba này đến từ {{provider}} ({{source}}) và có thể chứa hướng dẫn hoặc tập lệnh thực thi.", + "marketplaceConfirmDescription": "Kỹ năng của bên thứ ba này đến từ {{provider}} ({{source}}) và có thể chứa hướng dẫn hoặc tập lệnh thực thi.", "marketplaceConfirmInstall": "Cài đặt kỹ năng", "marketplaceOpen": "Mở {{name}} trên {{provider}}", "marketplaceOpenProvider": "Mở {{provider}}", @@ -836,7 +865,7 @@ "marketplaceInstall": "Cài đặt", "marketplaceNoTrend": "Chưa có xu hướng", "marketplaceTrendLabel": "Xu hướng lượt cài đặt trong 8 tuần", - "featured": "Kỹ năng agent", + "featured": "Kỹ năng của tác nhân", "empty": "Không có kỹ năng nào khả dụng.", "sourceWorkspace": "Tùy chỉnh", "sourceBuiltin": "Tích hợp", @@ -861,9 +890,9 @@ "detailDescription": "Chi tiết cho {{name}}." }, "voice": { - "selectProvider": "Chon nha cung cap", - "configureProvider": "Cau hinh nha cung cap", - "languageAuto": "Tu dong" + "selectProvider": "Chọn nhà cung cấp", + "configureProvider": "Cấu hình nhà cung cấp", + "languageAuto": "Tự động" } }, "chat": { @@ -877,34 +906,34 @@ "actions": "Tác vụ cho chủ đề {{title}}", "newInProject": "Bắt đầu chủ đề mới trong {{project}}", "activity": { - "running": "Agent running", - "complete": "Agent finished", - "updated": "New activity" + "running": "Tác nhân đang chạy", + "complete": "Tác nhân đã hoàn tất", + "updated": "Hoạt động mới" }, - "pin": "Pin", - "unpin": "Unpin", - "rename": "Rename", + "pin": "Ghim", + "unpin": "Bỏ ghim", + "rename": "Đổi tên", "renameTitle": "Đổi tên chủ đề", "renameDescription": "Chọn tên hiển thị trong thanh bên cho chủ đề này.", "renamePlaceholder": "Tên chủ đề", - "renameProjectTitle": "Rename project", - "renameProjectDescription": "Choose a local sidebar name for this project.", - "renameProjectPlaceholder": "Project name", - "renameSave": "Save", - "archive": "Archive", - "unarchive": "Unarchive", - "showArchived": "Show archived", - "hideArchived": "Hide archived", + "renameProjectTitle": "Đổi tên dự án", + "renameProjectDescription": "Chọn tên hiển thị cục bộ cho dự án này trên thanh bên.", + "renameProjectPlaceholder": "Tên dự án", + "renameSave": "Lưu", + "archive": "Lưu trữ", + "unarchive": "Bỏ lưu trữ", + "showArchived": "Hiện mục đã lưu trữ", + "hideArchived": "Ẩn mục đã lưu trữ", "delete": "Xóa", "newChat": "Chủ đề mới", "groups": { - "pinned": "Pinned", + "pinned": "Đã ghim", "all": "Chủ đề", - "projects": "Projects", - "today": "Today", - "yesterday": "Yesterday", - "earlier": "Earlier", - "archived": "Archived" + "projects": "Dự án", + "today": "Hôm nay", + "yesterday": "Hôm qua", + "earlier": "Trước đó", + "archived": "Đã lưu trữ" } }, "deleteConfirm": { @@ -970,25 +999,25 @@ }, "more": { "title": "Thêm", - "prompt": "Cho tôi xem vài cách hữu ích mà bạn có thể giúp trong workspace này." + "prompt": "Cho tôi xem vài cách hữu ích mà bạn có thể giúp trong không gian làm việc này." } }, "imageQuickActions": { "icon": { - "title": "Thiết kế biểu tượng app", + "title": "Thiết kế biểu tượng ứng dụng", "prompt": "Tạo một biểu tượng ứng dụng 1:1 gọn gàng cho nanobot: robot thân thiện, phong cách vector đơn giản, bảng màu xanh trắng dịu, không có chữ." }, "sticker": { - "title": "Tạo sticker", - "prompt": "Tạo một hình kiểu sticker dễ thương của trợ lý robot nhỏ, nền trông như trong suốt, biểu cảm và vui nhộn." + "title": "Tạo nhãn dán", + "prompt": "Tạo một hình kiểu nhãn dán dễ thương của trợ lý robot nhỏ, nền trông như trong suốt, biểu cảm và vui nhộn." }, "poster": { "title": "Tạo poster", - "prompt": "Tạo một ý tưởng poster chỉn chu cho trợ lý AI cá nhân, bố cục hiện đại, phân cấp thị giác rõ, phù hợp cho landing page." + "prompt": "Tạo một ý tưởng poster chỉn chu cho trợ lý AI cá nhân, bố cục hiện đại, phân cấp thị giác rõ, phù hợp cho trang đích." }, "product": { - "title": "Mockup sản phẩm", - "prompt": "Tạo một hình mockup sản phẩm gọn gàng cho ứng dụng web AI hội thoại, giao diện tối giản, ánh sáng cao cấp, khung thiết bị chân thực." + "title": "Mô hình mẫu sản phẩm", + "prompt": "Tạo một hình mô hình mẫu sản phẩm gọn gàng cho ứng dụng web AI hội thoại, giao diện tối giản, ánh sáng cao cấp, khung thiết bị chân thực." }, "portrait": { "title": "Chân dung cách điệu", @@ -1069,7 +1098,7 @@ "auto": "Tự động", "1_1": "Vuông 1:1", "3_4": "Dọc 3:4", - "9_16": "Story 9:16", + "9_16": "Tin 9:16", "4_3": "Ngang 4:3", "16_9": "Rộng 16:9" } @@ -1109,7 +1138,7 @@ }, "stop": { "title": "Dừng tác vụ hiện tại", - "description": "Hủy lượt agent đang chạy trong cuộc trò chuyện này." + "description": "Hủy lượt của tác nhân đang chạy trong cuộc trò chuyện này." }, "restart": { "title": "Khởi động lại nanobot", @@ -1117,11 +1146,11 @@ }, "status": { "title": "Hiển thị trạng thái", - "description": "Hiển thị trạng thái runtime, provider và channel." + "description": "Hiển thị trạng thái thời gian chạy, nhà cung cấp và kênh." }, "model": { "title": "Mô hình", - "description": "Hiển thị hoặc chuyển preset mô hình đang hoạt động." + "description": "Hiển thị hoặc chuyển cấu hình đặt trước của mô hình đang hoạt động." }, "history": { "title": "Hiển thị lịch sử", @@ -1137,19 +1166,19 @@ }, "dream_restore": { "title": "Khôi phục bộ nhớ", - "description": "Đưa bộ nhớ về một snapshot Dream trước đó." + "description": "Đưa bộ nhớ về một ảnh chụp Dream trước đó." }, "dream_prompt": { "title": "Bộ nhớ Dream", - "description": "Cho Dream biết cách sắp xếp bộ nhớ của workspace này." + "description": "Cho Dream biết cách sắp xếp bộ nhớ của không gian làm việc này." }, "goal": { "title": "Mục tiêu dài hạn", - "description": "Yêu cầu agent xử lý đây là mục tiêu nhiều bước kéo dài." + "description": "Yêu cầu tác nhân xử lý đây là mục tiêu nhiều bước kéo dài." }, "trigger": { - "title": "Tạo trigger cục bộ", - "description": "Tạo trigger CLI gắn với phiên chat này." + "title": "Tạo trình kích hoạt cục bộ", + "description": "Tạo trình kích hoạt CLI gắn với phiên chat này." }, "help": { "title": "Hiển thị trợ giúp", @@ -1195,10 +1224,12 @@ "cliBadge": "CLI", "mcpBadge": "MCP", "cliDescription": "Dùng @{{name}} như ứng dụng CLI cục bộ", - "mcpDescription": "Dùng @{{name}} như máy chủ MCP" + "mcpDescription": "Dùng @{{name}} như máy chủ MCP", + "cliTitle": "Ứng dụng CLI: {{name}}", + "mcpTitle": "Máy chủ MCP: {{name}}" }, "workspace": { - "accessAria": "Chế độ truy cập workspace", + "accessAria": "Chế độ truy cập không gian làm việc", "projectAria": "Chọn dự án", "projectPlaceholder": "Chọn dự án", "default": "Quyền mặc định", @@ -1211,11 +1242,12 @@ "loadEarlier": "Tải tin nhắn trước đó", "forkedFromHistory": "Tách nhánh từ lịch sử", "promptNavigator": { - "open": "Mở trình điều hướng prompt", - "title": "Prompt", - "search": "Tìm prompt", - "noResults": "Không có prompt phù hợp.", - "jumpTo": "Nhảy tới prompt: {{label}}" + "open": "Mở trình điều hướng lời nhắc", + "title": "Lời nhắc", + "search": "Tìm lời nhắc", + "noResults": "Không có lời nhắc phù hợp.", + "jumpTo": "Nhảy tới lời nhắc: {{label}}", + "railAria": "Điều hướng lời nhắc của người dùng" } }, "message": { @@ -1239,19 +1271,27 @@ "agentActivityLiveSummary": "Đang chạy… · {{reasoning}} bước · {{tools}} lần gọi công cụ", "agentActivityLiveToolsOnly": "Đang chạy… · {{tools}} lần gọi công cụ", "imageAttachment": "Tệp hình ảnh đính kèm", + "videoAttachment": "Tệp video đính kèm", + "fileAttachment": "Tệp đính kèm", + "attachmentUnavailable": "Tệp đính kèm không khả dụng", + "dataTable": "Bảng dữ liệu", + "fileEditPreparing": "Đang chuẩn bị sửa tệp…", + "openLink": "Mở liên kết: {{label}}", + "openAttachment": "Mở {{name}}", + "skill": "Kỹ năng: {{name}}", "askAboutSelection": "Hỏi về nội dung này", "forkFromHere": "Tách nhánh", "copyReply": "Sao chép", "copiedReply": "Đã sao chép", "turnLatencyTitle": "Thời gian phản hồi (end-to-end)", - "fileEditViewDiff": "Xem diff", - "fileEditViewLargeDiff": "Xem diff lớn", + "fileEditViewDiff": "Xem khác biệt", + "fileEditViewLargeDiff": "Xem khác biệt lớn", "fileEditDiffLineCount": "{{count}} dòng", "fileEditUnchangedLinesHidden": "Đã ẩn {{count}} dòng không đổi", "fileEditShowMoreLines": "Hiển thị thêm {{count}} dòng", "fileEditShowFewerLines": "Hiển thị ít dòng hơn", "fileEditOpenFile": "Mở tệp", - "fileEditDiffTruncated": "Diff đã bị cắt bớt. Mở tệp để xem toàn bộ thay đổi.", + "fileEditDiffTruncated": "Khác biệt đã bị cắt bớt. Mở tệp để xem toàn bộ thay đổi.", "activityThinkingFor": "Đang suy nghĩ trong {{duration}}", "activityThought": "Đã suy nghĩ", "activityThoughtFor": "Đã suy nghĩ trong {{duration}}", @@ -1279,6 +1319,7 @@ }, "filePreview": { "aria": "Xem trước tệp", + "breadcrumb": "Đường dẫn tệp", "close": "Đóng xem trước tệp", "loading": "Đang tải bản xem trước...", "failed": "Không thể xem trước tệp này.", @@ -1293,7 +1334,10 @@ "copied": "Đã sao chép" }, "common": { - "dismiss": "Đóng" + "dismiss": "Đóng", + "close": "Đóng", + "current": "Hiện tại", + "cancel": "Hủy" }, "errors": { "messageTooBig": { @@ -1301,8 +1345,8 @@ "body": "Máy chủ đã từ chối tin nhắn trước vì vượt quá giới hạn kích thước. Hãy bớt ảnh hoặc chọn tệp nhỏ hơn rồi thử lại." }, "workspaceScopeRejected": { - "title": "Workspace không thay đổi", - "body": "Gateway đã từ chối dự án hoặc chế độ truy cập được yêu cầu, nên Nanobot giữ workspace trước đó." + "title": "Không gian làm việc không thay đổi", + "body": "Gateway đã từ chối dự án hoặc chế độ truy cập được yêu cầu, nên Nanobot giữ không gian làm việc trước đó." }, "turnRejected": { "title": "Tin nhắn chưa được gửi", @@ -1311,7 +1355,7 @@ }, "workspace": { "dialog": { - "defaultProject": "Workspace mặc định", + "defaultProject": "Không gian làm việc mặc định", "manual": "Dán đường dẫn", "manualPlaceholder": "/Users/name/project", "usePath": "Dùng đường dẫn", diff --git a/webui/src/i18n/locales/zh-CN/common.json b/webui/src/i18n/locales/zh-CN/common.json index fee2306fd..5664baf14 100644 --- a/webui/src/i18n/locales/zh-CN/common.json +++ b/webui/src/i18n/locales/zh-CN/common.json @@ -7,18 +7,18 @@ }, "error": { "title": "无法连接到 nanobot", - "gatewayHint": "请确认 gateway 已启动(`nanobot gateway`),并且当前页面与 gateway 运行在同一台机器上。" + "gatewayHint": "请确认网关已启动(`nanobot gateway`),并且当前页面与网关运行在同一台机器上。" }, "auth": { "title": "需要验证", - "hint": "请输入 gateway 配置中的 tokenIssueSecret。", + "hint": "请输入网关配置中的 tokenIssueSecret。", "placeholder": "密码", "submit": "连接", "invalid": "密码无效,请重试。" }, "account": { "section": "账户", - "logoutHint": "断开此浏览器与 gateway 的连接。", + "logoutHint": "断开此浏览器与网关的连接。", "logout": "退出登录" }, "system": { @@ -38,6 +38,15 @@ }, "meta": { "description": "nanobot Web UI —— 与你的 nanobot 工作区对话。" + }, + "pairing": { + "title": "配对聊天用户", + "description": "输入聊天中显示的配对码。", + "code": "配对码", + "matched": "已匹配 {{channel}},正在连接…", + "expiresInline": "配对码将于 {{expires}} 过期。", + "queueCount": "{{count}} 个待处理", + "noMatch": "没有待处理请求与此配对码匹配。" } }, "sidebar": { @@ -75,7 +84,7 @@ "providers": "提供商", "image": "图片", "voice": "语音", - "browser": "网页", + "browser": "网络", "channels": "渠道", "cliApps": "CLI 应用", "mcp": "MCP", @@ -95,8 +104,8 @@ "presets": "预设", "imageGeneration": "图片生成", "imageDefaults": "默认值", - "webSearch": "网页搜索", - "webBehavior": "行为", + "webSearch": "网络搜索", + "webBehavior": "网络行为", "cliApps": "CLI 应用", "mcp": "MCP 服务", "regional": "区域", @@ -129,7 +138,7 @@ "advancedOptions": "高级选项", "advancedSummary": "上下文 {{context}} · 最大输出 {{max}} tokens", "maxTokens": "最大输出 tokens", - "temperature": "Temperature", + "temperature": "温度", "reasoningEffort": "推理强度", "convertTitle": "转换现有模型设置", "convertHelp": "把现有主模型和备用模型转换成预设,之后即可在这里管理调用顺序。", @@ -175,7 +184,7 @@ "presetModel": "预设模型", "density": "密度", "activityMode": "活动详情", - "fileEditDisplay": "文件编辑展示", + "fileEditDisplay": "文件编辑显示", "codeWrap": "代码换行", "brandLogos": "品牌 Logo", "maxResults": "最大结果数", @@ -217,16 +226,16 @@ "selectedModelProvider": "由选中的模型决定。", "selectedModelValue": "由选中的模型决定。", "selectedPreset": "命名预设在这里只读;请在 config.json 中编辑。", - "presetModel": "切回 Default 后可在 WebUI 中编辑模型和提供商。", + "presetModel": "切回默认预设后可在 WebUI 中编辑模型和提供商。", "density": "只保存在此浏览器中。", - "activityMode": "选择默认显示多少 agent 活动细节。", + "activityMode": "选择默认显示多少智能体活动详情。", "fileEditDisplay": "选择文件编辑活动默认显示行数还是差异。", "codeWrap": "让长代码行在小屏幕上也易读。", "brandLogos": "在设置中显示第三方提供商和 CLI 图标。", "maxResults": "每次 web_search 调用返回的结果数。", - "timeout": "搜索提供商请求超时前的秒数。", + "timeout": "搜索提供商请求超时前等待的秒数。", "jinaReader": "可用时为 web_fetch 使用 Jina Reader。", - "imageGeneration": "配置图片提供商后,在聊天中开放 generate_image。", + "imageGeneration": "配置图片提供商后,即可在聊天中使用 generate_image。", "imageProvider": "选择 generate_image 使用的注册提供商。", "imageProviderStatus": "图片生成会复用「提供商」里的凭据。", "imageModel": "选择当前图片提供商支持的模型。", @@ -246,7 +255,7 @@ "contextWindow": "选择此模型配置的默认上下文预算。", "transcription": "发送前先把麦克风输入转写到输入框。聊天渠道里的语音消息也使用同一套设置。", "transcriptionProvider": "使用「提供商」中对应提供商的凭据。", - "transcriptionProviderStatus": "API Key 仍保存在 providers 里,不写进 transcription 设置。", + "transcriptionProviderStatus": "API 密钥仍保存在“提供商”配置中,不写入“语音转写”设置。", "transcriptionModel": "除非提供商需要自定义模型 ID,否则保持解析后的默认值即可。", "transcriptionLanguage": "可选 ISO-639 语言提示,例如 en、zh、ja 或 ko。" }, @@ -331,15 +340,16 @@ "setup": "连接", "configure": "连接", "connectTitle": "连接 {{name}}", - "connectHint": "填入你账户里的 key。", + "connectHint": "填入账户中的密钥。", "saveAndEnable": "保存并启用", "updateSetup": "更新配置", "configured": "已配置", "keepExisting": "留空则保留当前值", "statusConfigured": "已配置", - "statusMissingCredentials": "需要 key", + "statusMissingCredentials": "需要密钥", "statusMissingDependency": "缺少依赖", "statusComingSoon": "暂不支持", + "comingSoon": "即将推出", "statusNotInstalled": "未启用", "toolScope": "工具", "allTools": "全部", @@ -355,7 +365,7 @@ "restartPending": "等待重启", "ready": "就绪", "privateEngine": "私有引擎", - "unixSocket": "Unix socket", + "unixSocket": "Unix 套接字", "defaultWorkspace": "默认工作区", "comfortable": "舒适", "compact": "紧凑", @@ -372,7 +382,10 @@ "configured": "已配置", "notConfigured": "未配置", "pending": "等待中", - "restartingEngine": "正在重启" + "restartingEngine": "正在重启", + "checking": "检查中", + "running": "运行中", + "needsSetup": "需要设置" }, "status": { "loading": "正在加载设置...", @@ -400,51 +413,52 @@ "delete": "删除", "deleting": "正在删除...", "cancel": "取消", + "dismiss": "关闭", "open": "打开", "export": "导出", "opening": "正在打开...", "exporting": "正在导出..." }, "byok": { - "description": "自带服务商密钥。Nanobot 会从当前 config 读取这些值,只有已配置的服务商才能用于模型预设。", + "description": "使用自己的提供商密钥。nanobot 会从当前配置读取这些值,只有已配置的提供商才能用于模型预设。", "configured": "已配置", "notConfigured": "未配置", "configuredSection": "已配置", "notConfiguredSection": "未配置", "showMore": "再显示 {{count}} 个", "showLess": "收起", - "apiKey": "API key", - "apiBase": "API base", - "apiKeyPlaceholder": "输入 API key", - "apiKeyConfiguredPlaceholder": "留空则保留当前 key", - "configuredKeyHint": "已配置的 key", - "apiBasePlaceholder": "使用服务商默认地址", - "apiKeyRequired": "需要 API key 才能配置此服务商。", - "showApiKey": "显示 API key", - "hideApiKey": "隐藏 API key", - "noConfiguredProviders": "没有已配置的服务商", - "configureFirst": "请先在 BYOK 里配置服务商。", + "apiKey": "API 密钥", + "apiBase": "API 基础地址", + "apiKeyPlaceholder": "输入 API 密钥", + "apiKeyConfiguredPlaceholder": "留空则保留当前密钥", + "configuredKeyHint": "已配置的密钥", + "apiBasePlaceholder": "使用提供商默认地址", + "apiKeyRequired": "需要 API 密钥才能配置此提供商。", + "showApiKey": "显示 API 密钥", + "hideApiKey": "隐藏 API 密钥", + "noConfiguredProviders": "没有已配置的提供商", + "configureFirst": "请先在 BYOK 中配置提供商。", "openByok": "打开 BYOK", "tabs": { "ariaLabel": "BYOK 凭证类型", "llm": "LLM", - "webSearch": "网页搜索" + "webSearch": "网络搜索" }, "webSearch": { - "provider": "搜索服务商", - "providerHelp": "选择网页搜索工具使用的后端。", - "selectProvider": "选择服务商", + "provider": "搜索提供商", + "providerHelp": "选择网络搜索工具使用的后端。", + "selectProvider": "选择提供商", "credentials": "凭证", - "noCredentialRequired": "无需 key", - "noCredentialHelp": "DuckDuckGo 不需要保存 API key。", - "apiKeyHelp": "保存到 config 后只显示掩码提示。", - "baseUrl": "Base URL", + "noCredentialRequired": "无需密钥", + "noCredentialHelp": "DuckDuckGo 无需保存 API 密钥。", + "apiKeyHelp": "保存到 config 后仅显示掩码。", + "baseUrl": "基础 URL", "baseUrlHelp": "SearXNG 需要你自己的实例地址。", "baseUrlPlaceholder": "https://search.example.com", - "apiKeyRequired": "这个搜索服务商需要 API key。", - "baseUrlRequired": "SearXNG 需要 Base URL。", + "apiKeyRequired": "此搜索提供商需要 API 密钥。", + "baseUrlRequired": "SearXNG 需要基础 URL。", "missingCredential": "填写所需凭证后才能保存。", - "saveHint": "改动会应用到新的网页搜索请求。" + "saveHint": "改动会应用到新的网络搜索请求。" } }, "overview": { @@ -452,19 +466,19 @@ "providers": "提供商", "configuredCount": "已配置 {{count}} 个", "totalProviders": "共 {{count}} 个可用", - "webSearch": "网页搜索", + "webSearch": "网络搜索", "imageGeneration": "图片生成", "voiceInput": "语音识别", "workspace": "工作区" }, "usage": { - "title": "Token 活动", - "shortTitle": "Token Usage", - "subtitle": "最近 12 个月由提供商上报的 token 用量。", - "empty": "新的模型回复产生后,这里会显示 token 活动。", - "totalTokens": "累计 Token 数", - "peakTokens": "峰值 Token 数", - "thirtyDayTokens": "30 天 Token 数", + "title": "Token 用量", + "shortTitle": "Token 用量", + "subtitle": "最近 12 个月由提供商上报的 Token 用量。", + "empty": "模型产生新的回复后,这里会显示 Token 用量。", + "totalTokens": "Token 总数", + "peakTokens": "Token 峰值", + "thirtyDayTokens": "30 天 Token 用量", "currentStreak": "当前连续天数", "longestStreak": "最长连续天数", "daysValue": "{{count}} 天", @@ -509,13 +523,23 @@ "selectProvider": "选择提供商", "selectAspect": "选择比例", "selectSize": "选择尺寸", + "selectModel": "选择图片模型", + "searchOrTypeModel": "搜索或输入模型 ID", + "typeModelId": "输入此提供商支持的模型 ID。", "configureProvider": "配置提供商", "missingCredential": "启用图片生成前请先配置此提供商。" }, + "capabilities": { + "providerSupport": "提供商支持", + "providerInstallOnSave": "保存此提供商时会自动安装所需支持。", + "searchSupport": "搜索提供商支持", + "searchInstallOnSave": "保存时会自动安装 Olostep 支持。", + "installing": "正在安装支持…" + }, "api": { "title": "API 服务", "openaiCompatible": "OpenAI 兼容 API", - "description": "让 SDK 和其他 Agent 通过本地 /v1 接口连接 nanobot。", + "description": "让 SDK 和其他智能体通过本地 /v1 接口连接 nanobot。", "start": "启动 API 服务", "starting": "正在启动...", "stop": "停止", @@ -524,13 +548,13 @@ "thisDevice": "仅此设备", "localNetwork": "局域网", "localHelp": "只有当前设备可以连接。", - "networkHelp": "局域网内其他设备可以连接,因此必须设置 API Key。", + "networkHelp": "局域网内其他设备可以连接,因此必须设置 API 密钥。", "port": "端口", "portHelp": "API 服务使用的本地端口。", - "apiKey": "API Key", + "apiKey": "API 密钥", "apiKeyHelp": "客户端使用 Bearer Token 发送此密钥。", "apiKeyRequired": "向局域网开放 API 前必须设置密钥。", - "apiKeyPlaceholder": "输入 API Key", + "apiKeyPlaceholder": "输入 API 密钥", "autoInstall": "启动时会自动安装 API 支持。" }, "observability": { @@ -540,7 +564,7 @@ "enable": "启用追踪支持" }, "apps": { - "description": "把工具连接到 nanobot,然后在对话中 @ 使用。", + "description": "将工具接入 nanobot,然后在对话中通过 @ 调用。", "cliLabel": "应用", "mcpLabel": "集成", "channelLabel": "渠道", @@ -569,7 +593,7 @@ "requires": "需要:{{requirements}}", "setUp": "设置", "setupGuide": "配置指南", - "setupSummary": "启用只会打开 nanobot 的渠道支持。请补充平台凭据,然后重启 nanobot。", + "setupSummary": "启用只会开启 nanobot 对该渠道的支持。请补充平台凭据,然后重启 nanobot。", "configKeys": "配置字段", "enable": "启用渠道", "disable": "禁用渠道", @@ -579,6 +603,8 @@ "advanced": "高级", "checkAndEnable": "检查并启用", "checkConnection": "检查连接", + "connectionChecks": "连接检查", + "open": "打开", "checkedAndEnabled": "已检查并启用。", "checking": "正在检查...", "checkOnly": "仅检查", @@ -601,7 +627,7 @@ "managedByWebui": "由 WebUI 管理", "officialGuide": "官方指南", "optional": "可选", - "providerPreset": "服务商", + "providerPreset": "提供商", "requiredSetup": "必需配置", "savedSecret": "已保存", "savedSecretPlaceholder": "已保存的密钥", @@ -674,6 +700,8 @@ "protected": "受保护", "editTitle": "编辑自动任务", "save": "保存", + "commandCopied": "已复制", + "copyCommand": "复制", "deleteTitle": "删除自动任务", "deleteDescription": "这会从 cron 存储中删除 {{name}},历史聊天消息会保留在会话中。", "cancel": "取消", @@ -733,6 +761,7 @@ "fields": { "name": "名称", "message": "消息", + "command": "命令", "scheduleType": "计划类型", "every": "每隔", "unit": "单位", @@ -767,7 +796,7 @@ "signInAgain": "重新登录", "signOut": "退出登录", "signedInAs": "已登录为 {{account}}", - "signInHelp": "从这台设备登录;不会在配置中保存 API key。", + "signInHelp": "从这台设备登录;不会在配置中保存 API 密钥。", "remoteSignInHelp": "点击“登录”在你的电脑上打开 xAI,完成登录后粘贴页面显示的授权码。", "codexRemoteSignInHelp": "在此浏览器中登录,然后将完整的 localhost 回调 URL 粘贴回 nanobot。", "signInRequired": "需要登录", @@ -790,7 +819,7 @@ "finishSignIn": "完成登录" }, "skills": { - "description": "查看此 agent 在对话中可以加载的指令技能。", + "description": "查看此智能体在对话中可以加载的指令技能。", "caption": "{{available}} 个可用 · 共 {{total}} 个", "views": "技能视图", "installedTab": "已安装", @@ -809,7 +838,7 @@ "showLess": "收起", "showMore": "展开", "enabledControl": "使用此技能", - "enabledDescription": "当技能需求满足时,允许 agent 加载并使用它。", + "enabledDescription": "当技能需求满足时,允许智能体加载并使用它。", "enableSkill": "启用 {{name}}", "disableSkill": "停用 {{name}}", "updateFailed": "无法更新此技能。", @@ -850,7 +879,7 @@ "marketplaceInstall": "安装", "marketplaceNoTrend": "暂无趋势", "marketplaceTrendLabel": "近 8 周安装趋势", - "featured": "Agent 技能", + "featured": "智能体技能", "empty": "暂无可用技能。", "sourceWorkspace": "自定义", "sourceBuiltin": "内置", @@ -891,8 +920,8 @@ "actions": "“{{title}}” 的话题操作", "newInProject": "在 {{project}} 中开始新话题", "activity": { - "running": "Agent 正在运行", - "complete": "Agent 已完成", + "running": "智能体正在运行", + "complete": "智能体已完成", "updated": "有新内容" }, "pin": "置顶", @@ -1065,7 +1094,7 @@ "modelNotConfigured": "模型未配置", "configureModel": "配置模型", "queued": { - "label": "待引导提示", + "label": "排队中的引导消息", "guide": "引导", "delete": "删除引导", "edit": "编辑引导", @@ -1132,7 +1161,7 @@ }, "stop": { "title": "停止当前任务", - "description": "取消这个对话中正在运行的 agent 回合。" + "description": "取消这个对话中正在运行的智能体回合。" }, "restart": { "title": "重启 nanobot", @@ -1140,7 +1169,7 @@ }, "status": { "title": "查看状态", - "description": "显示运行时、服务商和通道状态。" + "description": "显示运行时、提供商和渠道状态。" }, "model": { "title": "模型", @@ -1192,7 +1221,9 @@ "cliBadge": "CLI", "mcpBadge": "MCP", "cliDescription": "使用 @{{name}} 调用本地 CLI", - "mcpDescription": "使用 @{{name}} 调用 MCP 服务" + "mcpDescription": "使用 @{{name}} 调用 MCP 服务", + "cliTitle": "CLI 应用:{{name}}", + "mcpTitle": "MCP 服务:{{name}}" }, "encoding": "处理中…", "remove": "移除附件", @@ -1225,11 +1256,12 @@ "loadEarlier": "加载更早消息", "forkedFromHistory": "从历史消息分叉", "promptNavigator": { - "open": "打开输入导航", - "title": "输入列表", - "search": "搜索输入", - "noResults": "没有匹配的输入。", - "jumpTo": "跳转到输入:{{label}}" + "open": "打开提示词导航", + "title": "提示词列表", + "search": "搜索提示词", + "noResults": "没有匹配的提示词。", + "jumpTo": "跳转到提示词:{{label}}", + "railAria": "用户提示词导航" } }, "message": { @@ -1268,10 +1300,18 @@ "cliRunRan": "已使用", "cliRunFailed": "失败", "imageAttachment": "图片附件", + "videoAttachment": "视频附件", + "fileAttachment": "文件附件", + "attachmentUnavailable": "附件不可用", + "dataTable": "数据表", + "fileEditPreparing": "正在准备文件编辑…", + "openLink": "打开链接:{{label}}", + "openAttachment": "打开 {{name}}", + "skill": "技能:{{name}}", "automationSourceFallback": "自动化", "automationTriggered": "自动触发", - "askAboutSelection": "继续提问", - "forkFromHere": "分叉", + "askAboutSelection": "询问此内容", + "forkFromHere": "从此处分叉", "copyReply": "复制", "copiedReply": "已复制", "turnLatencyTitle": "本轮耗时(端到端)", @@ -1293,10 +1333,11 @@ }, "filePreview": { "aria": "文件预览", + "breadcrumb": "文件路径", "close": "关闭文件预览", "loading": "正在加载预览...", "failed": "无法预览这个文件。", - "routeMissing": "文件预览需要最新的 gateway。请重启 nanobot gateway 后再试。", + "routeMissing": "文件预览需要最新的网关。请重启 nanobot gateway 后再试。", "resize": "调整文件预览宽度", "truncated": "文件较大,当前只显示前半部分预览。" }, @@ -1307,7 +1348,10 @@ "copied": "已复制" }, "common": { - "dismiss": "关闭" + "dismiss": "关闭", + "close": "关闭", + "current": "当前", + "cancel": "取消" }, "errors": { "messageTooBig": { diff --git a/webui/src/i18n/locales/zh-TW/common.json b/webui/src/i18n/locales/zh-TW/common.json index 143b37458..aa4217eac 100644 --- a/webui/src/i18n/locales/zh-TW/common.json +++ b/webui/src/i18n/locales/zh-TW/common.json @@ -38,6 +38,15 @@ }, "meta": { "description": "nanobot Web UI —— 與你的 nanobot 工作區對話。" + }, + "pairing": { + "title": "配對聊天使用者", + "description": "輸入聊天中顯示的配對碼。", + "code": "配對碼", + "matched": "已符合 {{channel}},正在連線…", + "expiresInline": "配對碼將於 {{expires}} 到期。", + "queueCount": "{{count}} 個待處理", + "noMatch": "沒有待處理請求符合此配對碼。" } }, "sidebar": { @@ -75,7 +84,7 @@ "providers": "供應商", "image": "圖片", "voice": "語音", - "browser": "網頁", + "browser": "網路", "channels": "通訊管道", "runtime": "系統", "advanced": "安全", @@ -95,8 +104,8 @@ "presets": "預設", "imageGeneration": "圖片生成", "imageDefaults": "預設值", - "webSearch": "網頁搜尋", - "webBehavior": "行為", + "webSearch": "網路搜尋", + "webBehavior": "網路行為", "regional": "區域", "webuiSafety": "WebUI 安全", "capabilities": "能力", @@ -162,9 +171,9 @@ "model": "選擇此預設使用的模型。", "configPath": "目前閘道使用中的設定檔。", "selectedPreset": "命名預設在此為唯讀;請在 config.json 中編輯。", - "presetModel": "切回 Default 後可在 WebUI 中編輯模型與供應商。", + "presetModel": "切回預設後可在 WebUI 中編輯模型與供應商。", "density": "只儲存在此瀏覽器中。", - "activityMode": "選擇預設顯示多少 Agent 活動細節。", + "activityMode": "選擇預設顯示多少智能體活動細節。", "fileEditDisplay": "選擇檔案編輯活動預設顯示行數或差異。", "codeWrap": "讓長程式碼行在小螢幕上也易讀。", "maxResults": "每次呼叫 web_search 所回傳的結果數。", @@ -194,7 +203,7 @@ "contextWindow": "選擇此模型設定的預設上下文預算。", "transcription": "送出前先將麥克風輸入轉寫至輸入框。聊天通訊管道的語音訊息也會使用同一組設定。", "transcriptionProvider": "使用 [供應商] 中對應供應商的憑證。", - "transcriptionProviderStatus": "API 金鑰仍儲存在 providers 中,不會寫入 transcription 設定。", + "transcriptionProviderStatus": "API 金鑰仍儲存在「供應商」中,不會寫入「語音轉寫」設定。", "transcriptionModel": "除非供應商需要自訂模型 ID,否則保留解析後的預設值即可。", "transcriptionLanguage": "選填的 ISO-639 語言提示,例如 en、zh、ja 或 ko。" }, @@ -207,7 +216,7 @@ "restartPending": "等待重新啟動", "ready": "就緒", "privateEngine": "私有引擎", - "unixSocket": "Unix socket", + "unixSocket": "Unix 套接字", "defaultWorkspace": "預設工作區", "comfortable": "舒適", "compact": "緊湊", @@ -224,7 +233,10 @@ "configured": "已設定", "notConfigured": "未設定", "pending": "等待中", - "restartingEngine": "正在重新啟動" + "restartingEngine": "正在重新啟動", + "checking": "檢查中", + "running": "執行中", + "needsSetup": "需要設定" }, "status": { "loading": "正在載入設定…", @@ -252,6 +264,7 @@ "deleting": "正在刪除…", "edit": "編輯", "cancel": "取消", + "dismiss": "關閉", "open": "開啟", "export": "匯出", "opening": "正在開啟…", @@ -280,23 +293,23 @@ "tabs": { "ariaLabel": "BYOK 憑證類型", "llm": "LLM", - "webSearch": "網頁搜尋" + "webSearch": "網路搜尋" }, "webSearch": { "provider": "搜尋供應商", - "providerHelp": "選擇網頁搜尋工具使用的後端。", + "providerHelp": "選擇網路搜尋工具使用的後端。", "selectProvider": "選擇供應商", "credentials": "憑證", "noCredentialRequired": "不需要金鑰", "noCredentialHelp": "使用 DuckDuckGo 不需要儲存 API 金鑰。", "apiKeyHelp": "金鑰會儲存在設定檔中,儲存後以遮罩顯示。", - "baseUrl": "Base URL", + "baseUrl": "基礎 URL", "baseUrlHelp": "SearXNG 需要自行架設的執行個體網址。", "baseUrlPlaceholder": "https://search.example.com", "apiKeyRequired": "此搜尋供應商需要 API 金鑰。", - "baseUrlRequired": "SearXNG 需要 Base URL。", + "baseUrlRequired": "SearXNG 需要基礎 URL。", "missingCredential": "填寫必要憑證後才能儲存。", - "saveHint": "變更會套用至新的網頁搜尋請求。" + "saveHint": "變更會套用至新的網路搜尋請求。" } }, "overview": { @@ -304,7 +317,7 @@ "providers": "供應商", "configuredCount": "已設定 {{count}} 個", "totalProviders": "共 {{count}} 個可用", - "webSearch": "網頁搜尋", + "webSearch": "網路搜尋", "imageGeneration": "圖片生成", "voiceInput": "語音輸入", "workspace": "工作區" @@ -358,9 +371,19 @@ "selectProvider": "選擇供應商", "selectAspect": "選擇比例", "selectSize": "選擇尺寸", + "selectModel": "選擇圖片模型", + "searchOrTypeModel": "搜尋或輸入模型 ID", + "typeModelId": "輸入此供應商支援的模型 ID。", "configureProvider": "設定供應商", "missingCredential": "啟用圖片生成功能前,請先設定此供應商。" }, + "capabilities": { + "providerSupport": "供應商支援", + "providerInstallOnSave": "儲存此供應商時會自動安裝所需支援。", + "searchSupport": "搜尋供應商支援", + "searchInstallOnSave": "儲存時會自動安裝 Olostep 支援。", + "installing": "正在安裝支援…" + }, "models": { "selectModel": "選擇模型", "addConfiguration": "新增設定", @@ -383,7 +406,7 @@ "advancedOptions": "進階選項", "advancedSummary": "上下文 {{context}} · 最大輸出 {{max}} tokens", "maxTokens": "最大輸出 tokens", - "temperature": "Temperature", + "temperature": "溫度", "reasoningEffort": "推理強度", "convertTitle": "轉換現有模型設定", "convertHelp": "將現有主要模型和備用模型轉換為預設,之後即可在這裡管理呼叫順序。", @@ -503,6 +526,7 @@ "statusMissingCredentials": "需要金鑰", "statusMissingDependency": "需要相依項", "statusComingSoon": "即將推出", + "comingSoon": "即將推出", "statusNotInstalled": "未啟用", "toolScope": "工具", "allTools": "全部", @@ -510,7 +534,7 @@ "testForTools": "執行 [測試] 以檢視並選擇個別工具。" }, "api": { - "title": "API 伺服器", "openaiCompatible": "OpenAI 相容 API", "description": "讓 SDK 與其他 Agent 透過本機 /v1 端點連線 nanobot。", + "title": "API 伺服器", "openaiCompatible": "OpenAI 相容 API", "description": "讓 SDK 與其他智能體透過本機 /v1 端點連線 nanobot。", "start": "啟動 API 伺服器", "starting": "正在啟動…", "stop": "停止", "stopping": "正在停止…", "access": "存取範圍", "thisDevice": "僅此裝置", "localNetwork": "區域網路", "localHelp": "只有目前裝置可以連線。", "networkHelp": "區域網路內其他裝置可以連線,因此必須設定 API 金鑰。", @@ -565,6 +589,8 @@ "advanced": "進階", "checkAndEnable": "檢查並啟用", "checkConnection": "檢查連線", + "connectionChecks": "連線檢查", + "open": "開啟", "checkedAndEnabled": "已檢查並啟用。", "checking": "正在檢查...", "checkOnly": "僅檢查", @@ -660,6 +686,8 @@ "protected": "受保護", "editTitle": "編輯自動任務", "save": "儲存", + "commandCopied": "已複製", + "copyCommand": "複製", "deleteTitle": "刪除自動任務", "deleteDescription": "這會從 cron 儲存區移除 {{name}},過往的聊天訊息仍會保留在該對話中。", "cancel": "取消", @@ -719,6 +747,7 @@ "fields": { "name": "名稱", "message": "訊息", + "command": "指令", "scheduleType": "排程類型", "every": "每隔", "unit": "單位", @@ -776,7 +805,7 @@ "finishSignIn": "完成登入" }, "skills": { - "description": "檢閱此 Agent 可在對話期間載入的指令技能。", + "description": "檢閱此智能體可在對話期間載入的指令技能。", "caption": "{{available}} 個可用 · 共 {{total}} 個", "views": "技能檢視", "installedTab": "已安裝", @@ -795,7 +824,7 @@ "showLess": "收合", "showMore": "展開", "enabledControl": "使用此技能", - "enabledDescription": "當技能需求已滿足時,允許 agent 載入並使用它。", + "enabledDescription": "當技能需求已滿足時,允許智能體載入並使用它。", "enableSkill": "啟用 {{name}}", "disableSkill": "停用 {{name}}", "updateFailed": "無法更新此技能。", @@ -836,7 +865,7 @@ "marketplaceInstall": "安裝", "marketplaceNoTrend": "暫無趨勢", "marketplaceTrendLabel": "近 8 週安裝趨勢", - "featured": "Agent 技能", + "featured": "智能體技能", "empty": "目前沒有可用的技能。", "sourceWorkspace": "自訂", "sourceBuiltin": "內建", @@ -877,8 +906,8 @@ "actions": "「{{title}}」的話題操作", "newInProject": "在 {{project}} 中開始新話題", "activity": { - "running": "Agent 正在執行", - "complete": "Agent 已完成", + "running": "智能體正在執行", + "complete": "智能體已完成", "updated": "有新內容" }, "pin": "置頂", @@ -1109,7 +1138,7 @@ }, "stop": { "title": "停止目前任務", - "description": "取消這個對話中正在執行的 Agent 回合。" + "description": "取消這個對話中正在執行的智能體回合。" }, "restart": { "title": "重新啟動 nanobot", @@ -1195,7 +1224,9 @@ "cliBadge": "CLI", "mcpBadge": "MCP", "cliDescription": "將 @{{name}} 作為本機 CLI 應用程式使用", - "mcpDescription": "將 @{{name}} 作為 MCP 伺服器使用" + "mcpDescription": "將 @{{name}} 作為 MCP 伺服器使用", + "cliTitle": "CLI 應用程式:{{name}}", + "mcpTitle": "MCP 伺服器:{{name}}" }, "workspace": { "accessAria": "工作區存取模式", @@ -1215,7 +1246,8 @@ "title": "提示詞", "search": "搜尋提示詞", "noResults": "找不到符合的提示詞。", - "jumpTo": "跳到提示詞:{{label}}" + "jumpTo": "跳到提示詞:{{label}}", + "railAria": "使用者提示詞導覽" } }, "message": { @@ -1239,6 +1271,14 @@ "agentActivityLiveSummary": "進行中… · {{reasoning}} 步 · {{tools}} 次工具呼叫", "agentActivityLiveToolsOnly": "進行中… · {{tools}} 次工具呼叫", "imageAttachment": "圖片附件", + "videoAttachment": "影片附件", + "fileAttachment": "檔案附件", + "attachmentUnavailable": "附件無法使用", + "dataTable": "資料表", + "fileEditPreparing": "正在準備檔案編輯…", + "openLink": "開啟連結:{{label}}", + "openAttachment": "開啟 {{name}}", + "skill": "技能:{{name}}", "forkFromHere": "建立分支", "copyReply": "複製", "copiedReply": "已複製", @@ -1279,6 +1319,7 @@ }, "filePreview": { "aria": "檔案預覽", + "breadcrumb": "檔案路徑", "close": "關閉檔案預覽", "loading": "正在載入預覽…", "failed": "無法預覽這個檔案。", @@ -1293,7 +1334,10 @@ "copied": "已複製" }, "common": { - "dismiss": "關閉" + "dismiss": "關閉", + "close": "關閉", + "current": "目前", + "cancel": "取消" }, "errors": { "messageTooBig": { diff --git a/webui/src/tests/i18n.test.tsx b/webui/src/tests/i18n.test.tsx index 1b4328915..2c0bcba47 100644 --- a/webui/src/tests/i18n.test.tsx +++ b/webui/src/tests/i18n.test.tsx @@ -236,6 +236,72 @@ const LOCALIZED_CHANNEL_SHELL_KEYS = [ "settings.channels.validation.unsupported", "settings.channels.validationFailed", ]; +const LOCALIZED_NEW_SURFACE_KEYS = [ + "chat.activity.running", + "chat.activity.complete", + "chat.activity.updated", + "chat.pin", + "chat.unpin", + "chat.rename", + "chat.renameProjectTitle", + "chat.renameProjectDescription", + "chat.renameProjectPlaceholder", + "chat.renameSave", + "chat.archive", + "chat.unarchive", + "chat.showArchived", + "chat.hideArchived", + "chat.groups.pinned", + "chat.groups.projects", + "chat.groups.today", + "chat.groups.yesterday", + "chat.groups.earlier", + "chat.groups.archived", + "thread.promptNavigator.railAria", + "thread.composer.mentions.cliTitle", + "thread.composer.mentions.mcpTitle", + "message.openLink", + "message.openAttachment", + "message.skill", + "settings.channels.connectionChecks", + "settings.channels.open", +]; +const ACCIDENTALLY_SPANISH_SETTINGS_KEYS = [ + "settings.help.provider", + "settings.help.configPath", + "settings.help.selectedPreset", + "settings.help.maxResults", + "settings.help.timeout", + "settings.help.jinaReader", + "settings.help.imageGeneration", + "settings.help.imageProvider", + "settings.help.imageProviderStatus", + "settings.help.imageModel", + "settings.help.defaultAspectRatio", + "settings.help.timezone", + "settings.help.securityManagedControls", + "settings.help.selectedModelProvider", + "settings.help.selectedModelValue", + "settings.help.cliAppsCatalog", + "settings.help.cliAppsFilter", + "settings.help.logs", + "settings.help.diagnostics", + "settings.help.localServiceAccessNative", + "settings.help.webuiDefaultAccessNative", + "settings.status.savedRestart", + "settings.status.restartAfterSaving", + "settings.status.savedRestartApply", + "settings.status.imageProviderRestart", + "settings.status.hostRestartAfterSaving", + "settings.status.hostRestartPending", + "settings.status.hostApiUnavailable", + "settings.status.logsOpened", + "settings.status.logsOpenFailed", + "settings.status.diagnosticsExported", + "settings.status.diagnosticsExportFailed", + "settings.image.missingCredential", + "settings.oauth.signInHelp", +]; const INDEX_HTML = readFileSync(resolve(process.cwd(), "index.html"), "utf8"); const PREBOOT_SCRIPT = INDEX_HTML.match( /