const esES = { sidebar: { home: 'Inicio', extensions: 'Extensiones', installedPlugins: 'Instalados', pluginMarket: 'Tienda', mcpServers: 'Servidores MCP', addExtension: 'Añadir extensión', pluginPages: 'Páginas de plugins', pluginPagesTooltip: 'Páginas visuales proporcionadas por los plugins instalados', quickStart: 'Inicio rápido', scrollToBottom: 'Desplazar al final', editionCommunity: 'Comunidad', editionCloud: 'Cloud', }, common: { login: 'Iniciar sesión', logout: 'Cerrar sesión', accountOptions: 'Configuración', account: 'Cuenta', integration: 'Integración', email: 'Correo electrónico', password: 'Contraseña', welcome: 'Bienvenido de nuevo a LangBot 👋', continueToLogin: 'Inicia sesión para continuar', loginSuccess: 'Inicio de sesión exitoso', loginFailed: 'Error de inicio de sesión, por favor verifica tu correo y contraseña', loginLoadError: 'No se puede conectar al servidor', loginLoadErrorDesc: 'No se puede conectar al backend de LangBot. Asegúrate de que el servicio esté en ejecución e inténtalo de nuevo.', retry: 'Reintentar', enterEmail: 'Introduce la dirección de correo electrónico', enterPassword: 'Introduce la contraseña', invalidEmail: 'Por favor, introduce una dirección de correo electrónico válida', emptyPassword: 'Por favor, introduce tu contraseña', language: 'Idioma', helpDocs: 'Obtener ayuda', featureRequest: 'Solicitar función', starOnGitHub: 'Dar estrella en GitHub', joinDiscord: 'Únete a Discord', create: 'Crear', edit: 'Editar', delete: 'Eliminar', add: 'Añadir', select: 'Seleccionar', skill: 'Habilidad', cancel: 'Cancelar', submit: 'Enviar', error: 'Error', success: 'Éxito', save: 'Guardar', saving: 'Guardando...', recommend: 'Recomendado', start: 'Iniciar', confirm: 'Confirmar', confirmDelete: 'Confirmar eliminación', deleteConfirmation: '¿Estás seguro de que deseas eliminar esto?', selectOption: 'Selecciona una opción', selectPreset: 'Seleccionar preajuste', required: 'Obligatorio', enable: 'Activar', name: 'Nombre', description: 'Descripción', icon: 'Icono', close: 'Cerrar', deleteSuccess: 'Eliminado correctamente', deleteError: 'Error al eliminar: ', addRound: 'Añadir ronda', copy: 'Copiar', copySuccess: 'Copiado correctamente', copyFailed: 'Error al copiar', test: 'Probar', forgotPassword: '¿Olvidaste tu contraseña?', agreementNotice: 'Al continuar, aceptas nuestros', termsOfService: 'Términos de servicio', privacyPolicy: 'Política de privacidad', and: 'y', dataCollectionPolicy: 'Política de recopilación de datos', dataCollectionPolicyUrl: 'https://link.langbot.app/en/docs/data-policy', loading: 'Cargando...', fieldRequired: 'Este campo es obligatorio', or: 'o', loginWithSpace: 'Iniciar sesión con Space', spaceLoginRecommended: 'Recomendado: Usa API de modelos oficiales estables y servicios en la nube', loginLocal: 'Iniciar sesión con cuenta local', loginWithPassword: 'Iniciar sesión con contraseña', spaceLoginTitle: 'Iniciar sesión con Space', spaceLoginDescription: 'Escanea el código QR o visita el enlace para autorizar', spaceLoginUserCode: 'Tu código', spaceLoginExpires: 'El código expira en {{seconds}} segundos', spaceLoginWaiting: 'Esperando autorización...', spaceLoginSuccess: 'Autorización exitosa', spaceLoginFailed: 'Error de inicio de sesión con Space', spaceLoginExpired: 'El código de autorización ha expirado, por favor inténtalo de nuevo', spaceLoginCancel: 'Cancelar', spaceLoginVisitLink: 'Visitar enlace', spaceLoginProcessing: 'Iniciando sesión con Space', spaceLoginProcessingDescription: 'Por favor espera mientras completamos tu inicio de sesión...', spaceLoginSuccessDescription: 'Redirigiendo a LangBot...', spaceLoginError: 'Error de inicio de sesión', spaceLoginNoCode: 'Falta el código de autorización', backToLogin: 'Volver al inicio de sesión', backToHome: 'Volver al inicio', spaceAccountCannotChangePassword: 'Las cuentas de Space no pueden cambiar la contraseña aquí', theme: 'Tema', changePassword: 'Cambiar contraseña', currentPassword: 'Contraseña actual', newPassword: 'Nueva contraseña', confirmNewPassword: 'Confirmar nueva contraseña', enterCurrentPassword: 'Introduce la contraseña actual', enterNewPassword: 'Introduce la nueva contraseña', enterConfirmPassword: 'Confirma la nueva contraseña', currentPasswordRequired: 'La contraseña actual es obligatoria', newPasswordRequired: 'La nueva contraseña es obligatoria', confirmPasswordRequired: 'La confirmación de contraseña es obligatoria', passwordsDoNotMatch: 'Las contraseñas no coinciden', changePasswordSuccess: 'Contraseña cambiada correctamente', changePasswordFailed: 'Error al cambiar la contraseña, por favor verifica tu contraseña actual', apiIntegration: 'Integración API', apiIntegrationDescription: 'Gestiona las claves API y los webhooks para el acceso externo', apiKeys: 'Claves API', manageApiIntegration: 'Gestionar integración API', manageApiKeys: 'Gestionar claves API', createApiKey: 'Crear clave API', apiKeyName: 'Nombre de la clave API', apiKeyDescription: 'Descripción de la clave API', apiKeyValue: 'Valor de la clave API', apiKeyCreated: 'Clave API creada correctamente', apiKeyDeleted: 'Clave API eliminada correctamente', apiKeyDeleteConfirm: '¿Estás seguro de que deseas eliminar esta clave API?', apiKeyNameRequired: 'El nombre de la clave API es obligatorio', copyApiKey: 'Copiar clave API', apiKeyCopied: 'Clave API copiada al portapapeles', noApiKeys: 'No hay claves API configuradas', apiKeyHint: 'Las claves API permiten a sistemas externos acceder a las API del servicio LangBot', mcpTab: 'MCP', mcpHint: 'LangBot exposes an MCP (Model Context Protocol) server so AI agents can manage this instance. It uses the same API keys as the Service API.', mcpEndpoint: 'MCP Endpoint', mcpAuthTitle: 'Authentication', mcpAuthDesc: 'Authenticate with any API key from the API Keys tab, sent as a header:', mcpGlobalKeyNote: 'You can also set a global API key in config.yaml (api.global_api_key) to use without logging in.', mcpClientConfigTitle: 'Example MCP client config', webhooks: 'Webhooks', createWebhook: 'Crear Webhook', webhookName: 'Nombre del Webhook', webhookUrl: 'URL del Webhook', webhookDescription: 'Descripción del Webhook', webhookEnabled: 'Activado', webhookCreated: 'Webhook creado correctamente', webhookDeleted: 'Webhook eliminado correctamente', webhookDeleteConfirm: '¿Estás seguro de que deseas eliminar este Webhook?', webhookNameRequired: 'El nombre del Webhook es obligatorio', webhookUrlRequired: 'La URL del Webhook es obligatoria', noWebhooks: 'No hay Webhooks configurados', webhookHint: 'Los Webhooks permiten a LangBot enviar eventos de mensajes personales y grupales a sistemas externos', actions: 'Acciones', apiKeyCreatedMessage: 'Por favor copia esta clave API, si el botón no funciona, cópiala manualmente.', none: 'Ninguno', more: 'Más ({{count}})', less: 'Menos', noItems: 'Sin elementos', }, notFound: { title: 'Página no encontrada', description: 'La página que buscas no existe.', back: 'Volver', home: 'Inicio', help: 'Obtener ayuda', }, models: { title: 'Modelos', description: 'Configura y gestiona los modelos que se pueden usar en los Pipelines', createModel: 'Crear modelo', editModel: 'Editar modelo', getModelListError: 'Error al obtener la lista de modelos: ', modelName: 'Nombre del modelo', modelProvider: 'Proveedor del modelo', modelBaseURL: 'URL base', modelAbilities: 'Capacidades del modelo', saveSuccess: 'Guardado correctamente', saveError: 'Error al guardar: ', createSuccess: 'Creado correctamente', createError: 'Error al crear: ', deleteSuccess: 'Eliminado correctamente', deleteError: 'Error al eliminar: ', deleteConfirmation: '¿Estás seguro de que deseas eliminar este modelo?', modelNameRequired: 'El nombre del modelo no puede estar vacío', modelProviderRequired: 'El proveedor del modelo no puede estar vacío', requestURLRequired: 'La URL de solicitud no puede estar vacía', apiKeyRequired: 'La clave API no puede estar vacía', keyNameRequired: 'El nombre de la clave no puede estar vacío', mustBeValidNumber: 'Debe ser un número válido', mustBeTrueOrFalse: 'Debe ser verdadero o falso', requestURL: 'URL de solicitud', scanURL: 'URL de escaneo de modelos', scanURLPlaceholder: 'Déjalo vacío para usar URL de solicitud + /models', scanURLDescription: 'Ingresa el endpoint real de la lista de modelos cuando el escaneo de modelos no utiliza la misma dirección que la invocación del modelo.', apiKey: 'Clave API', abilities: 'Capacidades', selectModelAbilities: 'Seleccionar capacidades del modelo', visionAbility: 'Capacidad de visión', functionCallAbility: 'Llamada a funciones', contextLength: 'Ventana de contexto', contextLengthPlaceholder: 'Desconocido', contextLengthInvalid: 'La ventana de contexto debe ser un entero positivo', extraParameters: 'Parámetros adicionales', addParameter: 'Añadir parámetro', keyName: 'Nombre de la clave', type: 'Tipo', value: 'Valor', string: 'Cadena', number: 'Número', boolean: 'Booleano', object: 'Objeto', objectJsonPlaceholder: '{ "type": "disabled" }', invalidJsonObject: 'El valor debe ser un objeto JSON válido', selectModelProvider: 'Seleccionar proveedor del modelo', modelProviderDescription: 'Por favor, introduce el nombre del modelo proporcionado por el proveedor', modelManufacturer: 'Fabricante del modelo', aggregationPlatform: 'Plataforma de agregación', selfDeployed: 'Autoalojado', builtin: 'Integrado', selectModel: 'Seleccionar modelo', testSuccess: 'Prueba exitosa', testError: 'Error en la prueba, por favor verifica la configuración del modelo', llmModels: 'Modelos LLM', localProvider: 'Local', localProviderDescription: 'Modelos configurados y gestionados localmente', spaceProviderDescription: 'Modelos sincronizados desde tu cuenta de Space', spaceDisabledForLocalAccount: 'Inicia sesión con Space para usar modelos en la nube', syncModels: 'Sincronizar', syncSuccess: 'Sincronización completa: {{created}} creados, {{updated}} actualizados', syncError: 'Error de sincronización: ', spaceModelReadOnly: 'Los modelos de Space son de solo lectura', noSpaceModels: 'No hay modelos de Space. Haz clic en Sincronizar para obtener modelos de Space.', noLocalModels: 'No hay modelos locales. Haz clic en Crear para añadir un modelo.', providerCount: '{{count}} proveedores', addModel: 'Añadir modelo', manualAdd: 'Manual', scanAdd: 'Escanear', scanModels: 'Escanear modelos', scanModelsHint: 'Lee los modelos disponibles del proveedor actual y luego elige cuáles agregar.', scannedModels: 'Modelos detectados', scanDebug: 'Información de depuración', searchScannedModels: 'Buscar modelos detectados', noScannedModels: 'Todavía no hay resultados. Pulsa el botón superior para escanear.', noScannedModelsMatch: 'No hay modelos coincidentes', addSelectedModels: 'Agregar seleccionados', addSelectedModelsSuccess: 'Se agregaron {{count}} modelo(s)', selectAll: 'Seleccionar todo', alreadyAdded: 'Ya agregado', addLLMModel: 'Añadir modelo LLM', addEmbeddingModel: 'Añadir modelo Embedding', provider: 'Proveedor', existingProvider: 'Proveedor existente', newProvider: 'Nuevo proveedor', selectProvider: 'Seleccionar proveedor', requester: 'Tipo de proveedor', selectRequester: 'Seleccionar tipo de proveedor', searchProviders: 'Buscar proveedores...', langbotModelsDescription: 'Modelos en la nube impulsados por LangBot Space', credits: 'Créditos', loginWithSpace: 'Iniciar sesión con Space', loginToUseModels: 'Inicia sesión con Space para usar modelos en la nube', noModels: 'No hay modelos configurados', langbotModels: 'Modelos LangBot', spaceTrialTooltip: '¡Créditos de prueba gratuitos disponibles! Inicia sesión con Space para acceder a modelos en la nube sin configuración.', unlockModels: 'Inicia sesión para usar', editProvider: 'Editar proveedor', addProvider: 'Añadir proveedor', addProviderHint: 'Añade proveedores para usar modelos de otras fuentes', addProviderHintSimple: 'Añade proveedores para usar modelos', noProviders: 'Aún no hay proveedores', providerName: 'Nombre del proveedor', providerNameRequired: 'El nombre del proveedor es obligatorio', requesterRequired: 'El tipo de proveedor es obligatorio', providerSaved: 'Proveedor guardado', providerCreated: 'Proveedor creado', providerSaveError: 'Error al guardar el proveedor: ', providerDeleted: 'Proveedor eliminado', providerDeleteError: 'Error al eliminar el proveedor: ', deleteProviderConfirmation: '¿Estás seguro de que deseas eliminar este proveedor?', loadError: 'Error al cargar datos', chat: 'Chat', embedding: 'Embedding', rerank: 'Reordenar', rerankUrlTooltip: 'URL completa para el endpoint de reordenación (ej: https://dashscope.aliyuncs.com/compatible-api/v1/reranks)', rerankPathTooltip: 'Ruta añadida a la URL base (predeterminado: rerank, algunos servicios usan reranks)', modelsCount: '{{count}} modelo(s)', expandModels: 'Expandir', collapseModels: 'Contraer', fallback: { primary: 'Modelo principal', fallbackList: 'Modelos de respaldo', addFallback: 'Añadir modelo de respaldo', }, }, bots: { title: 'Bots', description: 'Crea y gestiona Bots, que son los puntos de entrada para que LangBot se conecte con diversas plataformas', createBot: 'Crear Bot', selectFromSidebar: 'Selecciona un Bot de la barra lateral', editBot: 'Editar Bot', getBotListError: 'Error al obtener la lista de Bots: ', botName: 'Nombre del Bot', botDescription: 'Descripción del Bot', botNameRequired: 'El nombre del Bot no puede estar vacío', botDescriptionRequired: 'La descripción del Bot no puede estar vacía', adapterRequired: 'El adaptador no puede estar vacío', defaultDescription: 'Un Bot', getBotConfigError: 'Error al obtener la configuración del Bot: ', saveSuccess: 'Guardado correctamente', saveError: 'Error al guardar: ', createSuccess: 'Creado correctamente. Por favor, activa o modifica el Pipeline vinculado', createError: 'Error al crear: ', deleteSuccess: 'Eliminado correctamente', deleteError: 'Error al eliminar: ', deleteConfirmation: '¿Estás seguro de que deseas eliminar este Bot?', platformAdapter: 'Selección de plataforma/adaptador', selectAdapter: 'Seleccionar adaptador', adapterConfig: 'Configuración del adaptador', viewAdapterDocs: 'Ver documentación', bindPipeline: 'Vincular Pipeline', selectPipeline: 'Seleccionar Pipeline', selectBot: 'Seleccionar Bot', botLogTitle: 'Registro del Bot', enableAutoRefresh: 'Activar actualización automática', session: 'Sesión', yesterday: 'Ayer', earlier: 'Anterior', dateFormat: '{{day}}/{{month}}', setBotEnableError: 'Error al establecer el estado de activación del Bot', log: 'Registro', configuration: 'Configuración', logs: 'Registros', basicInfo: 'Información básica', basicInfoDescription: 'Establece el nombre y la descripción del Bot', routingConnection: 'Enrutamiento y conexión', routingConnectionDescription: 'Vincula el Pipeline que procesa los mensajes de este Bot', routingRules: 'Reglas de enrutamiento condicional', routingRulesDescription: 'Las reglas se evalúan en orden; la primera coincidencia enruta a su pipeline. Si ninguna coincide, se usa el pipeline predeterminado.', addRoutingRule: 'Agregar regla', ruleTypeLauncherType: 'Tipo de sesión', ruleTypeLauncherId: 'ID de sesión', ruleTypeMessageContent: 'Contenido del mensaje', operatorEq: 'Igual a', operatorNeq: 'No igual a', operatorContains: 'Contiene', operatorNotContains: 'No contiene', operatorStartsWith: 'Comienza con', operatorRegex: 'Regex', operatorHas: 'Tiene', operatorNotHas: 'No tiene', ruleTypeMessageHasElement: 'Elemento del mensaje', ruleValueElementPlaceholder: 'Seleccionar tipo de elemento', elementImage: 'Imagen', elementVoice: 'Voz', elementFile: 'Archivo', elementForward: 'Reenvío', elementFace: 'Emoji', elementAt: '@Mención', elementAtAll: '@Todos', elementQuote: 'Cita', ruleValuePlaceholder: 'Valor de coincidencia', ruleValueLauncherIdPlaceholder: 'ID de grupo o usuario', ruleValueMessagePlaceholder: 'Texto del mensaje', ruleValuePrefixPlaceholder: 'ej. !draw', ruleValueRegexpPlaceholder: 'ej. ^/help', pipelineDiscard: 'Descartar mensaje', sessionTypePerson: 'Chat privado', sessionTypeGroup: 'Chat grupal', adapterConfigDescription: 'Configura el adaptador de plataforma seleccionado', dangerZone: 'Zona de peligro', dangerZoneDescription: 'Acciones irreversibles y destructivas', deleteBotAction: 'Eliminar este Bot', deleteBotHint: 'Una vez eliminado, toda la configuración asociada se eliminará permanentemente.', webhookUrl: 'URL de callback Webhook', webhookUrlCopied: 'URL del Webhook copiada', webhookUrlHint: 'Haz clic en el campo para seleccionar todo, luego presiona Ctrl+C (Mac: Cmd+C) para copiar, o haz clic en el botón', webhookUrlHintEither: 'Usa cualquiera de las dos URL anteriores en la configuración de tu plataforma', webhookSaasHint: 'Webhook requiere un dominio accesible públicamente. LangBot Cloud proporciona un punto de acceso público listo para usar para tu Bot.', webhookSaasLink: 'Más información sobre LangBot Cloud', adapterCategory: { popular: 'Popular', china: 'China', global: 'Global', protocol: 'Protocolo', }, logLevel: 'Nivel de registro', allLevels: 'Todos los niveles', selectLevel: 'Seleccionar nivel', levelsSelected: 'niveles seleccionados', viewDetailedLogs: 'Ver registros detallados', viewDetails: 'Detalles', collapse: 'Contraer', imagesAttached: 'imagen(es) adjunta(s)', noLogs: 'Aún no hay registros', sessionMonitor: { title: 'Sesiones', sessions: 'Sesiones', noSessions: 'No se encontraron sesiones', selectSession: 'Selecciona una sesión para ver los mensajes', noMessages: 'No hay mensajes en esta sesión', messages: 'mensajes', messageCount: '{{count}} mensajes', loading: 'Cargando...', loadingSessions: 'Cargando sesiones...', loadingMessages: 'Cargando mensajes...', user: 'Usuario', variables: 'Variables', platform: 'Plataforma', lastActive: 'Última actividad', refresh: 'Actualizar', active: 'Activo', inactive: 'Inactivo', discarded: 'Descartado', userMessage: 'Usuario', botMessage: 'Asistente', }, admins: { title: 'Admins', description: "Launchers (person/group IDs) that have admin privilege for this bot's commands", addAdmin: 'Add Admin', launcherType: 'Type', launcherId: 'ID', typePerson: 'Person', typeGroup: 'Group', placeholderId: 'User or group ID', addSuccess: 'Admin added', addError: 'Failed to add admin: ', deleteSuccess: 'Admin removed', deleteError: 'Failed to remove admin: ', noAdmins: 'No admins configured', setAdminTitle: 'Set as admin', removeAdminTitle: 'Remove admin', adminBadge: 'Admin', configureAdmins: 'Manage Admins', }, }, plugins: { title: 'Extensiones', description: 'Instala y configura plugins para ampliar la funcionalidad, selecciónalos en la configuración del Pipeline', createPlugin: 'Crear plugin', editPlugin: 'Editar plugin', installed: 'Instalados', marketplace: 'Tienda', arrange: 'Ordenar plugins', install: 'Instalar', installPlugin: 'Instalar plugin', newPlugin: 'Nuevo Plugin', onlySupportGithub: 'Actualmente solo se admite la instalación desde GitHub', enterGithubLink: 'Introduce el enlace de GitHub del plugin', installing: 'Instalando plugin...', installSuccess: 'Plugin instalado correctamente', installFailed: 'Error en la instalación del plugin:', searchPlugin: 'Buscar plugins', sortBy: 'Ordenar por', mostStars: 'Más estrellas', recentlyAdded: 'Añadidos recientemente', recentlyUpdated: 'Actualizados recientemente', noMatchingPlugins: 'No se encontraron plugins coincidentes', loading: 'Cargando...', getPluginListError: 'Error al obtener la lista de plugins:', noPluginInstalled: 'No hay plugins instalados', noExtensionInstalled: 'No hay extensiones instaladas', loadingExtensions: 'Cargando extensiones...', groupByType: 'Agrupar por formato', pluginConfig: 'Configuración del plugin', pluginSort: 'Orden de plugins', pluginSortDescription: 'El orden de los plugins afecta el orden de procesamiento dentro del mismo evento, arrastra la tarjeta del plugin para ordenar', pluginSortSuccess: 'Orden de plugins aplicado correctamente', pluginSortError: 'Error al ordenar plugins: ', pluginNoConfig: 'El plugin no tiene elementos de configuración.', systemDisabled: 'Sistema de plugins desactivado', systemDisabledDesc: 'El sistema de plugins no está activado, por favor modifica la configuración según la documentación', connectionError: 'Error de conexión del sistema de plugins', connectionErrorDesc: 'Verifica la configuración del sistema de plugins o contacta al administrador.', errorDetails: 'Detalles del error', loadingStatus: 'Comprobando el estado del sistema de plugins...', failedToGetStatus: 'Error al obtener el estado del sistema de plugins', pluginSystemNotReady: 'El sistema de plugins no está listo, no se puede realizar esta operación', debugInfo: 'Información de depuración', debugInfoTitle: 'Información de depuración del plugin', debugUrl: 'URL de depuración', debugKey: 'Clave de depuración', noDebugKey: '(No establecida)', debugKeyDisabled: 'La clave de depuración no está configurada, la depuración del plugin no requiere autenticación', boxStatusTitle: 'Box Runtime', boxStatus: 'Estado', boxConnected: 'Conectado', boxUnavailable: 'No disponible', boxBackend: 'Backend', boxProfile: 'Perfil', boxSandboxes: 'Sandboxes', boxErrors: 'Errores', boxSessionImage: 'Imagen', boxSessionBackend: 'Backend', boxSessionResources: 'Recursos', boxSessionNetwork: 'Red', boxStatusLoadFailed: 'Error al cargar el estado de Box', failedToGetDebugInfo: 'Error al obtener la información de depuración', copiedToClipboard: 'Copiado al portapapeles', deleting: 'Eliminando...', deletePlugin: 'Eliminar plugin', cancel: 'Cancelar', saveConfig: 'Guardar configuración', saving: 'Guardando...', confirmDeletePlugin: '¿Estás seguro de que deseas eliminar el plugin ({{author}}/{{name}})?', deleteDataCheckbox: 'También eliminar la configuración y el almacenamiento persistente del plugin', confirmDelete: 'Confirmar eliminación', deleteError: 'Error al eliminar: ', close: 'Cerrar', deleteConfirm: 'Confirmación de eliminación', deleteSuccess: 'Eliminación exitosa', dangerZone: 'Zona de peligro', dangerZoneDescription: 'Acciones irreversibles y destructivas', modifyFailed: 'Error al modificar: ', componentName: { Tool: 'Herramienta', EventListener: 'Listener de eventos', Command: 'Comando', KnowledgeEngine: 'Motor de conocimiento', Parser: 'Analizador', Page: 'Página', AgentRunner: 'Ejecutor de agentes', }, uploadLocal: 'Subir local', debugging: 'Depuración', uploadLocalPlugin: 'Subir plugin local', localPreview: { title: 'Previsualizar paquete de plugin local', unpacking: 'Descomprimiendo vista previa del paquete...', unpackComplete: 'Vista previa del paquete lista', failed: 'No se pudo previsualizar el paquete', pluginInfo: 'Información del plugin', packageInfo: 'Información del paquete', name: 'Nombre', author: 'Autor', version: 'Versión', fileCount: 'Archivos', dependencies: 'Dependencias', components: 'Componentes', ready: 'El paquete del plugin está descomprimido. Confirma para iniciar la instalación.', }, dragToUpload: 'Arrastra el archivo del plugin aquí para subirlo', unsupportedFileType: 'Tipo de archivo no soportado, solo se admiten archivos .lbpkg y .zip', uploadingPlugin: 'Subiendo plugin...', uploadSuccess: 'Subida exitosa', uploadFailed: 'Error en la subida', selectFileToUpload: 'Selecciona el archivo del plugin para subir', askConfirm: '¿Estás seguro de instalar el plugin "{{name}}" ({{version}})?', askConfirmNoVersion: '¿Estás seguro de instalar el plugin "{{name}}"?', fromGithub: 'Desde GitHub', fromLocal: 'Desde local', fromMarketplace: 'Desde la tienda', componentsList: 'Componentes: ', noComponents: 'Sin componentes', delete: 'Eliminar plugin', update: 'Actualizar plugin', new: 'Nuevo', updateConfirm: 'Confirmación de actualización', confirmUpdatePlugin: '¿Estás seguro de que deseas actualizar el plugin ({{author}}/{{name}})?', confirmUpdate: 'Confirmar actualización', updating: 'Actualizando...', updateSuccess: 'Plugin actualizado correctamente', updateError: 'Error al actualizar: ', saveConfigSuccessNormal: 'Configuración guardada correctamente', saveConfigError: 'Error al guardar la configuración: ', config: 'Configuración', readme: 'Documentación', viewSource: 'Ver código fuente', loadingReadme: 'Cargando documentación...', noReadme: 'Este plugin no proporciona documentación README', tabDocs: 'Documentación', tabLogs: 'Registros', logsLevelAll: 'Todos los niveles', logsRefresh: 'Actualizar', logsAutoRefresh: 'Auto-actualizar', logsEmpty: 'Aún no hay registros. Los registros que el plugin imprima mediante logger aparecerán aquí.', fileUpload: { tooLarge: 'El tamaño del archivo supera el límite de 10MB', success: 'Archivo subido correctamente', failed: 'Error al subir el archivo', uploading: 'Subiendo...', chooseFile: 'Elegir archivo', addFile: 'Añadir archivo', }, installFromGithub: 'Desde GitHub', enterRepoUrl: 'Introduce la URL del repositorio de GitHub', repoUrlPlaceholder: 'p. ej., https://github.com/owner/repo', fetchingReleases: 'Obteniendo versiones...', selectRelease: 'Seleccionar versión', noReleasesFound: 'No se encontraron versiones', fetchReleasesError: 'Error al obtener versiones: ', selectAsset: 'Seleccionar archivo a instalar', noAssetsFound: 'No hay archivos .lbpkg disponibles en esta versión', fetchAssetsError: 'Error al obtener archivos: ', backToReleases: 'Volver a versiones', backToRepoUrl: 'Volver a la URL del repositorio', backToAssets: 'Volver a archivos', releaseTag: 'Etiqueta: {{tag}}', releaseName: 'Nombre: {{name}}', publishedAt: 'Publicado el: {{date}}', prerelease: 'Pre-lanzamiento', assetSize: 'Tamaño: {{size}}', confirmInstall: 'Confirmar instalación', installFromGithubDesc: 'Instalar plugin desde GitHub Release', goToMarketplace: 'Ir a la tienda', installProgress: { title: 'Instalando {{name}}', titleGeneric: 'Instalación de Plugin', overallProgress: 'Progreso general', downloading: 'Descargando Plugin', installingDeps: 'Instalando dependencias', initializing: 'Inicializando configuración', launching: 'Iniciando Plugin', completed: 'Completado', failed: 'Fallido', downloadSize: 'Tamaño del paquete: {{size}}', depsInfo: '{{count}} dependencias por instalar', depsProgress: '{{installed}}/{{total}} instaladas · {{remaining}} restantes', installComplete: 'Plugin instalado correctamente', dismiss: 'Descartar', background: 'Ejecutar en segundo plano', taskQueue: 'Tareas de instalación', clearCompleted: 'Limpiar completados', noTasks: 'No hay tareas de instalación', titlePlugin: 'Instalando plugin {{name}}', titleMCP: 'Instalando servidor MCP {{name}}', titleSkill: 'Instalando skill {{name}}', installCompletePlugin: 'Plugin instalado correctamente', installCompleteMCP: 'Servidor MCP instalado correctamente', installCompleteSkill: 'Skill instalada correctamente', }, uploadPluginOnly: 'Solo se admiten paquetes de plugin .lbpkg', }, market: { searchPlaceholder: 'Buscar plugins...', searchPlaceholderCount: 'Buscar {{count}} extensiones, capacidades o casos de uso...', searchResults: 'Se encontraron {{count}} extensiones', totalPlugins: 'Total {{count}} extensiones', noPlugins: 'No hay plugins disponibles', noResults: 'No se encontraron plugins relevantes', loadingMore: 'Cargando más...', loading: 'Cargando...', allLoaded: 'Todos los plugins mostrados', allLoadedCount: 'Se muestran las {{count}} extensiones', install: 'Instalar', installConfirm: '¿Estás seguro de que deseas instalar el plugin "{{name}}" ({{version}})?', downloadComplete: 'Descarga del plugin "{{name}}" completada', installFailed: 'Error en la instalación, por favor inténtalo más tarde', loadFailed: 'Error al obtener la lista de plugins, por favor inténtalo más tarde', noDescription: 'No hay descripción disponible', recommendation: { pause: 'Pausar rotación automática', resume: 'Reanudar rotación automática', }, notFound: 'No se encontró la información del plugin', sortBy: 'Ordenar por', sort: { recentlyAdded: 'Añadidos recientemente', recentlyUpdated: 'Actualizados recientemente', mostDownloads: 'Más descargas', leastDownloads: 'Menos descargas', }, downloads: 'descargas', download: 'Descargar', repository: 'Repositorio', downloadFailed: 'Error en la descarga', noReadme: 'Este plugin no proporciona documentación README', description: 'Descripción', tagLabel: 'Etiquetas', submissionTitle: 'Tienes un envío de plugin en revisión: {{name}}', submissionPending: 'Tu envío de plugin está en revisión: {{name}}', submissionApproved: 'Tu envío de plugin ha sido aprobado: {{name}}', submissionRejected: 'Tu envío de plugin ha sido rechazado: {{name}}', clickToRevoke: 'Revocar', revokeSuccess: 'Revocación exitosa', revokeFailed: 'Error en la revocación', submissionDetails: 'Detalles del envío del plugin', markAsRead: 'Marcar como leído', markAsReadSuccess: 'Marcado como leído', markAsReadFailed: 'Error al marcar como leído', filterByComponent: 'Componente del plugin', filterByComponentHint: 'Los tipos de capacidad que ofrece un plugin: herramienta (Tool), comando (Command), escucha de eventos (EventListener), etc., usados para ampliar las capacidades de LangBot. Filtra por componente para ver solo los plugins que ofrecen esa capacidad.', allComponents: 'Todos los componentes', componentName: { Tool: 'Herramienta', EventListener: 'Listener de eventos', Command: 'Comando', KnowledgeEngine: 'Motor de conocimiento', Parser: 'Analizador', Page: 'Página', AgentRunner: 'Ejecutor de agentes', }, filterByType: 'Tipo', allTypes: 'Todos los tipos', typePlugin: 'Plugin', typeMCP: 'MCP', typeSkill: 'Habilidad', requestPlugin: 'Solicitar plugin', viewDetails: 'Ver detalles', deprecated: 'Obsoleto', deprecatedTooltip: 'Por favor, instala el plugin de motor de conocimiento correspondiente.', filters: { allFormats: 'Todos los tipos', more: 'Más', advancedTitle: 'Filtros avanzados', advancedDescription: 'Filtrar por tipo de extensión', technicalType: 'Tipo técnico', }, allExtensions: 'Todas las extensiones', tags: { filterByTags: 'Filtrar por etiquetas', selected: 'seleccionadas', selectTags: 'Seleccionar etiquetas', clearAll: 'Borrar todo', noTags: 'No hay etiquetas disponibles', }, installCard: 'Instalar {{name}}', }, mcp: { title: 'MCP', createServer: 'Añadir servidor MCP', addMCPServer: 'Añadir servidor MCP', editServer: 'Editar servidor MCP', deleteServer: 'Eliminar servidor MCP', confirmDeleteServer: '¿Estás seguro de que deseas eliminar este servidor MCP?', confirmDeleteTitle: 'Eliminar servidor MCP', getServerListError: 'Error al obtener la lista de servidores MCP: ', serverName: 'Nombre del servidor', serverMode: 'Modo de conexión', selectMode: 'Seleccionar modo', stdio: 'Modo Stdio', sse: 'Modo SSE', http: 'Modo HTTP', local: 'Local (Stdio)', remote: 'Remoto', localModeDescription: 'Ejecuta un servidor MCP localmente como subproceso dentro del sandbox de Box.', remoteModeDescription: 'Conéctate a un servidor MCP remoto por URL. El transporte (Streamable HTTP o SSE) se detecta automáticamente.', remoteUrlPlaceholder: 'https://example.com/mcp', remoteUrlDescription: 'Pega la URL del servidor MCP. Se admiten tanto endpoints Streamable HTTP como SSE heredados.', noServerInstalled: 'No hay servidores MCP configurados', serverNameRequired: 'El nombre del servidor no puede estar vacío', commandRequired: 'El comando no puede estar vacío', urlRequired: 'La URL no puede estar vacía', timeoutMustBePositive: 'El tiempo de espera debe ser un número positivo', command: 'Comando', args: 'Argumentos', env: 'Variables de entorno', url: 'URL', headers: 'Encabezados', timeout: 'Tiempo de espera', addArgument: 'Añadir argumento', addEnvVar: 'Añadir variable de entorno', addHeader: 'Añadir encabezado', keyName: 'Nombre de la clave', value: 'Valor', testing: 'Probando...', connecting: 'Conectando...', testSuccess: 'Prueba exitosa', testFailed: 'Error en la prueba: ', testError: 'Error de prueba', refreshSuccess: 'Actualización exitosa', refreshFailed: 'Error en la actualización: ', connectionSuccess: 'Conexión exitosa', connectionFailed: 'Error de conexión, por favor verifica la URL', connectionFailedStatus: 'Conexión fallida', boxDisabledStdioRefused: 'Los servidores MCP en modo stdio requieren el sandbox de Box, desactivado en la configuración (box.enabled = false).', boxUnavailableStdioRefused: 'Los servidores MCP en modo stdio requieren el sandbox de Box, actualmente no accesible.', boxStdioRefusedSuggestion: 'Active Box (box.enabled = true) y asegúrese de que el runtime está conectado, o cambie este servidor a modo http/sse.', boxRequired: 'requiere Box', stdioBlockedByBoxToast: 'No se puede guardar el MCP en modo stdio mientras el sandbox de Box está desactivado o no disponible. Active Box o seleccione modo http/sse.', toolsFound: 'herramientas', unknownError: 'Error desconocido', noToolsFound: 'No se encontraron herramientas', noResourcesFound: 'No se encontraron recursos', tabTools: 'Herramientas', tabResources: 'Recursos', tabDocs: 'Documentación', tabLogs: 'Registros', logsLevelAll: 'Todos los niveles', logsRefresh: 'Actualizar', logsAutoRefresh: 'Actualización automática', logsEmpty: 'Aún no hay registros. Los registros de ejecución del servidor MCP aparecerán aquí.', noReadme: 'No hay documentación disponible', parseResultFailed: 'Error al analizar el resultado de la prueba', noResultReturned: 'La prueba no devolvió resultados', getTaskFailed: 'Error al obtener el estado de la tarea', noTaskId: 'No se obtuvo el ID de la tarea', deleteSuccess: 'Eliminado correctamente', deleteFailed: 'Error al eliminar: ', deleteError: 'Error al eliminar: ', saveSuccess: 'Guardado correctamente', saveError: 'Error al guardar: ', createSuccess: 'Creado correctamente', createFailed: 'Error al crear: ', createError: 'Error al crear: ', loadFailed: 'Error al cargar', modifyFailed: 'Error al modificar: ', toolCount: 'Herramientas: {{count}}', parameterCount: 'Parámetros: {{count}}', noParameters: 'Sin parámetros', resourceCount: 'Recursos: {{count}}', resourceBinaryContent: 'Contenido binario (no se puede mostrar)', resourceBinaryOmitted: 'Contenido binario omitido por la política de seguridad de recursos', resourceTruncated: 'Contenido truncado por límites de bytes o tokens', resourceReadFailed: 'Error al leer el contenido del recurso', statusConnected: 'Conectado', statusDisconnected: 'Desconectado', statusError: 'Error de conexión', statusDisabled: 'Desactivado', loading: 'Cargando...', starCount: 'Estrellas: {{count}}', install: 'Instalar', installFromGithub: 'Instalar servidor MCP desde GitHub', add: 'Añadir', name: 'Nombre', nameRequired: 'El nombre no puede estar vacío', sseTimeout: 'Tiempo de espera SSE', sseTimeoutDescription: 'Tiempo de espera para establecer la conexión SSE', extraParametersDescription: 'Parámetros adicionales para configurar el comportamiento específico del servidor MCP', timeoutMustBeNumber: 'El tiempo de espera debe ser un número', timeoutNonNegative: 'El tiempo de espera no puede ser negativo', sseTimeoutMustBeNumber: 'El tiempo de espera SSE debe ser un número', sseTimeoutNonNegative: 'El tiempo de espera SSE no puede ser negativo', updateSuccess: 'Actualizado correctamente', updateFailed: 'Error al actualizar: ', selectFromSidebar: 'Selecciona un servidor MCP de la barra lateral', dangerZone: 'Zona de peligro', dangerZoneDescription: 'Acciones irreversibles y destructivas para este servidor MCP.', deleteMCPAction: 'Eliminar este servidor MCP', deleteMCPHint: 'Una vez eliminada, la configuración de este servidor MCP no se podrá recuperar.', }, pipelines: { title: 'Flujos', description: 'Los Pipelines definen el flujo de procesamiento de eventos de mensajes, se usan para vincular a los Bots', createPipeline: 'Crear Pipeline', selectFromSidebar: 'Selecciona un Pipeline de la barra lateral', editPipeline: 'Editar Pipeline', chat: 'Chat', configuration: 'Configuración', debugChat: 'Chat de depuración', getPipelineListError: 'Error al obtener la lista de Pipelines: ', daysAgo: 'días atrás', today: 'Hoy', updateTime: 'Actualizado ', defaultBadge: 'Predeterminado', sortBy: 'Ordenar por', newestCreated: 'Más recientes', earliestCreated: 'Más antiguos', recentlyEdited: 'Editados recientemente', earliestEdited: 'Editados más antiguos', basicInfo: 'Información básica', basicInfoDescription: 'Establece el nombre, icono y descripción del Pipeline', aiCapabilities: 'IA', triggerConditions: 'Disparador', safetyControls: 'Seguridad', outputProcessing: 'Salida', nameRequired: 'El nombre no puede estar vacío', descriptionRequired: 'La descripción no puede estar vacía', createSuccess: 'Creado correctamente. Por favor, edita los parámetros del Pipeline', createError: 'Error al crear: ', saveSuccess: 'Guardado correctamente', saveError: 'Error al guardar: ', copySuffix: ' Copia', deleteConfirmation: '¿Estás seguro de que deseas eliminar este Pipeline? Los Bots vinculados a este Pipeline dejarán de funcionar.', defaultPipelineCannotDelete: 'El Pipeline predeterminado no se puede eliminar', deleteSuccess: 'Eliminado correctamente', deleteError: 'Error al eliminar: ', copyConfirmTitle: 'Confirmar copia', copyConfirmation: '¿Estás seguro de que deseas copiar este Pipeline? Esto creará un nuevo Pipeline con todas las configuraciones.', unsavedChanges: 'Tienes cambios sin guardar', dangerZone: 'Zona de peligro', dangerZoneDescription: 'Acciones irreversibles y destructivas', deletePipelineAction: 'Eliminar este Pipeline', deletePipelineHint: 'Una vez eliminado, los Bots vinculados a este Pipeline dejarán de funcionar.', copyPipelineAction: 'Copiar este Pipeline', copyPipelineHint: 'Crear un nuevo Pipeline con todas las configuraciones duplicadas.', extensions: { title: 'Extensiones', loadError: 'Error al cargar plugins', saveSuccess: 'Guardado correctamente', saveError: 'Error al guardar', noPluginsAvailable: 'No hay plugins disponibles', disabled: 'Desactivado', noPluginsSelected: 'No hay plugins seleccionados', addPlugin: 'Añadir plugin', selectPlugins: 'Seleccionar plugins', pluginsTitle: 'Plugins', mcpServersTitle: 'Servidores MCP', mcpResourcesTitle: 'Recursos MCP', noMCPServersSelected: 'No hay servidores MCP seleccionados', noMCPResourcesAvailable: 'No hay recursos MCP disponibles', addMCPServer: 'Añadir servidor MCP', selectMCPServers: 'Seleccionar servidores MCP', enableMCPResourceAgentRead: 'Permitir lectura del modelo', toolCount: '{{count}} herramientas', noPluginsInstalled: 'No hay plugins instalados', noMCPServersConfigured: 'No hay servidores MCP configurados', selectAll: 'Seleccionar todo', enableAllPlugins: 'Activar todos los plugins', enableAllMCPServers: 'Activar todos los servidores MCP', allPluginsEnabled: 'Todos los plugins activados', allMCPServersEnabled: 'Todos los servidores MCP activados', enableAllSkills: 'Activar todas las skills', allSkillsEnabled: 'Todas las skills están activadas', skillsTitle: 'Skills', noSkillsSelected: 'No hay skills seleccionadas', addSkill: 'Añadir skill', selectSkills: 'Seleccionar skills', noSkillsAvailable: 'No hay skills disponibles', mcpServersScopeTooltip: 'Aquí solo se controla qué servidores MCP se vinculan al Pipeline. Las herramientas y recursos MCP concretos se eligen en AI Feature > Local Agent.', enableAllMCPServersTooltip: 'Al activarlo, todos los servidores MCP configurados y habilitados serán candidatos para herramientas y recursos MCP en AI Feature.', }, localAgent: { toolsTitle: 'Herramientas', toolsDescription: 'Selecciona las herramientas de plugins, MCP e integradas disponibles para este Local Agent.', toolsScopeTooltip: 'Las herramientas MCP solo provienen de servidores MCP vinculados en Extensiones. Vincula allí otro servidor para poder seleccionarlo aquí.', enableAllTools: 'Activar todas las herramientas', allToolsEnabled: 'Todas las herramientas disponibles están activadas', noToolsSelected: 'No hay herramientas seleccionadas', editTools: 'Editar herramientas', builtinTools: 'Herramientas integradas', pluginTools: 'Herramientas de plugin', skillTools: 'Herramientas de skill', mcpTools: 'Herramientas MCP', mcpToolsScopeTooltip: 'Aquí solo se muestran herramientas de servidores MCP permitidos actualmente en Extensiones.', skillToolsScopeTooltip: 'Las herramientas de skill aparecen cuando el servicio de skills de LangBot y el backend de sandbox Box están disponibles. Permiten al agente activar o registrar skills.', selectTools: 'Seleccionar herramientas', resourcesTitle: 'Recursos', resourcesDescription: 'Selecciona los recursos MCP y bases de conocimiento disponibles para este Local Agent.', knowledgeBases: 'Bases de conocimiento', mcpResources: 'Recursos MCP', mcpResourcesScopeTooltip: 'Aquí solo se muestran recursos expuestos por servidores MCP permitidos actualmente en Extensiones.', enableMCPResourceRead: 'Permitir que el modelo lea recursos MCP', mcpResourceReadTooltip: 'Si se desactiva, los recursos MCP seleccionados no se inyectarán en el contexto del modelo.', noMCPResourcesAvailable: 'No hay recursos MCP disponibles', selectKnowledgeBases: 'Seleccionar bases de conocimiento', }, debugDialog: { title: 'Chat del Pipeline', selectPipeline: 'Seleccionar Pipeline', sessionType: 'Tipo de sesión', privateChat: 'Chat privado', groupChat: 'Chat grupal', send: 'Enviar', reset: 'Reiniciar conversación', inputPlaceholder: 'Enviar mensaje {{type}}...', noMessages: 'Sin mensajes', userMessage: 'Usuario', botMessage: 'Bot', sendFailed: 'Error al enviar', resetSuccess: 'Conversación reiniciada correctamente', resetFailed: 'Error al reiniciar', loadMessagesFailed: 'Error al cargar mensajes', loadPipelinesFailed: 'Error al cargar Pipelines', atTips: 'Mencionar al Bot', streaming: 'Transmisión', streamOutput: 'Transmisión', connected: 'WebSocket conectado', disconnected: 'WebSocket desconectado', connectionError: 'Error de conexión WebSocket', connectionFailed: 'Conexión WebSocket fallida', notConnected: 'WebSocket no conectado, por favor inténtalo más tarde', imageUploadFailed: 'Error al subir imagen', reply: 'Responder', replyTo: 'Responder a', showMarkdown: 'Mostrar Markdown', showRaw: 'Mostrar sin formato', allMembers: 'Todos los miembros', file: 'Archivo', voice: 'Voz', uploadImage: 'Subir imagen', uploading: 'Subiendo...', }, monitoring: { title: 'Panel de control', description: 'Ver registros de ejecución y errores de este Pipeline (últimas 24 horas)', detailedLogs: 'Registros detallados', }, }, knowledge: { title: 'Conocimiento', createKnowledgeBase: 'Crear base de conocimiento', selectFromSidebar: 'Selecciona una base de conocimiento de la barra lateral', editKnowledgeBase: 'Editar base de conocimiento', selectKnowledgeBase: 'Seleccionar base de conocimiento', selectKnowledgeBases: 'Seleccionar bases de conocimiento', addKnowledgeBase: 'Añadir base de conocimiento', noKnowledgeBaseSelected: 'No hay bases de conocimiento seleccionadas', empty: 'Vacío', editDocument: 'Documentos', description: 'Configurar bases de conocimiento para mejorar las respuestas del LLM', metadata: 'Metadatos', documents: 'Documentos', kbNameRequired: 'El nombre de la base de conocimiento no puede estar vacío', kbDescriptionRequired: 'La descripción de la base de conocimiento no puede estar vacía', embeddingModelUUIDRequired: 'El modelo Embedding no puede estar vacío', daysAgo: 'días atrás', today: 'Hoy', kbName: 'Nombre de la base de conocimiento', kbDescription: 'Descripción de la base de conocimiento', topK: 'Top K', topKRequired: 'Top K no puede estar vacío', topKMax: 'El valor máximo de Top K es 30', topKdescription: 'Se usa para especificar el número de documentos relevantes a recuperar, con un rango de 1 a 30.', defaultDescription: 'Una base de conocimiento', embeddingModelUUID: 'Modelo Embedding', selectEmbeddingModel: 'Seleccionar modelo Embedding', embeddingModelDescription: 'Se usa para vectorizar el texto, puedes configurarlo en la página de Modelos', updateTime: 'Actualizado ', cannotChangeEmbeddingModel: 'El modelo Embedding no se puede modificar una vez creada la base de conocimiento', updateKnowledgeBaseSuccess: 'Base de conocimiento actualizada correctamente', updateKnowledgeBaseFailed: 'Error al actualizar la base de conocimiento: ', documentsTab: { name: 'Nombre', status: 'Estado', noResults: 'No hay documentos', dragAndDrop: 'Arrastra y suelta archivos aquí o haz clic para subir', uploading: 'Subiendo...', supportedFormats: 'Admite PDF, Word, TXT, Markdown, HTML, ZIP y otros formatos de documentos', uploadSuccess: '¡Archivo subido correctamente!', uploadError: 'Error al subir el archivo: ', uploadingFile: 'Subiendo archivo...', fileSizeExceeded: 'El tamaño del archivo supera el límite de 10MB. Por favor, divídelo en archivos más pequeños.', actions: 'Acciones', delete: 'Eliminar archivo', fileDeleteSuccess: 'Archivo eliminado correctamente', fileDeleteFailed: 'Error al eliminar el archivo: ', processing: 'Procesando', completed: 'Completado', failed: 'Fallido', selectParser: 'Seleccionar analizador', builtInParser: 'Proporcionado por el motor de conocimiento', noParserAvailable: 'Ningún analizador admite este tipo de archivo. Por favor, instala un plugin de analizador que pueda manejar este formato.', installParserHint: 'Buscar plugins de analizador en el Marketplace →', confirmUpload: 'Subir', cancelUpload: 'Cancelar', }, deleteKnowledgeBaseConfirmation: '¿Estás seguro de que deseas eliminar esta base de conocimiento? Todos los documentos de esta base se eliminarán.', retrieve: 'Prueba de recuperación', retrieveTest: 'Prueba de recuperación', query: 'Consulta', queryPlaceholder: 'Introduce el texto de consulta...', distance: 'Distancia', content: 'Contenido', fileName: 'Nombre del archivo', noResults: 'Sin resultados', retrieveError: 'Error en la recuperación: ', unknownEngine: 'Motor desconocido', knowledgeEngine: 'Motor de conocimiento', knowledgeEngineRequired: 'El motor de conocimiento es obligatorio', selectKnowledgeEngine: 'Seleccionar motor de conocimiento', builtInEngine: 'Motor integrado', cannotChangeKnowledgeEngine: 'El motor de conocimiento no se puede cambiar después de la creación', basicInfo: 'Información básica', basicInfoDescription: 'Establece el nombre, icono y descripción de la base de conocimiento', engineSettings: 'Configuración del motor', engineSettingsDescription: 'Configuración del motor de conocimiento seleccionado', engineSettingsReadonly: 'solo lectura en modo de edición', engineSettingsInvalid: 'La configuración del motor no es válida, verifique los campos obligatorios', retrievalSettingsInvalid: 'La configuración de recuperación no es válida, verifique los campos obligatorios', retrievalSettings: 'Configuración de recuperación', retrievalSettingsDescription: 'Configura cómo se recuperan los documentos de esta base de conocimiento', dangerZone: 'Zona de peligro', dangerZoneDescription: 'Acciones irreversibles y destructivas', deleteKbAction: 'Eliminar esta base de conocimiento', deleteKbHint: 'Una vez eliminada, todos los documentos y datos de esta base de conocimiento se eliminarán permanentemente.', noEnginesAvailable: 'No hay motores de base de conocimiento disponibles', installEngineHint: 'Por favor, instala primero un plugin de "Motor de conocimiento"', createKnowledgeBaseFailed: 'Error al crear la base de conocimiento: ', loadKnowledgeBaseFailed: 'Error al cargar la base de conocimiento: ', deleteKnowledgeBaseFailed: 'Error al eliminar la base de conocimiento: ', getKnowledgeBaseListError: 'Error al obtener la lista de bases de conocimiento: ', embeddingModel: 'Modelo Embedding', embeddingModelRequired: 'El modelo Embedding es obligatorio para este motor', addExternal: 'Añadir base de conocimiento externa', createExternalSuccess: 'Base de conocimiento externa creada correctamente', updateExternalSuccess: 'Base de conocimiento externa actualizada correctamente', deleteExternalSuccess: 'Base de conocimiento externa eliminada correctamente', retriever: 'Recuperador', selectRetriever: 'Seleccionar un recuperador...', retrieverConfiguration: 'Configuración del recuperador', retrieverInstallInfo: 'Puedes instalar plugins de recuperador de conocimiento desde', retrieverMarketLink: 'aquí', migration: { title: 'Migración de base de conocimiento', description: 'La nueva versión ha refactorizado la base de conocimiento en una arquitectura basada en plugins, unificando las bases de conocimiento internas y externas como plugins de "Motor de conocimiento". Se requiere la migración de los datos heredados. Tus datos antiguos se han respaldado automáticamente en la base de datos.', detected: 'Se encontraron {{total}} base(s) de conocimiento para migrar ({{internal}} internas, {{external}} externas).', startWithInstall: 'Auto-instalar plugin y migrar', startDataOnly: 'Migrar solo datos', dataOnlyHint: '"Migrar solo datos" es para entornos sin conexión/intranet. Instala el plugin correspondiente manualmente después de la migración.', dismiss: 'Descartar datos originales', running: 'Migrando bases de conocimiento, por favor espera...', success: 'Migración de base de conocimiento completada', error: 'Error en la migración de base de conocimiento: ', dismissError: 'Error en la operación', retry: 'Reintentar', }, }, register: { title: 'Inicializar LangBot 👋', description: 'Es tu primera vez iniciando LangBot', adminAccountNote: 'La cuenta que uses aquí se establecerá como cuenta de administrador', register: 'Registrarse', initWithSpace: 'Inicializar con Space', spaceRecommended: 'Recomendado: Usa API de modelos oficiales estables y servicios en la nube', spaceInfoTip1: 'Space proporciona servicios de autenticación unificada de cuentas sin subir ninguna de tu información sensible.', spaceInfoTip2: 'Iniciar sesión con una cuenta de Space te da acceso a los modelos de LangBot y otros servicios en la nube, incluyendo créditos gratuitos de llamadas a modelos para ayudarte a comenzar rápidamente.', spaceInfoTip3: 'Tu método de inicio de sesión no afecta otras funciones. Puedes configurar y usar modelos de otras fuentes en cualquier momento.', registerLocal: 'Registrar cuenta local', registerWithPassword: 'Registrarse con correo electrónico y contraseña', initSuccess: 'Inicialización exitosa, por favor inicia sesión', initFailed: 'Error en la inicialización: ', }, resetPassword: { title: 'Restablecer contraseña 🔐', description: 'Introduce tu clave de recuperación y nueva contraseña para restablecer la contraseña de tu cuenta', recoveryKey: 'Clave de recuperación', recoveryKeyDescription: 'Almacenada en `system.recovery_key` del archivo de configuración `data/config.yaml`', newPassword: 'Nueva contraseña', enterRecoveryKey: 'Introduce la clave de recuperación', enterNewPassword: 'Introduce la nueva contraseña', recoveryKeyRequired: 'La clave de recuperación no puede estar vacía', newPasswordRequired: 'La nueva contraseña no puede estar vacía', resetPassword: 'Restablecer contraseña', resetting: 'Restableciendo...', resetSuccess: 'Contraseña restablecida correctamente, por favor inicia sesión', resetFailed: 'Error al restablecer la contraseña, por favor verifica tu correo y clave de recuperación', backToLogin: 'Volver al inicio de sesión', }, embedding: { description: 'Gestionar modelos Embedding para la vectorización de texto', createModel: 'Crear modelo Embedding', editModel: 'Editar modelo Embedding', getModelListError: 'Error al obtener la lista de modelos Embedding: ', embeddingModels: 'Embedding', extraParametersDescription: 'Se adjuntarán al cuerpo de la solicitud, como encoding_format, dimensions, etc.', }, llm: { description: 'Gestionar modelos LLM para la generación de conversaciones', llmModels: 'LLM', extraParametersDescription: 'Se adjuntarán al cuerpo de la solicitud, como max_tokens, temperature, top_p, etc.', }, version: { newVersionAvailable: 'Nueva versión disponible', viewUpdateGuide: 'Ver guía de actualización', noReleaseNotes: 'No hay notas de la versión disponibles', }, account: { settings: 'Configuración de la cuenta', settingsDescription: 'Gestiona tu contraseña y las cuentas vinculadas', setPassword: 'Establecer contraseña', passwordSetSuccess: 'Contraseña establecida correctamente', passwordStatus: 'Contraseña local', passwordSet: 'Establecida', passwordNotSet: 'No establecida', passwordSetDescription: 'La contraseña está establecida, puedes iniciar sesión con correo y contraseña', spaceStatus: 'Cuenta de Space', spaceBound: 'Vinculada', spaceNotBound: 'No vinculada', spaceBoundDescription: 'Cuenta de Space vinculada, API de modelos oficiales y servicios en la nube disponibles', bindSpace: 'Vincular cuenta de Space', bindSpaceDescription: 'Vincular para usar API de modelos oficiales y servicios en la nube', bindSpaceButton: 'Vincular', bindSpaceConfirmTitle: 'Confirmar vinculación', bindSpaceConfirmDescription: 'Estás a punto de vincular tu instancia local a una cuenta de Space', bindSpaceWarning: 'Después de vincular, tu correo de inicio de sesión se cambiará de {{localEmail}} al correo de la cuenta de Space.', bindSpaceSuccess: 'Cuenta de Space vinculada correctamente', bindSpaceFailed: 'Error al vincular la cuenta de Space', bindSpaceInvalidState: 'Solicitud de vinculación no válida. Por favor, inténtalo de nuevo desde la configuración de la cuenta.', setPasswordHint: 'Establece una contraseña para iniciar sesión con correo y contraseña', spaceEmailMismatch: 'El correo de inicio de sesión de Space no coincide con el correo de la cuenta local', }, monitoring: { title: 'Panel de control', description: 'Monitorea las actividades de los Bots, llamadas LLM y rendimiento del sistema', overview: 'Resumen', totalMessages: 'Total de mensajes', llmCallsCount: 'Llamadas LLM', modelCallsCount: 'Llamadas a modelos', successRate: 'Tasa de éxito', activeSessions: 'Sesiones activas', last24Hours: 'Últimas 24 horas', filters: { title: 'Filtros', bot: 'Bot', pipeline: 'Pipeline', allBots: 'Todos los Bots', selectBot: 'Seleccionar Bot', allPipelines: 'Todos los Pipelines', selectPipeline: 'Seleccionar Pipeline', loading: 'Cargando...', timeRange: 'Rango de tiempo', customRange: 'Rango personalizado', from: 'Desde', to: 'Hasta', apply: 'Aplicar', reset: 'Restablecer filtros', lastHour: 'Última hora', last6Hours: 'Últimas 6 horas', last24Hours: 'Últimas 24 horas', last7Days: 'Últimos 7 días', last30Days: 'Últimos 30 días', }, tabs: { messages: 'Registros de mensajes', llmCalls: 'Llamadas LLM', embeddingCalls: 'Llamadas Embedding', modelCalls: 'Llamadas a modelos', tokens: 'Monitoreo de Tokens', sessions: 'Análisis de sesiones', feedback: 'Comentarios de usuarios', errors: 'Registros de errores', }, messageList: { timestamp: 'Marca de tiempo', bot: 'Bot', pipeline: 'Pipeline', message: 'Mensaje', sessionId: 'ID de sesión', status: 'Estado', actions: 'Acciones', viewDetails: 'Ver detalles', copyId: 'Copiar ID', noMessages: 'No se encontraron mensajes', noMessagesDescription: 'Intenta ajustar los filtros o vuelve a comprobarlo más tarde', loading: 'Cargando mensajes...', loadMore: 'Cargar más', autoRefresh: 'Actualización automática', platform: 'Rol', user: 'Usuario', level: 'Nivel', runner: 'Ejecutor', viewConversation: 'Ver conversación', turns: '{{count}} turnos de conversación', userMessage: 'Usuario', noUserMessage: 'No se registró entrada del usuario', assistantMessage: 'Asistente', assistantMessageCount: 'Asistente +{{count}}', noAssistantMessage: 'No se registró respuesta del asistente', messageCount: 'Mensajes', conversationTrace: 'Flujo de conversación', noLlmCalls: 'No se registraron llamadas al modelo', roles: { user: 'Usuario', assistant: 'Asistente', message: 'Mensaje', }, }, llmCalls: { title: 'Llamadas LLM', model: 'Modelo', tokens: 'Tokens', duration: 'Duración', cost: 'Coste', noData: 'No se encontraron llamadas LLM', inputTokens: 'Tokens de entrada', outputTokens: 'Tokens de salida', totalTokens: 'Tokens totales', avgDuration: 'Duración promedio', calls: 'Llamadas', }, toolCalls: { title: 'Llamadas de herramientas', totalCalls: 'Llamadas', duration: 'Duración de herramientas', errorCalls: 'Llamadas fallidas', arguments: 'Argumentos', result: 'Resultado', noToolCalls: 'No se registraron llamadas de herramientas', }, tokens: { totalTokens: 'Tokens totales', inputTokens: 'Tokens de entrada', outputTokens: 'Tokens de salida', avgPerCall: 'Prom. / llamada', throughput: 'Rendimiento', tokensPerSec: 'tokens/seg', errorCalls: 'Llamadas fallidas', acrossCalls: 'en {{count}} llamadas', ofTotal: 'de {{count}} en total', usageOverTime: 'Uso de tokens a lo largo del tiempo', byModel: 'Por modelo', model: 'Modelo', calls: 'Llamadas', avgLatency: 'Latencia media', noData: 'No hay uso de tokens en el rango de tiempo seleccionado', loadError: 'Error al cargar las estadísticas de tokens: {{error}}', zeroTokenWarning: '{{count}} llamada(s) exitosa(s) reportaron cero uso de tokens. Esto suele significar que el proveedor upstream no devolvió información de uso; revisa la configuración del proveedor del modelo.', bucket: { hour: 'Por hora', day: 'Por día', }, }, embeddingCalls: { title: 'Llamadas Embedding', model: 'Modelo', tokens: 'Tokens', duration: 'Duración', noData: 'No se encontraron llamadas Embedding', promptTokens: 'Tokens de prompt', totalTokens: 'Tokens totales', inputCount: 'Cantidad de entradas', knowledgeBase: 'Base de conocimiento', queryText: 'Consulta', }, modelCalls: { title: 'Llamadas a modelos', llmModel: 'LLM', embeddingModel: 'Embedding', embeddingCall: 'Embedding', retrieveCall: 'Recuperación', noData: 'No se encontraron llamadas a modelos', }, sessions: { sessionId: 'ID de sesión', messageCount: 'Mensajes', duration: 'Duración', lastActivity: 'Última actividad', noSessions: 'No se encontraron sesiones', startTime: 'Hora de inicio', messageStats: 'Estadísticas de mensajes', totalMessages: 'Total de mensajes', successMessages: 'Exitosos', errorMessages: 'Fallidos', llmStats: 'Estadísticas LLM', noData: 'Sesión no encontrada', }, errors: { title: 'Errores', errorType: 'Tipo de error', errorMessage: 'Mensaje de error', occurredAt: 'Ocurrido el', noErrors: 'No se encontraron errores', stackTrace: 'Traza de pila', }, feedback: { title: 'Comentarios de usuarios', totalFeedback: 'Total de comentarios', totalLikes: 'Me gusta', totalDislikes: 'No me gusta', satisfactionRate: 'Tasa de satisfacción', like: 'Me gusta', dislike: 'No me gusta', noFeedback: 'Aún no hay comentarios', noFeedbackDescription: 'Los comentarios de los usuarios aparecerán aquí', feedbackList: 'Lista de comentarios', feedbackContent: 'Contenido del comentario', contextInfo: 'Información de contexto', userId: 'ID de usuario', messageId: 'ID de mensaje', streamId: 'ID de consulta relacionada', inaccurateReasons: 'Razones de inexactitud', platform: 'Plataforma', exportFeedback: 'Exportar comentarios', description: 'Tell us what went wrong or what could be better. Instance UUID and login account are included for diagnosis.', placeholder: 'Describe your suggestion, issue, or reproduction steps...', attachImage: 'Add image', screenshot: 'Screenshot', submit: 'Submit feedback', privacyHint: 'Do not include secrets, passwords, or private chat content.', contentRequired: 'Please enter feedback first', imageOnly: 'Only image attachments are supported', imageTooLarge: 'Each image must be under 1MB', tooManyImages: 'You can attach up to 3 images', screenshotFailed: 'Screenshot failed. Try pasting or uploading an image.', submitSuccess: 'Feedback submitted. Thanks!', submitFailed: 'Failed to submit feedback. Please try again later.', removeImage: 'Remove image', }, queries: { title: 'Consultas', }, messageDetails: { noData: 'No hay llamadas LLM ni errores para esta consulta', }, queryVariables: { title: 'Variables de consulta', }, trafficChart: { title: 'Resumen de tráfico', messages: 'Mensajes', llmCalls: 'Llamadas LLM', noData: 'No hay datos de tráfico disponibles', }, viewMonitoring: 'Ver monitoreo', refreshData: 'Actualizar datos', exportData: 'Exportar datos', export: { title: 'Exportar datos', exporting: 'Exportando...', messages: 'Mensajes', llmCalls: 'Llamadas LLM', embeddingCalls: 'Llamadas Embedding', errors: 'Registros de errores', sessions: 'Sesiones', feedback: 'Comentarios de usuarios', }, systemStatus: 'Estado del sistema', pluginRuntime: 'Plugin Runtime', boxRuntime: 'Box Runtime', connected: 'Conectado', disconnected: 'Desconectado', disabled: 'Desactivado', statusDetail: 'Estado', pluginDisabled: 'El sistema de plugins está desactivado', boxDisabled: 'El sandbox de Box está desactivado en la configuración — herramientas de sandbox, alta/edición de skills y MCP stdio no están disponibles', boxUnavailable: 'El sandbox de Box no está disponible — herramientas de sandbox, alta/edición de skills y MCP stdio no están disponibles', boxRequiredHint: 'Esta función requiere el runtime de Box. Actívelo en la configuración (box.enabled = true) y asegúrese de que el runtime está conectado.', boxBackend: 'Backend', boxProfile: 'Perfil', boxSandboxes: 'Sandboxes', boxSessionCreated: 'Creado', boxSessionLastUsed: 'Último uso', }, settingsDialog: { title: 'Configuración', nav: { models: 'Modelos', api: 'API', storage: 'Almacenamiento', account: 'Cuenta', }, }, storageAnalysis: { title: 'Análisis de almacenamiento', description: 'Inspecciona el uso de almacenamiento y los candidatos de limpieza', openDialog: 'Ver análisis', dialogTitle: 'Análisis de almacenamiento', generatedAt: 'Generado el {{time}}', loading: 'Cargando...', refresh: 'Actualizar', totalSize: 'Tamaño total', binaryStorage: 'Almacenamiento binario de plugins', uploadCleanup: 'Subidas caducadas', logCleanup: 'Registros caducados', sections: 'Secciones de almacenamiento', monitoringTables: 'Tablas de monitoreo', runtimeTasks: 'Tareas en ejecución', cleanupPolicy: 'Política de limpieza', uploadRetention: 'Retención de subidas', logRetention: 'Retención de registros', databaseType: 'Tipo de base de datos', days: 'días', missing: 'Falta', expiredUploads: 'Subidas caducadas', expiredLogs: 'Registros caducados', noExpiredUploads: 'No hay archivos subidos caducados', noExpiredLogs: 'No hay registros caducados', sectionNames: { database: 'Base de datos', logs: 'Registros', storage: 'Archivos subidos', vector_store: 'Almacén vectorial', plugins: 'Plugins', mcp: 'MCP', temp: 'Archivos temporales', }, }, limitation: { maxBotsReached: 'Se ha alcanzado el número máximo de Bots ({{max}}). Por favor, elimina un Bot existente antes de crear uno nuevo.', maxPipelinesReached: 'Se ha alcanzado el número máximo de Pipelines ({{max}}). Por favor, elimina un Pipeline existente antes de crear uno nuevo.', maxExtensionsReached: 'Se ha alcanzado el número máximo de extensiones ({{max}}). Por favor, elimina un servidor MCP o plugin existente antes de añadir uno nuevo.', }, wizard: { sidebarDescription: 'Crea un Bot con pasos guiados', loading: 'Cargando asistente...', loadError: 'Error al cargar los datos del asistente', skip: 'Omitir', skipConfirmMessage: 'Puedes volver a acceder al asistente de inicio rápido desde el menú de cuenta más tarde, o crear un Bot manualmente.', skipConfirmOk: 'Aceptar', prev: 'Anterior', next: 'Siguiente', finish: 'Crear y desplegar', confirmCreateBot: 'Confirmar, crear Bot', createSuccess: '¡Pipeline creado y vinculado al Bot correctamente!', botCreateSuccess: '¡Bot creado correctamente!', botSaveSuccess: '¡Configuración del Bot guardada y activada!', createError: 'Error al crear los recursos', spaceAuthError: 'Error al iniciar la autorización de Space', skipSaveError: 'Error al guardar el estado de omisión. Por favor, inténtalo de nuevo.', completeSaveError: 'Error al guardar el estado de finalización. Por favor, inténtalo de nuevo.', step: { platform: 'Plataforma', botConfig: 'Configuración del Bot', aiEngine: 'Motor de IA', done: 'Listo', }, platform: { title: 'Selecciona una plataforma', description: 'Elige la plataforma de mensajería a la que se conectará tu Bot.', }, botConfig: { title: 'Configura tu Bot', description: 'Configura tu Bot y verifica que funcione antes de continuar.', saveBot: 'Guardar y activar Bot', resaveBot: 'Volver a guardar configuración', botSaved: 'Configuración del Bot guardada y activada. Consulta los registros para verificar la conexión.', logsTitle: 'Registros del Bot', logsDescription: 'Monitorea la actividad del Bot para verificar que la conexión con la plataforma funcione.', }, aiEngine: { title: 'Selecciona un motor de IA', description: 'Elige el motor de IA que impulsará la inteligencia de tu Bot.', }, spaceBanner: { message: '¡Conéctate a LangBot Space para obtener créditos de prueba gratuitos y configuración instantánea sin esfuerzo!', action: 'Autorizar con Space', }, config: { botInfo: 'Información del Bot', botNamePlaceholder: 'Introduce el nombre del Bot', botDescPlaceholder: 'Introduce la descripción del Bot (opcional)', platformConfig: 'Configuración de {{platform}}', aiConfig: 'Configuración de {{engine}}', }, done: { title: '¡Todo listo!', description: 'Tu Bot ha sido creado y conectado al Pipeline de IA. Ahora puedes gestionarlo desde el panel de trabajo.', backToWorkbench: 'Volver al panel de trabajo', }, }, errorPage: { unexpectedError: 'Algo salió mal', unexpectedErrorDescription: 'Ocurrió un error inesperado. Por favor, inténtelo de nuevo más tarde.', notFound: 'Página no encontrada', notFoundDescription: 'La página que buscas no existe o ha sido movida.', backendUnavailableStatus: 'Backend no disponible', goBack: 'Volver', backToHome: 'Ir al inicio', backToLogin: 'Volver al inicio de sesión', retrying: 'Reintentando', retryFailed: 'Aún no se puede conectar con el backend. Inicia el servicio e inténtalo de nuevo.', }, feishu: { createApp: 'Crear aplicación de Feishu con un clic', scanQRCode: 'Escanea el código QR de abajo con Feishu para autorizar y crear la aplicación automáticamente', waitingForScan: 'Esperando escaneo', createSuccess: '¡Aplicación creada correctamente! Las credenciales se han rellenado automáticamente', createFailed: 'Error al crear la aplicación', connecting: 'Conectando con el servicio de Feishu...', expired: 'El código QR ha caducado. Inténtalo de nuevo', denied: 'El usuario rechazó la autorización', connectionLost: 'Se perdió la conexión. Inténtalo de nuevo', reconnecting: 'Reconectando...', retry: 'Reintentar', }, weixin: { scanLogin: 'Iniciar sesión en WeChat con QR', scanQRCode: 'Escanea el código QR de abajo con WeChat para autorizar e introducir el token automáticamente', loginSuccess: '¡Inicio de sesión correcto! El token se ha rellenado automáticamente', loginFailed: 'Error al iniciar sesión', }, dingtalk: { createApp: 'Crear aplicación de DingTalk con un clic', scanQRCode: 'Escanea el código QR de abajo con DingTalk para autorizar y crear la aplicación automáticamente', waitingForScan: 'Esperando escaneo', createSuccess: '¡Aplicación creada correctamente! Las credenciales se han rellenado automáticamente', createFailed: 'Error al crear la aplicación', connecting: 'Conectando con el servicio de DingTalk...', retry: 'Reintentar', robotCodeNote: 'El código del robot no puede obtenerse automáticamente. Ve al panel de desarrolladores de DingTalk > Configuración del robot para copiarlo manualmente. Es necesario para funciones como reconocimiento de imágenes y carga de archivos.', }, wecombot: { createBot: 'Crear bot de WeCom con un clic', scanQRCode: 'Escanea el código QR de abajo con WeCom para autorizar y crear el bot automáticamente', waitingForScan: 'Esperando escaneo', createSuccess: '¡Bot creado correctamente! Las credenciales se han rellenado automáticamente', createFailed: 'Error al crear el bot', connecting: 'Conectando con el servicio de WeCom...', retry: 'Reintentar', robotNameNote: 'El nombre del robot no puede obtenerse automáticamente. Introdúcelo manualmente.', }, pluginPages: { selectFromSidebar: 'Selecciona una página de plugin en la barra lateral', invalidPage: 'Página de plugin no válida', }, skills: { title: 'Skills', description: 'Crea y gestiona skills que se pueden activar durante las conversaciones', createSkill: 'Crear skill', createSkillDescription: 'Importa un directorio local o crea una skill rellenando la información', editSkill: 'Editar skill', getSkillListError: 'Error al obtener la lista de skills: ', skillName: 'Nombre de la skill', displayName: 'Nombre de la skill', displayNamePlaceholder: 'Nombre visible (admite cualquier idioma)', skillSlug: 'Nombre del directorio', skillSlugPlaceholder: 'english-name-only', skillSlugHelp: 'Se usa como nombre del directorio de la skill. Solo letras, números, guiones y guiones bajos.', skillDescription: 'Descripción de la skill', skillInstructions: 'Instrucciones', saveSuccess: 'Guardado correctamente', saveError: 'Error al guardar: ', createSuccess: 'Creado correctamente', createError: 'Error al crear: ', deleteSuccess: 'Eliminado correctamente', deleteError: 'Error al eliminar: ', deleteConfirmation: '¿Seguro que quieres eliminar esta skill?', delete: 'Eliminar skill', skillNameRequired: 'El nombre de la skill no puede estar vacío', skillDescriptionRequired: 'La descripción de la skill no puede estar vacía', packageRootRequired: 'La ruta raíz del paquete no puede estar vacía', scan: 'Escanear', scanSuccess: 'Directorio escaneado correctamente', scanError: 'Error al escanear el directorio: ', noSkills: 'No hay skills configuradas', preview: 'Vista previa', previewInstructions: 'Vista previa del contenido de SKILL.md', instructionsPlaceholder: 'Introduce las instrucciones de la skill en formato Markdown...', descriptionPlaceholder: 'Breve descripción de lo que hace esta skill (se muestra al LLM)', packageRoot: 'Directorio del paquete', packageRootHelp: 'Opcional. Solo se necesita al importar un directorio de skill existente. Déjalo vacío para skills nuevas. El escaneo revisa el directorio actual y subdirectorios hasta 2 niveles.', importLocalDirectory: 'Importar directorio local de skill', chooseSkillDirectory: 'Elegir directorio de SKILL.md', chooseAnotherDirectory: 'Elegir otro directorio', importingDirectory: 'Generando vista previa...', clearDirectoryPreview: 'Borrar directorio seleccionado', noSkillMdInDirectory: 'No se encontró SKILL.md en el directorio seleccionado', multipleSkillMdInDirectory: 'El directorio seleccionado contiene varios SKILL.md. Elige directamente un único directorio de skill.', importDirectoryError: 'Error al importar el directorio: ', advancedSettings: 'Configuración avanzada', searchSkills: 'Buscar skills...', selectSkills: 'Seleccionar skills', addSkill: 'Añadir skill', builtin: 'Integrada', importFromGithub: 'Instalar skill desde GitHub', createManually: 'Crear manualmente', uploadZip: 'Subir paquete ZIP', uploadZipOnly: 'Solo se admiten paquetes de skill .zip', installSuccess: 'Skill instalada correctamente', installError: 'Error al instalar la skill: ', enterRepoUrl: 'Introduce la URL del repositorio de GitHub', repoUrlPlaceholder: 'p. ej., https://github.com/owner/repo', fetchingReleases: 'Obteniendo releases...', selectRelease: 'Seleccionar release', noReleasesFound: 'No se encontraron releases', fetchReleasesError: 'Error al obtener releases: ', selectAsset: 'Selecciona el archivo para instalar', sourceArchive: 'Código fuente (zip)', noAssetsFound: 'No hay archivos instalables en esta release', fetchAssetsError: 'Error al obtener archivos: ', backToReleases: 'Volver a releases', backToRepoUrl: 'Volver a la URL del repositorio', backToAssets: 'Volver a archivos', releaseTag: 'Etiqueta: {{tag}}', publishedAt: 'Publicado el: {{date}}', prerelease: 'Pre-release', assetSize: 'Tamaño: {{size}}', confirmInstall: 'Confirmar instalación', installing: 'Instalando skill...', loading: 'Cargando...', previewLoadError: 'Error al cargar la vista previa', selectFromSidebar: 'Selecciona una skill en la barra lateral', dangerZone: 'Zona peligrosa', dangerZoneDescription: 'Acciones irreversibles y destructivas', files: 'Archivos', noFiles: 'No se encontraron archivos', loadFilesError: 'Error al cargar archivos: ', readFileError: 'Error al leer el archivo: ', saveFile: 'Guardar archivo', saveFileSuccess: 'Archivo guardado correctamente', saveFileError: 'Error al guardar el archivo: ', }, addExtension: { installTitle: 'Instalar {{type}}', installConfirm: '¿Instalar {{type}} "{{name}}"?', installInfoType: 'Tipo', installInfoId: 'ID', installInfoVersion: 'Versión', installSuccess: 'Instalado correctamente', installStage: { mcpInstalling: 'Añadiendo y conectando el servidor MCP…', skillInstalling: 'Instalando la skill…', installed: 'Listo', }, manualAdd: 'Añadir manualmente', uploadExtension: 'Arrastra y suelta o haz clic para subir', uploadHint: 'Admite archivos .zip (skills) y .lbpkg (plugins)', orContinueWith: 'o elige una acción abajo', addMCPServerHint: 'Conectar una extensión de servidor de herramientas MCP', installFromGithub: 'Instalar desde GitHub', installFromGithubHint: 'Paquete de plugin o skill (SKILL.md)', githubUrlHelp: 'Pega una URL de GitHub', githubUrlTooltip: 'Plugin: pega una URL de repositorio, Release o Tag. Skill: pega la URL de la página SKILL.md dentro del directorio de la skill.', githubUrlPlaceholder: 'Repositorio de GitHub, Release o enlace SKILL.md', githubUrlRequired: 'Introduce una URL de GitHub', previewSkill: 'Previsualizar skill', noSkillPreviewFound: 'No se encontró ninguna skill importable', createSkill: 'Crear nueva skill', createSkillHint: 'Importar desde un directorio local o crear manualmente', unsupportedFileType: 'Tipo de archivo no admitido. Solo se admiten archivos .zip y .lbpkg', }, }; export default esES;