feat(ui): add locales and split catalogs

Adds Spanish, French, Russian, Japanese, and Simplified Chinese catalogs and wires supported locales into the i18n layer.
This commit is contained in:
Shantur Rathore
2026-01-26 12:56:26 +00:00
parent 5b1e21345f
commit feccbd13bd
89 changed files with 4531 additions and 30 deletions

View File

@@ -0,0 +1,6 @@
export const advancedSettingsMessages = {
"advancedSettings.title": "Configuración avanzada",
"advancedSettings.environmentVariables.title": "Variables de entorno",
"advancedSettings.environmentVariables.subtitle": "Se aplican cada vez que inicia una nueva instancia de OpenCode",
"advancedSettings.actions.close": "Cerrar",
} as const

View File

@@ -0,0 +1,29 @@
export const appMessages = {
"app.launchError.title": "No se pudo iniciar OpenCode",
"app.launchError.description": "No pudimos iniciar el binario de OpenCode seleccionado. Revisa la salida de error abajo o elige un binario distinto en Configuración avanzada.",
"app.launchError.binaryPathLabel": "Ruta del binario",
"app.launchError.errorOutputLabel": "Salida de error",
"app.launchError.openAdvancedSettings": "Abrir Configuración avanzada",
"app.launchError.close": "Cerrar",
"app.launchError.closeTitle": "Cerrar (Esc)",
"app.launchError.fallbackMessage": "No se pudo iniciar el workspace",
"app.stopInstance.confirmMessage": "¿Detener la instancia de OpenCode? Esto detendrá el servidor.",
"app.stopInstance.title": "Detener instancia",
"app.stopInstance.confirmLabel": "Detener",
"app.stopInstance.cancelLabel": "Seguir ejecutándose",
"emptyState.logoAlt": "Logo de CodeNomad",
"emptyState.brandTitle": "CodeNomad",
"emptyState.tagline": "Selecciona una carpeta para empezar a programar con IA",
"emptyState.actions.selectFolder": "Seleccionar carpeta",
"emptyState.actions.selecting": "Seleccionando...",
"emptyState.keyboardShortcut": "Atajo de teclado: {shortcut}",
"emptyState.examples": "Ejemplos: {example}",
"emptyState.multipleInstances": "Puedes tener varias instancias de la misma carpeta",
"releases.upgradeRequired.title": "Actualización requerida",
"releases.upgradeRequired.message.withVersion": "Actualiza a CodeNomad {version} para usar la UI más reciente.",
"releases.upgradeRequired.message.noVersion": "Actualiza CodeNomad para usar la UI más reciente.",
"releases.upgradeRequired.action.getUpdate": "Obtener actualización",
} as const

View File

@@ -0,0 +1,160 @@
export const commandMessages = {
"commandPalette.title": "Paleta de comandos",
"commandPalette.description": "Busca y ejecuta comandos",
"commandPalette.searchPlaceholder": "Escribe un comando o busca...",
"commandPalette.empty": "No se encontraron comandos para \"{query}\"",
"commandPalette.category.customCommands": "Comandos personalizados",
"commandPalette.category.instance": "Instancia",
"commandPalette.category.session": "Sesión",
"commandPalette.category.agentModel": "Agente y modelo",
"commandPalette.category.inputFocus": "Entrada y foco",
"commandPalette.category.system": "Sistema",
"commandPalette.category.other": "Otro",
"commands.newInstance.label": "Nueva instancia",
"commands.newInstance.description": "Abrir el selector de carpetas para crear una nueva instancia",
"commands.newInstance.keywords": "carpeta, proyecto, workspace",
"commands.closeInstance.label": "Cerrar instancia",
"commands.closeInstance.description": "Detener el servidor de la instancia actual",
"commands.closeInstance.keywords": "detener, salir, cerrar",
"commands.nextInstance.label": "Siguiente instancia",
"commands.nextInstance.description": "Cambiar a la siguiente pestaña de instancia",
"commands.nextInstance.keywords": "cambiar, navegar",
"commands.previousInstance.label": "Instancia anterior",
"commands.previousInstance.description": "Cambiar a la pestaña de instancia anterior",
"commands.previousInstance.keywords": "cambiar, navegar",
"commands.newSession.label": "Nueva sesión",
"commands.newSession.description": "Crear una nueva sesión principal",
"commands.newSession.keywords": "crear, iniciar",
"commands.closeSession.label": "Cerrar sesión",
"commands.closeSession.description": "Cerrar la sesión principal actual",
"commands.closeSession.keywords": "cerrar, detener",
"commands.scrubSessions.label": "Depurar sesiones",
"commands.scrubSessions.description": "Eliminar sesiones vacías, sesiones de subagente que ya completaron su tarea principal y sesiones bifurcadas innecesarias.",
"commands.scrubSessions.keywords": "limpieza, blanco, vacías, sesiones, quitar, eliminar, depurar",
"commands.instanceInfo.label": "Info de la instancia",
"commands.instanceInfo.description": "Abrir el resumen de la instancia para ver logs y estado",
"commands.instanceInfo.keywords": "info, logs, consola, salida",
"commands.nextSession.label": "Siguiente sesión",
"commands.nextSession.description": "Cambiar a la siguiente pestaña de sesión",
"commands.nextSession.keywords": "cambiar, navegar",
"commands.previousSession.label": "Sesión anterior",
"commands.previousSession.description": "Cambiar a la pestaña de sesión anterior",
"commands.previousSession.keywords": "cambiar, navegar",
"commands.compactSession.label": "Compactar sesión",
"commands.compactSession.description": "Resumir y compactar la sesión actual",
"commands.compactSession.keywords": "resumir, comprimir",
"commands.compactSession.errorFallback": "No se pudo compactar la sesión",
"commands.compactSession.alert.title": "La compactación falló",
"commands.compactSession.alert.message": "La compactación falló: {message}",
"commands.undoLastMessage.label": "Deshacer último mensaje",
"commands.undoLastMessage.description": "Revertir el último mensaje",
"commands.undoLastMessage.keywords": "revertir, deshacer",
"commands.undoLastMessage.none.title": "No hay acciones para deshacer",
"commands.undoLastMessage.none.message": "Nada que deshacer",
"commands.undoLastMessage.failed.title": "No se pudo deshacer",
"commands.undoLastMessage.failed.message": "No se pudo revertir el mensaje",
"commands.openModelSelector.label": "Abrir selector de modelo",
"commands.openModelSelector.description": "Elegir un modelo diferente",
"commands.openModelSelector.keywords": "modelo, llm, IA",
"commands.selectModelVariant.label": "Seleccionar variante del modelo",
"commands.selectModelVariant.description": "Elegir un nivel de esfuerzo de pensamiento para el modelo actual",
"commands.selectModelVariant.keywords": "variante, pensamiento, razonamiento, esfuerzo",
"commands.openAgentSelector.label": "Abrir selector de agente",
"commands.openAgentSelector.description": "Elegir un agente diferente",
"commands.openAgentSelector.keywords": "agente, modo",
"commands.clearInput.label": "Limpiar entrada",
"commands.clearInput.description": "Borrar el área de texto del prompt",
"commands.clearInput.keywords": "limpiar, reiniciar",
"commands.thinkingBlocks.label.show": "Mostrar bloques de pensamiento",
"commands.thinkingBlocks.label.hide": "Ocultar bloques de pensamiento",
"commands.thinkingBlocks.description": "Mostrar/ocultar el proceso de pensamiento de la IA",
"commands.thinkingBlocks.keywords": "pensamiento, razonamiento, alternar, mostrar, ocultar",
"commands.timelineToolCalls.label.show": "Mostrar llamadas de herramienta en la línea de tiempo",
"commands.timelineToolCalls.label.hide": "Ocultar llamadas de herramienta en la línea de tiempo",
"commands.timelineToolCalls.description": "Alternar entradas de llamadas de herramienta en la línea de tiempo de mensajes",
"commands.timelineToolCalls.keywords": "línea de tiempo, herramienta, alternar",
"commands.common.expanded": "Expandido",
"commands.common.collapsed": "Colapsado",
"commands.common.visible": "Visible",
"commands.common.hidden": "Oculto",
"commands.common.enabled": "Activado",
"commands.common.disabled": "Desactivado",
"commands.thinkingBlocksDefault.label": "Bloques de pensamiento por defecto · {state}",
"commands.thinkingBlocksDefault.description": "Alternar si los bloques de pensamiento empiezan expandidos",
"commands.thinkingBlocksDefault.keywords": "pensamiento, razonamiento, expandir, colapsar, por defecto",
"commands.diffViewSplit.label": "Usar vista de diff dividida",
"commands.diffViewSplit.description": "Mostrar diffs de llamadas de herramienta lado a lado",
"commands.diffViewSplit.keywords": "diff, dividir, vista",
"commands.diffViewUnified.label": "Usar vista de diff unificada",
"commands.diffViewUnified.description": "Mostrar diffs de llamadas de herramienta en línea",
"commands.diffViewUnified.keywords": "diff, unificada, vista",
"commands.toolOutputsDefault.label": "Salidas de herramientas por defecto · {state}",
"commands.toolOutputsDefault.description": "Alternar la expansión por defecto de las salidas de herramientas",
"commands.toolOutputsDefault.keywords": "herramienta, salida, expandir, colapsar",
"commands.diagnosticsDefault.label": "Diagnósticos por defecto · {state}",
"commands.diagnosticsDefault.description": "Alternar la expansión por defecto de la salida de diagnósticos",
"commands.diagnosticsDefault.keywords": "diagnósticos, expandir, colapsar",
"commands.tokenUsageDisplay.label": "Mostrar uso de tokens · {state}",
"commands.tokenUsageDisplay.description": "Mostrar u ocultar estadísticas de tokens y costo en los mensajes del asistente",
"commands.tokenUsageDisplay.keywords": "token, uso, costo, estadísticas",
"commands.autoCleanupBlankSessions.label": "Auto-limpieza de sesiones vacías · {state}",
"commands.autoCleanupBlankSessions.description": "Limpiar automáticamente las sesiones vacías al crear nuevas",
"commands.autoCleanupBlankSessions.keywords": "auto, limpieza, vacías, sesiones, alternar",
"commands.showHelp.label": "Mostrar ayuda",
"commands.showHelp.description": "Mostrar atajos de teclado y ayuda",
"commands.showHelp.keywords": "atajos, ayuda",
"commands.custom.argumentsPrompt.message": "Argumentos para /{name}",
"commands.custom.argumentsPrompt.title": "Comando personalizado",
"commands.custom.argumentsPrompt.inputLabel": "Argumentos",
"commands.custom.argumentsPrompt.inputPlaceholder": "p. ej. foo bar",
"commands.custom.argumentsPrompt.confirmLabel": "Ejecutar",
"commands.custom.argumentsPrompt.cancelLabel": "Cancelar",
"commands.custom.argumentsPrompt.openFailed.message": "No se pudo abrir el diálogo de argumentos.",
"commands.custom.argumentsPrompt.openFailed.title": "Argumentos del comando",
"commands.custom.entries.descriptionFallback": "Comando personalizado",
"commands.custom.sessionRequired.message": "Selecciona una sesión antes de ejecutar un comando personalizado.",
"commands.custom.sessionRequired.title": "Se requiere sesión",
"commands.custom.runFailed.message": "No se pudo ejecutar el comando personalizado. Revisa la consola para más detalles.",
"commands.custom.runFailed.title": "El comando falló",
"unifiedPicker.loading.searching": "Buscando...",
"unifiedPicker.loading.loadingWorkspace": "Cargando workspace...",
"unifiedPicker.title.command": "Seleccionar comando",
"unifiedPicker.title.mention": "Seleccionar agente o archivo",
"unifiedPicker.empty": "No se encontraron resultados",
"unifiedPicker.sections.commands": "COMANDOS",
"unifiedPicker.sections.agents": "AGENTES",
"unifiedPicker.sections.files": "ARCHIVOS",
"unifiedPicker.badge.subagent": "subagente",
"unifiedPicker.footer.navigate": "navegar",
"unifiedPicker.footer.select": "seleccionar",
"unifiedPicker.footer.close": "cerrar",
} as const

View File

@@ -0,0 +1,16 @@
export const dialogMessages = {
"alertDialog.fallbackTitle.info": "Aviso",
"alertDialog.fallbackTitle.warning": "Por favor revisa",
"alertDialog.fallbackTitle.error": "Algo salió mal",
"alertDialog.actions.confirm": "Confirmar",
"alertDialog.actions.run": "Ejecutar",
"alertDialog.actions.ok": "OK",
"alertDialog.actions.cancel": "Cancelar",
"alertDialog.prompt.inputLabel": "Entrada",
"backgroundProcessOutputDialog.title": "Salida en segundo plano",
"backgroundProcessOutputDialog.actions.close": "Cerrar",
"backgroundProcessOutputDialog.loading": "Cargando salida...",
"backgroundProcessOutputDialog.truncatedNotice": "Salida truncada para mostrar.",
"backgroundProcessOutputDialog.loadErrorFallback": "No se pudo cargar la salida.",
} as const

View File

@@ -0,0 +1,43 @@
export const filesystemMessages = {
"directoryBrowser.defaultDescription": "Explora carpetas bajo la raíz del workspace configurado.",
"directoryBrowser.close": "Cerrar",
"directoryBrowser.currentFolder": "Carpeta actual",
"directoryBrowser.selectCurrent": "Seleccionar actual",
"directoryBrowser.newFolder": "Nueva carpeta",
"directoryBrowser.creating": "Creando…",
"directoryBrowser.loadingFolders": "Cargando carpetas…",
"directoryBrowser.noFolders": "No hay carpetas disponibles.",
"directoryBrowser.upOneLevel": "Subir un nivel",
"directoryBrowser.select": "Seleccionar",
"directoryBrowser.load.errorFallback": "No se pudo cargar el sistema de archivos",
"directoryBrowser.createFolder.promptMessage": "Crea una nueva carpeta en el directorio actual.",
"directoryBrowser.createFolder.title": "Nueva carpeta",
"directoryBrowser.createFolder.inputLabel": "Nombre de la carpeta",
"directoryBrowser.createFolder.inputPlaceholder": "p. ej. mi-nuevo-proyecto",
"directoryBrowser.createFolder.confirmLabel": "Crear",
"directoryBrowser.createFolder.cancelLabel": "Cancelar",
"directoryBrowser.createFolder.invalidNameMessage": "Introduce un único nombre de carpeta.",
"directoryBrowser.createFolder.invalidNameDetail": "Los nombres de carpeta no pueden incluir barras, '..' ni '~'.",
"directoryBrowser.createFolder.errorFallback": "No se pudo crear la carpeta",
"filesystemBrowser.descriptionFallback": "Busca una ruta bajo la raíz del workspace configurado.",
"filesystemBrowser.rootLabel": "Raíz: {root}",
"filesystemBrowser.actions.close": "Cerrar",
"filesystemBrowser.actions.retry": "Reintentar",
"filesystemBrowser.actions.select": "Seleccionar",
"filesystemBrowser.filterLabel": "Filtro",
"filesystemBrowser.search.placeholder.directories": "Buscar carpetas",
"filesystemBrowser.search.placeholder.files": "Buscar archivos",
"filesystemBrowser.currentFolder.label": "Carpeta actual",
"filesystemBrowser.currentFolder.selectCurrent": "Seleccionar actual",
"filesystemBrowser.loading.filesystem": "sistema de archivos",
"filesystemBrowser.loading.workspaceRoot": "raíz del workspace",
"filesystemBrowser.loading.loadingWithPath": "Cargando {path}…",
"filesystemBrowser.empty.noEntries": "No se encontraron elementos.",
"filesystemBrowser.navigation.upOneLevel": "Subir un nivel",
"filesystemBrowser.hints.navigate": "Navegar",
"filesystemBrowser.hints.select": "Seleccionar",
"filesystemBrowser.hints.close": "Cerrar",
"filesystemBrowser.errors.loadFilesystemFallback": "No se pudo cargar el sistema de archivos",
"filesystemBrowser.errors.openDirectoryFallback": "No se pudo abrir el directorio",
} as const

View File

@@ -0,0 +1,34 @@
export const folderSelectionMessages = {
"folderSelection.logoAlt": "Logo de CodeNomad",
"folderSelection.tagline": "Selecciona una carpeta para empezar a programar con IA",
"folderSelection.links.github": "GitHub de CodeNomad",
"folderSelection.links.githubStars": "Estrellas de CodeNomad en GitHub",
"folderSelection.links.discord": "Discord de CodeNomad",
"folderSelection.empty.title": "No hay carpetas recientes",
"folderSelection.empty.description": "Explora una carpeta para comenzar",
"folderSelection.recent.title": "Carpetas recientes",
"folderSelection.recent.subtitle.one": "{count} carpeta disponible",
"folderSelection.recent.subtitle.other": "{count} carpetas disponibles",
"folderSelection.recent.remove": "Quitar de recientes",
"folderSelection.browse.title": "Explorar carpetas",
"folderSelection.browse.subtitle": "Selecciona cualquier carpeta en tu ordenador",
"folderSelection.browse.button": "Explorar carpetas",
"folderSelection.browse.buttonOpening": "Abriendo...",
"folderSelection.advancedSettings": "Configuración avanzada",
"folderSelection.hints.navigate": "Navegar",
"folderSelection.hints.select": "Seleccionar",
"folderSelection.hints.remove": "Quitar",
"folderSelection.hints.browse": "Explorar",
"folderSelection.loading.title": "Iniciando instancia...",
"folderSelection.loading.subtitle": "Espera un momento mientras preparamos tu workspace.",
"folderSelection.dialog.title": "Seleccionar workspace",
"folderSelection.dialog.description": "Selecciona un workspace para empezar a programar.",
} as const

View File

@@ -0,0 +1,36 @@
import { advancedSettingsMessages } from "./advancedSettings"
import { appMessages } from "./app"
import { commandMessages } from "./commands"
import { dialogMessages } from "./dialogs"
import { filesystemMessages } from "./filesystem"
import { folderSelectionMessages } from "./folderSelection"
import { instanceMessages } from "./instance"
import { loadingScreenMessages } from "./loadingScreen"
import { logMessages } from "./logs"
import { markdownMessages } from "./markdown"
import { messagingMessages } from "./messaging"
import { remoteAccessMessages } from "./remoteAccess"
import { sessionMessages } from "./session"
import { settingsMessages } from "./settings"
import { timeMessages } from "./time"
import { toolCallMessages } from "./toolCall"
import { mergeMessageParts } from "../merge"
export const esMessages = mergeMessageParts(
folderSelectionMessages,
advancedSettingsMessages,
loadingScreenMessages,
timeMessages,
appMessages,
dialogMessages,
filesystemMessages,
instanceMessages,
logMessages,
sessionMessages,
messagingMessages,
toolCallMessages,
markdownMessages,
settingsMessages,
remoteAccessMessages,
commandMessages,
)

View File

@@ -0,0 +1,125 @@
export const instanceMessages = {
"instanceTabs.new.title": "Nueva instancia (Cmd/Ctrl+N)",
"instanceTabs.new.ariaLabel": "Nueva instancia",
"instanceTabs.remote.title": "Conexión remota",
"instanceTabs.remote.ariaLabel": "Conexión remota",
"instanceInfo.title": "Información de la instancia",
"instanceInfo.labels.folder": "Carpeta",
"instanceInfo.labels.project": "Proyecto",
"instanceInfo.labels.versionControl": "Control de versiones",
"instanceInfo.labels.opencodeVersion": "Versión de OpenCode",
"instanceInfo.labels.binaryPath": "Ruta del binario",
"instanceInfo.labels.environmentVariables": "Variables de entorno ({count})",
"instanceInfo.loading": "Cargando...",
"instanceInfo.server.title": "Servidor",
"instanceInfo.server.port": "Puerto:",
"instanceInfo.server.pid": "PID:",
"instanceInfo.server.status": "Estado:",
"instanceTab.status.permission": "Esperando permiso",
"instanceTab.status.compacting": "Compactando",
"instanceTab.status.working": "Trabajando",
"instanceTab.status.idle": "Inactiva",
"instanceTab.status.ariaLabel": "Estado de la instancia: {status}",
"instanceTab.actions.close.ariaLabel": "Cerrar instancia",
"instanceShell.leftPanel.sessionsTitle": "Sesiones",
"instanceShell.leftPanel.instanceInfo": "Info de la instancia",
"instanceShell.leftDrawer.pin": "Fijar panel izquierdo",
"instanceShell.leftDrawer.unpin": "Desfijar panel izquierdo",
"instanceShell.leftDrawer.toggle.pinned": "Panel izquierdo fijado",
"instanceShell.leftDrawer.toggle.open": "Abrir panel izquierdo",
"instanceShell.leftDrawer.toggle.close": "Cerrar panel izquierdo",
"instanceShell.rightDrawer.pin": "Fijar panel derecho",
"instanceShell.rightDrawer.unpin": "Desfijar panel derecho",
"instanceShell.rightDrawer.toggle.pinned": "Panel derecho fijado",
"instanceShell.rightDrawer.toggle.open": "Abrir panel derecho",
"instanceShell.rightDrawer.toggle.close": "Cerrar panel derecho",
"instanceShell.metrics.usedLabel": "Usado",
"instanceShell.metrics.availableLabel": "Disp.",
"instanceShell.commandPalette.openAriaLabel": "Abrir paleta de comandos",
"instanceShell.commandPalette.button": "Paleta de comandos",
"instanceShell.connection.ariaLabel": "Connection {status}",
"instanceShell.connection.connected": "Conectada",
"instanceShell.connection.connecting": "Conectando...",
"instanceShell.connection.disconnected": "Desconectada",
"instanceShell.connection.unknown": "Desconocida",
"instanceWelcome.shortcuts.newSession": "Nueva sesión",
"instanceWelcome.empty.title": "No hay sesiones anteriores",
"instanceWelcome.empty.description": "Crea una nueva sesión abajo para comenzar",
"instanceWelcome.loading.title": "Cargando sesiones",
"instanceWelcome.loading.description": "Obteniendo tus sesiones anteriores...",
"instanceWelcome.resume.title": "Reanudar sesión",
"instanceWelcome.resume.subtitle.one": "{count} sesión disponible",
"instanceWelcome.resume.subtitle.other": "{count} sesiones disponibles",
"instanceWelcome.session.untitled": "Sesión sin título",
"instanceWelcome.new.title": "Iniciar nueva sesión",
"instanceWelcome.new.subtitle": "Reutilizaremos tu último agente/modelo automáticamente",
"instanceWelcome.new.createButton": "Crear sesión",
"instanceWelcome.overlay.close": "Cerrar",
"instanceWelcome.actions.viewInstanceInfo": "Ver info de la instancia",
"instanceWelcome.actions.renameTitle": "Renombrar sesión",
"instanceWelcome.actions.deleteTitle": "Eliminar sesión",
"instanceWelcome.hints.navigate": "Navegar",
"instanceWelcome.hints.jump": "Saltar",
"instanceWelcome.hints.firstLast": "Primero/Último",
"instanceWelcome.hints.resume": "Reanudar",
"instanceWelcome.hints.delete": "Eliminar",
"instanceWelcome.toasts.renameError": "No se pudo renombrar la sesión",
"instanceDisconnected.title": "Instancia desconectada",
"instanceDisconnected.folderFallback": "este workspace",
"instanceDisconnected.reasonFallback": "El servidor dejó de responder",
"instanceDisconnected.description": "{folder} ya no se puede alcanzar. Cierra la pestaña para seguir trabajando.",
"instanceDisconnected.details.title": "Detalles",
"instanceDisconnected.details.folderLabel": "Carpeta:",
"instanceDisconnected.actions.closeInstance": "Cerrar instancia",
"instanceShell.empty.title": "No hay sesión seleccionada",
"instanceShell.empty.description": "Selecciona una sesión para ver mensajes",
"instanceShell.rightPanel.title": "Panel de estado",
"instanceShell.rightPanel.sections.plan": "Plan",
"instanceShell.rightPanel.sections.backgroundProcesses": "Shells en segundo plano",
"instanceShell.rightPanel.sections.mcp": "Servidores MCP",
"instanceShell.rightPanel.sections.lsp": "Servidores LSP",
"instanceShell.rightPanel.sections.plugins": "Plugins",
"instanceShell.plan.noSessionSelected": "Selecciona una sesión para ver el plan.",
"instanceShell.plan.empty": "Aún no hay nada planificado.",
"instanceShell.backgroundProcesses.empty": "No hay procesos en segundo plano.",
"instanceShell.backgroundProcesses.status": "Estado: {status}",
"instanceShell.backgroundProcesses.output": "Salida: {sizeKb} KB",
"instanceShell.backgroundProcesses.actions.output": "Salida",
"instanceShell.backgroundProcesses.actions.stop": "Detener",
"instanceShell.backgroundProcesses.actions.terminate": "Terminar",
"versionPill.appWithVersion": "App {version}",
"versionPill.ui": "UI",
"versionPill.uiWithVersion": "UI {version}",
"versionPill.source": " ({source})",
"opencodeBinarySelector.title": "Binario de OpenCode",
"opencodeBinarySelector.subtitle": "Elige qué ejecutable de OpenCode debe ejecutarse",
"opencodeBinarySelector.customPath.placeholder": "Introduce la ruta al binario de opencode…",
"opencodeBinarySelector.actions.add": "Agregar",
"opencodeBinarySelector.actions.browse": "Explorar binario…",
"opencodeBinarySelector.actions.removeTitle": "Quitar binario",
"opencodeBinarySelector.badge.systemPath": "Usar binario del PATH del sistema",
"opencodeBinarySelector.status.checkingVersions": "Comprobando versiones…",
"opencodeBinarySelector.status.checking": "Comprobando…",
"opencodeBinarySelector.dialog.title": "Seleccionar binario de OpenCode",
"opencodeBinarySelector.dialog.description": "Explora los archivos expuestos por el servidor del CLI.",
"opencodeBinarySelector.validation.invalidBinary": "Binario de OpenCode no válido",
"opencodeBinarySelector.validation.alreadyValidating": "Ya se está validando",
"opencodeBinarySelector.display.systemPath": "{name} (PATH del sistema)",
"opencodeBinarySelector.versionLabel": "v{version}",
} as const

View File

@@ -0,0 +1,17 @@
export const loadingScreenMessages = {
"loadingScreen.logoAlt": "Logo de CodeNomad",
"loadingScreen.status.issue": "Se produjo un problema",
"loadingScreen.actions.showAnother": "Mostrar otra",
"loadingScreen.errors.missingRoot": "No se encontró el elemento raíz de carga",
"loadingScreen.phrases.neurons": "Calentando las neuronas de la IA…",
"loadingScreen.phrases.daydreaming": "Convenciendo a la IA de dejar de soñar despierta…",
"loadingScreen.phrases.goggles": "Puliendo las gafas de código de la IA…",
"loadingScreen.phrases.reorganizingFiles": "Pidiéndole a la IA que deje de reorganizar tus archivos…",
"loadingScreen.phrases.coffee": "Dándole más café a la IA…",
"loadingScreen.phrases.nodeModules": "Enseñándole a la IA a no borrar node_modules (otra vez)…",
"loadingScreen.phrases.actNatural": "Diciéndole a la IA que actúe natural antes de que llegues…",
"loadingScreen.phrases.rewritingHistory": "Pidiéndole a la IA que deje de reescribir la historia…",
"loadingScreen.phrases.stretch": "Dejando que la IA se estire antes de su sprint de código…",
"loadingScreen.phrases.keyboardControl": "Convenciendo a la IA de devolverte el control del teclado…",
} as const

View File

@@ -0,0 +1,18 @@
export const logMessages = {
"logsView.title": "Registros del servidor",
"logsView.actions.show": "Mostrar registros del servidor",
"logsView.actions.hide": "Ocultar registros del servidor",
"logsView.envVars.title": "Variables de entorno ({count})",
"logsView.paused.title": "Los registros del servidor están en pausa",
"logsView.paused.description": "Activa el streaming para ver la actividad de tu servidor de OpenCode.",
"logsView.empty.waiting": "Esperando la salida del servidor...",
"logsView.scrollToBottom": "Desplazarse al final",
"infoView.logs.title": "Registros del servidor",
"infoView.logs.actions.show": "Mostrar registros del servidor",
"infoView.logs.actions.hide": "Ocultar registros del servidor",
"infoView.logs.paused.title": "Los registros del servidor están en pausa",
"infoView.logs.paused.description": "Activa el streaming para ver la actividad de tu servidor de OpenCode.",
"infoView.logs.empty.waiting": "Esperando la salida del servidor...",
"infoView.logs.scrollToBottom": "Desplazarse al final",
} as const

View File

@@ -0,0 +1,7 @@
export const markdownMessages = {
"markdown.codeBlock.copy.label": "Copiar",
"markdown.codeBlock.copy.copied": "¡Copiado!",
"markdown.codeBlock.copy.failed": "Error",
"markdown.copy": "Copiar",
} as const

View File

@@ -0,0 +1,109 @@
export const messagingMessages = {
"messageListHeader.sidebar.openSessionListAriaLabel": "Abrir lista de sesiones",
"messageListHeader.metrics.usedLabel": "Usado",
"messageListHeader.metrics.availableLabel": "Disp.",
"messageListHeader.commandPalette.ariaLabel": "Abrir paleta de comandos",
"messageListHeader.commandPalette.button": "Paleta de comandos",
"messageListHeader.connection.connected": "Conectado",
"messageListHeader.connection.connecting": "Conectando...",
"messageListHeader.connection.disconnected": "Desconectado",
"messageSection.empty.logoAlt": "Logo de CodeNomad",
"messageSection.empty.brandTitle": "CodeNomad",
"messageSection.empty.title": "Inicia una conversación",
"messageSection.empty.description": "Escribe un mensaje abajo o abre la Paleta de comandos:",
"messageSection.empty.tips.commandPalette": "Paleta de comandos",
"messageSection.empty.tips.askAboutCodebase": "Pregunta sobre tu codebase",
"messageSection.empty.tips.attachFilesPrefix": "Adjunta archivos con",
"messageSection.loading.messages": "Cargando mensajes...",
"messageSection.scroll.toFirstAriaLabel": "Desplazarse al primer mensaje",
"messageSection.scroll.toLatestAriaLabel": "Desplazarse al último mensaje",
"messageSection.quote.addAsQuote": "Añadir como cita",
"messageSection.quote.addAsCode": "Añadir como código",
"messageTimeline.ariaLabel": "Línea de tiempo de mensajes",
"messageTimeline.segment.user.label": "Tú",
"messageTimeline.segment.assistant.label": "Asist.",
"messageTimeline.segment.compaction.label": "Compactación",
"messageTimeline.tool.fallbackLabel": "Llamada de herramienta",
"messageTimeline.tooltip.userFallback": "Mensaje del usuario",
"messageTimeline.tooltip.assistantFallback": "Respuesta del asistente",
"messageTimeline.tooltip.compaction.auto": "Compactación automática",
"messageTimeline.tooltip.compaction.manual": "Compactación manual",
"messageTimeline.text.filePrefix": "[Archivo] {filename}",
"messageTimeline.text.attachment": "Adjunto",
"messageBlock.tool.header": "Llamada de herramienta",
"messageBlock.tool.unknown": "desconocido",
"messageBlock.tool.goToSession.label": "Ir a sesión",
"messageBlock.tool.goToSession.title": "Ir a la sesión",
"messageBlock.tool.goToSession.unavailableTitle": "La sesión aún no está disponible",
"messageBlock.compaction.ariaLabel": "Compactación de sesión",
"messageBlock.compaction.autoLabel": "Sesión compactada automáticamente",
"messageBlock.compaction.manualLabel": "Sesión compactada por ti",
"messageBlock.usage.input": "Entrada",
"messageBlock.usage.output": "Salida",
"messageBlock.usage.reasoning": "Razonamiento",
"messageBlock.usage.cacheRead": "Lectura de cache",
"messageBlock.usage.cacheWrite": "Escritura de cache",
"messageBlock.usage.cost": "Costo",
"messageBlock.step.agentLabel": "Agente: {agent}",
"messageBlock.step.modelLabel": "Modelo: {model}",
"messageBlock.reasoning.thinkingLabel": "Pensamiento",
"messageBlock.reasoning.expandAriaLabel": "Expandir pensamiento",
"messageBlock.reasoning.collapseAriaLabel": "Colapsar pensamiento",
"messageBlock.reasoning.indicator.hide": "Ocultar",
"messageBlock.reasoning.indicator.view": "Ver",
"messageBlock.reasoning.detailsAriaLabel": "Detalles del razonamiento",
"codeBlockInline.actions.copy": "Copiar",
"codeBlockInline.actions.copied": "¡Copiado!",
"messageItem.speaker.you": "Tú",
"messageItem.speaker.assistant": "Asistente",
"messageItem.actions.revert": "Revertir",
"messageItem.actions.revertTitle": "Revertir a este mensaje",
"messageItem.actions.fork": "Fork",
"messageItem.actions.forkTitle": "Fork desde este mensaje",
"messageItem.actions.copy": "Copiar",
"messageItem.actions.copyTitle": "Copiar mensaje",
"messageItem.actions.copied": "¡Copiado!",
"messageItem.status.queued": "EN COLA",
"messageItem.status.generating": "Generando...",
"messageItem.status.sending": "Enviando...",
"messageItem.status.failedToSend": "No se pudo enviar el mensaje",
"messageItem.attachment.defaultName": "adjunto",
"messageItem.attachment.downloadAriaLabel": "Descargar {name}",
"messageItem.agentMeta.agentLabel": "Agente: {agent}",
"messageItem.agentMeta.modelLabel": "Modelo: {model}",
"messageItem.errors.authenticationFallback": "Error de autenticación",
"messageItem.errors.outputLengthExceeded": "Se excedió la longitud de salida del mensaje",
"messageItem.errors.requestAborted": "La solicitud fue abortada",
"messageItem.errors.unknownFallback": "Se produjo un error desconocido",
"attachmentChip.removeAriaLabel": "Quitar adjunto",
"expandButton.toggleAriaLabel": "Alternar altura de entrada del chat",
"promptInput.placeholder.shell": "Ejecuta un comando de shell (Esc para salir)...",
"promptInput.placeholder.default": "Escribe tu mensaje, @file, @agent, o pega imágenes y texto...",
"promptInput.hints.shell.exit": "para salir del modo shell",
"promptInput.hints.shell.enable": "Modo shell",
"promptInput.hints.commands": "Comandos",
"promptInput.history.previousAriaLabel": "Prompt anterior",
"promptInput.history.nextAriaLabel": "Siguiente prompt",
"promptInput.overlay.newLine": "Nueva línea",
"promptInput.overlay.send": "Enviar",
"promptInput.overlay.filesAgents": "Archivos/agentes",
"promptInput.overlay.history": "Historial",
"promptInput.overlay.attachments": "• {count} archivo(s) adjunto(s)",
"promptInput.overlay.shellModeActive": "Modo shell activo",
"promptInput.overlay.press": "Pulsa",
"promptInput.overlay.againToAbort": "otra vez para abortar la sesión",
"promptInput.stopSession.ariaLabel": "Detener sesión",
"promptInput.stopSession.title": "Detener sesión",
"promptInput.send.ariaLabel": "Enviar mensaje",
"promptInput.send.errorFallback": "No se pudo enviar el mensaje",
"promptInput.send.errorTitle": "Error al enviar",
} as const

View File

@@ -0,0 +1,51 @@
export const remoteAccessMessages = {
"remoteAccess.eyebrow": "Transferencia remota",
"remoteAccess.title": "Conectar a CodeNomad de forma remota",
"remoteAccess.subtitle": "Usa las direcciones de abajo para abrir CodeNomad desde otro dispositivo.",
"remoteAccess.close": "Cerrar acceso remoto",
"remoteAccess.refresh": "Actualizar",
"remoteAccess.sections.listeningMode.label": "Modo de escucha",
"remoteAccess.sections.listeningMode.help": "Permite o limita las transferencias remotas vinculando a todas las interfaces o solo a localhost.",
"remoteAccess.toggle.on": "Activado",
"remoteAccess.toggle.off": "Desactivado",
"remoteAccess.toggle.title": "Permitir conexiones desde otras IP",
"remoteAccess.toggle.caption.all": "Vinculado a 0.0.0.0",
"remoteAccess.toggle.caption.local": "Vinculado a 127.0.0.1",
"remoteAccess.toggle.note": "Cambiar esto requiere reiniciar y detiene temporalmente todas las instancias activas. Comparte las direcciones de abajo una vez que el servidor se reinicie.",
"remoteAccess.listeningMode.restartConfirm.message": "¿Reiniciar para aplicar el modo de escucha? Esto detendrá todas las instancias en ejecución.",
"remoteAccess.listeningMode.restartConfirm.title.all": "Abrir a otros dispositivos",
"remoteAccess.listeningMode.restartConfirm.title.local": "Limitar a este dispositivo",
"remoteAccess.listeningMode.restartConfirm.confirmLabel": "Reiniciar ahora",
"remoteAccess.listeningMode.restartConfirm.cancelLabel": "Cancelar",
"remoteAccess.restart.errorManual": "No se pudo reiniciar automáticamente. Reinicia la app para aplicar el cambio.",
"remoteAccess.sections.serverPassword.label": "Contraseña del servidor",
"remoteAccess.sections.serverPassword.help": "Las transferencias remotas requieren una contraseña. Define una fácil de recordar para habilitar inicios de sesión desde otros dispositivos.",
"remoteAccess.authStatus.unavailable": "Estado de autenticación no disponible.",
"remoteAccess.username": "Usuario: {username}",
"remoteAccess.password.status.set": "Hay una contraseña configurada para el acceso remoto.",
"remoteAccess.password.status.unset": "Aún no hay una contraseña fácil de recordar. Configura una para permitir inicios de sesión por transferencia remota.",
"remoteAccess.password.actions.cancel": "Cancelar",
"remoteAccess.password.actions.change": "Cambiar contraseña",
"remoteAccess.password.actions.set": "Configurar contraseña",
"remoteAccess.password.form.newPassword": "Nueva contraseña",
"remoteAccess.password.form.confirmPassword": "Confirmar contraseña",
"remoteAccess.password.form.placeholder": "Al menos 8 caracteres",
"remoteAccess.password.error.tooShort": "La contraseña debe tener al menos 8 caracteres.",
"remoteAccess.password.error.mismatch": "Las contraseñas no coinciden.",
"remoteAccess.password.save.saving": "Guardando…",
"remoteAccess.password.save.label": "Guardar contraseña",
"remoteAccess.sections.addresses.label": "Direcciones accesibles",
"remoteAccess.sections.addresses.help": "Abre o escanea desde otra máquina para transferir el control.",
"remoteAccess.addresses.loading": "Cargando direcciones…",
"remoteAccess.addresses.none": "Aún no hay direcciones disponibles.",
"remoteAccess.address.scope.network": "Red",
"remoteAccess.address.scope.loopback": "Loopback",
"remoteAccess.address.scope.internal": "Interna",
"remoteAccess.address.open": "Abrir",
"remoteAccess.address.showQr": "Mostrar QR",
"remoteAccess.address.hideQr": "Ocultar QR",
"remoteAccess.address.qrAlt": "QR para {url}",
} as const

View File

@@ -0,0 +1,67 @@
export const sessionMessages = {
"sessionPicker.title": "OpenCode • {folder}",
"sessionPicker.empty.noPrevious": "No hay sesiones anteriores",
"sessionPicker.resume.title": "Reanudar una sesión ({count}):",
"sessionPicker.session.untitled": "Sin título",
"sessionPicker.divider.or": "o",
"sessionPicker.new.title": "Iniciar nueva sesión:",
"sessionPicker.agents.loading": "Cargando agentes...",
"sessionPicker.actions.creating": "Creando...",
"sessionPicker.actions.createSession": "Crear sesión",
"sessionPicker.actions.cancel": "Cancelar",
"sessionList.header.title": "Sesiones",
"sessionList.session.untitled": "Sin título",
"sessionList.status.working": "Trabajando",
"sessionList.status.compacting": "Compactando",
"sessionList.status.idle": "Inactiva",
"sessionList.status.needsPermission": "Requiere permiso",
"sessionList.status.needsInput": "Requiere entrada",
"sessionList.expand.collapseAriaLabel": "Colapsar sesión",
"sessionList.expand.expandAriaLabel": "Expandir sesión",
"sessionList.expand.collapseTitle": "Colapsar",
"sessionList.expand.expandTitle": "Expandir",
"sessionList.actions.copyId.ariaLabel": "Copiar ID de sesión",
"sessionList.actions.copyId.title": "Copiar ID de sesión",
"sessionList.actions.rename.ariaLabel": "Renombrar sesión",
"sessionList.actions.rename.title": "Renombrar sesión",
"sessionList.actions.delete.ariaLabel": "Eliminar sesión",
"sessionList.actions.delete.title": "Eliminar sesión",
"sessionList.copyId.success": "ID de sesión copiado",
"sessionList.copyId.error": "No se pudo copiar el ID de sesión",
"sessionList.delete.error": "No se pudo eliminar la sesión",
"sessionList.rename.error": "No se pudo renombrar la sesión",
"sessionRenameDialog.title": "Renombrar sesión",
"sessionRenameDialog.description.withLabel": "Actualiza el título de \"{label}\".",
"sessionRenameDialog.description.default": "Establece un nuevo título para esta sesión.",
"sessionRenameDialog.input.label": "Nombre de la sesión",
"sessionRenameDialog.input.placeholder": "Introduce un nombre de sesión",
"sessionRenameDialog.actions.cancel": "Cancelar",
"sessionRenameDialog.actions.rename": "Renombrar",
"sessionRenameDialog.actions.renaming": "Renombrando…",
"sessionView.fallback.sessionNotFound": "No se encontró la sesión",
"sessionView.alerts.abortFailed.message": "No se pudo detener la sesión",
"sessionView.alerts.abortFailed.title": "No se pudo detener",
"sessionView.alerts.revertFailed.message": "No se pudo revertir al mensaje",
"sessionView.alerts.revertFailed.title": "No se pudo revertir",
"sessionView.alerts.forkFailed.message": "No se pudo hacer fork de la sesión",
"sessionView.alerts.forkFailed.title": "No se pudo hacer fork",
"sessionView.attachments.expandPastedTextAriaLabel": "Expandir texto pegado",
"sessionView.attachments.insertPastedTextTitle": "Insertar texto pegado",
"sessionView.attachments.removeAriaLabel": "Quitar adjunto",
"sessionEvents.sessionCompactedToast": "La sesión {label} fue compactada",
"sessionEvents.sessionError.unknown": "Error desconocido",
"sessionEvents.sessionError.title": "Error de sesión",
"sessionEvents.sessionError.message": "Error: {message}",
"sessionState.cleanup.deepConfirm.message": "Esta limpieza puede ser lenta y puede eliminar sesiones que no pretendías eliminar. ¿Estás seguro?",
"sessionState.cleanup.deepConfirm.title": "Limpieza profunda de sesiones",
"sessionState.cleanup.deepConfirm.detail": "La limpieza profunda de sesiones eliminará todas las sesiones sin mensajes, quitará cualquier sesión de subagente finalizada y limpiará cualquier fork no usado de una sesión.",
"sessionState.cleanup.deepConfirm.confirmLabel": "Continuar",
"sessionState.cleanup.deepConfirm.cancelLabel": "Cancelar",
"sessionState.cleanup.toast.one": "Se limpió {count} sesión vacía",
"sessionState.cleanup.toast.other": "Se limpiaron {count} sesiones vacías",
} as const

View File

@@ -0,0 +1,54 @@
export const settingsMessages = {
"instanceServiceStatus.sections.lsp": "Servidores LSP",
"instanceServiceStatus.sections.mcp": "Servidores MCP",
"instanceServiceStatus.sections.plugins": "Plugins",
"instanceServiceStatus.lsp.loading": "Cargando servidores LSP...",
"instanceServiceStatus.lsp.empty": "No se detectaron servidores LSP.",
"instanceServiceStatus.lsp.status.connected": "Conectado",
"instanceServiceStatus.lsp.status.error": "Error",
"instanceServiceStatus.mcp.loading": "Cargando servidores MCP...",
"instanceServiceStatus.mcp.empty": "No se detectaron servidores MCP.",
"instanceServiceStatus.mcp.toggleAriaLabel": "Alternar servidor MCP {name}",
"instanceServiceStatus.plugins.loading": "Cargando plugins...",
"instanceServiceStatus.plugins.empty": "No hay plugins configurados.",
"permissionBanner.pendingRequests.one": "{count} solicitud pendiente",
"permissionBanner.pendingRequests.other": "{count} solicitudes pendientes",
"permissionBanner.detail.permission.one": "{count} permiso",
"permissionBanner.detail.permission.other": "{count} permisos",
"permissionBanner.detail.question.one": "{count} pregunta",
"permissionBanner.detail.question.other": "{count} preguntas",
"permissionBanner.detail.wrapper": " ({detail})",
"agentSelector.placeholder": "Seleccionar agente...",
"agentSelector.badge.subagent": "subagente",
"agentSelector.none": "Ninguno",
"agentSelector.trigger.primary": "Agente: {agent}",
"modelSelector.placeholder.search": "Buscar modelos...",
"modelSelector.none": "Ninguno",
"modelSelector.trigger.primary": "Modelo: {model}",
"thinkingSelector.variant.default": "Por defecto",
"thinkingSelector.label": "Pensamiento: {variant}",
"envEditor.title": "Variables de entorno",
"envEditor.count.one": "({count} variable)",
"envEditor.count.other": "({count} variables)",
"envEditor.fields.name.placeholder": "Nombre de la variable",
"envEditor.fields.name.readOnlyTitle": "Nombre de la variable (solo lectura)",
"envEditor.fields.value.placeholder": "Valor de la variable",
"envEditor.actions.remove.title": "Quitar variable",
"envEditor.actions.add.title": "Agregar variable",
"envEditor.empty": "No hay variables de entorno configuradas. Agrega variables arriba para personalizar el entorno de OpenCode.",
"envEditor.help": "Estas variables estarán disponibles en el entorno de OpenCode al iniciar instancias.",
"contextUsagePanel.headings.tokens": "Tokens",
"contextUsagePanel.headings.context": "Contexto",
"contextUsagePanel.labels.input": "Entrada",
"contextUsagePanel.labels.output": "Salida",
"contextUsagePanel.labels.cost": "Costo",
"contextUsagePanel.labels.used": "Usado",
"contextUsagePanel.labels.available": "Disp.",
"contextUsagePanel.unavailable": "--",
} as const

View File

@@ -0,0 +1,6 @@
export const timeMessages = {
"time.relative.justNow": "justo ahora",
"time.relative.daysAgoShort": "hace {count} d",
"time.relative.hoursAgoShort": "hace {count} h",
"time.relative.minutesAgoShort": "hace {count} m",
} as const

View File

@@ -0,0 +1,121 @@
export const toolCallMessages = {
"toolCall.pending.waitingToRun": "Esperando para ejecutar...",
"toolCall.error.label": "Error:",
"toolCall.diff.label": "Diff",
"toolCall.diff.label.withPath": "Diff · {path}",
"toolCall.diff.viewMode.ariaLabel": "Modo de vista de diff",
"toolCall.diff.viewMode.split": "Dividida",
"toolCall.diff.viewMode.unified": "Unificada",
"toolCall.diagnostics.title": "Diagnósticos",
"toolCall.diagnostics.ariaLabel": "Diagnósticos",
"toolCall.diagnostics.ariaLabel.withLabel": "Diagnósticos {label}",
"toolCall.diagnostics.severity.error.short": "ERR",
"toolCall.diagnostics.severity.warning.short": "WARN",
"toolCall.diagnostics.severity.info.short": "INFO",
"toolCall.renderer.toolName.shell": "Shell",
"toolCall.renderer.toolName.fetch": "Fetch",
"toolCall.renderer.toolName.invalid": "Inválido",
"toolCall.renderer.toolName.plan": "Plan",
"toolCall.renderer.toolName.applyPatch": "Aplicar patch",
"toolCall.renderer.action.working": "Trabajando...",
"toolCall.renderer.action.writingCommand": "Escribiendo comando...",
"toolCall.renderer.action.preparingEdit": "Preparando edición...",
"toolCall.renderer.action.readingFile": "Leyendo archivo...",
"toolCall.renderer.action.preparingWrite": "Preparando escritura...",
"toolCall.renderer.action.preparingPatch": "Preparando patch...",
"toolCall.renderer.action.planning": "Planificando...",
"toolCall.renderer.action.fetchingFromWeb": "Obteniendo desde la web...",
"toolCall.renderer.action.findingFiles": "Buscando archivos...",
"toolCall.renderer.action.searchingContent": "Buscando contenido...",
"toolCall.renderer.action.listingDirectory": "Listando directorio...",
"toolCall.renderer.bash.title.timeout": "Tiempo de espera: {timeout}",
"toolCall.renderer.read.detail.offset": "Desplazamiento: {offset}",
"toolCall.renderer.read.detail.limit": "Límite: {limit}",
"toolCall.renderer.todo.empty": "Aún no hay elementos del plan.",
"toolCall.renderer.todo.status.pending": "Pendiente",
"toolCall.renderer.todo.status.inProgress": "En progreso",
"toolCall.renderer.todo.status.completed": "Completado",
"toolCall.renderer.todo.status.cancelled": "Cancelado",
"toolCall.renderer.todo.title.plan": "Plan",
"toolCall.renderer.todo.title.creating": "Creando plan",
"toolCall.renderer.todo.title.completing": "Completando plan",
"toolCall.renderer.todo.title.updating": "Actualizando plan",
"toolCall.permission.status.required": "Permiso requerido",
"toolCall.permission.status.queued": "Permiso en cola",
"toolCall.permission.requestedDiff.label": "Diff solicitado",
"toolCall.permission.requestedDiff.withPath": "Diff solicitado · {path}",
"toolCall.permission.queuedText": "Esperando respuestas de permisos anteriores.",
"toolCall.permission.actions.allowOnce": "Permitir una vez",
"toolCall.permission.actions.alwaysAllow": "Permitir siempre",
"toolCall.permission.actions.deny": "Denegar",
"toolCall.permission.shortcuts.allowOnce": "Permitir una vez",
"toolCall.permission.shortcuts.alwaysAllow": "Permitir siempre",
"toolCall.permission.shortcuts.deny": "Denegar",
"toolCall.permission.errors.unableToUpdate": "No se pudo actualizar el permiso",
"permissionApproval.title": "Solicitudes",
"permissionApproval.empty": "No hay solicitudes pendientes.",
"permissionApproval.kind.permission": "Permiso",
"permissionApproval.kind.question": "Pregunta",
"permissionApproval.questionCount.one": "{count} pregunta",
"permissionApproval.questionCount.other": "{count} preguntas",
"permissionApproval.status.active": "Activa",
"permissionApproval.actions.closeAriaLabel": "Cerrar",
"permissionApproval.actions.goToSession": "Ir a sesión",
"permissionApproval.actions.loadingSession": "Cargando…",
"permissionApproval.actions.loadSession": "Cargar sesión",
"permissionApproval.actions.allowOnce": "Permitir una vez",
"permissionApproval.actions.alwaysAllow": "Permitir siempre",
"permissionApproval.actions.deny": "Denegar",
"permissionApproval.fallbackHint": "Carga la sesión para más información.",
"permissionApproval.errors.unableToUpdatePermission": "No se pudo actualizar el permiso",
"toolCall.question.status.required": "Pregunta requerida",
"toolCall.question.status.queued": "Pregunta en cola",
"toolCall.question.status.questions": "Preguntas",
"toolCall.question.action.awaitingAnswers": "Esperando respuestas...",
"toolCall.question.title.questions": "Preguntas",
"toolCall.question.title.askingQuestions": "Haciendo preguntas",
"toolCall.question.type.one": "Pregunta",
"toolCall.question.type.other": "Preguntas",
"toolCall.question.number": "P{number}:",
"toolCall.question.multiple": "Múltiple",
"toolCall.question.custom.title": "Escribe una respuesta personalizada",
"toolCall.question.custom.label": "Respuesta personalizada",
"toolCall.question.custom.placeholder": "Escribe tu propia respuesta",
"toolCall.question.actions.submit": "Enviar",
"toolCall.question.actions.dismiss": "Descartar",
"toolCall.question.shortcuts.submit": "Enviar",
"toolCall.question.shortcuts.dismiss": "Descartar",
"toolCall.question.queuedText": "Esperando respuestas anteriores.",
"toolCall.question.validation.answerAll": "Responde todas las preguntas antes de enviar.",
"toolCall.question.errors.unableToReply": "No se pudo responder",
"toolCall.question.errors.unableToDismiss": "No se pudo descartar",
"toolCall.task.action.delegating": "Delegando...",
"toolCall.task.sections.prompt": "Prompt",
"toolCall.task.sections.steps": "Pasos",
"toolCall.task.sections.output": "Salida",
"toolCall.task.steps.count": "{count} pasos",
"toolCall.task.meta.agentModel": "Agente: {agent} • Modelo: {model}",
"toolCall.task.meta.agent": "Agente: {agent}",
"toolCall.task.meta.model": "Modelo: {model}",
"toolCall.status.pending": "Pendiente",
"toolCall.status.running": "En ejecución",
"toolCall.status.completed": "Completado",
"toolCall.status.error": "Error",
"toolCall.status.unknown": "Desconocido",
"toolCall.applyPatch.action.preparing": "Preparando apply_patch...",
"toolCall.applyPatch.title.withFileCount.one": "{tool} ({count} archivo)",
"toolCall.applyPatch.title.withFileCount.other": "{tool} ({count} archivos)",
"toolCall.applyPatch.fileFallback": "Archivo {number}",
} as const