import type { LocaleCatalog } from './types.ts'

// Spanish (es) translation catalog. Mirrors the key set in `fr.ts`.
// Style notes:
// - Sentence case (not Title Case) for headings.
// - Inverted punctuation (¿, ¡) where native.
// - Brand names ({{brandName}}, "OpenCode") and industry terms
//   (MCP, API, tokens) stay untranslated.

const strings: Record<string, string> = {
  // Common
  'common.save': 'Guardar',
  'common.cancel': 'Cancelar',
  'common.close': 'Cerrar',
  'common.delete': 'Eliminar',
  'common.remove': 'Quitar',
  'common.retry': 'Reintentar',
  'common.continue': 'Continuar',
  'common.back': 'Atrás',
  'common.loading': 'Cargando…',
  'common.yes': 'Sí',
  'common.no': 'No',
  'common.unknown': 'Desconocido',
  'common.version': 'Versión',

  // Login / Setup / Loading
  'login.welcome': 'Bienvenido a {{brandName}}',
  'login.signInGoogle': 'Iniciar sesión con Google',
  'login.failed': 'Error al iniciar sesión',
  'setup.welcomeUser': 'Bienvenido, {{name}}',
  'setup.welcomeGeneric': 'Bienvenido a {{brandName}}',
  'setup.description': 'Elige el proveedor y el modelo por defecto para esta instancia de {{brandName}}.',
  'setup.provider': 'Proveedor',
  'setup.model': 'Modelo',
  'setup.continue': 'Continuar',
  'setup.saveFailed': 'No se pudo guardar la configuración.',
  'setup.runtimeFailed': 'El runtime no pudo arrancar con las credenciales proporcionadas. Verifica tu clave API y vuelve a intentarlo.',
  'loading.boot': 'Iniciando…',
  'loading.auth': 'Verificando autenticación…',
  'loading.config': 'Cargando configuración…',
  'loading.runtime': 'Iniciando el runtime…',
  'loading.connecting': 'Conectando al runtime…',
  'loading.almostThere': 'Casi listo…',
  'loading.runtimeNeedsAttention': 'La configuración del runtime requiere tu atención.',
  'loading.error.title': '{{brandName}} no pudo iniciar el runtime',
  'loading.error.hint': 'Corrige la configuración inválida y reinicia la aplicación.',

  // Sidebar / navigation
  'sidebar.home': 'Inicio',
  'sidebar.agents': 'Agentes',
  'sidebar.capabilities': 'Capacidades',
  'sidebar.settings': 'Ajustes',
  'sidebar.threads': 'Conversaciones',
  'sidebar.search': 'Buscar conversación…',
  'sidebar.searchTitle': 'Buscar conversación (⌘K)',
  'sidebar.noThreads': 'Aún no hay conversaciones',
  'sidebar.noMatches': 'Sin resultados',
  'sidebar.threadFallback': 'Conversación {{id}}',
  'sidebar.newThread': 'Nueva conversación',
  'sidebar.newThreadInProject': 'Nueva conversación en un proyecto…',
  'newThread.blank': 'Conversación en blanco',
  'newThread.blankHint': 'Empieza con Build y los agentes, herramientas y habilidades disponibles',
  'newThread.project': 'Abrir un proyecto',
  'newThread.projectHint': 'Elige una carpeta — el agente podrá leer y modificar archivos',
  'sidebar.newChat': 'Nuevo chat',
  'newChat.blankUnavailableReason': 'No se puede crear un chat en este espacio de trabajo.',
  'newChat.unavailable': 'No disponible',
  'newChat.blankHint': 'Espacio local - empieza con Build y los compañeros, herramientas y habilidades disponibles',
  'newChat.blankCloudHint': 'Acción segura para Cloud - inicia un chat sincronizado en Cloud',
  'newChat.localOnlyAction': 'Acción solo local',
  'newChat.cloudAction': 'Acción de Cloud',
  'newChat.projectHint': 'Acción solo local - elige un directorio de proyecto que el compañero pueda leer y editar',
  'newChat.cloudProjectHint': 'Acción segura para Cloud - elige Git o sube una instantánea explícita',
  'newChat.projectBlocked': 'La creación de chats de proyecto está desactivada.',
  'newChat.createFailed': 'No se pudo crear un nuevo chat de proyecto. Vuelve a intentarlo.',
  'newChat.blank': 'Chat en blanco',
  'newChat.cloudProjectSubtitle': 'Inicia un chat de proyecto en Cloud desde Git o una instantánea subida explícitamente.',
  'newChat.createCloudProject': 'Crear chat de proyecto',
  'sidebar.busy': 'Ocupado',
  'sidebar.awaitingQuestion': 'Esperando tu respuesta',

  // Thread context menu
  'thread.rename': 'Renombrar',
  'thread.exportMarkdown': 'Exportar a Markdown',
  'thread.shareLink': 'Compartir enlace',
  'thread.linkCopied': '¡Enlace copiado!',
  'thread.viewChanges': 'Ver cambios',
  'thread.delete': 'Eliminar',
  'thread.deleteConfirm': '¿Eliminar esta conversación? Esta acción no se puede deshacer.',
  'agent.deleteConfirm': '¿Eliminar el agente «{{name}}»? Esta acción no se puede deshacer.',
  'mcp.deleteConfirm': '¿Quitar el MCP «{{name}}»? Esta acción no se puede deshacer.',
  'skill.deleteConfirm': '¿Quitar la habilidad «{{name}}»? Esta acción no se puede deshacer.',

  // Status bar
  'statusbar.ready': 'Listo',
  'statusbar.runtimeError': 'Error del runtime',
  'statusbar.sessionUsage': 'Uso de la sesión',
  'statusbar.inputTokens': 'Tokens de entrada',
  'statusbar.outputTokens': 'Tokens de salida',
  'statusbar.reasoningTokens': 'Tokens de razonamiento',
  'statusbar.cacheTokens': 'Tokens en caché',
  'statusbar.totalTokens': 'Total',
  'statusbar.totalCost': 'Coste total',

  // Runtime offline banner
  'runtime.offline': 'Runtime no disponible: {{error}}',
  'runtime.offlineLabel': 'Runtime no disponible:',
  'runtime.tryAgain': 'Reintentar',
  'runtime.restarting': 'Reiniciando…',

  // Home
  'homepage.title': 'Estado del espacio de trabajo, capacidades y salud de la ejecución en una sola vista.',
  'homepage.subtitle': 'Usa el inicio como un panel de observabilidad, no como una pantalla de bienvenida. Revisa qué está cargado, qué está conectado, qué usa OpenCode y dónde retomar.',
  'homepage.diagnostics': 'Diagnósticos de {{brandName}}',
  'homepage.refresh': 'Actualizar',
  'homepage.refreshing': 'Actualizando…',
  'homepage.range.last7d': 'Últimos 7 días',
  'homepage.range.last30d': 'Últimos 30 días',
  'homepage.range.ytd': 'Año actual',
  'homepage.range.all': 'Histórico',

  // Status pills
  'homepage.pill.runtime': 'Runtime',
  'homepage.pill.runtimeReady': 'Listo',
  'homepage.pill.runtimeLoading': 'Cargando diagnósticos',
  'homepage.pill.runtimeNotReady': 'No listo',
  'homepage.pill.provider': 'Proveedor',
  'homepage.pill.providerNotConfigured': 'No configurado',
  'homepage.pill.context': 'Contexto',
  'homepage.pill.contextTokens': '{{count}} tokens',
  'homepage.pill.contextUnknown': 'Límite desconocido',
  'homepage.pill.mcp': 'MCP',
  'homepage.pill.mcpConnected': '{{connected}}/{{total}} conectados',
  'homepage.pill.capabilities': 'Capacidades',
  'homepage.pill.capabilitiesSummary': '{{tools}} herramientas · {{skills}} habilidades',

  // Metric cards
  'homepage.card.toolsAndSkills': 'Herramientas y habilidades',
  'homepage.card.configuredTools': 'Herramientas configuradas',
  'homepage.card.activeSkills': 'Habilidades activas',
  'homepage.card.customSkills': 'Habilidades personalizadas',
  'homepage.card.customMcps': 'MCP personalizados',
  'homepage.card.connectedMcps': 'MCP conectados',
  'homepage.card.agents': 'Agentes integrados y personalizados',
  'homepage.card.primaryModes': 'Modos principales',
  'homepage.card.builtinAgents': 'Agentes integrados',
  'homepage.card.enabledCustomAgents': 'Personalizados activos',
  'homepage.card.invalidAgents': 'Necesitan atención',
  'homepage.card.leadAgent': 'Agente principal',
  'homepage.card.availableSubAgents': 'Sub-agentes disponibles',
  'homepage.card.usage': 'Conversaciones, tokens y coste',
  'homepage.card.threads': 'Conversaciones',
  'homepage.card.totalMessages': 'Mensajes',
  'homepage.card.trackedTokens': 'Tokens registrados',
  'homepage.card.trackedCost': 'Coste registrado',
  'homepage.card.userMessages': 'Mensajes de usuario',
  'homepage.card.assistantMessages': 'Mensajes del asistente',
  'homepage.card.toolCalls': 'Llamadas a herramientas',
  'homepage.card.busySessions': 'Sesiones activas',
  'homepage.card.refreshedAt': 'Actualizado a las {{time}}',
  'homepage.card.agentUsage': 'Uso por sub-agente',
  'homepage.card.agentUsageEmpty': 'No hay delegaciones a sub-agentes en {{window}}.',
  'homepage.card.perf': 'Rendimiento de hidratación y parches',
  'homepage.card.noPerfTelemetry': 'Aún no hay telemetría de rendimiento capturada.',
  'homepage.card.bundledTools': 'Herramientas integradas',
  'homepage.card.customTools': 'Herramientas personalizadas',
  'homepage.card.primaryMode': 'Modo principal',
  'homepage.card.visibleBuiltins': 'Integrados visibles',
  'homepage.card.noToolsDiscovered': 'Aún no se han descubierto herramientas.',
  'homepage.card.noBuiltinAgents': 'No hay agentes integrados disponibles.',
  'homepage.card.tokenMix': 'Distribución de tokens',
  'homepage.card.window': 'Ventana',
  'homepage.card.usageRefreshed': 'Uso actualizado',
  'homepage.card.notLoaded': 'No cargado',
  'homepage.card.busyRightNow': 'Activas ahora',
  'homepage.card.currentModel': 'Modelo actual',
  'homepage.card.contextWindow': 'Ventana de contexto',
  'homepage.card.notSet': 'No definido',
  'homepage.card.unknownLimit': 'Desconocido',
  'homepage.card.historicalUsageNote': 'El uso histórico se conserva por conversación y se superpone con las sesiones en vivo; los totales ya no dependen de abrir las conversaciones primero.',
  'homepage.card.backfillCompleted': ' Se actualizaron {{count}} resumen(es) antiguos en segundo plano.',
  'homepage.card.unknownSubAgent': 'Sub-agente desconocido',
  'homepage.card.tasks': 'tarea(s)',
  'homepage.card.tokShort': 'tok',
  'homepage.card.historyLoadP95': 'Carga de historial p95',
  'homepage.card.coldSyncP95': 'Sync en frío p95',
  'homepage.card.flushP95': 'Flush p95',
  'homepage.card.slowEvents': 'Eventos lentos',
  'homepage.card.flushWaitP95': 'Espera de flush p95',
  'homepage.card.patchPublishes': 'Parches publicados',
  'homepage.card.telemetrySamples': 'Muestras de telemetría',
  'homepage.card.perfLiveNote': 'Los diagnósticos vienen en vivo del motor del proceso principal. Los números provienen de los mismos pipelines de hidratación y parches que usa la vista de chat.',
  'homepage.card.perfEmptyHint': 'Aún no hay telemetría de rendimiento. Abre una conversación, transmite una respuesta y vuelve aquí para inspeccionar los tiempos del runtime.',

  // Sidebar widgets (home)
  'homepage.side.resumeThreads': 'Retomar conversaciones',
  'homepage.side.resumeEmpty': 'No hay conversaciones en {{window}}.',
  'homepage.side.recentWork': 'Trabajo reciente',
  'homepage.side.actions': 'Acciones',
  'homepage.side.openWorkingSurface': 'Abrir una superficie de trabajo',
  'homepage.side.newThread': 'Nueva conversación',
  'homepage.side.newThreadHint': 'Abre una conversación nueva vinculada al espacio de trabajo.',
  'homepage.side.openDirectory': 'Abrir carpeta',
  'homepage.side.openDirectoryHint': 'Basa la siguiente sesión en una base de código o carpeta real.',
  'homepage.side.currentInventory': 'Inventario actual',
  'homepage.side.availableTools': 'Herramientas disponibles',
  'homepage.side.skillBundles': 'Paquetes de habilidades',
  'homepage.side.runtimeInputs': 'Entradas del runtime',
  'homepage.side.opencodeVersion': 'OpenCode',
  'homepage.side.providerName': 'Proveedor',
  'homepage.side.providerSource': 'Origen del proveedor',
  'homepage.side.model': 'Modelo',
  'homepage.side.modelSource': 'Origen del modelo',
  'homepage.side.package': 'Paquete',
  'homepage.side.packageFallback': 'Integrado/runtime',
  'homepage.side.providerOptions': 'Opciones del proveedor',
  'homepage.side.credentialOverrides': 'Sobrescrituras de credenciales',
  'homepage.side.noOptions': 'No se exponen opciones no secretas del proveedor.',
  'homepage.side.usingDefaults': 'Usando valores por defecto.',

  // Home warnings
  'homepage.warning.backfillFailed': 'No se pudieron reconstruir {{count}} sesión(es) — los totales pueden quedar por debajo.',
  'homepage.warning.backfillPending': 'Cargando {{count}} sesión(es) antiguas en segundo plano. Los totales se actualizarán automáticamente.',

  // Tokens / agent / runtime misc
  'tokens.input': 'Entrada',
  'tokens.output': 'Salida',
  'tokens.reasoning': 'Razonamiento',
  'tokens.cache': 'Caché',
  'provider.none': 'Sin proveedor',
  'agent.unknown': 'Desconocido',
  'thread.sandbox': 'Conversación sandbox',
  'runtime.source.settings': 'Anulación desde ajustes',
  'runtime.source.default': 'Valor por defecto',
  'runtime.source.fallback': 'Valor de reserva',

  // Settings panel
  'settings.title': 'Ajustes',
  'settings.subtitle': 'Ajusta la interfaz, el runtime del modelo y los permisos locales.',
  'settings.done': 'Hecho',
  'settings.save': 'Guardar',
  'settings.saved': '✓ Guardado',
  'settings.saveChanges': 'Guardar cambios',
  'settings.saveHint': 'Los cambios de apariencia se aplican al instante. Los cambios de proveedor y permisos reinician el runtime cuando es necesario.',
  'settings.tab.appearance': 'Apariencia',
  'settings.tab.appearanceDescription': 'Tema, esquema de colores y fuentes',
  'settings.tab.models': 'Modelos',
  'settings.tab.modelsDescription': 'Proveedor, modelo y credenciales',
  'settings.tab.permissions': 'Permisos',
  'settings.tab.permissionsDescription': 'Acceso a herramientas locales',
  'settings.tab.storage': 'Almacenamiento',
  'settings.tab.storageDescription': 'Artefactos sandbox y limpieza',
  'settings.tab.language': 'Idioma',
  'settings.appearance.colorScheme': 'Esquema de colores',
  'settings.appearance.theme': 'Tema',
  'settings.appearance.themeActive': 'Activo',
  'settings.appearance.uiFont': 'Fuente de interfaz',
  'settings.appearance.monoFont': 'Fuente monoespaciada',
  'settings.appearance.preview': 'Vista previa',
  'settings.appearance.previewHealth': 'Salud del espacio de trabajo',
  'settings.appearance.previewHealthDescription': 'Proveedor conectado, runtime listo',
  'settings.appearance.previewActive': 'Activo',
  'settings.appearance.previewMessage': 'Los cambios de tema se aplican al instante.',
  'settings.appearance.previewMessageSecondary': 'Los cambios de proveedor y permisos siguen usando el botón Guardar.',
  'settings.models.provider': 'Proveedor',
  'settings.models.model': 'Modelo',
  'settings.models.featured': 'Destacado',
  'settings.models.allModels': 'Todos los modelos',
  'settings.models.refresh': 'Actualizar',
  'settings.models.refreshing': 'Actualizando…',
  'settings.models.refreshTitle': 'Actualizar el catálogo dinámico de modelos',
  'settings.models.search': 'Buscar entre {{count}} modelos…',
  'settings.models.noMatches': 'Ningún modelo coincide con la búsqueda.',
  'settings.models.credentialsHeader': 'Credenciales',
  'settings.permissions.header': 'Herramientas de desarrollo',
  'settings.permissions.bashTitle': 'Comandos de shell',
  'settings.permissions.bashDescription': 'Permite a los agentes ejecutar comandos de terminal dentro del espacio de trabajo activo.',
  'settings.permissions.fileWriteTitle': 'Edición de archivos',
  'settings.permissions.fileWriteDescription': 'Permite a los agentes crear y modificar archivos en el espacio de trabajo local.',
  'settings.storage.loading': 'Cargando almacenamiento sandbox…',
  'settings.storage.supportDiagnostics': 'Diagnósticos de soporte',
  'settings.storage.supportDescription': 'Copia un informe de texto plano (configuración, entradas del runtime, líneas recientes de log) al portapapeles. Las credenciales se enmascaran/ocultan para que sea seguro pegarlo en un informe de errores.',
  'settings.storage.copyDiagnostics': 'Copiar diagnósticos al portapapeles',
  'settings.storage.preparing': 'Preparando…',
  'settings.storage.copied': 'Copiado al portapapeles',
  'settings.storage.copyFailed': 'No se pudieron generar los diagnósticos — reintenta',
  'settings.storage.diagnosticsHint': 'Útil al abrir una incidencia — incluye este paquete en tu informe.',
  'settings.storage.sandboxStorage': 'Almacenamiento sandbox',
  'settings.storage.totalSize': 'Tamaño total',
  'settings.storage.workspaces': 'Espacios de trabajo',
  'settings.storage.referenced': 'Referenciados',
  'settings.storage.unreferenced': 'No referenciados',
  'settings.storage.stale': 'Obsoletos',
  'settings.storage.retention': 'Retención',
  'settings.storage.retentionDays': '{{days}} días',
  'settings.storage.cleanup': 'Limpieza',
  'settings.storage.clearOld': 'Borrar artefactos sandbox antiguos',
  'settings.storage.clearOldDescription': 'Elimina los espacios sandbox no referenciados con más de {{days}} días.',
  'settings.storage.clearAll': 'Borrar todos los artefactos sandbox no usados',
  'settings.storage.clearAllDescription': 'Elimina todos los espacios sandbox no referenciados manteniendo los de las conversaciones activas.',
  'settings.storage.cleaning': 'Limpiando…',
  'settings.storage.lastCleanup': 'La última limpieza eliminó {{count}} espacio(s) y liberó {{size}}.',
  'settings.storage.sandboxNote': 'Las conversaciones sandbox escriben en un espacio privado de Cowork en {{root}}. Los espacios antiguos no referenciados se purgan automáticamente; también puedes hacerlo manualmente aquí.',
  'settings.updates.header': 'Actualizaciones',
  'settings.updates.checkForUpdates': 'Buscar actualizaciones',
  'settings.updates.description': 'Consulta la API pública de GitHub Releases para la última versión publicada. Solo lectura: no hay descarga ni instalación automática.',
  'settings.updates.checking': 'Comprobando…',
  'settings.updates.newAvailable': 'Nueva versión disponible: {{version}}',
  'settings.updates.upToDate': 'Estás en la última versión ({{version}})',
  'settings.updates.unavailable': 'Búsqueda de actualizaciones no disponible',
  'settings.updates.failed': 'No se pudo buscar actualizaciones',
  'settings.updates.hint': 'Abre la página de releases de GitHub si hay una versión más reciente.',
  'settings.updates.currentHint': 'Estás en {{version}}. Haz clic abajo para abrir las notas de la versión.',
  'settings.updates.openReleaseNotes': 'Abrir notas de la versión',
  'settings.updates.resetFailed': 'No se pudieron restablecer los datos: {{message}}',
  'settings.updates.resetCheckLogs': 'Error al restablecer. Revisa los registros.',
  'settings.updates.checkFailedGeneric': 'Error al buscar actualizaciones.',
  'settings.reset.header': 'Restablecer',
  'settings.reset.title': 'Restablecer todos los datos',
  'settings.reset.description': 'Elimina todas las conversaciones, credenciales, agentes personalizados, habilidades y MCP de este dispositivo. La aplicación se reinicia en el flujo de primer uso. Útil antes de desinstalar o para una demo en blanco; destructivo e irreversible.',
  'settings.reset.button': 'Restablecer datos',
  'settings.reset.resetting': 'Restableciendo…',
  'settings.reset.requiresConfirm': 'Requiere confirmación explícita. La aplicación se cerrará y reiniciará.',
  'settings.reset.confirm': '¿Restablecer todos los datos?\n\nEsto elimina todas las conversaciones, credenciales, agentes personalizados, habilidades y MCP de este dispositivo. La aplicación se reiniciará en el flujo de primer uso. Irreversible.',
  'settings.language.label': 'Idioma',
  'settings.language.description': 'Elige el idioma de la interfaz. La selección se recuerda en este dispositivo. Los idiomas parcialmente traducidos mostrarán los textos faltantes en inglés.',
  'settings.language.systemDefault': 'Detección automática (sistema)',

  // Agent builder basics
  'agents.tab.skills': 'Habilidades',
  'agents.tab.tools': 'Herramientas',
  'agents.tab.instructions': 'Instrucciones',
  'agents.tab.inference': 'Inferencia',
  'agents.new': 'Nuevo agente',
  'agents.save': 'Guardar cambios',
  'agents.create': 'Crear agente',
  'agents.saving': 'Guardando…',
  'agents.openCapabilities': '¿Necesitas más herramientas o habilidades?',
  'agents.openCapabilitiesLink': 'Abrir Herramientas y habilidades',

  // Capabilities
  'capabilities.tab.tools': 'Herramientas',
  'capabilities.tab.skills': 'Habilidades',
  'capabilities.addMcp': 'Añadir un MCP',
  'capabilities.addSkill': 'Añadir una habilidad',
  'capabilities.noTools': 'Aún no hay herramientas. Añade un MCP desde la página Capacidades.',
  'capabilities.noSkills': 'Aún no hay habilidades. Añade un paquete desde la página Capacidades.',

  // Chat
  'chat.placeholder': 'Escribe un mensaje a {{brandName}}…',
  'chat.showContext': 'Mostrar contexto',
  'chat.hideContext': 'Ocultar contexto',
  'chat.thinking': 'Pensando…',

  // View error boundary
  'error.viewError': 'Error de vista',
  'error.viewErrorTitle': 'Esta página no se pudo renderizar.',
  'error.viewErrorBody': '{{brandName}} recuperó el resto de la aplicación. Vuelve al inicio e inténtalo de nuevo.',
  'error.backToHome': 'Volver al inicio',

  // Chat — approval
  'approval.sendEmail': 'Enviar correo',
  'approval.createSpreadsheet': 'Crear hoja de cálculo',
  'approval.createDocument': 'Crear documento',
  'approval.createPresentation': 'Crear presentación',
  'approval.delete': 'Eliminar',
  'approval.shareFile': 'Compartir archivo',
  'approval.createEvent': 'Crear evento',
  'approval.allowAction': 'Permitir acción',
  'approval.deny': 'Denegar',
  'approval.approve': 'Aprobar',

  // Chat — message actions
  'messageActions.branchHere': 'Ramificar aquí',
  'messageActions.branchHereDescription': 'Crear una nueva conversación que termina en este mensaje',
  'messageActions.revertHere': 'Revertir aquí',
  'messageActions.revertHereDescription': 'Revertir el estado de la sesión a justo antes de este mensaje',
  'messageActions.viewDiff': 'Ver diff',
  'messageActions.viewDiffDescription': 'Mostrar los cambios de archivo introducidos por este mensaje',
  'messageActions.branchFailed': 'No se pudo ramificar desde este mensaje. Inténtalo de nuevo.',
  'messageActions.revertConfirm': '¿Revertir la sesión a este mensaje? Los turnos posteriores se ocultarán hasta deshacer.',
  'messageActions.revertFailed': 'No se pudo revertir a este mensaje. Inténtalo de nuevo.',

  // Chat — input composer
  'chat.attachFile': 'Adjuntar archivo',
  'chat.planMode': 'Plan',
  'chat.buildMode': 'Build',
  'chat.planModeDescription': 'Modo Plan: análisis y auditorías de solo lectura',
  'chat.buildModeDescription': 'Modo Build: acceso completo y delegación',
  'chat.forkThread': 'Bifurcar conversación',
  'chat.stopGenerating': 'Detener generación (Esc)',
  'chat.awaitingApproval': 'Esperando aprobación',
  'chat.awaitingApprovalTitle': 'Aprueba o deniega la herramienta pendiente para continuar',
  'chat.awaitingAnswer': 'Esperando respuesta',
  'chat.awaitingAnswerTitle': 'Responde a la pregunta pendiente para continuar',
  'chat.placeholder.answerPending': 'Responde a la pregunta de arriba para continuar…',
  'chat.placeholder.askPlan': 'Pídele a Plan que analice o estructure el trabajo…',
  'chat.placeholder.askBuild': 'Pídele a Build que trabaje en esto…',
  'chat.placeholder.noThread': 'Inicia primero una nueva conversación',

  // Chat — diff viewer
  'diff.changesFromMessage': 'Cambios de este mensaje',
  'diff.changes': 'Cambios',
  'diff.closeChanges': 'Cerrar cambios',
  'diff.loading': 'Cargando cambios…',
  'diff.noChanges': 'Sin cambios de archivo en esta sesión',
  'diff.filesChanged': '{{count}} archivo(s) cambiado(s)',
  'diff.unified': 'Unificado',
  'diff.split': 'Dividido',
  'diff.noTextual': 'Sin diff textual disponible (archivo binario, renombrado o solo espacios).',
  'diff.couldNotLoad': 'No se pudo cargar el contenido del archivo',
  'diff.couldNotLoadWithError': 'No se pudo cargar: {{error}}',
  'diff.showHiddenLines': 'Mostrar {{count}} línea(s) sin cambios',
  'diff.collapse': 'Contraer',
  'diff.statusNew': 'Nuevo',
  'diff.statusDeleted': 'Eliminado',
  'diff.statusModified': 'Modificado',

  // Chat — thinking
  'thinking.buildCoordinating': 'Build está coordinando',
  'thinking.planning': 'Planificando',
  'thinking.generalWorking': 'General está trabajando',
  'thinking.exploreWorking': 'Explore está trabajando',
  'thinking.awaitingApproval': 'Esperando tu aprobación',
  'thinking.buildCoordinatingCount': 'Build está coordinando {{count}} agente(s)',
  'thinking.buildMerging': 'Build está fusionando los resultados',
  'thinking.agentWorking': '{{agent}} está trabajando',
  'thinking.thinking': 'Pensando',
  'thinking.compacting': 'Compactando la conversación para preservar el contexto…',
  'thinking.agentPlan': 'Plan del agente',
  'thinking.sessionTodos': 'Tareas de la sesión',

  // Chat — compaction
  'compaction.running': 'Compactando',
  'compaction.done': 'Compactado',
  'compaction.causeOverflow': 'desbordamiento',
  'compaction.causeAuto': 'auto',
  'compaction.causeManual': 'manual',
  'compaction.runningOverflow': 'La ventana de contexto se desbordó — recortando turnos antiguos para dejar espacio.',
  'compaction.runningAuto': 'Acercándose al límite de contexto — compactando de forma proactiva.',
  'compaction.runningManual': 'Resumiendo manualmente la sesión para condensar turnos antiguos.',
  'compaction.doneOverflow': 'Los turnos antiguos se resumieron porque la ventana de contexto estaba llena.',
  'compaction.doneAuto': 'Los turnos antiguos se resumieron automáticamente para dejar espacio a nuevas respuestas.',
  'compaction.doneManual': 'Los turnos antiguos se resumieron manualmente.',

  // Task status
  'taskStatus.running': 'en curso',
  'taskStatus.done': 'listo',
  'taskStatus.errored': 'con error',
  'taskStatus.queued': 'en cola',

  // Mission control / drill-in / question dock
  'taskRun.deeperTitle': 'Este sub-agente lanzó {{count}} sub-tarea(s) más. Haz clic en la línea para profundizar.',
  'taskDrillIn.backToParent': 'Volver a la tarea padre',
  'taskDrillIn.abortTask': 'Abortar esta tarea',
  'taskDrillIn.abortTaskDescription': 'Aborta solo este sub-agente; los hermanos y el principal siguen',
  'taskDrillIn.closeDrawer': 'Cerrar panel',
  'questionDock.pendingCount': '{{count}} preguntas pendientes en esta conversación',
  'questionDock.scrollToToolCall': 'Desplazarse a la llamada a herramienta de esta pregunta',
  'questionDock.typeOwnAnswer': 'Escribe tu propia respuesta',

  // Mermaid / model menu
  'mermaid.zoomOut': 'Alejar diagrama Mermaid',
  'mermaid.resetZoom': 'Restablecer zoom de Mermaid',
  'mermaid.zoomIn': 'Acercar diagrama Mermaid',
  'chatModelMenu.selectModel': 'Seleccionar modelo',
  'chatModelMenu.search': 'Buscar modelos…',

  // Agents page / card
  'agentsPage.title': 'Agentes',
  'agentsPage.subtitle': 'Compón especialistas a partir de habilidades, herramientas e instrucciones. Haz clic en una tarjeta para abrirla en el constructor.',
  'agentsPage.backToChat': 'Volver al chat',
  'agentsPage.search': 'Buscar agentes, habilidades, herramientas o instrucciones…',
  'agentsPage.importTitle': 'Importar un agente personalizado desde un archivo .cowork-agent.json',
  'agentsPage.import': 'Importar',
  'agentsPage.importFailed': 'No se pudo importar {{filename}}: {{error}}',
  'agentsPage.importConflict': 'Ya existe un agente personalizado llamado «{{name}}». ¿Reemplazarlo por el importado?',
  'studioTeamPage.eyebrow': 'Equipo',
  'studioTeamPage.title': 'Compañeros',
  'studioTeamPage.subtitle': 'Compón agentes de OpenCode en una lista de compañeros con roles, habilidades, herramientas y asignación de chat claras.',
  'studioTeamPage.customCount': 'personalizados',
  'studioTeamPage.builtInCount': 'integrados',
  'studioTeamPage.runtimeCount': 'runtime',
  'studioTeamPage.search': 'Buscar compañeros, habilidades, herramientas o instrucciones…',
  'studioTeamPage.filterLabel': 'Filtro de compañeros',
  'studioTeamPage.importTitle': 'Importar un compañero personalizado desde un archivo .cowork-agent.json',
  'studioTeamPage.importFailed': 'No se pudo importar {{filename}}: {{error}}',
  'studioTeamPage.importConflict': 'Ya existe un compañero personalizado llamado «{{name}}». ¿Reemplazarlo por el importado?',
  'studioTeamPage.newCoworker': 'Nuevo compañero',
  'studioTeamPage.customSection': 'Compañeros personalizados',
  'studioTeamPage.customSectionHelp': 'Creados por ti; edita, activa, exporta o elimina desde la tarjeta.',
  'studioTeamPage.noCustom': 'Aún no hay compañeros personalizados. Crea uno para empaquetar un rol repetible, instrucciones, habilidades y herramientas.',
  'studioTeamPage.noCustomMatch': 'Ningún compañero personalizado coincide con tu búsqueda.',
  'studioTeamPage.builtInSection': 'Compañeros integrados',
  'studioTeamPage.builtInSectionHelp': 'Especialistas de Open Cowork creados con habilidades y herramientas incluidas.',
  'studioTeamPage.noBuiltInMatch': 'Ningún compañero integrado coincide con tu búsqueda.',
  'studioTeamPage.runtimeSection': 'Compañeros registrados por runtime',
  'studioTeamPage.runtimeSectionHelp': 'Compañeros registrados por un plugin del SDK; OpenCode sigue siendo dueño de su comportamiento de ejecución.',
  'studioTeamPage.noRuntimeMatch': 'Ningún compañero de runtime coincide con tu búsqueda.',
  'studioTeamPage.noOpenCodeMatch': 'Ningún valor predeterminado de OpenCode coincide con tu búsqueda.',
  'agentCard.editAvatar': 'Editar avatar del agente',
  'agentCard.idPlaceholder': 'agent-id',
  'agentCard.descriptionPlaceholder': '¿En qué se especializa este agente?',
  'agentCard.enabledTitle': 'Visible en el chat',
  'agentCard.disabledTitle': 'Desactivado — no aparecerá en el chat',
  'agentCard.removeLabel': 'Quitar {{label}}',
  'agentCard.missingTool': 'Herramienta faltante: {{label}}',
  'avatarEditor.setColor': 'Definir color en {{label}}',
  'skillLibrary.empty': 'Aún no hay habilidades disponibles. Añade un paquete desde la página Capacidades.',
  'skillLibrary.needsTools': 'Necesita {{count}} herramienta(s)',
  'toolLibrary.empty': 'Aún no hay herramientas disponibles. Añade un MCP desde la página Capacidades.',
  'toolLibrary.writeTooltip': 'Esta herramienta puede escribir — amplía la huella del agente',

  'agentCard.edit': 'Editar',
  'agentCard.export': 'Exportar',
  'agentCard.exportTitle': 'Exportar este agente como un paquete JSON compartible',
  'agentCard.noDescription': 'Sin descripción',

  'capabilities.title': 'Herramientas y habilidades',
  'capabilities.subtitle': 'Inspecciona las herramientas y paquetes de habilidades disponibles en el contexto actual de OpenCode, incluyendo los añadidos integrados, de máquina, de proyecto y personalizados.',
  'capabilities.addTool': 'Añadir herramienta',
  'capabilities.addSkillButton': 'Añadir habilidad',
  'capabilities.searchTools': 'Buscar herramientas, descripciones o compañeros…',
  'capabilities.searchSkills': 'Buscar habilidades, descripciones o compañeros…',
  'capabilities.details': 'Detalles',
  'capabilities.connection': 'Conexión',
  'capabilities.linkedAgents': 'Agentes vinculados',
  'capabilities.linkedCoworkers': 'Compañeros vinculados',
  'capabilities.linkedTools': 'Herramientas vinculadas',
  'capabilities.skillContent': 'Contenido de la habilidad',
  'capabilities.usedByAgents': 'Usada por agentes',
  'capabilities.usedByCoworkers': 'Usada por compañeros',
  'capabilities.bundleFiles': 'Archivos del paquete',
  'capabilities.noToolsDiscovered': 'Aún no se han descubierto herramientas. Añade un MCP personalizado para ampliar el runtime.',
  'capabilities.noToolsMatch': 'Ninguna herramienta coincide con tu búsqueda.',
  'capabilities.noSkillsDiscovered': 'Aún no se han descubierto habilidades. Añade un paquete personalizado para ampliar los agentes.',
  'capabilities.noSkillsMatch': 'Ninguna habilidad coincide con tu búsqueda.',
  'capabilities.kindOpencodeTool': 'Herramienta OpenCode',
  'capabilities.kindCustomMcp': 'MCP personalizado',
  'capabilities.kindBuiltinTool': 'Herramienta integrada',
  'capabilities.kindMcpTool': 'Herramienta MCP',
  'capabilities.kindCustomSkill': 'Habilidad personalizada',
  'capabilities.kindBuiltinSkill': 'Habilidad integrada',
  'capabilities.skillSourceBundled': 'Habilidad integrada en {{brand}}',
  'capabilities.skillSourceProject': 'Habilidad de proyecto',
  'capabilities.skillSourceMachine': 'Habilidad de máquina',
  'capabilities.skillSourceBundle': 'Paquete de habilidades',

  'mcpForm.titleAdd': 'Añadir herramienta MCP',
  'mcpForm.titleEdit': 'Editar herramienta MCP — {{name}}',
  'mcpForm.subtitleAdd': 'Conecta un servidor Model Context Protocol y haz disponible su conjunto de herramientas dentro de {{brand}} y OpenCode.',
  'mcpForm.subtitleEdit': 'Actualiza la configuración de este MCP. Los cambios surten efecto tras recargar el runtime en {{brand}}.',
  'mcpForm.saving': 'Guardando…',
  'mcpForm.saveChanges': 'Guardar cambios',
  'mcpForm.addMcp': 'Añadir MCP',
  'mcpForm.completeBeforeSave': 'Completa estos antes de guardar',
  'mcpForm.whereToSave': 'Dónde guardarlo',
  'mcpForm.connectionType': 'Tipo de conexión',
  'mcpForm.connectionDetails': 'Detalles de conexión',
  'mcpForm.mcpId': 'ID de MCP',
  'mcpForm.displayName': 'Nombre para mostrar',
  'mcpForm.displayNamePlaceholder': 'p. ej. GitHub, Jira, Slack',
  'mcpForm.description': 'Descripción',
  'mcpForm.descriptionPlaceholder': 'A qué da acceso este MCP.',
  'mcpForm.command': 'Comando',
  'mcpForm.commandPlaceholder': 'p. ej. npx, node, python',
  'mcpForm.arguments': 'Argumentos',
  'mcpForm.argumentsPlaceholder': 'p. ej. -y @modelcontextprotocol/server-github',
  'mcpForm.envVars': 'Variables de entorno',
  'mcpForm.envValuePlaceholder': 'valor',
  'mcpForm.url': 'URL',
  'mcpForm.headers': 'Encabezados',
  'mcpForm.allowPrivateNetwork': 'Permitir red privada',
  'mcpForm.linkedSkills': 'Habilidades vinculadas',
  'mcpForm.preview': 'Vista previa del MCP',

  'skillForm.titleAdd': 'Añadir paquete de habilidades',
  'skillForm.titleEdit': 'Editar paquete — {{name}}',
  'skillForm.subtitle': 'Crea un paquete de habilidades real de OpenCode con `SKILL.md` más las referencias, ejemplos o plantillas que necesite.',
  'skillForm.addSkill': 'Añadir habilidad',
  'skillForm.importing': 'Importando…',
  'skillForm.importDirectory': 'Importar carpeta',
  'skillForm.bundleIdentity': 'Identidad del paquete',
  'skillForm.skillDirectory': 'Carpeta de la habilidad',
  'skillForm.skillDirectoryPlaceholder': 'p. ej. code-review, data-pipeline',
  'skillForm.skillDirectoryHint': 'Se guarda como carpeta de paquete. Mantenla en minúsculas y estable.',
  'skillForm.requiredTools': 'Herramientas requeridas',
  'skillForm.additionalFiles': 'Archivos adicionales',
  'skillForm.fileContents': 'Contenido del archivo',
  'skillForm.bundlePreview': 'Vista previa del paquete',

  'mcpRestriction.removeRestriction': 'Haz clic para quitar esta restricción',

  'commandPalette.search': 'Buscar acciones, agentes y comandos…',
  'commandPalette.noMatches': 'Ninguna acción coincide. Prueba una búsqueda más amplia.',
  'commandPalette.hint': 'Intro para ejecutar. Esc para cerrar.',

  'chart.generatedChart': 'Gráfico generado',

  'chat.composerAriaLabel': 'Compositor de mensajes (arrastra archivos para adjuntar)',
  'chat.revertedSessionTitle': 'Esta sesión está revertida — haz clic para restaurar los mensajes posteriores',
  'chat.transcriptAriaLabel': 'Transcripción del chat',

  'homepage.card.usageEyebrow': 'Uso',
  'homepage.card.agentUsageEyebrow': 'Uso de agentes',
  'homepage.card.perfEyebrow': 'Rendimiento',
  'homepage.card.selectedWindow': 'la ventana seleccionada',
  'homepage.side.selectedPeriod': 'el periodo seleccionado',
  'homepage.side.noRecentThreads': 'Aún no hay conversaciones en {{window}}. Inicia una desde las acciones de abajo y el inicio se convierte en tu cola.',

  'setup.modelIdPlaceholder': 'ID del modelo',

  'statusbar.thinking': 'Pensando…',
  'statusbar.agentWorking': '{{agent}} trabajando…',
  'statusbar.compacting': 'Compactando…',
  'statusbar.contextPercent': '{{percent}}% de contexto',
  'statusbar.contextCompactingSoon': '{{percent}}% · compactación inminente',
  'statusbar.contextCompactingDetail': 'Compactando turnos antiguos para preservar el contexto',
  'statusbar.contextCompactedDetail': 'Compactado tras {{percent}}% de {{limit}}',
  'statusbar.contextNearThreshold': '{{percent}}% de {{limit}} — compactación automática pronto',
  'statusbar.contextOfLimit': '{{percent}}% de {{limit}}',
  'statusbar.tokensCount': '{{count}} tokens',
  'statusbar.cacheRead': 'Lectura de caché',
  'statusbar.cacheWrite': 'Escritura de caché',
  'statusbar.contextWindow': 'Ventana de contexto',
  'statusbar.compactions': 'Compactaciones',
  'statusbar.lastCompacted': 'Última compactación',
  'statusbar.lastMeasuredInput': 'Última entrada medida',
  'statusbar.sessionCost': 'Coste de la sesión',
  'statusbar.totalAllSessions': 'Total (todas las sesiones)',

  'threadList.waitingForAnswer': 'Esperando tu respuesta',
  'threadList.working': 'Trabajando',
  'threadList.forked': 'Conversación bifurcada',
  'threadList.forkedFrom': 'Bifurcada de otra conversación',
  'threadList.reverted': 'revertida',
  'threadList.revertedTitle': 'La sesión está revertida a un mensaje anterior',

  'agentBuilder.saveThisAgentIn': 'Guardar este agente en',
  'agentCard.scope': 'Alcance',

  'agentPreview.title': 'Vista previa estática',
  'agentPreview.subtitle': 'Cómo verá OpenCode a este agente cuando se invoque. Sin llamada de red — solo la vista compilada.',
  'agentPreview.scopeLabel': 'Alcance {{scope}}',
  'agentPreview.mention': 'Mención',
  'agentPreview.toolsResolved': 'Herramientas resueltas',
  'agentPreview.skillsResolved': 'Habilidades resueltas',
  'agentPreview.nOfM': '{{n}} de {{m}}',
  'agentPreview.missingTools': 'Herramientas faltantes: {{list}}',
  'agentPreview.missingSkills': 'Habilidades faltantes: {{list}}',
  'agentPreview.systemPrompt': 'Prompt del sistema',
  'agentPreview.toolPatterns': 'Patrones de herramientas',
  'agentPreview.skillsAvailable': 'Habilidades disponibles para cargar',

  'agentTemplate.title': 'Crear un nuevo agente',
  'agentTemplate.subtitle': 'Elige una plantilla inicial para saltar el lienzo en blanco — luego podrás cambiar lo que quieras.',
  'agentTemplate.startBlank': 'Empezar en blanco',
  'agentTemplate.startBlankHint': 'Sin herramientas ni instrucciones preseleccionadas — diseña el agente desde cero.',
  'agentTemplate.temp': 'temp {{value}}',
  'agentTemplate.steps': '{{count}} pasos',
  'agentTemplate.toolHints': '{{count}} sugerencia(s) de herramienta',

  'avatarEditor.avatar': 'Avatar',
  'avatarEditor.color': 'Color',

  'capabilities.noSkillContent': 'Aún no hay contenido de paquete de habilidad disponible.',
  'capabilities.skillNotTiedToTool': 'Esta habilidad no está vinculada a ninguna herramienta específica.',

  'chart.savedAs': 'Guardado como',

  'chatModelMenu.noMatches': 'Sin resultados.',

  'instructions.headerHint': 'Da forma al tono, prioridades y formato de salida. Las buenas instrucciones son específicas y operacionales.',
  'instructions.addSnippet': '+ Fragmento',
  'instructions.noInstructions': 'Sin instrucciones.',
  'instructions.placeholderExamples': 'Ejemplos:\n- Resume los hallazgos en 3 puntos con evidencia.\n- Prefiere docs oficiales sobre blogs.\n- Nunca envíes email; solo redacta.\n- Pide aprobación antes de cualquier escritura externa.',
  'instructions.charCount': '{{count}} caracteres',
  'instructions.longPromptWarning': 'Los prompts largos consumen tokens — considera recortar',
  'instructions.snippet.conciseLabel': 'Sé conciso',
  'instructions.snippet.conciseBody': 'Responde en 3–5 puntos. Mantén la prosa ajustada. Corta lo que no sea esencial.',
  'instructions.snippet.askFirstLabel': 'Hacer preguntas aclaratorias',
  'instructions.snippet.askFirstBody': 'Si la solicitud es ambigua, haz una pregunta aclaratoria antes de actuar.',
  'instructions.snippet.citeLabel': 'Citar fuentes',
  'instructions.snippet.citeBody': 'Al resumir hallazgos, cita cada afirmación contra el documento fuente o URL.',
  'instructions.snippet.draftOnlyLabel': 'Redactar, nunca enviar',
  'instructions.snippet.draftOnlyBody': 'Produce solo borradores. Nunca envíes mensajes, correos ni acciones externas sin confirmación.',
  'instructions.snippet.structuredLabel': 'Salida estructurada',
  'instructions.snippet.structuredBody': 'Devuelve los resultados como un resumen ejecutivo corto, luego un desglose numerado.',

  'mcpForm.mcpIdHint': 'Se convierte en el espacio de nombres del runtime y el prefijo de permisos.',
  'mcpForm.runtimeNamespace': 'Espacio de nombres del runtime',
  'mcpForm.permissionPrefix': 'Prefijo de permiso',
  'mcpForm.connectionSummary': 'Resumen de conexión',
  'mcpForm.connectivityTest': 'Prueba de conectividad',
  'mcpForm.couldNotConnect': 'No se pudo conectar a este MCP.',
  'mcpForm.runTestHint': 'Ejecuta una prueba antes de guardar para confirmar que el servidor responde y expone métodos.',
  'mcpForm.reloadsRuntimeNote': '{{brand}} recarga el runtime automáticamente tras guardar.',

  'questionDock.question': 'Pregunta',
  'sessionInspector.planFromTaskRuns': 'Derivado de las ejecuciones de tareas activas',
  'sessionInspector.session': 'Sesión',

  'skillForm.bundleId': 'ID del paquete',
  'skillForm.frontmatterName': 'Nombre del frontmatter',
  'skillForm.noExtraBundleFiles': 'Aún no hay archivos extra en el paquete.',
  'skillForm.whatWillBeSaved': 'Lo que se guardará',

  'todo.untitled': 'Tarea sin título',

  'toolTrace.artifact': 'Artefacto',
  'toolTrace.agent': 'Agente',
  'toolTrace.subAgent': 'Sub-agente',
  'toolTrace.reveal': 'Revelar',
  'toolTrace.saving': 'Guardando…',
  'toolTrace.saveAs': 'Guardar como…',
  'toolTrace.input': 'Entrada',
  'toolTrace.output': 'Salida',
  'toolTrace.noDetails': 'Sin detalles disponibles',
  'toolTrace.generatedInSubAgent': 'Generado vía {{tool}} en trabajo de sub-agente',
  'toolTrace.generatedInThread': 'Generado vía {{tool}} en esta conversación',

  // ────────────────────────────────────────────────────────────
  // Home (welcoming landing)
  // ────────────────────────────────────────────────────────────
  'home.greeting.cowork': '¿En qué cotrabajamos hoy?',
  'home.subtitle': '{{brand}} · Pregunta lo que sea o @menciona a un agente',
  'home.composer.placeholder': 'Pregunta lo que sea o @menciona a un agente',
  'home.composer.send': 'Enviar',
  'home.composer.dropZone': 'Redactor — suelta archivos para adjuntar',
  'studioHome.greeting': '¿Qué debe abordar tu equipo hoy?',
  'studioHome.subtitle': '{{brand}} · Elige un compañero líder, @menciona especialistas y revisa el trabajo en un solo lugar',
  'studioHome.composer.placeholder': 'Pregunta lo que sea o @menciona a un compañero',
  'studioHome.coachmark': 'Escribe una indicación, adjunta contexto o @menciona a un compañero — ⌘K para comandos.',
  'studioHome.agentNudge': '@menciona a un compañero',
  'home.suggestions.title': 'Prueba',
  'home.recent.title': 'Retoma donde lo dejaste',
  'home.recent.untitled': 'Conversación sin título',
  'home.statusStrip.ready': 'Listo',
  'home.statusStrip.mcps': '{{connected}}/{{total}} MCP',
  'home.statusStrip.viewMore': 'Pulso',

}

export const es: LocaleCatalog = {
  locale: 'es',
  nativeLabel: 'Español',
  strings,
}
