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 una cuenta de LangBot',
    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 una cuenta de LangBot',
    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 una cuenta de LangBot',
    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 una cuenta de LangBot',
    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 LangBot 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',

    apiKeyStoredSecurely: 'Secret shown only when created',
  },
  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',
    reasoningAbility: 'Razonamiento',
    reasoningLevel: 'Nivel de razonamiento',
    reasoningLevels: {
      providerDefault: 'Predeterminado del proveedor',
      disabled: 'Desactivado',
      enabled: 'Activado',
      minimal: 'Mínimo',
      low: 'Bajo',
      medium: 'Medio',
      high: 'Alto',
      xhigh: 'Extra alto',
      max: 'Máximo',
    },
    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 LangBot',
    spaceDisabledForLocalAccount:
      'Inicia sesión con una cuenta de LangBot 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 una cuenta de LangBot',
    loginToUseModels:
      'Inicia sesión con una cuenta de LangBot 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 una cuenta de LangBot 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',
    },

    ownerMustBindSpace:
      'The Workspace owner must connect a LangBot Account for LangBot Models.',
    usesOwnerSpaceBilling:
      "Uses the Workspace owner's LangBot Account billing and credits.",
  },
  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',
    debugKeyExpires:
      'Rota a las {{time}}; cada Workspace tiene una clave distinta',
    noDebugKey: '(No establecida)',
    debugKeyDisabled:
      'La credencial de depuración no está disponible temporalmente',
    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',
    },
    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: {
      hottest: 'Más populares',
      recentlyAdded: 'Añadidos recientemente',
      recentlyUpdated: 'Actualizados recientemente',
      mostDownloads: 'Más descargas',
      leastDownloads: 'Menos descargas',
    },
    downloads: 'descargas',
    download: 'Descargar',
    like: 'Me gusta',
    unlike: 'Ya no me gusta',
    likeFailed: 'No se pudo actualizar el Me gusta. Inténtalo de nuevo.',
    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',
    },
    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',
    toolCallTimeout: 'Tiempo de espera de herramienta (segundos)',
    toolCallTimeoutDescription:
      'Espera máxima para una llamada de herramienta. Use 0 para no limitar. El valor predeterminado es 300 segundos.',
    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',
    disabledByPolicy: 'desactivado por la política',
    stdioDisabledByPolicy:
      'Stdio MCP está deshabilitado en este despliegue. Use un servidor MCP remoto.',
    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 una cuenta de LangBot',
    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 LangBot 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 LangBot',
    spaceBound: 'Vinculada',
    spaceNotBound: 'No vinculada',
    spaceBoundDescription:
      'Cuenta de LangBot vinculada, API de modelos oficiales y servicios en la nube disponibles',
    bindSpace: 'Vincular cuenta de LangBot',
    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 LangBot',
    bindSpaceWarning:
      'Después de vincular, tu correo de inicio de sesión se cambiará de {{localEmail}} al correo de la cuenta de LangBot.',
    bindSpaceSuccess: 'Cuenta de LangBot vinculada correctamente',
    bindSpaceFailed: 'Error al vincular la cuenta de LangBot',
    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 la cuenta de LangBot no coincide con el correo de la cuenta local',

    space_account_not_registeredTitle: 'Account not registered',
    space_account_not_registered:
      'No local account is registered for this LangBot Account email. Ask the Workspace owner for an invitation.',
    space_account_binding_requiredTitle: 'LangBot Account connection required',
    space_account_binding_required:
      'This local account must connect a LangBot Account from Account settings before using LangBot Account login.',
  },
  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',

      workspace: 'Workspace',
    },
  },
  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.',
    quotaLoadingTooltip:
      'El uso del espacio de trabajo aún se está cargando. Espera antes de crear un recurso.',
    quotaCheckFailed:
      'No se pudo verificar la cuota actual del espacio de trabajo. Inténtalo de nuevo.',
    createDisabledTooltip:
      'Se alcanzó el límite de {{resource}} ({{max}}) de este espacio de trabajo. Elimina uno existente antes de crear otro.',
  },
  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',
    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.',
      waitingForMessage:
        'El Bot está activado. Envíale un mensaje desde tu plataforma de mensajería para continuar.',
      messageReceived:
        'El Bot recibió un mensaje. Puedes continuar al siguiente paso.',
      messageReceivedLocalAccountWarning:
        'La conexión del Bot está configurada correctamente y recibió un mensaje. Como no has iniciado sesión con una cuenta de LangBot, las llamadas al modelo pueden fallar; continúa al siguiente paso para añadir tu propio modelo.',
      pageBotTestPrompt:
        'El Bot de página está activado. Haz clic en la burbuja de chat de la esquina inferior derecha y envía un mensaje para verificar el flujo completo de la conversación.',
      pageBotTestNotice:
        'Solo para pruebas. Inserta el código en una página web externa real.',
      webhookTestPrompt:
        'La URL de devolución de llamada está lista. Configúrala en la plataforma externa y envía un mensaje real al Bot.',
      httpTestPrompt:
        'El Bot HTTP está activado. Envía aquí un mensaje entrante real para verificar la conexión.',
      httpTestDefaultMessage: 'Hola, este es un mensaje de prueba de conexión.',
      sendHttpTest: 'Enviar mensaje de prueba',
      httpTestAccepted:
        'El mensaje de prueba fue aceptado. Aparecerá en el registro en breve.',
      httpTestMissingSecret:
        'Introduce un secreto de firma entrante y guarda primero la configuración.',
      httpTestFailed: 'No se pudo enviar el mensaje de prueba: {{error}}',
      logsTitle: 'Registros del Bot',
      logsDescription:
        'Monitorea la actividad del Bot para verificar que la conexión con la plataforma funcione.',
    },
    aiEngine: {
      title: 'Configura el motor de IA',
      description:
        'Elige el motor de IA que impulsará la inteligencia de tu Bot.',
      optionalDescription:
        'Este paso es opcional. Elige cómo quieres continuar con el Agent actual.',
      externalTitle: 'Conectar un Agent de una plataforma externa',
      externalDescription:
        'Conecta Dify, n8n, Coze u otra plataforma y sustituye el Pipeline del Bot.',
      ownModelTitle: 'Usar mi propio modelo',
      ownModelDescription:
        'Añade un proveedor y luego escanea o introduce manualmente un modelo para completar la configuración.',
      ownModelSetupTitle: 'Añade tu propio modelo',
      ownModelSetupDescription:
        'Añade un proveedor de modelos. Los modelos de chat se detectan automáticamente, o puedes introducir un ID de modelo manualmente.',
      addProviderTitle: 'Añadir proveedor',
      addProviderDescription:
        'Introduce los datos del proveedor y la clave de API usados para conectar y detectar modelos.',
      selectModelTitle: 'Elige un modelo',
      selectScannedModelTitle: 'Elige un modelo',
      selectScannedModelDescription:
        'El modelo seleccionado será el modelo principal de un nuevo Pipeline y el Bot cambiará a él.',
      scanModelMode: 'Detectar modelos',
      manualModelMode: 'Añadir manualmente',
      scanningModels: 'Detectando modelos disponibles…',
      noScannedModels:
        'No se encontraron modelos de chat disponibles. Revisa la configuración del proveedor.',
      scanModelsFailed:
        'No se pudieron detectar los modelos. Revisa la URL y la clave de API e inténtalo de nuevo.',
      manualFallbackFailed:
        'La detección automática falló. Introduce un ID de modelo compatible con el proveedor.',
      manualFallbackEmpty:
        'No se encontraron modelos. Introduce un ID de modelo compatible con el proveedor.',
      manualModelId: 'ID del modelo',
      manualModelIdPlaceholder: 'Por ejemplo: gpt-4o',
      manualModelIdDescription:
        'Introduce el parámetro de modelo utilizado en las solicitudes.',
      manualModelOptions: 'Capacidades opcionales del modelo',
      editProvider: 'Editar proveedor',
      rescanModels: 'Volver a detectar modelos',
      moreFeaturesTitle: 'Añadir más funciones al Agent',
      moreFeaturesDescription:
        'Abre el área de trabajo para añadir herramientas, bases de conocimiento y otras capacidades al Agent que se acaba de generar automáticamente.',
      runnerDescription:
        'Selecciona un Runner para el Agent externo y configura su conexión.',
      backToChoices: 'Volver a las opciones',
      createExternal: 'Crear y vincular',
      finishWithModel: 'Usar el modelo seleccionado y finalizar',
      openWorkbench: 'Abrir área de trabajo',
    },
    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',
    connecting: 'Conectando con el servicio de WeChat...',
    waitingForScan: 'Esperando escaneo',
    retry: 'Reintentar',
  },
  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.',
  },
  qqofficial: {
    createBinding: 'Vinculación QR con un clic para el bot oficial de QQ',
    scanQRCode:
      'Escanea el código QR siguiente con QQ móvil y autoriza la vinculación en «QQ Bot Assistant»',
    waitingForScan: 'Esperando escaneo',
    bindSuccess:
      '¡Vinculación correcta! AppID y Secret se han rellenado automáticamente',
    bindFailed: 'Error en la vinculación',
    connecting: 'Conectando con el servicio de QQ...',
    retry: 'Reintentar',
    tokenNote:
      'El campo Token no es utilizado por el adaptador actual; puedes dejarlo vacío.',
    boundBy: 'Vinculado por el usuario QQ {{openid}}',
  },
  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',
  },

  workspace: {
    title: 'Workspace',
    description: 'Manage members, roles, and invitation links',
    selectTitle: 'Choose a Workspace',
    selectDescription: 'Select where you want to continue in LangBot.',
    selectionLoadFailed:
      'Your Workspaces could not be loaded. Please try again.',
    switchWorkspace: 'Switch Workspace',
    settings: 'Workspace Settings',
    currentPlan: 'Current plan',
    planUnavailable: 'Unavailable',
    upgradePlan: 'Change or upgrade plan',
    ossSingletonDescription:
      'This self-hosted instance has one Workspace and can include multiple users.',
    cloudManagedDescription:
      'This Workspace is hosted by LangBot Cloud. Manage members here; billing opens in Cloud.',
    loadFailed: 'Failed to load Workspace information',
    members: 'Members',
    you: 'You',
    inviteMember: 'Invite a member',
    inviteDescription:
      'Create a one-time link to add another user to this Workspace.',
    emailPlaceholder: 'member@example.com',
    createInvitation: 'Create invitation',
    invitationCreated: 'Invitation created',
    delivery: {
      sent: 'Invitation sent',
      link_only: 'Invitation link created',
      failed: 'Invitation link created, but email could not be sent',
    },
    invitationCreateFailed: 'Failed to create invitation',
    oneTimeLinkWarning: 'Copy this link now. It is shown only once.',
    copyInvitation: 'Copy invitation link',
    invitationCopied: 'Invitation link copied',
    pendingInvitations: 'Pending invitations',
    expiresAt: 'Expires {{date}}',
    revokeInvitation: 'Revoke invitation',
    invitationRevoked: 'Invitation revoked',
    invitationRevokeFailed: 'Failed to revoke invitation',
    acceptInvitation: 'Accept invitation',
    invitedToWorkspace: 'You were invited to {{workspace}}',
    checkingInvitation: 'Checking this invitation...',
    invitationMissing: 'This invitation link is missing required information.',
    invitationExpired: 'This invitation has expired.',
    invitationAlreadyRevoked: 'This invitation was revoked.',
    invitationAlreadyUsed: 'This invitation was already used.',
    invitationInvalid: 'This invitation is invalid or no longer available.',
    invitationAccepted: 'Invitation accepted',
    invitationAcceptFailed: 'Failed to accept invitation',
    invitationEmailMismatch:
      'This invitation belongs to a different email address.',
    existingAccountLoginRequired:
      'An account already exists for this email. Sign in to continue.',
    acceptAsCurrentAccount: 'Accept with current account',
    authenticatedInvitationNotice:
      'Sign out first, then sign in with the invited account. Your invitation will be preserved.',
    logoutAndReturn: 'Sign out and return to this invitation',
    switchAccount: 'Switch account',
    registerAndAccept: 'Create account and accept',
    alreadyHaveAccount: 'I already have an account',
    confirmPassword: 'Confirm password',
    passwordMinimum: 'Password must contain at least 8 characters.',
    passwordMismatch: 'The passwords do not match.',
    backToLogin: 'Back to sign in',
    memberUpdated: 'Member role updated',
    memberUpdateFailed: 'Failed to update member role',
    removeMember: 'Remove member',
    removeMemberConfirm: 'Remove this member from the Workspace?',
    memberRemoved: 'Member removed',
    memberRemoveFailed: 'Failed to remove member',
    transferOwnership: 'Transfer ownership',
    types: {
      personal: 'Personal',
      team: 'Team',
    },
    roles: {
      owner: 'Owner',
      admin: 'Admin',
      developer: 'Developer',
      operator: 'Operator',
      viewer: 'Viewer',
    },
  },
};

export default esES;
