import type { TranslationDictionary } from '@/types/i18n.types';

export const es: TranslationDictionary = {
  common: {
    save: 'Guardar',
    cancel: 'Cancelar',
    delete: 'Eliminar',
    edit: 'Editar',
    create: 'Crear',
    search: 'Buscar',
    filter: 'Filtrar',
    loading: 'Cargando...',
    noResults: 'No se encontraron resultados',
    confirm: 'Confirmar',
    back: 'Atrás',
    next: 'Siguiente',
    previous: 'Anterior',
    close: 'Cerrar',
    retry: 'Reintentar',
    error: 'Error',
    success: 'Éxito',
    warning: 'Advertencia',
    info: 'Información',
    healthy: 'Saludable',
    degraded: 'Degradado',
    unhealthy: 'No saludable',
    up: 'Activo',
    down: 'Inactivo',
    responseTime: 'Tiempo de respuesta',
    unknown: 'Desconocido',
    operational: 'Operativo',
    notAvailable: 'N/D',
    yes: 'Sí',
    no: 'No',
    never: 'Nunca',
    accessDenied: 'No tienes permiso para acceder a esta página.',
    brandName: 'Claw',
    brandVersion: 'Claw v{version}',
    select: 'Seleccionar',
    download: 'Descargar',
    noDataAvailable: 'No hay datos disponibles',
    showingPage: 'Mostrando página {page} de {total}',
  },
  auth: {
    login: 'Iniciar sesión',
    logout: 'Cerrar sesión',
    email: 'Correo electrónico',
    password: 'Contraseña',
    loginTitle: 'Inicia sesión en Claw',
    loginSubtitle: 'Introduce tus credenciales para continuar',
    loginButton: 'Iniciar sesión',
    logoutButton: 'Cerrar sesión',
    sessionExpired: 'Tu sesión ha expirado. Por favor, inicia sesión de nuevo.',
    invalidCredentials: 'Correo o contraseña inválidos',
    welcomeTitle: 'Bienvenido a Claw',
    welcomeSubtitle: 'Plataforma de orquestación de IA',
    passwordPlaceholder: 'Introduce tu contraseña',
    signingIn: 'Iniciando sesión...',
    loginFailed: 'Error al iniciar sesión. Inténtalo de nuevo.',
    tagline: 'Claw - Orquestación de IA local primero',
    authenticating: 'Autenticando...',
    emailPlaceholder: 'you@example.com',
  },
  nav: {
    dashboard: 'Panel',
    chat: 'Chat',
    compareModels: 'Comparar modelos',
    consensusMode: 'Modo consenso',
    escalationChain: 'Cadena de escalada',
    repairLab: 'Laboratorio de reparación',
    decomposeLab: 'Descomponedor de tareas',
    bestOfNLab: 'Generación Best-of-N',
    verifierLab: 'Verificador',
    pipelineLab: 'Laboratorio de pipeline',
    costEnsemble: 'Ensemble por coste',
    rolePackLab: 'Paquete de roles',
    connectors: 'Conectores',
    models: 'Modelos',
    modelCatalog: 'Catálogo de modelos',
    modelLocalFrontier: 'Modelos frontier',
    localModels: 'Modelos locales',
    routing: 'Enrutamiento',
    replayLab: 'Laboratorio de repetición',
    recoveryLab: 'Motor de recuperación',
    adaptiveInsights: 'Insights adaptativos',
    memory: 'Memoria',
    context: 'Paquetes de contexto',
    files: 'Archivos',
    observability: 'Observabilidad',
    audits: 'Registros de auditoría',
    logs: 'Registros',
    admin: 'Administración',
    settings: 'Ajustes',
    workspace: 'Espacio de trabajo',
    workspaceActions: 'Acciones',
    workspaceApprovals: 'Aprobaciones',
    workspaceSyncHealth: 'Estado de sincronización',
    agent: 'Agente',
    agentTerminal: 'Terminal',
    agentRepos: 'Repositorios',
    agentCapabilities: 'Capacidades',
    agentActivity: 'Actividad',
    agentRecipes: 'Recetas',
    agentMarketplace: 'Mercado',
    agentActivityMemory: 'Memoria de Actividad',
    discovery: 'Descubrimiento de modelos',
    workspaceProviders: 'Proveedores',
    workspaceAppConfigs: 'Configuraciones de apps',
    workspaceGmail: 'Gmail',
    workspaceJira: 'Jira',
    workspaceSourceControl: 'Control de versiones',
    workspaceSlack: 'Slack',
    workspaceDocs: 'Documentos',
    workspaceConfluence: 'Confluence',
    workspaceFigma: 'Figma',
    workspaceWorkflows: 'Flujos de trabajo',
    researchProviders: 'Proveedores de investigación',
    researchRuns: 'Ejecuciones de investigación',
    research: 'Investigación',
    workspaceInbox: 'Bandeja de entrada',
    workspaceSemanticSearch: 'Búsqueda semántica',
    workspaceDigest: 'Resumen',
    workspaceAutomationPreferences: 'Preferencias de automatización',
    workspaceEmailSignatures: 'Firmas de correo',
    workspaceEmailTemplates: 'Plantillas de correo',
    workspaceImplHandoffs: 'Entregas de código',
    adminAiActionPolicies: 'Políticas de acciones de IA',
    adminSuggestionRules: 'Reglas de sugerencia',
    adminWebhookDeliveries: 'Entregas de webhook',
  },
  chat: {
    newThread: 'Nuevo chat',
    threads: 'Conversaciones',
    searchThreads: 'Buscar conversaciones...',
    noThreads: 'Aún no hay conversaciones',
    noThreadsDesc: 'Inicia una nueva conversación para comenzar',
    sendMessage: 'Enviar mensaje',
    typeMessage: 'Escribe un mensaje...',
    deleteThread: 'Eliminar conversación',
    deleteThreadConfirm: '¿Seguro que quieres eliminar esta conversación?',
    threadCreated: 'Conversación creada',
    threadCreateFailed: 'Error al crear la conversación',
    threadDeleted: 'Conversación eliminada',
    threadDeleteFailed: 'Error al eliminar la conversación',
    threadUpdateFailed: 'Error al actualizar la conversación',
    messageSendFailed: 'Error al enviar el mensaje',
    feedbackFailed: 'Error al guardar la valoración',
    regenerateFailed: 'Error al regenerar el mensaje',
    aiThinking: 'La IA está pensando...',
    fallbackRetrying: 'Reintentando con alternativa...',
    providerFailed: 'falló',
    tryingProvider: 'probando',
    allProvidersFailed: 'Todos los proveedores fallaron al generar una respuesta',
    imageGeneration: 'Generación de imagen',
    generatedImage: 'Imagen generada',
    downloadImage: 'Descargar imagen',
    fileGeneration: 'Generación de archivo',
    generatingFile: 'Generando archivo...',
    fileGenerationFailed: 'Error en la generación del archivo',
    downloadFile: 'Descargar archivo',
    convertingFile: 'Convirtiendo archivo',
    providerModel: 'Proveedor / Modelo',
    pinThread: 'Fijar conversación',
    unpinThread: 'Desfijar conversación',
    archiveThread: 'Archivar conversación',
    unarchiveThread: 'Desarchivar conversación',
    threadPinned: 'Conversación fijada',
    threadUnpinned: 'Conversación desfijada',
    threadArchived: 'Conversación archivada',
    threadUnarchived: 'Conversación desarchivada',
    pinFailed: 'Error al actualizar el estado de fijado',
    archiveFailed: 'Error al actualizar el estado de archivo',
    showArchived: 'Mostrar archivadas',
    hideArchived: 'Ocultar archivadas',
    provenance: 'Procedencia del mensaje',
    provenanceProvider: 'Proveedor',
    provenanceModel: 'Modelo',
    provenanceLatency: 'Latencia',
    provenanceInputTokens: 'Tokens de entrada',
    provenanceOutputTokens: 'Tokens de salida',
    provenanceEstimatedCost: 'Coste estimado',
    provenanceRoutingMode: 'Modo de enrutamiento',
    provenanceFallbackUsed: 'Alternativa usada',
    provenanceYes: 'Sí',
    provenanceNo: 'No',
    globalSearch: 'Buscar conversaciones',
    globalSearchPlaceholder: 'Buscar en todas las conversaciones...',
    globalSearchNoResults: 'No se encontraron conversaciones',
    systemPrompt: 'Prompt del sistema',
    systemPromptPlaceholder: 'Instrucciones para la IA...',
    temperature: 'Temperatura',
    temperatureDescription: 'Controla la aleatoriedad. Menor = más centrado, mayor = más creativo.',
    maxTokens: 'Tokens máximos',
    maxTokensDescription: 'Longitud máxima de la respuesta de la IA.',
    threadSettings: 'Ajustes de la conversación',
    preferredModel: 'Modelo de IA predeterminado',
    preferredModelDescription:
      'Modelo predeterminado para esta conversación. Se puede anular por mensaje.',
    settingsSaved: 'Ajustes de la conversación guardados',
    helpful: 'Útil',
    notHelpful: 'No útil',
    feedbackSaved: 'Valoración guardada',
    attachFiles: 'Adjuntar archivos',
    noFiles: 'Aún no se han subido archivos',
    selectedFiles: '{count} archivo(s) adjunto(s)',
    contextPacks: 'Paquetes de contexto',
    contextPacksDescription: 'Selecciona paquetes de contexto para incluir en esta conversación.',
    noContextPacks: 'Aún no se han creado paquetes de contexto',
    reRouted: 'Reenrutado',
    reRoutedFrom: 'Reenrutado desde {provider}/{model}',
    weakResponse: 'Respuesta débil detectada',
    qualityScore: 'Calidad: {score}%',
    judgeReferee: 'Juez y árbitro',
    judgeRefereeDescription:
      'Activa la crítica y verificación por IA de las respuestas para mayor precisión.',
    judgeVerified: 'Verificado',
    judgeRevised: 'Revisado',
    judgeEscalated: 'Escalado',
    judgeCriticFeedback: 'Comentarios del crítico',
    judgeReasoning: 'Razonamiento del juez',
    judgeEvaluating: 'Verificando respuesta...',
    judgeModelLabel: 'Modelo del juez',
    judgeModelAuto: 'Auto (qwen3:1.7b)',
    judgeModelDescription: 'Anula el modelo local usado para el veredicto final',
    judgeOpenReview: 'Ver respuesta del juez',
    judgeReviewTitle: 'Revisión del juez',
    judgeReviewDescription:
      'Inspecciona la respuesta original, la decisión del juez y la respuesta generada por el juez.',
    judgeDecisionLabel: 'Decisión',
    judgeConfidenceLabel: 'Confianza',
    judgeSummary: 'Resumen del juez',
    judgeResponse: 'Respuesta del juez',
    judgeOriginalAnswer: 'Respuesta original',
    judgeRevisedAnswer: 'Respuesta revisada',
    judgeEscalatedAnswer: 'Respuesta escalada',
    judgeExecutionModel: 'Modelo de ejecución',
    judgeJudgeModel: 'Modelo del juez',
    judgeCriticModel: 'Modelo del crítico',
    judgeCriticScore: 'Puntuación del crítico',
    judgeJudgeLatency: 'Latencia del juez',
    judgeTotalLatency: 'Latencia total de revisión',
    judgeRecommendedChanges: 'Cambios recomendados',
    judgeNoCriticFeedback: 'No se registraron comentarios del crítico para esta revisión.',
    judgeResponseTypeSummary: 'Resumen',
    judgeResponseTypeRevisedAnswer: 'Respuesta revisada',
    judgeResponseTypeEscalatedAnswer: 'Respuesta escalada',
    judgeResponseTypeVerificationNote: 'Nota de verificación',
    qualityThreshold: 'Umbral de calidad',
    qualityThresholdDescription:
      'Puntuación mínima de calidad antes de reenrutar (0 = aceptar todo, 1 = muy estricto)',
    maxReRouteAttempts: 'Intentos máximos de reenrutamiento',
    maxReRouteAttemptsDescription: 'Número máximo de intentos de reenrutamiento por mensaje (0-5)',
    reRouteReasonShort: 'Demasiado corto',
    reRouteReasonRefusal: 'Rechazo detectado',
    reRouteReasonRepetition: 'Repetición excesiva',
    reRouteReasonEcho: 'Eco del prompt',
    reRouteReasonLowWords: 'Muy pocas palabras',
    backToThreads: 'Volver a conversaciones',
    loadingThread: 'Cargando conversación...',
    selectOrStartTitle: 'Selecciona una conversación o inicia un nuevo chat',
    selectOrStartDesc:
      'Elige una conversación existente de la barra lateral o crea una nueva para interactuar con tus modelos de IA configurados.',
    untitled: 'Sin título',
    attachedFile: 'Archivo adjunto',
    beginningOfConversation: 'Inicio de la conversación',
    composerPlaceholder: 'Escribe tu mensaje...',
    currentAiProgress: 'Progreso actual de la IA',
    fileGenerationCancelled: 'Generación de archivo cancelada',
    fileGenerationFailedRetry: 'Error al generar el archivo. ¿Reintentar?',
    generationCancelled: 'Generación cancelada',
    imageGenerationFailedRetry: 'Error al generar la imagen. ¿Reintentar?',
    judge: 'Juez',
    live: 'En vivo',
    loadingImage: 'Cargando imagen...',
    loadingMessages: 'Cargando mensajes...',
    loadingMoreThreads: 'Cargando más conversaciones...',
    loadingOlderMessages: 'Cargando mensajes anteriores...',
    loadingThreads: 'Cargando conversaciones...',
    manyMemories: '{count} memorias',
    modelThinking: 'El modelo está pensando...',
    noMatchingThreads: 'No hay conversaciones coincidentes',
    noMessagesYet: 'Aún no hay mensajes',
    noVisibleAnswer: 'No hay respuesta visible',
    oneMemory: '1 memoria',
    open: 'Abrir',
    preparingDownload: 'Preparando descarga...',
    regenerate: 'Regenerar',
    searching: 'Buscando...',
    threadActions: 'Acciones de la conversación',
    toggleProvenance: 'Alternar procedencia',
    tryAnotherModel: 'Probar otro modelo',
    tryingFallback: 'Probando alternativa...',
    verifyingWith: 'Verificando con {model}',
    visibleAiProgress: 'Progreso visible de la IA',
    useMemoryLabel: 'Usar memoria en esta conversación',
    useMemoryDescription: 'Cuando está desactivado, no se inyectan memorias en el prompt.',
    useContextLabel: 'Usar paquetes de contexto en esta conversación',
    useContextDescription: 'Cuando está desactivado, los paquetes adjuntos se ignoran.',
  },
  receipt: {
    openLabel: 'Mostrar lo que usó la IA',
    contextUsed: 'Contexto usado',
    dialogTitle: 'Por qué esta respuesta',
    dialogDescription: 'Memorias y elementos de paquete que influyeron en esta respuesta.',
    loading: 'Cargando recibo...',
    notAvailable: 'No hay recibo disponible para este mensaje.',
    memoriesCount: '{value} memorias',
    packItemsCount: '{value} elementos de paquete',
    tokenBudget: 'Tokens: {used} / {total}',
    memoriesHeading: 'Memorias',
    packItemsHeading: 'Elementos del paquete',
    warningsHeading: 'Advertencias',
    scoreLabel: 'puntuación {value}',
    pinnedBadge: 'fijado',
    redactedPlaceholder: '(redactado — contenido oculto)',
  },
  preview: {
    openLabel: 'Vista previa del contexto',
    dialogTitle: 'Lo que vería la IA',
    dialogDescription:
      'Simulación de la recuperación de memoria y paquetes de contexto para el borrador actual.',
    loading: 'Generando vista previa...',
    failed: 'La vista previa falló; el próximo envío seguirá funcionando.',
    empty: 'No se inyectará contexto para este borrador.',
    memoryCount: '{value} memorias',
    packCount: '{value} elementos de paquete',
    tokenBudget: 'Tokens: {used} / {total}',
    memoriesHeading: 'Memorias',
    packItemsHeading: 'Elementos del paquete',
    redactedPlaceholder: '(redactado — contenido oculto)',
  },
  connectors: {
    title: 'Conectores',
    description: 'Gestiona tus conexiones de proveedores de IA',
    createConnector: 'Crear conector',
    editConnector: 'Editar conector',
    deleteConnector: 'Eliminar conector',
    testConnection: 'Probar conexión',
    testingConnection: 'Probando...',
    syncModels: 'Sincronizar modelos',
    name: 'Nombre',
    nameHelp: 'Un nombre amigable para identificar este conector en tu panel.',
    provider: 'Proveedor',
    providerHelp: 'El proveedor de IA con el que se comunicará este conector.',
    authType: 'Tipo de autenticación',
    authTypeHelp: 'Cómo autenticarse con el proveedor. La mayoría usa API Key.',
    apiKey: 'Clave API',
    apiKeyHelp: 'Tu clave API secreta del proveedor. Se cifrará en reposo.',
    baseUrl: 'URL base',
    baseUrlHelp: 'Anula el endpoint API por defecto. Déjalo en blanco para usar el predeterminado.',
    region: 'Región',
    regionHelp: 'La región de AWS donde está desplegado tu endpoint de Bedrock.',
    status: 'Estado',
    healthy: 'Saludable',
    degraded: 'Degradado',
    error: 'Error',
    noConnectors: 'No hay conectores configurados',
    noConnectorsDesc: 'Añade un conector para empezar a usar proveedores de IA',
    connectorCreated: 'Conector creado',
    connectorCreateFailed: 'Error al crear el conector',
    connectorUpdated: 'Conector actualizado',
    connectorUpdateFailed: 'Error al actualizar el conector',
    connectorDeleted: 'Conector eliminado',
    connectorDeleteFailed: 'Error al eliminar el conector',
    testSuccessful: 'Prueba de conexión exitosa',
    testFailed: 'Prueba de conexión fallida',
    modelsSynced: 'Modelos sincronizados correctamente',
    syncFailed: 'Error al sincronizar los modelos',
    testBeforeCreate: 'Guarda el conector primero, luego pruébalo desde la lista.',
    loadingConnectors: 'Cargando conectores...',
    loadingConnector: 'Cargando conector...',
    addConnector: 'Añadir conector',
    loadFailed: 'Error al cargar los conectores.',
    connectorDetail: 'Detalle del conector',
    connectorNotFound: 'Conector no encontrado',
    backToConnectors: 'Volver a conectores',
    syncing: 'Sincronizando...',
    enabled: 'Activado',
    disabled: 'Desactivado',
    configuration: 'Configuración',
    healthHistory: 'Historial de estado',
    healthHistoryDesc:
      'El seguimiento del historial de estado estará disponible en una futura actualización.',
    models: 'Modelos',
    oneModel: '{count} modelo',
    manyModels: '{count} modelos',
    updatedAt: 'Actualizado {date}',
    addConnectorDesc: 'Añadir un nuevo conector de proveedor de IA',
    apiKeyPlaceholder: 'Ingresa la API Key',
    apiKeyPlaceholderEdit: 'Dejar en blanco para mantener la existente',
    baseUrlOptional: 'URL base (opcional)',
    baseUrlPlaceholder: 'https://api.example.com',
    defaultLabel: 'Predeterminado',
    editConnectorDesc: 'Actualizar la configuración del conector',
    namePlaceholder: 'p. ej., OpenAI Production',
    regionPlaceholder: 'p. ej., us-east-1',
    saveFirstThenTest: 'Guarda el conector primero, luego pruébalo',
    selectProvider: 'Selecciona un proveedor',
  },
  memory: {
    title: 'Memoria',
    description: 'Gestiona los registros de memoria de la IA',
    createMemory: 'Crear memoria',
    editMemory: 'Editar memoria',
    deleteMemory: 'Eliminar memoria',
    type: 'Tipo',
    content: 'Contenido',
    enabled: 'Activada',
    disabled: 'Desactivada',
    noMemories: 'No hay registros de memoria',
    noMemoriesDesc: 'Crea registros de memoria para dar contexto a la IA',
    memoryCreated: 'Memoria creada',
    memoryCreateFailed: 'Error al crear la memoria',
    memoryUpdated: 'Memoria actualizada',
    memoryUpdateFailed: 'Error al actualizar la memoria',
    memoryDeleted: 'Memoria eliminada',
    memoryDeleteFailed: 'Error al eliminar la memoria',
    memoryToggled: 'Memoria alternada',
    memoryToggleFailed: 'Error al alternar la memoria',
    loadFailed: 'Error al cargar los registros de memoria.',
    loadingMemories: 'Cargando registros de memoria...',
    addMemory: 'Añadir memoria',
    contentPlaceholder: 'Ingresa el contenido de la memoria...',
    createMemoryDesc: 'Crear una nueva entrada de memoria',
    editMemoryDesc: 'Actualizar los detalles de la memoria',
    source: 'Fuente',
    typeSummary: 'Resumen',
    typeFact: 'Hecho',
    typePreference: 'Preferencia',
    typeInstruction: 'Instrucción',
    filterAllTypes: 'Todos los tipos',
    tabSaved: 'Guardadas',
    tabSuggestions: 'Sugerencias',
    tabAudit: 'Auditoría',
    searchPlaceholder: 'Buscar memorias...',
    filterAllScopes: 'Todos los ámbitos',
    filterAllSources: 'Todas las fuentes',
    filterAllSensitivities: 'Todas las sensibilidades',
    scopeUser: 'Personal',
    scopeThread: 'Esta conversación',
    scopeWorkspace: 'Espacio de trabajo',
    scopeProject: 'Proyecto',
    sourceUserManual: 'Creada manualmente',
    sourceAiExtracted: 'Extraída del chat',
    sourceAutomation: 'Aprendida por automatización',
    sourceImported: 'Importada',
    sensitivityNormal: 'Normal',
    sensitivitySensitive: 'Sensible',
    sensitivityRedacted: 'Redactada',
    loadingSuggestions: 'Cargando sugerencias...',
    loadingAudit: 'Cargando auditoría...',
    noSuggestions: 'No hay sugerencias en este momento',
    noAudit: 'Aún no hay entradas de auditoría',
    auditNoMemoryId: '(memoria eliminada)',
    approveSuggestion: 'Aprobar',
    rejectSuggestion: 'Rechazar',
    rejectAndSuppress: 'Rechazar y silenciar similares',
    suggestionConfidence: 'Confianza: {value}%',
    suggestionReason: 'Razón: {value}',
  },
  files: {
    title: 'Archivos',
    description: 'Sube y gestiona archivos para el contexto de la IA',
    uploadFile: 'Subir archivo',
    deleteFile: 'Eliminar archivo',
    dragDrop: 'Arrastra y suelta archivos aquí, o haz clic para explorar',
    maxSize: 'Tamaño máximo de archivo: 50MB',
    noFiles: 'No hay archivos subidos',
    noFilesDesc: 'Sube archivos para usarlos como contexto de la IA',
    fileUploaded: 'Archivo subido',
    fileUploadFailed: 'Error al subir el archivo',
    fileDeleted: 'Archivo eliminado',
    fileDeleteFailed: 'Error al eliminar el archivo',
    uploadFailed: 'Error al subir el archivo',
    loadFailed: 'Error al cargar los archivos.',
    loadingFiles: 'Cargando archivos...',
    allTypesAccepted: 'Se aceptan todos los tipos de archivo',
    chunkIndex: 'Fragmento #{index}',
    chunksTitle: 'Fragmentos del archivo',
    dropFileHere: 'Suelta el archivo aquí',
    dropOrClick: 'Suelta el archivo aquí o haz clic para buscar',
    fileFallback: 'Archivo',
    noChunks: 'No hay fragmentos disponibles',
    uploading: 'Subiendo...',
    uploadNewFile: 'Subir un nuevo archivo',
    viewChunks: 'Ver fragmentos',
    statusPending: 'Pendiente',
    statusProcessing: 'Procesando',
    statusCompleted: 'Completado',
    statusFailed: 'Fallido',
  },
  context: {
    title: 'Paquetes de contexto',
    description: 'Organiza el contexto para las conversaciones de IA',
    createPack: 'Crear paquete de contexto',
    addItem: 'Añadir elemento',
    name: 'Nombre',
    scope: 'Ámbito',
    noContextPacks: 'No hay paquetes de contexto',
    noContextPacksDesc: 'Crea paquetes de contexto para organizar el contexto de la IA',
    packCreated: 'Paquete de contexto creado',
    packCreateFailed: 'Error al crear el paquete de contexto',
    packUpdated: 'Paquete de contexto actualizado',
    packUpdateFailed: 'Error al actualizar el paquete de contexto',
    packDeleted: 'Paquete de contexto eliminado',
    packDeleteFailed: 'Error al eliminar el paquete de contexto',
    itemAdded: 'Elemento añadido al paquete de contexto',
    itemAddFailed: 'Error al añadir el elemento',
    itemUpdated: 'Elemento del paquete actualizado',
    itemUpdateFailed: 'Error al actualizar el elemento',
    itemRemoved: 'Elemento eliminado del paquete de contexto',
    itemRemoveFailed: 'Error al eliminar el elemento',
    loadFailed: 'Error al cargar los paquetes de contexto.',
    contextPack: 'Paquete de contexto',
    packDetailsDesc: 'Detalles del paquete y elementos',
    backToPacks: 'Volver a paquetes',
    deletePack: 'Eliminar paquete',
    deleting: 'Eliminando...',
    loadingPackDetails: 'Cargando detalles del paquete...',
    noItems: 'No hay elementos en este paquete',
    noItemsDesc:
      'Añade notas de texto, instrucciones o referencias a archivos en este paquete de contexto.',
    loadingContextPacks: 'Cargando paquetes de contexto...',
    addItemDesc:
      'Añade una nota de texto, instrucción o referencia a archivo a este paquete de contexto.',
    adding: 'Añadiendo...',
    content: 'Contenido',
    contentPlaceholder: 'Introduce el contenido...',
    fileId: 'ID de archivo',
    fileIdPlaceholder: 'Introduce el ID del archivo',
    itemType: 'Tipo',
    selectType: 'Selecciona un tipo',
    createPackDesc: 'Crear un nuevo paquete de contexto',
    creating: 'Creando...',
    descriptionOptional: 'Descripción (opcional)',
    descriptionPlaceholder: 'Describe para qué sirve este paquete',
    namePlaceholder: 'p. ej., Contexto del Proyecto Alpha',
    scopeOptional: 'Alcance (opcional)',
    scopePlaceholder: 'p. ej., global, proyecto, usuario',
    typeNote: 'Nota',
    typeInstruction: 'Instrucción',
    typeFileReference: 'Referencia de archivo',
  },
  routing: {
    title: 'Políticas de enrutamiento',
    description: 'Configura el enrutamiento de modelos de IA',
    createPolicy: 'Crear política',
    editPolicy: 'Editar política',
    deletePolicy: 'Eliminar política',
    name: 'Nombre',
    mode: 'Modo de enrutamiento',
    priority: 'Prioridad',
    active: 'Activa',
    noPolicies: 'No hay políticas de enrutamiento',
    noPoliciesDesc: 'Crea políticas de enrutamiento para controlar la selección de modelos',
    policyCreated: 'Política creada',
    policyCreateFailed: 'Error al crear la política',
    policyUpdated: 'Política actualizada',
    policyUpdateFailed: 'Error al actualizar la política',
    policyDeleted: 'Política eliminada',
    policyDeleteFailed: 'Error al eliminar la política',
    status: 'Estado',
    inactive: 'Inactiva',
    activate: 'Activar',
    deactivate: 'Desactivar',
    loadFailed: 'Error al cargar la configuración de enrutamiento.',
    defaultRoutingMode: 'Modo de enrutamiento predeterminado',
    defaultRoutingModeDesc:
      'Elige cómo el enrutador local distribuye las solicitudes entre modelos',
    defaultMode: 'Modo predeterminado',
    fallbackSettings: 'Ajustes de alternativa',
    fallbackSettingsDesc: 'Configura el comportamiento de reintento y tiempo de espera',
    maxRetries: 'Reintentos máximos',
    timeoutMs: 'Tiempo de espera (ms)',
    loadingPolicies: 'Cargando políticas...',
    noPoliciesConfigured: 'No hay políticas de enrutamiento configuradas.',
    complexityLabel: 'Complejidad',
    complexitySimple: 'Simple',
    complexityMedium: 'Media',
    complexityComplex: 'Compleja',
    complexityExpert: 'Experta',
    routingExplanation: 'Explicación de enrutamiento',
    explanationSummary: 'Resumen de la decisión',
    explanationFactors: 'Factores de la decisión',
    routingDurationMs: 'Duración del enrutamiento',
    modalityLabel: 'Modalidad detectada',
    modalityText: 'Texto',
    modalityCode: 'Código',
    modalityImageInput: 'Comprensión de imagen',
    modalityImageOutput: 'Generación de imagen',
    modalityAudioInput: 'Audio / Voz',
    modalityVideoInput: 'Análisis de vídeo',
    modalityPdfInput: 'Documento / PDF',
    modalityWebSearch: 'Búsqueda web',
    modalityToolCalling: 'Llamada a herramientas',
    modalityStructuredOutput: 'Salida estructurada',
    modalityOcr: 'OCR / Extracción de texto',
    modalityReasoning: 'Razonamiento profundo',
    namePlaceholder: 'Mi política de enrutamiento',
    selectModePlaceholder: 'Selecciona el modo de enrutamiento',
    editPolicyDesc: 'Actualiza la configuración de la política de enrutamiento.',
    createPolicyDesc:
      'Crea una nueva política de enrutamiento para controlar la distribución de solicitudes.',
    weightsJsonLabel: 'Pesos de puntuación (JSON, opcional)',
    weightsJsonPlaceholder: '{"capability": 0.2, "domain": 0.1, ...}',
    weightsJsonHelp:
      'Opcional. Sobrescribe los pesos predeterminados por modo. Debe incluir las 14 dimensiones y sumar 1,0.',
    weightsJsonError: {
      invalidJson: 'El JSON de pesos no es JSON válido.',
      notAnObject: 'Los pesos deben ser un objeto JSON.',
      missingDimension: 'El JSON de pesos debe incluir cada dimensión como número.',
      sumNotOne: 'Los pesos deben sumar 1,0 (±0,001).',
    },
    models: {
      title: 'Registro de modelos',
      description:
        'Explora todos los modelos que conoce el enrutador. Anula coste, ciclo de vida o banderas de enrutamiento.',
      updateSucceeded: 'Modelo actualizado.',
      updateFailed: 'No se pudo actualizar el modelo.',
      overrideCleared: 'Anulación eliminada.',
      overrideClearFailed: 'No se pudo eliminar la anulación.',
      softDeleteSucceeded: 'Modelo marcado como eliminado.',
      softDeleteFailed: 'No se pudo eliminar el modelo.',
      columnProvider: 'Proveedor',
      columnModelKey: 'Modelo',
      columnLifecycle: 'Ciclo de vida',
      columnQuality: 'Calidad',
      columnCost: 'Coste',
      columnLatency: 'Latencia',
      filterByProvider: 'Filtrar por proveedor',
      filterByLifecycle: 'Filtrar por ciclo de vida',
    },
  },
  models: {
    title: 'Modelos',
    description: 'Ver todos los modelos de IA disponibles',
    localTitle: 'Modelos locales',
    localDescription: 'Gestiona los modelos de IA instalados localmente',
    pullModel: 'Descargar modelo',
    assignRole: 'Asignar rol',
    noModels: 'No hay modelos disponibles',
    noModelsDesc: 'Conecta un proveedor o descarga modelos locales',
    modelPullStarted: 'Descarga de modelo iniciada',
    modelPullFailed: 'Error al descargar el modelo',
    roleAssigned: 'Rol asignado',
    roleAssignFailed: 'Error al asignar el rol',
    loadFailed: 'Error al cargar los modelos.',
    loadingModels: 'Cargando modelos...',
    allProviders: 'Todos los proveedores',
    allLifecycle: 'Todos los ciclos de vida',
    noModelsMatch: 'Ningún modelo coincide con los filtros actuales.',
    localLoadFailed: 'Error al cargar los modelos locales.',
    runtimeHealth: 'Estado del runtime',
    runtimeHealthDesc: 'Estado actual del runtime de modelos locales',
    pullModelDesc: 'Descarga un nuevo modelo del registro',
    modelName: 'Nombre del modelo',
    runtime: 'Runtime',
    pulling: 'Descargando...',
    pull: 'Descargar',
    installedModels: 'Modelos instalados',
    loadingLocalModels: 'Cargando modelos locales...',
    noLocalModels: 'No hay modelos locales instalados',
    noLocalModelsDesc:
      'Descarga un modelo usando el formulario anterior para empezar con la inferencia local.',
    colModel: 'Modelo',
    colRuntime: 'Runtime',
    colSize: 'Tamaño',
    colFamily: 'Familia',
    colParameters: 'Parámetros',
    colRoles: 'Roles',
    noneRole: 'Ninguno',
    modelNamePlaceholder: 'llama3:8b',
    capabilities: 'Capacidades',
    context: 'Contexto',
    lifecycle: 'Ciclo de vida',
    noSyncedModels: 'No hay modelos sincronizados',
    streaming: 'Transmisión',
    tools: 'Herramientas',
    vision: 'Visión',
  },
  observability: {
    title: 'Observabilidad',
    description: 'Monitoriza el uso y rendimiento de la IA',
    totalRequests: 'Solicitudes totales',
    totalCost: 'Coste total',
    avgLatency: 'Latencia media',
    activeModels: 'Modelos activos',
    clientLogs: 'Registros del cliente',
    serverLogs: 'Registros del servidor',
    auditTrail: 'Rastro de auditoría',
    loadingData: 'Cargando datos de observabilidad...',
    failedToLoad: 'Error al cargar los datos',
    failedToLoadDesc:
      'No se pudieron obtener los datos de observabilidad. Inténtalo de nuevo más tarde.',
    noDataYet: 'Aún no hay datos de observabilidad',
    noDataDesc:
      'Las métricas y datos de rendimiento aparecerán aquí cuando las solicitudes comiencen a fluir por la capa de orquestación.',
    fullDescription:
      'Monitoriza el estado del sistema, latencias de solicitudes y rendimiento de modelos',
    totalRequestsLabel: 'Solicitudes totales',
    acrossProviders: 'En todos los proveedores',
    estimatedCost: 'Coste estimado',
    estimatedCostLabel: 'Coste estimado',
    recentFailures: 'Fallos recientes',
    highCriticalSeverity: 'Eventos de severidad ALTA + CRÍTICA',
    providerUsage: 'Uso por proveedor',
    modelUsage: 'Uso por modelo',
    latencyBreakdown: 'Desglose de latencia',
    costSummary: 'Resumen de coste',
    avg: 'Media',
    p50Median: 'P50 (Mediana)',
    p95: 'P95',
    totalTokens: 'Tokens totales',
    requests: 'solicitudes',
    tokens: 'tokens',
    noData: 'No hay datos',
  },
  audits: {
    title: 'Registros de auditoría',
    description: 'Ver los registros de actividad del sistema',
    action: 'Acción',
    severity: 'Severidad',
    entity: 'Entidad',
    timestamp: 'Marca de tiempo',
    noAudits: 'No hay registros de auditoría',
    noAuditsDesc: 'La actividad aparecerá aquí mientras uses la plataforma',
    actor: 'Actor',
    details: 'Detalles',
    loadingAudits: 'Cargando registros de auditoría...',
    loadFailed: 'Error al cargar las auditorías',
    loadFailedDesc:
      'No se pudieron obtener los registros de auditoría. Inténtalo de nuevo más tarde.',
    noMatchingAudits: 'Ningún registro de auditoría coincide con tus filtros.',
    allActions: 'Todas las acciones',
    allSeverities: 'Todas las severidades',
    searchPlaceholder: 'Buscar...',
    ipAddress: 'Dirección IP',
  },
  admin: {
    title: 'Administración',
    description: 'Gestiona usuarios y ajustes del sistema',
    users: 'Usuarios',
    createUser: 'Crear usuario',
    changeRole: 'Cambiar rol',
    deactivate: 'Desactivar',
    reactivate: 'Reactivar',
    noUsers: 'No se encontraron usuarios',
    checkingServices: 'Comprobando servicios...',
    healthUnreachable: 'No se puede contactar con el servicio de estado.',
    loadingUsers: 'Cargando usuarios...',
    loadUsersFailed: 'Error al cargar los usuarios',
    loadUsersFailedDesc: 'No se pudo obtener la lista de usuarios. Inténtalo de nuevo más tarde.',
    userRoleUpdated: 'Rol de usuario actualizado',
    userRoleUpdateFailed: 'Error al actualizar el rol del usuario',
    userDeactivated: 'Usuario desactivado',
    userDeactivateFailed: 'Error al desactivar el usuario',
    userStats: 'Estadísticas de usuarios',
    userStatsDesc: 'Resumen de usuarios de la plataforma',
    totalUsers: 'Usuarios totales',
    activeUsers: 'Usuarios activos',
    platformHealth: 'Estado de la plataforma',
    systemStatusOverview: 'Resumen del estado del sistema',
    userManagement: 'Gestión de usuarios',
    colUsername: 'Nombre de usuario',
    colEmail: 'Correo electrónico',
    colRole: 'Rol',
    colStatus: 'Estado',
    colJoined: 'Registrado',
    colActions: 'Acciones',
    roleAdmin: 'Administrador',
    roleOperator: 'Operador',
    roleViewer: 'Visualizador',
  },
  settings: {
    title: 'Ajustes',
    description: 'Gestiona los ajustes de tu cuenta',
    profile: 'Perfil',
    profileDescription: 'Tu información personal. Estos campos son de solo lectura.',
    username: 'Nombre de usuario',
    email: 'Correo electrónico',
    emailReadOnly: 'Contacta con un administrador para cambiar tu correo.',
    role: 'Rol',
    selectLanguage: 'Seleccionar idioma',
    preferences: 'Preferencias',
    language: 'Idioma',
    languageDescription: 'Selecciona tu idioma de visualización preferido',
    appearance: 'Apariencia',
    appearanceDescription: 'Elige cómo se ve la aplicación',
    system: 'Sistema',
    light: 'Claro',
    dark: 'Oscuro',
    theme: 'Tema',
    changePassword: 'Cambiar contraseña',
    currentPassword: 'Contraseña actual',
    newPassword: 'Nueva contraseña',
    confirmPassword: 'Confirmar contraseña',
    passwordChanged: 'Contraseña cambiada correctamente',
    passwordChangeFailed: 'Error al cambiar la contraseña',
    passwordRequirements:
      'La contraseña debe tener al menos 8 caracteres, con mayúsculas, minúsculas y un número',
    preferencesUpdated: 'Preferencias actualizadas correctamente',
    preferencesUpdateFailed: 'Error al actualizar las preferencias',
    devices: {
      title: 'Dispositivos',
      description: 'Gestiona los agentes de escritorio vinculados a tu cuenta.',
      emptyTitle: 'No hay dispositivos vinculados',
      emptyBody: 'Ejecuta `claw-agent login` en tu máquina para vincular un dispositivo.',
      revoke: 'Revocar',
      rename: 'Renombrar',
      scopesHeading: 'Permisos',
      revokedBanner: 'Este dispositivo ha sido revocado',
    },
    langEnglish: 'Inglés',
    langArabic: 'Árabe',
    langFrench: 'Francés',
    langItalian: 'Italiano',
    langGerman: 'Alemán',
    langSpanish: 'Español',
    langRussian: 'Ruso',
    langPortuguese: 'Portugués',
    langHindi: 'Hindi',
    appearanceSystem: 'Sistema',
    appearanceLight: 'Claro',
    appearanceDark: 'Oscuro',
  },
  dashboard: {
    title: 'Panel',
    description: 'Resumen de tu plataforma de IA',
    quickActions: 'Acciones rápidas',
    recentActivity: 'Actividad reciente',
    totalThreads: 'Conversaciones totales',
    activeConnectors: 'Conectores activos',
    localModels: 'Modelos locales',
    systemHealth: 'Estado del sistema',
    startNewChat: 'Iniciar un nuevo chat',
    addConnector: 'Añadir conector',
    configureRouting: 'Configurar enrutamiento',
    serviceStatus: 'Estado del servicio',
    checkingHealth: 'Comprobando el estado de los servicios...',
    healthUnreachable:
      'No se pudo contactar con el agregador de estado. Verifica que el servicio de estado esté en ejecución.',
    servicesOperational: '{up} de {total} servicios operativos',
    responseTimeMs: '{ms}ms',
    unreachable: 'inaccesible',
    newChatLabel: 'Nuevo chat',
    newChatDesc: 'Inicia una nueva conversación',
    manageConnectorsLabel: 'Gestionar conectores',
    manageConnectorsDesc: 'Configura los conectores de proveedores de IA',
    routingSettingsLabel: 'Configuración de enrutamiento',
    routingSettingsDesc: 'Configura cómo se enrutan las solicitudes',
  },
  catalog: {
    title: 'Catálogo de modelos',
    description: 'Explora y descarga modelos de IA',
    searchPlaceholder: 'Buscar modelos...',
    allCategories: 'Todo',
    coding: 'Programación',
    fileGeneration: 'Generación de archivos',
    imageGeneration: 'Generación de imagen',
    routing: 'Enrutamiento',
    reasoning: 'Razonamiento',
    thinking: 'Pensamiento y búsqueda',
    download: 'Descargar',
    downloading: 'Descargando...',
    installed: 'Instalado',
    failed: 'Fallido',
    unavailable: 'No disponible',
    cloudOnly: 'Solo nube',
    cancel: 'Cancelar',
    recommended: 'Recomendado',
    noModels: 'No se encontraron modelos',
    activeDownloads: 'Descargas activas',
    parameterCount: 'Parámetros',
    modelSize: 'Tamaño',
    capabilities: 'Capacidades',
    models: 'modelos',
    scrollForMore: 'Desplázate para ver más',
    allLoaded: 'Todos los modelos cargados',
    searchBrowserHelpers: 'Ayudantes de búsqueda/navegador',
    searchBrowserScoreLabel: 'Ayudante',
    searchBrowserScoreTooltip:
      'Idoneidad para flujos de ayudante de búsqueda y navegador (puntuación basada en metadatos, 0.00–1.00)',
    cancelDownloadFailed: 'Error al cancelar la descarga',
    downloadCancelled: 'Descarga cancelada',
    downloadStarted: 'Descarga iniciada',
    downloadStartFailed: 'Error al iniciar la descarga',
    modelRemoved: 'Modelo eliminado',
    modelRemoveFailed: 'Error al eliminar el modelo',
  },
  replay: {
    title: 'Laboratorio de repetición de enrutamiento',
    description:
      'Re-ejecuta decisiones de enrutamiento históricas contra el enrutador actual y compara resultados',
    runReplay: 'Ejecutar repetición',
    running: 'Ejecutando repetición...',
    totalReplayed: 'Total repetidas',
    changed: 'Cambiadas',
    unchanged: 'Sin cambios',
    oldRoute: 'Ruta original',
    newRoute: 'Nueva ruta',
    improvement: 'Mejora',
    noResults: 'Aún no hay resultados de repetición',
    confidenceOld: 'Confianza media (antigua)',
    confidenceNew: 'Confianza media (nueva)',
    replayComplete: 'Repetición de enrutamiento completada',
    replayFailed: 'Error al ejecutar la repetición de enrutamiento',
    saveRun: 'Guardar ejecución',
    runName: 'Nombre de la ejecución',
    runNamePlaceholder: 'p. ej. baseline-2026-04',
    threadIdFilter: 'ID de conversación',
    threadIdPlaceholder: 'Filtrar por conversación...',
    startDate: 'Fecha de inicio',
    endDate: 'Fecha de fin',
    suspicious: 'Sospechosas',
    avgImprovement: 'Mejora media',
    needsReview: 'Necesita revisión',
    noSuspiciousCases: 'No se detectaron casos sospechosos',
    noSuspiciousCasesDesc: 'Todos los resultados de la repetición se ven limpios',
    confirmedRegression: 'Regresión confirmada',
    markConfirmedRegression: 'Marcar como regresión',
    caseReviewed: 'Caso revisado correctamente',
    caseReviewFailed: 'Error al revisar el caso',
    copyBundle: 'Copiar paquete de exportación',
    bundleCopied: 'Paquete de exportación copiado al portapapeles',
    exportFailed: 'Error al exportar el paquete',
    runsHistory: 'Historial de ejecuciones',
    noRunsHistory: 'Aún no hay ejecuciones guardadas',
    noRunsHistoryDesc:
      'Activa "Guardar ejecución" al ejecutar una repetición para seguir el historial',
    runResults: 'Resultados',
    correct_improvement: 'Mejora',
    bad_regression: 'Regresión',
    cost_win: 'Ahorro de coste',
    quality_win: 'Mejora de calidad',
    uncertain: 'Incierto',
    badRegression: 'Regresiones',
    noOriginalContent: 'No hay prompt original almacenado',
    promoteCase: 'Promover a test',
    promoted: 'Caso promovido a fixture de test',
    promoteFailed: 'Error al promover el caso',
    compareRuns: 'Comparar ejecuciones',
    compareRunsTitle: 'Comparación de ejecuciones',
    compareRunsDesc: 'Selecciona dos ejecuciones para comparar decisiones de enrutamiento',
    selectRunToCompare: 'Selecciona una ejecución para comparar',
    runA: 'Ejecución A',
    runB: 'Ejecución B',
    improved: 'Mejorada',
    regressed: 'Regresó',
    suspiciousReasons: {
      empty_message_content: 'Falta el prompt original',
      large_confidence_drop: 'Gran caída de confianza',
      large_cost_increase: 'Gran aumento de coste',
      route_changed_with_negative_improvement: 'Ruta cambiada con impacto negativo',
    },
  },
  compare: {
    title: 'Comparar modelos',
    description:
      'Selecciona 2-5 modelos e introduce un prompt para comparar respuestas lado a lado',
    selectModels: 'Seleccionar modelos',
    minModels: 'Selecciona al menos {min} modelos',
    maxModels: 'Máximo {max} modelos permitidos',
    sendPrompt: 'Comparar modelos',
    comparing: 'Comparando...',
    compareFailed: 'Error al comparar modelos',
    results: 'Resultados',
    fastest: 'Más rápido',
    completed: 'Completado',
    failed: 'Fallido',
    latency: 'Latencia',
    tokens: 'Tokens',
    noResults: 'Aún no hay resultados de comparación',
    modelCount: '{count} modelos',
    expand: 'Expandir',
    bestResponse: 'Mejor respuesta',
    viewInThread: 'Ver en la conversación',
    totalTokens: 'Tokens totales',
    avgLatencyLabel: 'Latencia media',
    completedCount: '{count} completados',
    failedCount: '{count} fallidos',
    timeoutCount: '{count} con tiempo de espera agotado',
    modelsCompared: 'Modelos comparados',
    summaryTitle: 'Resumen de comparación',
    showMore: 'Mostrar más',
    showLess: 'Mostrar menos',
    timeout: 'Tiempo agotado',
    noContent: 'No hay contenido disponible',
    noJudge: 'Sin juez',
    judgeAwaiting: 'Esperando al juez',
    judgeSkipped: 'Juez omitido',
    judgeFailed: 'Juez fallido',
    judgeUnavailable: 'Juez no disponible',
    judgeVerified: 'Verificado',
    judgeRevised: 'Revisado',
    judgeEscalated: 'Escalado',
    modelsProcessing: 'Los modelos están procesando...',
    processingMessage: 'Procesando tu mensaje...',
  },
  consensus: {
    title: 'Modo consenso',
    description: 'Selecciona 2-5 modelos y deja que la IA sintetice una respuesta de consenso',
    selectModels: 'Seleccionar modelos',
    minModels: 'Selecciona al menos {min} modelos',
    maxModels: 'Máximo {max} modelos permitidos',
    sendPrompt: 'Ejecutar consenso',
    running: 'Ejecutando consenso...',
    sendFailed: 'Error al iniciar el consenso',
    synthesizing: 'Sintetizando respuestas...',
    synthesisReady: 'Síntesis lista',
    synthesisTitle: 'Síntesis de consenso',
    agreementScore: 'Puntuación de acuerdo',
    confidenceLevel: 'Confianza',
    agreements: 'Acuerdos',
    disagreements: 'Desacuerdos',
    contradictions: 'Contradicciones',
    synthesisRationale: 'Justificación',
    modelBreakdown: 'Desglose por modelo',
    completed: 'Completado',
    failed: 'Fallido',
    timeout: 'Tiempo agotado',
    contentLength: 'Longitud del contenido',
    noResults: 'Aún no hay resultados de consenso',
    viewInThread: 'Ver en la conversación',
    high: 'Alta',
    medium: 'Media',
    low: 'Baja',
    modelsSelected: '{count} modelos seleccionados',
    synthesisRationaleLabel: 'Justificación de la síntesis',
  },
  escalation: {
    title: 'Cadena de escalada',
    description:
      'Define una cadena de modelos — el más barato primero, el más potente al final. La IA escala automáticamente cuando la calidad es baja',
    chainBuilder: 'Construye tu cadena',
    addModel: 'Añadir modelo',
    removeModel: 'Eliminar',
    moveUp: 'Subir',
    moveDown: 'Bajar',
    minSteps: 'Añade al menos {min} modelos',
    maxSteps: 'Máximo {max} modelos en la cadena',
    sendPrompt: 'Ejecutar cadena',
    running: 'Ejecutando cadena...',
    sendFailed: 'Error al iniciar la cadena de escalada',
    synthesizing: 'Ejecutando escalada...',
    synthesisReady: 'Resultado listo',
    resultTitle: 'Resultado de la escalada',
    stepUsed: 'Paso usado',
    totalSteps: 'Pasos totales',
    escalated: 'Escalada',
    notEscalated: 'No se necesitó escalada',
    status: 'Estado',
    statusSingleStep: 'Resuelto en el primer paso',
    statusResolved: 'Resuelto tras escalada',
    statusExhausted: 'Todos los pasos agotados',
    qualityScore: 'Puntuación de calidad',
    latency: 'Latencia',
    step: 'Paso',
    passed: 'Aprobado',
    failed: 'Fallido',
    finalModel: 'Modelo final',
    noResults: 'Aún no hay resultados de escalada',
    viewInThread: 'Ver en la conversación',
    stepsTimeline: 'Cronograma de pasos',
    finalAnswer: 'Respuesta final',
  },
  repair: {
    title: 'Laboratorio de reparación de respuestas',
    description:
      'Repara respuestas malformadas, superficiales, incompletas o con alucinaciones sin reiniciar.',
    contentLabel: 'Respuesta a reparar',
    contentPlaceholder: 'Pega la respuesta que quieres reparar...',
    repairTypes: 'Tipos de reparación',
    schemaLabel: 'Esquema',
    schemaDesc: 'Corrige JSON malformado, estructura incorrecta o problemas de formato de datos.',
    formatLabel: 'Formato',
    formatDesc:
      'Corrige el formato markdown, encabezados, listas, bloques de código y estructura general.',
    completenessLabel: 'Completitud',
    completenessDesc:
      'Expande secciones superficiales o incompletas, añade puntos clave faltantes.',
    factualityLabel: 'Factualidad',
    factualityDesc:
      'Identifica y corrige errores factuales, alucinaciones o afirmaciones incorrectas.',
    sendPrompt: 'Reparar respuesta',
    running: 'Reparando...',
    sendFailed: 'Error al iniciar la reparación. Inténtalo de nuevo.',
    synthesizing: 'Reparación en curso...',
    resultTitle: 'Respuesta reparada',
    noResults: 'Aún no hay resultados de reparación',
    viewInThread: 'Ver en la conversación',
    finalAnswer: 'Respuesta final',
    provider: 'Proveedor',
    model: 'Modelo',
  },
  decompose: {
    title: 'Enrutador de descomposición de tareas',
    description:
      'Divide tareas complejas en sub-tareas, ejecuta cada una con el mejor modelo y sintetiza los resultados.',
    contentLabel: 'Tarea compleja',
    contentPlaceholder:
      'Describe una tarea compleja para descomponer, p. ej. "Investiga tendencias de IA en 2025, crea un plan de acción de 3 puntos y escribe un resumen ejecutivo."',
    maxSubTasks: 'Máximo de sub-tareas',
    sendPrompt: 'Descomponer y ejecutar',
    running: 'Descomponiendo…',
    synthesizing: 'Ejecutando sub-tareas y sintetizando resultados…',
    resultTitle: 'Resultado sintetizado',
    viewInThread: 'Ver en la conversación',
    subTasksHeader: 'Resultados de sub-tareas',
    subTaskResult: 'Resultado',
    category: 'Categoría',
    model: 'Modelo',
    latencyMs: 'Latencia',
    noResults: 'No hay resultados de descomposición',
    sendFailed: 'La descomposición de la tarea falló. Inténtalo de nuevo.',
  },
  bestOfN: {
    title: 'Generación de candidatos Best-of-N',
    description:
      'Genera múltiples respuestas candidatas y selecciona automáticamente la de mayor calidad.',
    contentLabel: 'Indicación',
    contentPlaceholder: 'Introduce tu prompt para generar múltiples candidatos…',
    nCandidates: 'Candidatos (N)',
    sendPrompt: 'Generar Best-of-N',
    running: 'Generando candidatos…',
    synthesizing: 'Puntuando y seleccionando el mejor candidato…',
    resultTitle: 'Resultado del mejor candidato',
    viewInThread: 'Ver en la conversación',
    candidatesHeader: 'Todos los candidatos',
    rank: 'Posición',
    score: 'Puntuación',
    model: 'Modelo',
    latency: 'Latencia',
    noResults: 'No se generaron candidatos',
    sendFailed: 'La generación de candidatos falló. Inténtalo de nuevo.',
  },
  recovery: {
    title: 'Recuperación de fallos de ruta',
    description:
      'Monitoriza los fallos de proveedor y los eventos de recuperación de alternativa automática.',
    totalDecisions: 'Decisiones totales',
    totalFallbacks: 'Eventos de alternativa',
    fallbackRate: 'Tasa de alternativa',
    providerTable: 'Desglose de fallos por proveedor',
    provider: 'Proveedor',
    fallbackCount: 'Alternativas',
    rate: 'Tasa',
    recentFallbacks: 'Eventos de alternativa recientes',
    originalProvider: 'Original',
    originalModel: 'Modelo',
    fallbackProvider: 'Alternativa',
    fallbackModel: 'Modelo alternativo',
    mode: 'Modo',
    time: 'Hora',
    noFallbacks: 'No hay eventos de alternativa',
    noData: 'Aún no hay decisiones de enrutamiento registradas.',
    loading: 'Cargando datos de recuperación…',
    error: 'Error al cargar las estadísticas de recuperación.',
  },
  verify: {
    title: 'Verificador',
    description: 'Genera y verifica una respuesta antes de enviarla',
    contentLabel: 'Tu prompt',
    contentPlaceholder: 'Introduce tu pregunta o tarea...',
    maxRevisionsLabel: 'Revisiones máximas',
    sendPrompt: 'Verificar y enviar',
    running: 'Verificando...',
    synthesizing: 'Generando y verificando respuesta...',
    noResults: 'Aún no hay respuesta verificada',
    sendFailed: 'La verificación falló. Inténtalo de nuevo.',
    verified: 'Verificado',
    verifierScore: 'Puntuación de calidad',
    revisions: 'Revisiones',
    issues: 'Problemas',
    viewInThread: 'Ver en la conversación',
  },
  adaptiveLearning: {
    title: 'Aprendizaje adaptativo de rutas',
    description: 'Insights derivados del historial de enrutamiento para mejorar decisiones futuras',
    loading: 'Cargando insights...',
    error: 'Error al cargar los insights',
    windowDays: 'Ventana',
    days: 'días',
    totalDecisions: 'Decisiones totales',
    avgConfidence: 'Confianza media',
    topReasonTags: 'Etiquetas de razón principales',
    providerTable: 'Rendimiento por proveedor',
    modeBreakdown: 'Desglose por modo',
    noData: 'No hay decisiones de enrutamiento en esta ventana',
    provider: 'Proveedor',
    fallbackRate: 'Tasa de alternativa',
    totalCalls: 'Llamadas totales',
    topModes: 'Modos principales',
    mode: 'Modo',
    count: 'Recuento',
    percentage: 'Porcentaje',
  },
  pipeline: {
    title: 'Pipeline multi-etapa',
    description: 'Enruta tu solicitud a través de una cadena de etapas especializadas',
    contentLabel: 'Tu solicitud',
    contentPlaceholder: 'Describe lo que necesitas...',
    templateLabel: 'Plantilla de pipeline',
    templateAnalyze: 'Analizar → Razonar → Formatear',
    templateCode: 'Codificar → Depurar → Revisar',
    templateDraft: 'Borrador → Criticar → Revisar',
    sendPrompt: 'Ejecutar pipeline',
    running: 'Ejecutando pipeline...',
    synthesizing: 'Procesando etapas...',
    noResults: 'Aún no hay resultados de pipeline',
    sendFailed: 'El pipeline falló. Inténtalo de nuevo.',
    stageBreakdown: 'Desglose por etapa',
    stage: 'Etapa',
    model: 'Modelo',
    latency: 'Latencia',
    viewInThread: 'Ver en la conversación',
  },
  costEnsemble: {
    title: 'Ensemble por coste',
    description:
      'Ejecución inteligente: usa uno, dos o tres modelos según la complejidad de la tarea',
    contentLabel: 'Tu prompt',
    contentPlaceholder: 'Introduce tu pregunta o tarea...',
    sendPrompt: 'Analizar y enviar',
    running: 'Analizando coste...',
    synthesizing: 'Seleccionando el ensemble óptimo...',
    noResults: 'Aún no hay resultados',
    sendFailed: 'El ensemble por coste falló. Inténtalo de nuevo.',
    tier: 'Nivel',
    tierSingle: 'Individual',
    tierDuo: 'Dúo',
    tierTrio: 'Trío',
    complexity: 'Complejidad',
    risk: 'Riesgo',
    ambiguity: 'Ambigüedad',
    reasoning: 'Razonamiento',
    candidates: 'Candidatos',
    viewInThread: 'Ver en la conversación',
  },
  rolePack: {
    title: 'Ensemble basado en roles',
    description: 'Envía tu solicitud a un equipo de roles de IA especializados',
    contentLabel: 'Tu solicitud',
    contentPlaceholder: 'Describe lo que necesitas...',
    packLabel: 'Seleccionar equipo',
    packCoding: 'Equipo de programación',
    packResearch: 'Equipo de investigación',
    packMarketing: 'Equipo de marketing',
    packLegal: 'Equipo legal',
    sendPrompt: 'Ejecutar equipo',
    running: 'Equipo procesando...',
    synthesizing: 'Ejecutando todos los roles en paralelo...',
    noResults: 'Aún no hay resultados del equipo',
    sendFailed: 'La ejecución del equipo falló. Inténtalo de nuevo.',
    teamBreakdown: 'Resultados del equipo',
    role: 'Rol',
    model: 'Modelo',
    latency: 'Latencia',
    viewInThread: 'Ver en la conversación',
  },
  advancedModelSelector: {
    label: 'Modelo de ejecución',
    auto: 'Auto (elegir el mejor modelo local)',
    loading: 'Cargando modelos...',
    description: 'Elige Auto o un modelo Ollama local instalado específico para este laboratorio.',
    empty: 'Aún no hay modelos de texto locales disponibles para este laboratorio.',
  },
  workspaceConnectors: {
    title: 'Conectores del espacio de trabajo',
    description:
      'Conecta tus herramientas del espacio de trabajo — GitHub, Slack, Jira, Google Drive y más.',
    createConnector: 'Crear conector',
    editConnector: 'Editar conector',
    deleteConnector: 'Eliminar conector',
    testHealth: 'Probar estado',
    triggerSync: 'Sincronizar ahora',
    name: 'Nombre',
    nameHelp: 'Un nombre visible para este conector',
    provider: 'Proveedor',
    providerHelp: 'La herramienta del espacio de trabajo a conectar',
    permissionLevel: 'Nivel de permisos',
    permissionLevelHelp: 'El nivel de acceso concedido a este conector',
    status: 'Estado',
    connected: 'Conectado',
    degraded: 'Degradado',
    disconnected: 'Desconectado',
    pendingAuth: 'Autenticación pendiente',
    unknown: 'Desconocido',
    noConnectors: 'No hay conectores del espacio de trabajo',
    noConnectorsDesc: 'Conecta tu primera herramienta del espacio de trabajo para empezar.',
    noConnectorsGuidance:
      'Las conexiones comienzan desde Configuraciones de apps. Registra tu app OAuth ahí y pulsa Conectar para vincularla aquí.',
    overviewDescription:
      'Tus herramientas del espacio de trabajo conectadas. Añade nuevas desde Configuraciones de apps.',
    manageAppConfigs: 'Gestionar configuraciones de apps',
    goToAppConfigs: 'Ir a configuraciones de apps',
    connectorCreated: 'Conector creado correctamente.',
    connectorCreateFailed: 'Error al crear el conector.',
    connectorDeleted: 'Conector eliminado correctamente.',
    connectorDeleteFailed: 'Error al eliminar el conector.',
    healthCheckStarted: 'Comprobación de estado iniciada.',
    healthCheckFailed: 'Error en la comprobación de estado.',
    syncStarted: 'Sincronización iniciada.',
    syncFailed: 'Error al iniciar la sincronización.',
    loadFailed: 'Error al cargar los conectores.',
    loadingConnectors: 'Cargando conectores...',
    addConnector: 'Añadir conector',
    connectViaOAuth: 'Conectar vía OAuth',
    lastSync: 'Última sincronización',
    never: 'Nunca',
    syncRuns: 'Ejecuciones de sincronización',
    healthEvents: 'Eventos de estado',
    enabled: 'Activado',
    disabled: 'Desactivado',
    deleteConfirm: '¿Seguro que quieres eliminar este conector? Esta acción no se puede deshacer.',
    namePlaceholder: 'p. ej., GitHub Workspace',
    paused: 'En pausa',
  },
  workspaceObjects: {
    title: 'Objetos sincronizados',
    description: 'Objetos sincronizados desde tus herramientas del espacio de trabajo conectadas.',
    loading: 'Cargando objetos...',
    loadFailed: 'Error al cargar los objetos del espacio de trabajo.',
    noObjects: 'Aún no hay objetos sincronizados.',
    noObjectsDesc:
      'Lanza una sincronización en un conector para importar objetos del espacio de trabajo.',
    selectConnector: 'Selecciona un conector para ver sus objetos sincronizados.',
    source: 'Origen',
    viewObject: 'Ver objeto',
  },
  workspaceSearch: {
    title: 'Búsqueda en el espacio de trabajo',
    description: 'Busca en todos los objetos sincronizados del espacio de trabajo.',
    placeholder: 'Buscar documentos, issues, mensajes...',
    searching: 'Buscando...',
    noResults: 'No se encontraron resultados.',
    noResultsDesc: 'Prueba con otro término de búsqueda o sincroniza más conectores.',
    searchFailed: 'La búsqueda falló. Inténtalo de nuevo.',
    resultCount: '{count} resultado(s)',
    viewSource: 'Ver origen',
    score: 'Relevancia',
  },
  workspaceObjectDetail: {
    title: 'Detalle del objeto',
    description: 'Inspecciona un objeto sincronizado y actualízalo desde su proveedor.',
    loadFailed: 'Error al cargar el objeto.',
    refresh: 'Actualizar desde proveedor',
    refreshing: 'Actualizando...',
    refreshFailed: 'Error al actualizar.',
    content: 'Contenido',
    metadata: 'Metadatos',
    externalCreated: 'Creado en origen',
    externalUpdated: 'Actualizado en origen',
    openInProvider: 'Abrir en el proveedor',
    author: 'Autor: {author}',
  },
  connectorDetail: {
    title: 'Detalle del conector',
    description:
      'Historial de sincronización, eventos de estado y objetos recientes para este conector.',
    loadFailed: 'Error al cargar el conector.',
    never: 'nunca',
    lastSync: 'Última sincronización: {value}',
    syncRunsCount: '{count} ejecuciones de sincronización',
    objectsCount: '{count} objetos',
    recentObjects: 'Objetos recientes',
    noObjects:
      'Aún no hay objetos sincronizados. Lanza una sincronización para traer objetos del proveedor.',
    syncHistory: 'Historial de sincronización',
    noSyncRuns: 'Aún no hay ejecuciones de sincronización.',
    syncRunLine: '{synced} sincronizados · {failed} fallidos',
    healthHistory: 'Historial de estado',
    noHealthEvents: 'Aún no se han registrado comprobaciones de estado.',
    healthOk: 'OK',
    activating:
      'Activando este conector — importando tu primer conjunto de objetos desde el proveedor. Puedes seguir usando Claw mientras se ejecuta.',
    askAi: 'Preguntar a la IA sobre esto',
    askAiTitle: 'Acerca de {name}',
    reconnect: 'Reconectar',
    reconnectTitle: 'Este conector está desconectado',
    reconnectDescription:
      'Las credenciales almacenadas ya no son válidas. Vuelve a autorizar desde Configuraciones de apps para restaurar el acceso.',
  },
  workspaceSyncRuns: {
    title: 'Ejecuciones de sincronización',
    description: 'Historial reciente de sincronización para este conector.',
    loading: 'Cargando ejecuciones de sincronización...',
    loadFailed: 'Error al cargar las ejecuciones de sincronización.',
    empty: 'Aún no hay ejecuciones de sincronización.',
    started: 'Iniciada',
    status: 'Estado',
    type: 'Tipo',
    delta: 'Delta',
    found: 'Encontrados',
    synced: 'Sincronizados',
    failed: 'Fallidos',
    duration: 'Duración',
  },
  workspaceSync: {
    dashboard: {
      title: 'Estado de sincronización del espacio de trabajo',
      description:
        'Vista en vivo de los trabajos de sincronización programados en cada conector del espacio de trabajo.',
      error_title: 'No se puede cargar el panel de sincronización',
      empty_title: 'Aún no hay conectores',
      empty_description:
        'Cuando conectes una herramienta del espacio de trabajo, su estado de sincronización aparecerá aquí.',
      scheduler_title: 'Planificador',
      scheduler_enabled: 'Planificador activado',
      last_tick: 'Último tick',
      active_runs: 'Ejecuciones activas',
      dlq_backlog: 'Cola DLQ pendiente',
      connectors_title: 'Conectores',
      col: {
        connector: 'Conector',
        freshness: 'Frescura',
        last_sync: 'Última sincronización',
        cadence: 'Cadencia',
        success_rate: 'Tasa de éxito 24h',
        avg_duration: 'Duración media',
        status: 'Estado',
      },
    },
    band: {
      fresh: 'Reciente',
      slow: 'Lento',
      stale: 'Obsoleto',
    },
    cadence: {
      label: 'Sincronizar cada',
      '1m': '1 minuto',
      '5m': '5 minutos',
      '10m': '10 minutos',
      '30m': '30 minutos',
      '1h': '1 hora',
      save: 'Guardar cadencia',
      saving: 'Guardando...',
      saved: 'Cadencia actualizada',
    },
    pause: {
      pause: 'Pausar sincronización',
      resume: 'Reanudar sincronización',
      paused_label: 'Sincronización pausada',
      reason_placeholder: 'Motivo (opcional)',
    },
    chip: {
      synced_ago: 'Sincronizado hace {ago}',
      stale: 'Obsoleto',
      paused: 'Pausado',
    },
  },
  aiActions: {
    dialog: {
      title: 'Ejecutar acción de IA · {action}',
      description:
        'Elige un modelo y genera. AUTO deja que el enrutador elija según el tipo de acción y la clase de privacidad.',
      model_label: 'Modelo',
      generate: 'Generar',
      regenerate: 'Regenerar',
      resolving: 'Generando…',
      cancel: 'Cancelar',
      close: 'Cerrar',
      copy: 'Copiar',
      copied: 'Copiado',
      generated_by: 'Generado por {model}',
      resolution_mode: 'Modo: {mode}',
      resolution_primary: 'Principal: {model}',
      resolution_fallback: 'Modelos alternativos en cola: {count}',
    },
  },
  approvals: {
    page: {
      title: 'Centro de aprobaciones',
      description:
        'Revisa y aprueba las acciones pendientes redactadas por IA en tus conectores del espacio de trabajo.',
      empty_title: 'No hay aprobaciones pendientes',
      empty_description:
        'Cuando la IA redacte una acción en tu nombre, aparecerá aquí para revisión.',
      error_title: 'No se pueden cargar las aprobaciones',
      error_description: 'Algo falló al cargar la lista de aprobaciones. Inténtalo de nuevo.',
    },
    card: {
      approve: 'Aprobar',
      reject: 'Rechazar',
      edit: 'Editar',
      edited: 'Editado · v{version}',
      source_stale: 'Origen obsoleto',
      attribution_auto: 'AUTO · {model}',
      attribution_manual: 'Manual · {model}',
    },
    bulk: {
      selected: '{count} seleccionados',
      approve_all: 'Aprobar todos los seleccionados',
      clear: 'Limpiar selección',
    },
    edit: {
      title: 'Editar borrador',
      description:
        'Edita el payload de la acción. El borrador original se conserva en el historial.',
      payload_label: 'Carga útil (JSON)',
      reason_placeholder: 'Motivo de la edición (opcional)',
      save: 'Guardar y volver a aprobar más tarde',
      cancel: 'Cancelar',
      invalid_json: 'El payload debe ser JSON válido',
    },
    reject: {
      title: 'Rechazar acción',
      description: 'Describe opcionalmente por qué estás rechazando esta acción.',
      reason_placeholder: 'Motivo (opcional)',
      confirm: 'Rechazar',
      cancel: 'Cancelar',
    },
  },
  automationPreferences: {
    page: {
      title: 'Preferencias de automatización',
      description:
        'Controles por tipo de acción. Gana la más restrictiva: la política del admin es el suelo; tus preferencias solo pueden ajustarla.',
      loading: 'Cargando preferencias…',
      error: 'No se pudieron cargar las preferencias. Intenta refrescar.',
      empty: 'Aún no hay tipos de acción.',
    },
    row: {
      enabled: 'Habilitado',
      disabled: 'Deshabilitado',
      toggleAria: 'Alternar automatización para {kind}',
      autoApproveBelowRisk: 'Auto-aprobar cuando el riesgo esté en o por debajo',
      autoApproveDisabled: 'Auto-aprobación desactivada (siempre en cola de revisión)',
      autoApproveAt: 'Auto-aprobar con riesgo ≤ {score}',
      perDayBudget: 'Límite diario',
      perDayBudgetPlaceholder: 'unlimited',
      clear: 'Limpiar',
    },
  },
  connectorGrants: {
    title: 'Compartir',
    description:
      'Comparte este conector con otros usuarios. El propietario siempre tiene acceso completo; los destinatarios ven el nivel de acceso que elijas.',
    loading: 'Cargando permisos…',
    error: 'No se pudieron cargar los permisos.',
    empty: 'Aún no hay permisos. Este conector solo es accesible para ti.',
    granteeUserIdLabel: 'ID de usuario destinatario',
    granteeUserIdPlaceholder: 'cmnkgdc2c00009w92riuztmmd',
    accessLevelLabel: 'Nivel de acceso',
    grant: 'Otorgar acceso',
    granting: 'Otorgando…',
    revoke: 'Revocar',
    revoking: 'Revocando…',
    grantedBy: 'otorgado por',
    levelReadOnly: 'Solo lectura',
    levelAiActions: 'Acciones de IA',
    levelFull: 'Completo',
  },
  emailSignatures: {
    page: {
      title: 'Firmas de correo electrónico',
      description:
        'Gestiona las firmas que se añaden a los correos redactados por IA. Marca una como predeterminada para usarla automáticamente.',
      loading: 'Cargando firmas…',
      error: 'No se pudieron cargar las firmas. Actualiza la página.',
      empty: 'Aún no hay firmas. Crea una para comenzar.',
      create: 'Nueva firma',
      edit: 'Editar',
      delete: 'Eliminar',
      deleting: 'Eliminando…',
      defaultBadge: 'Predeterminada',
    },
    dialog: {
      createTitle: 'Crear firma',
      editTitle: 'Editar firma',
      nameLabel: 'Nombre',
      namePlaceholder: 'Firma de trabajo',
      bodyLabel: 'Contenido',
      bodyPlaceholder: 'Saludos,\nAlice\nVP de Ingeniería · Example Inc.',
      defaultLabel: 'Usar como predeterminada',
      save: 'Guardar',
      saving: 'Guardando…',
      cancel: 'Cancelar',
    },
  },
  research: {
    toggle: {
      placeholder: 'Investigación',
      autoProvider: 'Proveedor automático',
      noProviders: 'No hay proveedores configurados',
    },
    modes: {
      off: 'Sin investigación',
      searchOnly: 'Búsqueda web',
      searchThenFetch: 'Búsqueda + obtener',
      searchFetchExtract: 'Búsqueda + extraer',
    },
    providers: {
      title: 'Proveedores de investigación',
      description: 'Proveedores dinámicos de búsqueda, obtención y evidencia.',
      createButton: 'Nuevo proveedor',
      createTitle: 'Añadir proveedor de investigación',
      createDescription: 'Registra un proveedor Tavily / SearXNG / Ollama Web.',
      create: 'Crear',
      creating: 'Creando...',
      kind: 'Tipo',
      name: 'Nombre',
      baseUrl: 'URL base',
      apiKey: 'Clave API (almacenada cifrada)',
      test: 'Probar',
      secretStored: 'Secreto almacenado',
      healthy: 'Saludable',
      unhealthy: 'No saludable',
      loadFailed: 'Error al cargar los proveedores.',
      emptyTitle: 'No hay proveedores de investigación',
      emptyDescription: 'Añade un proveedor para empezar a anclar el chat con evidencia en vivo.',
      col: {
        name: 'Nombre',
        kind: 'Tipo',
        baseUrl: 'URL base',
        status: 'Estado',
        secret: 'Secreto',
        actions: 'Acciones',
      },
      namePlaceholder: 'p. ej., Tavily Production',
    },
    runs: {
      title: 'Ejecuciones de investigación',
      description: 'Historial de ejecuciones de investigación lanzadas desde el chat.',
      loadFailed: 'Error al cargar las ejecuciones.',
      emptyTitle: 'Aún no hay ejecuciones de investigación',
      emptyDescription: 'Activa la investigación en el chat para producir evidencia.',
    },
    evidence: {
      title: 'Evidencia de investigación en vivo',
      empty: 'No se devolvieron elementos de evidencia.',
      noTitle: '(sin título)',
      confidence: 'Confianza',
      warnings: 'Advertencias',
      requestedModel: 'Modelo solicitado',
      toolsUsed: 'Herramientas',
    },
    results: {
      open: 'Resultados de búsqueda',
      title: 'Resultados de investigación',
      description:
        'Inspecciona la elección del proveedor, la cadena de alternativas, el paquete de evidencia y el rastro de investigación.',
      provider: 'Proveedor',
      selectionMode: 'Selección',
      selectionAuto: 'Automático',
      selectionExplicit: 'Explícita',
      fallbackUsed: 'Alternativa usada',
      query: 'Consulta de investigación',
      evidenceCount: 'Elementos de evidencia',
      attempts: 'Intentos de proveedor',
      trace: 'Rastro de investigación',
    },
  },
  workspaceActions: {
    title: 'Acciones del espacio de trabajo',
    description: 'Revisa y aprueba acciones de escritura automatizadas antes de que se ejecuten.',
    approve: 'Aprobar',
    reject: 'Rechazar',
    cancel: 'Cancelar',
    rejectTitle: 'Rechazar acción',
    rejectDesc: 'Proporciona un motivo opcional para rechazar esta acción.',
    rejectReasonPlaceholder: 'Motivo (opcional)',
    confirmReject: 'Confirmar rechazo',
    connector: 'Conector',
    rejectionReason: 'Motivo del rechazo',
    pendingApproval: 'Aprobación pendiente',
    executing: 'Ejecutando',
    executed: 'Ejecutada',
    failed: 'Fallida',
    rejected: 'Rechazada',
    noActions: 'No se encontraron acciones',
    noActionsDesc:
      'Las acciones de escritura automatizadas creadas por la IA aparecerán aquí para tu revisión.',
    loadFailed: 'Error al cargar las acciones.',
    viewPayload: 'Ver payload',
    requestedAt: 'solicitada {value}',
    reviewedAt: 'revisada {value}',
    executedAt: 'ejecutada {value}',
    approved: 'Aprobado',
    expired: 'Expirado',
    edited: 'Editado',
  },
  workspaceProviders: {
    catalog: {
      title: 'Catálogo de proveedores del espacio de trabajo',
      description: 'Explora las integraciones soportadas del espacio de trabajo.',
      loadFailed: 'Error al cargar el catálogo de proveedores.',
      emptyTitle: 'No hay proveedores disponibles',
      emptyDescription: 'Aún no hay proveedores del espacio de trabajo registrados.',
      available: 'Disponible',
      comingSoon: 'Próximamente',
      objectTypes: 'tipos de objeto',
      docs: 'Documentación',
    },
    appConfigs: {
      title: 'Configuraciones de apps de proveedores',
      description:
        'Registra apps OAuth y credenciales para los proveedores del espacio de trabajo.',
      createButton: 'Nueva configuración',
      createTitle: 'Crear configuración de app del proveedor',
      createDescription: 'Registra credenciales OAuth o un token de acceso personal.',
      create: 'Crear',
      creating: 'Creando...',
      editTitle: 'Editar configuración de aplicación de proveedor',
      editDescription:
        'Actualice los valores de configuración y los metadatos de este proveedor. Deje los campos secretos en blanco para mantenerlos sin cambios.',
      editSecretHint:
        'Los campos secretos dejados en blanco conservarán el valor almacenado previamente. Rellénelos solo para rotar las credenciales.',
      save: 'Guardar',
      saving: 'Guardando…',
      provider: 'Proveedor',
      providerPlaceholder: 'Selecciona un proveedor...',
      name: 'Nombre',
      namePlaceholder: 'p. ej. App de producción de GitHub',
      authMode: 'Modo de autenticación',
      descriptionLabel: 'Descripción',
      descriptionPlaceholder: 'Notas opcionales sobre esta configuración',
      test: 'Probar',
      connect: 'Conectar',
      testResult: 'Resultado de la prueba: {status} ({latency}ms)',
      secretStored: 'Secreto almacenado',
      emptyTitle: 'Aún no hay configuraciones de proveedor',
      emptyDescription:
        'Añade las credenciales de tu primer proveedor para habilitar conectores del espacio de trabajo.',
      loadFailed: 'Error al cargar las configuraciones de apps.',
      fields: {
        secret: '(secreto)',
      },
      columns: {
        name: 'Nombre',
        provider: 'Proveedor',
        authMode: 'Autenticación',
        status: 'Estado',
        secret: 'Secreto',
        lastValidated: 'Última validación',
        actions: 'Acciones',
      },
      errors: {
        nameRequired: 'Se requiere un nombre.',
      },
    },
    oauthCallback: {
      exchangingTitle: 'Completando conexión...',
      exchangingDescription: 'Intercambiando el código de autorización con el proveedor.',
      successTitle: '¡Conectado!',
      successDescription: 'Redirigiéndote de vuelta al espacio de trabajo...',
      successDescriptionNamed: '{name} conectado. Redirigiéndote de vuelta...',
      errorTitle: 'Error de conexión',
      errorUnknown: 'Se produjo un error desconocido.',
    },
  },
  agent: {
    title: 'Agente de escritorio',
    description: 'Gestiona los agentes de escritorio conectados y los comandos de terminal.',
    loading: 'Cargando sesiones del agente...',
    loadFailed: 'Error al cargar los datos del agente.',
    noSessions: 'No hay sesiones activas',
    noSessionsDesc: 'Inicia el agente de escritorio de Claw en tu máquina para conectar.',
    noCommands: 'No hay comandos',
    noCommandsDesc: 'Los comandos de terminal pendientes aparecerán aquí.',
    noRepos: 'No hay repositorios',
    noReposDesc: 'Los repositorios detectados por el agente aparecerán aquí.',
    terminal: 'Comandos de terminal',
    terminalDesc: 'Aprueba o rechaza los comandos de terminal solicitados por el agente.',
    capabilities: 'Cola de capacidades',
    capabilitiesDesc:
      'Aprueba o rechaza invocaciones de capacidades en sistema de archivos, procesos, navegador y otras clases.',
    capabilityClass: 'Clase',
    capabilityOperation: 'Operación',
    blastRadius: 'Radio de impacto',
    reversibility: 'Reversibilidad',
    riskScore: 'Puntuación de riesgo',
    matchedPolicy: 'Política coincidente',
    activity: 'Actividad del agente',
    activityDesc: 'Capacidades recientes y ejecuciones de recetas en todos tus dispositivos.',
    autoApproved: 'Aprobado automáticamente',
    denied: 'Denegado',
    rolledBack: 'Revertido',
    recipes: 'Recetas',
    recipesDesc: 'Automatizaciones multipaso que encadenan invocaciones de capacidades.',
    noRecipes: 'Aún no hay recetas',
    noRecipesDesc: 'Crea una receta para automatizar flujos de trabajo multipaso.',
    recipeRunDetail: 'Detalle de Ejecución',
    recipeRunDetailDesc: 'Progreso en vivo de la ejecución de una receta.',
    runStatus: 'Estado de Ejecución',
    cancelRun: 'Cancelar Ejecución',
    steps: 'Pasos',
    marketplace: 'Mercado de Recetas',
    marketplaceDesc: 'Explora e instala recetas firmadas publicadas por la comunidad.',
    noListings: 'Aún no hay listados',
    noListingsDesc: 'Cuando los publicadores envíen recetas firmadas, aparecerán aquí.',
    install: 'Instalar',
    activityMemory: 'Memoria de Actividad',
    activityMemoryDesc:
      'Entradas de actividad sincronizadas en la nube optadas desde tus dispositivos.',
    noActivity: 'Aún no hay entradas de actividad',
    noActivityDesc:
      'La actividad registrada en tus dispositivos solo aparece aquí tras optar por sincronización.',
    repos: 'Repositorios',
    reposDesc: 'repositorios detectados',
    pendingCommands: 'Comandos pendientes',
    pendingApproval: 'Aprobación pendiente',
    recentCommands: 'Comandos recientes',
    approve: 'Aprobar',
    reject: 'Rechazar',
    version: 'Versión',
    commands: 'comandos',
    files: 'archivos',
    dirty: 'Modificado',
    connect: {
      title: 'Vincular un dispositivo',
      approveDescription: 'Revisa los detalles del dispositivo y los permisos antes de aprobar.',
      scopesLabel: 'Permisos (scopes)',
      approveButton: 'Aprobar',
      denyButton: 'Cancelar',
      successTitle: 'Dispositivo vinculado',
      successBody: 'Puedes cerrar esta pestaña y volver a tu terminal.',
      expiredTitle: 'Enlace de vinculación inválido o expirado',
      expiredBody: 'Vuelve a ejecutar `claw-agent login` para iniciar una nueva vinculación.',
      deniedTitle: 'Aprobación cancelada',
      deniedBody: 'No se emitieron credenciales. Puedes cerrar esta pestaña.',
      accountMismatchTitle: 'Cuenta incorrecta',
      accountMismatchBody:
        'Inicia sesión con la cuenta con la que quieres vincular este dispositivo.',
      deviceNamePlaceholder: 'p. ej., Mi MacBook Pro',
    },
    rejectedByUser: 'Rechazado por el usuario',
  },
  discovery: {
    title: 'Descubrimiento de modelos',
    description: 'Descubre, clasifica y aprueba nuevos modelos Ollama de forma dinámica.',
    searchPlaceholder: 'Buscar candidatos...',
    filter: {
      status: 'Estado',
      all: 'Todos',
      pending: 'Pendiente',
      approved: 'Aprobado',
      rejected: 'Rechazado',
      imported: 'Importado',
      duplicate: 'Duplicado',
    },
    actions: {
      refresh: 'Ejecutar descubrimiento',
      dryRun: 'Ejecución en seco',
      approve: 'Aprobar',
      reject: 'Rechazar',
    },
    runs: {
      title: 'Ejecuciones de descubrimiento recientes',
      empty:
        'Aún no hay ejecuciones de descubrimiento. Pulsa "Ejecutar descubrimiento" para empezar.',
      discovered: 'descubiertos',
      imported: 'importados',
      skipped: 'omitidos',
    },
    candidates: {
      title: 'Candidatos',
      empty: {
        title: 'No hay candidatos',
        description: 'Lanza una ejecución de descubrimiento para encontrar nuevos modelos.',
      },
    },
    candidate: {
      size: 'Tamaño',
      confidence: 'Confianza',
    },
    packs: {
      title: 'Paquetes de hardware',
      empty: 'No hay paquetes de hardware configurados.',
      install: 'Instalar paquete',
      noModelsYet: 'Aún no hay modelos que coincidan con este perfil.',
    },
  },
  validation: {
    required: 'Este campo es obligatorio',
    invalidEmail: 'Introduce una dirección de correo válida',
    tooShort: 'Debe tener al menos {min} caracteres',
    tooLong: 'Debe tener como máximo {max} caracteres',
    invalidUrl: 'Introduce una URL válida',
    fileTooLarge: 'El tamaño del archivo excede el máximo permitido',
    invalidFileType: 'Este tipo de archivo no está soportado',
  },
  toast: {
    loginSuccess: 'Inicio de sesión correcto',
    loginFailed: 'Error al iniciar sesión',
    logoutFailed: 'Error al cerrar sesión',
    sessionExpired: 'Sesión expirada, por favor inicia sesión de nuevo',
  },
  accessibility: {
    closeSidebar: 'Cerrar barra lateral',
    openSidebar: 'Abrir barra lateral',
    toggleSidebar: 'Alternar barra lateral',
    userMenu: 'Menú de usuario',
    closeDialog: 'Cerrar diálogo',
    openMenu: 'Abrir menú',
    search: 'Buscar',
    openSearch: 'Abrir búsqueda',
    closeSearch: 'Cerrar búsqueda',
    navigation: 'Navegación principal',
    notifications: 'Notificaciones',
    languageSelector: 'Seleccionar idioma',
    themeToggle: 'Alternar tema',
    resizeInput: 'Redimensionar entrada de mensaje',
  },
  actions: {
    test: 'Probar',
    testing: 'Probando...',
    sync: 'Sincronizar',
    syncing: 'Sincronizando...',
    archive: 'Archivar',
    unarchive: 'Desarchivar',
    pin: 'Fijar',
    unpin: 'Desfijar',
    duplicate: 'Duplicar',
    copy: 'Copiar',
    copied: 'Copiado',
    copyToClipboard: 'Copiar al portapapeles',
    view: 'Ver',
    viewAll: 'Ver todo',
    viewDetails: 'Ver detalles',
    download: 'Descargar',
    upload: 'Subir',
    refresh: 'Actualizar',
    reset: 'Restablecer',
    apply: 'Aplicar',
    approve: 'Aprobar',
    approving: 'Aprobando...',
    reject: 'Rechazar',
    rejecting: 'Rechazando...',
    reload: 'Recargar',
    reconnect: 'Reconectar',
    expand: 'Expandir',
    collapse: 'Contraer',
    enable: 'Activar',
    disable: 'Desactivar',
    remove: 'Eliminar',
    add: 'Añadir',
    select: 'Seleccionar',
    selectAll: 'Seleccionar todo',
    deselectAll: 'Deseleccionar todo',
    clear: 'Limpiar',
    submit: 'Enviar',
    more: 'Más',
    less: 'Menos',
    showMore: 'Mostrar más',
    showLess: 'Mostrar menos',
  },
  logs: {
    allLevels: 'Todos los niveles',
    allActions: 'Todas las acciones',
    allSeverities: 'Todas las severidades',
    allMethods: 'Todos los métodos',
    methodPlaceholder: 'Método',
    componentPlaceholder: 'Componente...',
    actionPlaceholder: 'Acción...',
    routePlaceholder: 'Ruta...',
    routeRegexPlaceholder: 'Ruta (regex)...',
    userIdPlaceholder: 'ID de usuario...',
    messageContainsPlaceholder: 'El mensaje contiene...',
    servicePlaceholder: 'Servicio...',
    controllerPlaceholder: 'Controlador...',
    entityTypePlaceholder: 'Tipo de entidad...',
    startDate: 'Fecha de inicio',
    endDate: 'Fecha de fin',
    fullTextSearch: 'Búsqueda de texto completo...',
    searchAllFields: 'Buscar en todos los campos...',
    avgLatency: 'Latencia promedio',
    errors: 'Errores',
    failedToLoadClient: 'Error al cargar los registros del cliente',
    failedToLoadClientDesc: 'No se pueden obtener los registros del cliente desde el servidor',
    failedToLoadServer: 'Error al cargar los registros del servidor',
    failedToLoadServerDesc: 'No se pueden obtener los registros del servidor desde el servidor',
    levelDistribution: 'Distribución por nivel',
    loadingClient: 'Cargando registros del cliente...',
    loadingServer: 'Cargando registros del servidor...',
    noActionData: 'No hay datos de acciones',
    noClientLogs: 'No hay registros del cliente',
    noClientLogsActivityDesc: 'Aún no se ha registrado actividad de registros del cliente',
    noComponentData: 'No hay datos de componentes',
    noServerLogs: 'No hay registros del servidor',
    noServerLogsActivityDesc: 'Aún no se ha registrado actividad de registros del servidor',
    noServiceData: 'No hay datos de servicios',
    percentOfTotal: '% del total',
    topActions: 'Acciones principales',
    topComponents: 'Componentes principales',
    topServices: 'Servicios principales',
    totalLogs: 'Registros totales',
  },
  gmail: {
    page: {
      title: 'Gmail',
      description: 'Navega y gestiona los mensajes de Gmail sincronizados.',
      empty_title: 'No hay correos sincronizados',
      empty_description:
        'Aún no se han sincronizado correos. Activa la sincronización en tu conector de Gmail.',
      error_title: 'No se pudieron cargar los correos',
      no_connector_title: 'No se encontró conector de Gmail',
      no_connector_description:
        'Conecta una cuenta de Gmail en los conectores de espacio de trabajo para explorar tu bandeja de entrada.',
    },
    message: {
      from: 'De',
      to: 'Para',
      date: 'Fecha',
      subject: 'Asunto',
      reply: 'Responder',
      open_in_gmail: 'Abrir en Gmail',
      unread: 'No leído',
      attachments: 'Adjuntos ({count})',
      download: 'Descargar {name}',
      htmlIframeTitle: 'Cuerpo del correo',
      toggleHtml: 'Alternar HTML',
      showHtml: 'Mostrar HTML',
      toggleImages: 'Alternar imágenes',
      loadImages: 'Cargar imágenes',
      imagesBlocked: 'Imágenes bloqueadas',
    },
    actions: {
      summarize: 'Resumir',
      draft_reply: 'Redactar respuesta',
      extract_tasks: 'Extraer tareas',
      send_email: 'Enviar correo',
      draft_sent: 'Borrador creado — revisa en Aprobaciones',
      draft_failed: 'No se pudo crear el borrador',
    },
  },
  jira: {
    page: {
      title: 'Jira',
      description: 'Navega y gestiona los tickets de Jira sincronizados.',
      empty_title: 'No hay tickets sincronizados',
      empty_description:
        'Aún no se han sincronizado tickets de Jira. Activa una sincronización en tu conector de Jira para cargar tickets.',
      error_title: 'No se pueden cargar los tickets',
      no_connector_title: 'No se encontró conector de Jira',
      no_connector_description:
        'Conecta una cuenta de Jira en los Conectores del Workspace para empezar a navegar tus tickets.',
    },
    ticket: {
      status: 'Estado',
      priority: 'Prioridad',
      assignee: 'Asignado',
      reporter: 'Informador',
      project: 'Proyecto',
      sprint: 'Sprint',
      story_points: 'Puntos de historia',
      due_date: 'Vencimiento',
      labels: 'Etiquetas',
      issue_type: 'Tipo',
      open_in_jira: 'Abrir en Jira',
      unassigned: 'Sin asignar',
      no_sprint: 'Sin sprint',
    },
    actions: {
      summarize: 'Resumir',
      write_comment: 'Escribir comentario',
      extract_tasks: 'Extraer tareas',
    },
  },
  source_control: {
    page: {
      title: 'Control de versiones',
      description: 'Navega pull requests de GitHub, GitLab y Bitbucket.',
      empty_title: 'No hay pull requests sincronizados',
      empty_description:
        'Aún no se han sincronizado pull requests. Activa una sincronización en tu conector de control de versiones.',
      error_title: 'No se pueden cargar los pull requests',
      no_connector_title: 'No se encontró conector de control de versiones',
      no_connector_description:
        'Conecta GitHub, GitLab o Bitbucket en los Conectores del Workspace.',
    },
    pr: {
      author: 'Autor',
      source_branch: 'Desde',
      target_branch: 'Hacia',
      reviewers: 'Revisores',
      additions: 'Adiciones',
      deletions: 'Eliminaciones',
      labels: 'Etiquetas',
      draft: 'Borrador',
      open_pr: 'Abrir PR',
      state_open: 'Abierto',
      state_closed: 'Cerrado',
      state_merged: 'Fusionado',
      review_approved: 'Aprobado',
      review_changes: 'Cambios solicitados',
      review_pending: 'Revisión pendiente',
    },
    actions: {
      review: 'Revisar PR',
      summarize: 'Resumir',
      extract_tasks: 'Extraer tareas',
    },
  },
  slack: {
    page: {
      title: 'Slack',
      description: 'Navega y gestiona mensajes de Slack sincronizados.',
      empty_title: 'No hay mensajes sincronizados',
      empty_description:
        'Aún no se han sincronizado mensajes de Slack. Activa una sincronización en tu conector de Slack.',
      error_title: 'No se pueden cargar los mensajes',
      no_connector_title: 'No se encontró conector de Slack',
      no_connector_description: 'Conecta un workspace de Slack en los Conectores del Workspace.',
    },
    message: {
      channel: 'Canal',
      sender: 'De',
      date: 'Fecha',
      thread_reply: 'Respuesta en hilo',
      open_in_slack: 'Abrir en Slack',
      reactions: 'Reacciones',
    },
    actions: {
      summarize: 'Resumir',
      reply: 'Redactar respuesta',
      extract_tasks: 'Extraer tareas',
    },
  },
  confluence: {
    page: {
      title: 'Confluence',
      description: 'Explora y gestiona páginas de Confluence sincronizadas.',
      empty_title: 'No hay páginas sincronizadas',
      empty_description:
        'Aún no se han sincronizado páginas de Confluence. Inicia una sincronización en tu conector de Confluence.',
      error_title: 'No se pudieron cargar las páginas',
      no_connector_title: 'No se encontró conector de Confluence',
      no_connector_description:
        'Conecta un workspace de Confluence en Conectores de espacio de trabajo para explorar páginas.',
    },
    article: {
      space: 'Espacio',
      author: 'Autor',
      modified_by: 'Modificado por',
      version: 'Versión',
      labels: 'Etiquetas',
      parent: 'Padre',
      open_page: 'Abrir en Confluence',
    },
    actions: {
      summarize: 'Resumir',
      extract_tasks: 'Extraer tareas',
      write_comment: 'Escribir comentario',
    },
  },
  docs: {
    page: {
      title: 'Documentos',
      description:
        'Explora y gestiona documentos sincronizados de Google Drive, OneDrive y SharePoint.',
      empty_title: 'No hay documentos sincronizados',
      empty_description:
        'Aún no se han sincronizado documentos. Inicia una sincronización en tu conector de Drive o SharePoint.',
      error_title: 'No se pudieron cargar los documentos',
      no_connector_title: 'No se encontró conector de documentos',
      no_connector_description:
        'Conecta Google Drive, OneDrive o SharePoint en Conectores de espacio de trabajo para explorar documentos.',
    },
    file: {
      owner: 'Propietario',
      modified_by: 'Modificado por',
      size: 'Tamaño',
      type: 'Tipo',
      open_file: 'Abrir archivo',
      shared_with: 'Compartido con',
      path: 'Ruta',
    },
    actions: {
      summarize: 'Resumir',
      extract_tasks: 'Extraer tareas',
      draft_email: 'Redactar correo',
    },
  },
  figma: {
    page: {
      title: 'Figma',
      description: 'Explora y gestiona archivos de diseño de Figma sincronizados.',
      empty_title: 'No se encontraron diseños',
      empty_description: 'Aún no se han sincronizado archivos de diseño de Figma.',
      error_title: 'Error al cargar los diseños',
      no_connector_title: 'Figma no conectado',
      no_connector_description: 'Conecta tu espacio de trabajo de Figma para explorar diseños.',
    },
    design: {
      team: 'Equipo',
      project: 'Proyecto',
      modified_by: 'Modificado por',
      components: 'Componentes',
      open_in_figma: 'Abrir en Figma',
      last_updated: 'Última actualización',
    },
    actions: {
      summarize: 'Resumir diseño',
      extract_components: 'Extraer componentes',
      draft_spec: 'Redactar especificación',
    },
  },
  workflow: {
    page: {
      title: 'Flujos de trabajo entre espacios',
      description:
        'Selecciona objetos de múltiples proveedores y ejecuta acciones de IA sobre el contexto combinado.',
      empty_title: 'No se encontraron objetos',
      empty_description: 'Aún no se han sincronizado objetos del espacio de trabajo.',
      error_title: 'Error al cargar los objetos',
    },
    object: {
      add: 'Agregar',
      remove: 'Eliminar',
      selected_count: 'objetos seleccionados',
      clear_all: 'Limpiar todo',
    },
    actions: {
      summarize_all: 'Resumir todo',
      extract_requirements: 'Extraer requisitos',
      draft_prd: 'Redactar PRD',
    },
  },
  gpuBadge: {
    cpuOnly: 'Solo CPU',
    noGpu: 'Sin GPU detectada — haga clic para ver modelos locales',
    vendor: {
      nvidia: 'NVIDIA',
      amd: 'AMD ROCm',
      metal: 'Metal',
      intel: 'Intel/Vulkan',
      unknown: 'GPU',
      cpu: 'CPU',
    },
  },
  localFrontier: {
    title: 'Modelos Frontier locales',
    subtitle:
      'Ejecute LLMs frontier de pesos abiertos (Kimi K2, GLM-5.1, DeepSeek V3.2/V4) localmente.',
    loading: 'Cargando catálogo…',
    catalogEmpty: 'Ningún modelo coincide con los filtros.',
    catalogError: 'No se pudo cargar el catálogo. Verifique claw-llamacpp-service.',
    contextLength: 'tokens de contexto',
    requiresRamGb: 'GB RAM',
    sourceLink: 'HuggingFace',
    actions: {
      download: 'Descargar',
      load: 'Cargar',
      unload: 'Descargar',
      deleteWeights: 'Eliminar pesos',
      configure: 'Configurar runtime',
    },
    download: { start: 'Descargar', cancel: 'Cancelar', retry: 'Reintentar' },
    compat: {
      fits: 'Compatible con su hardware',
      warns: 'Hardware ajustado',
      refuses: 'Hardware insuficiente',
    },
    qualityTier: { survival: 'Supervivencia', balanced: 'Equilibrado', best: 'Mejor' },
    preflight: {
      RAM_INSUFFICIENT: 'Memoria RAM insuficiente para este modelo.',
      DISK_INSUFFICIENT: 'Espacio en disco insuficiente (no se puede anular).',
      GPU_INSUFFICIENT: 'No se detectó una GPU compatible.',
      BINARY_NOT_INSTALLED: 'El binario llama-server aún no está instalado.',
      RUNTIME_INCOMPATIBLE: 'El runtime instalado no puede ejecutar este modelo.',
    },
    override: {
      warning: 'Su hardware está por debajo de los requisitos. Anule solo si entiende el riesgo.',
      confirmTypeSize: 'Escriba el tamaño del modelo en GB para confirmar la anulación:',
    },
    delete: {
      confirm: '¿Eliminar pesos?',
      confirmTypePrompt: 'Escriba el nombre del modelo (p. ej. glm-5.1:Q4_K_M) para confirmar.',
    },
    hardware: {
      title: 'Hardware y runtime',
      subtitle: 'Vista en vivo de esta máquina y el binario llama.cpp.',
      refresh: 'Actualizar',
      ram: 'RAM',
      disk: 'Disco',
      cpu: 'CPU',
      gpu: 'GPU',
      binary: 'Binario',
      cores: 'núcleos',
      noGpu: 'Sin GPU detectada',
      notInstalled: 'No instalado',
      loadedModel: 'Modelo cargado',
      noLoadedModel: 'Ninguno cargado',
    },
    filters: {
      category: 'Categoría',
      qualityTier: 'Nivel de calidad',
      compatibleOnly: 'Solo compatibles',
      refreshCatalog: 'Refrescar catálogo',
      refreshing: 'Actualizando…',
      allCategories: 'Todas las categorías',
      allTiers: 'Todos los niveles',
      categoryCoding: 'Programación',
      categoryReasoning: 'Razonamiento',
      categoryThinking: 'Pensamiento',
      categoryGeneral: 'General',
      categoryFileGen: 'Generación de archivos',
    },
    downloads: {
      title: 'Descargas activas',
      empty: 'No hay descargas activas o recientes.',
      cancel: 'Cancelar',
      retry: 'Reintentar',
      remove: 'Cerrar',
      status: 'Estado',
      bytes: 'Bytes',
      files: 'Archivos',
      rate: 'Velocidad',
      eta: 'ETA',
      unknown: 'Preparando…',
    },
    deleteDialog: {
      title: 'Eliminar pesos',
      description: 'Esto elimina permanentemente los pesos descargados del disco.',
      promptLabel: 'Escriba para confirmar',
      placeholder: 'modelo:tag',
      cancel: 'Cancelar',
      confirm: 'Eliminar pesos',
      warning: 'No se puede deshacer. Tendrá que volver a descargar para usar este modelo.',
    },
    overrideDialog: {
      title: '¿Anular la verificación de hardware?',
      description: 'Su máquina no cumple las especificaciones recomendadas para este modelo.',
      reasonsTitle: 'Razones:',
      cancel: 'Cancelar',
      proceed: 'Descargar de todos modos',
    },
    configDialog: {
      title: 'Configuración de runtime',
      description: 'Ajuste los parámetros de llama.cpp para el modelo cargado.',
      ngpuLayers: 'Capas GPU',
      ngpuLayersHint: 'Número de capas en GPU. Vacío = automático.',
      ctxSize: 'Tamaño del contexto',
      ctxSizeHint: 'Ventana de contexto máxima en tokens.',
      threads: 'Hilos CPU',
      threadsHint: 'Número de hilos CPU. Vacío = automático.',
      cpuMoe: 'CPU MoE',
      cpuMoeHint: 'Ejecutar capas mixture-of-experts solo en CPU.',
      customArgs: 'Argumentos personalizados',
      customArgsHint: 'Flags adicionales de llama-server (allowlist aplicada).',
      cancel: 'Cancelar',
      save: 'Guardar',
    },
  },

  emailTemplates: {
    page: {
      title: 'Plantillas de correo electrónico',
      description:
        'Puntos de partida reutilizables (asunto + cuerpo) para correos redactados por IA. Los {{placeholders}} se rellenan al usar la plantilla.',
      loading: 'Cargando plantillas…',
      error: 'No se pudieron cargar las plantillas. Actualiza la página.',
      empty: 'Aún no hay plantillas. Crea una para comenzar.',
      create: 'Nueva plantilla',
      edit: 'Editar',
      delete: 'Eliminar',
      deleting: 'Eliminando…',
      defaultBadge: 'Predeterminada',
      subjectLabel: 'Asunto',
    },
    dialog: {
      createTitle: 'Crear plantilla',
      editTitle: 'Editar plantilla',
      nameLabel: 'Nombre',
      namePlaceholder: 'Correo de seguimiento',
      subjectLabel: 'Asunto',
      subjectPlaceholder: 'Seguimiento sobre {{topic}}',
      bodyLabel: 'Cuerpo',
      bodyPlaceholder: 'Hola {{name}},\n\nVolviendo al tema de {{topic}}…',
      defaultLabel: 'Usar como predeterminada',
      save: 'Guardar',
      saving: 'Guardando…',
      cancel: 'Cancelar',
    },
  },

  inbox: {
    page: {
      title: 'Bandeja del espacio de trabajo',
      description:
        'Cross-provider feed of every recent workspace object — filter by provider, type, attention.',
      loading: 'Cargando bandeja…',
      loadingMore: 'Cargando más…',
      loadMore: 'Cargar más',
      empty: 'No hay elementos que coincidan con los filtros.',
      error: 'No se pudo cargar la bandeja. Intenta refrescar.',
    },
    filter: {
      providers: 'Proveedor:',
      types: 'Tipo:',
      needsAttention: 'Requiere atención',
      hasSuggestion: 'Tiene sugerencia',
      reset: 'Restablecer filtros',
    },
    row: {
      needsAttention: 'Requiere atención',
      hasSuggestion: 'Tiene sugerencia',
      mark: 'Marcar como atención',
      unmark: 'Quitar atención',
      openExternal: 'Abrir',
      viewFile: 'Ver archivo',
    },
  },
  fileViewer: {
    loading: 'Cargando archivo…',
    error: 'No se pudo cargar este archivo.',
    unsupported:
      'No hay vista previa disponible para este tipo de archivo. Usa Descargar para abrirlo localmente.',
    download: 'Descargar',
    close: 'Cerrar',
  },
  search: {
    page: {
      title: 'Búsqueda semántica',
      description:
        'Busca en todos tus objetos del workspace — embeddings locales que preservan privacidad.',
      placeholder: 'Type a natural-language question…',
      submit: 'Buscar',
      searching: 'Buscando…',
      reset: 'Restablecer',
      local: 'Con embeddings locales ({model})',
      noResults: 'No se encontraron coincidencias. Prueba con otras palabras.',
      error: 'La búsqueda falló. Inténtalo de nuevo.',
    },
  },
  digest: {
    page: {
      title: 'Resumen',
      description: 'Tu resumen matutino: qué cambió en cada espacio conectado.',
      loading: 'Cargando resumen…',
      error: 'No se pudo cargar el resumen.',
      noTodayDigest: 'Aún no hay resumen para hoy. Genera uno o espera al cron.',
      today: 'Resumen de hoy',
      history: 'Resúmenes anteriores',
      generatedAt: 'Generado {ts}',
      sectionsCount: '{n} sections',
      triggerDaily: 'Generar resumen diario',
      triggerWeekly: 'Generar resumen semanal',
      triggering: 'Generando…',
      preferenceHint: 'Entrega diaria: {hour}:00 ({tz})',
    },
    section: {
      highlights: 'Destacados',
      actionItems: 'Acciones',
    },
  },
  adminAutomation: {
    dismiss: 'Descartar',
    retry: 'Reintentar',
    policies: {
      title: 'Políticas de acciones de IA',
      description:
        'Reglas de aprobación estrictas por defecto. Los valores predeterminados del sistema pueden desactivarse pero no eliminarse.',
      loading: 'Cargando políticas…',
      error: 'No se pudieron cargar las políticas.',
      empty: 'Aún no hay políticas configuradas.',
      systemDefault: 'Predeterminado del sistema',
      priority: 'Prioridad {p}',
      providerRegex: 'Regex de proveedor',
      actionKindRegex: 'Regex de tipo de acción',
      riskCeiling: 'Tope de riesgo',
      delete: 'Eliminar',
      cannotDelete: 'Los predeterminados del sistema no se pueden eliminar',
      toggleActive: 'Alternar activo',
      toggleSucceeded: 'Política actualizada.',
      toggleFailed: 'No se pudo actualizar la política.',
      deleteSucceeded: 'Política eliminada.',
      deleteFailed: 'No se pudo eliminar la política.',
      mutationError: 'Se produjo un error al actualizar la política.',
      addPolicy: 'Añadir política',
      editPolicy: 'Editar política',
      createTitle: 'Crear política',
      editTitle: 'Editar política',
      createDescription:
        'Define una nueva regla de aprobación para acciones de espacio de trabajo redactadas por IA.',
      editDescription: 'Actualiza esta regla de aprobación. El nombre no se puede cambiar.',
      createSucceeded: 'Política creada.',
      createFailed: 'No se pudo crear la política.',
      updateSucceeded: 'Política actualizada.',
      updateFailed: 'No se pudo actualizar la política.',
      submit: 'Guardar política',
      submitting: 'Guardando…',
      nameLabel: 'Nombre',
      nameHelp: 'Identificador en minúsculas y kebab-case (p. ej., deny-pii).',
      descriptionLabel: 'Descripción',
      kindFieldLabel: 'Tipo',
      requireReasonLabel: 'Requerir motivo para HIGH/CRITICAL',
      isActiveLabel: 'Activa',
      riskMaxScoreLabel: 'Puntuación máxima de riesgo (0–100)',
      priorityLabel: 'Prioridad (0–10000)',
      kindLabel: {
        DENY: 'Denegar',
        ALLOW: 'Permitir',
        AUTO_APPROVE: 'Aprobar automáticamente',
      },
      riskLabel: {
        LOW: 'Bajo',
        MEDIUM: 'Medio',
        HIGH: 'Alto',
        CRITICAL: 'Crítico',
      },
    },
    rules: {
      title: 'Reglas de activación de sugerencias',
      description:
        'Reglas que convierten eventos brutos del proveedor en sugerencias de borrador. Edita, desactiva o elimina.',
      loading: 'Cargando reglas…',
      error: 'No se pudieron cargar las reglas.',
      empty: 'Aún no hay reglas configuradas.',
      systemDefault: 'Predeterminado del sistema',
      priority: 'Prioridad {p}',
      eventType: 'Tipo de evento',
      actionKind: 'Tipo de acción',
      providerRegex: 'Regex de proveedor',
      contentRegex: 'Regex de contenido',
      delete: 'Eliminar',
      cannotDelete: 'Los predeterminados del sistema no se pueden eliminar',
      toggleActive: 'Alternar activo',
      toggleSucceeded: 'Regla actualizada.',
      toggleFailed: 'No se pudo actualizar la regla.',
      deleteSucceeded: 'Regla eliminada.',
      deleteFailed: 'No se pudo eliminar la regla.',
      mutationError: 'Se produjo un error al actualizar la regla.',
      addRule: 'Añadir regla',
      editRule: 'Editar regla',
      createTitle: 'Crear regla',
      editTitle: 'Editar regla',
      createDescription:
        'Define cuándo se debe redactar una sugerencia a partir de un evento del espacio de trabajo.',
      editDescription: 'Actualiza esta regla de activación. El nombre no se puede cambiar.',
      createSucceeded: 'Regla creada.',
      createFailed: 'No se pudo crear la regla.',
      updateSucceeded: 'Regla actualizada.',
      updateFailed: 'No se pudo actualizar la regla.',
      submit: 'Guardar regla',
      submitting: 'Guardando…',
      nameLabel: 'Nombre',
      nameHelp: 'Identificador en minúsculas y kebab-case (p. ej., github-pr-opened).',
      descriptionLabel: 'Descripción',
      eventTypeHelp: 'Patrón de evento como workspace.webhook.received.',
      actionKindHelp: 'Tipo de acción como SUMMARIZE, DRAFT, REWRITE.',
      isActiveLabel: 'Activa',
      priorityLabel: 'Prioridad (0–10000)',
    },
  },
  adminWebhooks: {
    page: {
      title: 'Entregas de webhook',
      description: 'Inspecciona y reproduce las entregas de webhook entrantes de tus proveedores.',
      loading: 'Cargando entregas…',
      error: 'No se pudieron cargar las entregas de webhook.',
      empty: 'Ninguna entrega coincide con tus filtros.',
    },
    filter: {
      providerPlaceholder: 'Filtrar por proveedor (p. ej. GITHUB)',
      connectorPlaceholder: 'Filtrar por ID de conector',
      signaturePlaceholder: 'Estado de firma',
      signatureAny: 'Cualquier firma',
      signatureValid: 'Firma válida',
      signatureInvalid: 'Firma inválida',
      clear: 'Limpiar filtros',
    },
    row: {
      deliveryId: 'ID de entrega',
      connector: 'Conector',
      bytes: 'Bytes del cuerpo',
      processedAt: 'Procesado en',
    },
    status: {
      accepted: 'Aceptado',
      rejected: 'Rechazado',
      idempotent: 'Idempotente',
    },
    replay: 'Reproducir',
    replaying: 'Reproduciendo…',
    replaySucceeded: 'Entrega de webhook reproducida.',
    replayFailed: 'No se pudo reproducir la entrega de webhook.',
  },
  implHandoff: {
    page: {
      title: 'Entregas de código',
      description:
        'Approved IMPL_PROMPT actions delivered to chat threads, agent terminals, or clipboard.',
      loading: 'Cargando entregas…',
      error: 'No se pudieron cargar las entregas.',
      empty: 'Aún no hay entregas. Aprueba un IMPL_PROMPT en la cola.',
      openThread: 'Abrir hilo de chat →',
    },
    picker: {
      title: 'Enviar IMPL_PROMPT a…',
      description: 'Elige dónde entregar el resumen de código aprobado.',
      cancel: 'Cancelar',
      CHAT: { hint: 'Abrir un hilo de chat nuevo con el brief precargado' },
      AGENT: { hint: 'Encolar en la terminal del agente conectado' },
      CLIPBOARD: { hint: 'Copiar al portapapeles para herramientas externas' },
    },
  },
  learned: {
    panel: {
      title: 'Lo que hemos aprendido',
      subtitle: '{count} preferences',
      description:
        'Patterns derived from your approve / reject / edit decisions. Used to personalise future suggestions.',
      loading: 'Cargando…',
      error: 'No se pudieron cargar las preferencias.',
      empty: 'Aprenderemos de tus aprobaciones — aún no hay preferencias.',
    },
  },
};
