Spanish locale (#182)

* Spanish locale

* from es to es-ES
This commit is contained in:
José Conti 2026-05-01 05:27:13 +02:00 committed by GitHub
parent 7e916a2f03
commit 98d8f58b06
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 635 additions and 2 deletions

View file

@ -10,6 +10,7 @@ import {
type ReactNode,
} from 'react';
import { en } from './locales/en';
import { esES } from './locales/es-ES';
import { fa } from './locales/fa';
import { ptBR } from './locales/pt-BR';
import { ru } from './locales/ru';
@ -27,6 +28,7 @@ const DICTS: Record<Locale, Dict> = {
'zh-CN': zhCN,
'zh-TW': zhTW,
'pt-BR': ptBR,
'es-ES': esES,
'ru': ru,
'fa': fa,
};

View file

@ -0,0 +1,630 @@
import type { Dict } from '../types';
export const esES: Dict = {
'common.cancel': 'Cancelar',
'common.save': 'Guardar',
'common.close': 'Cerrar',
'common.delete': 'Eliminar',
'common.rename': 'Renombrar',
'common.preview': 'Vista previa',
'common.share': 'Compartir',
'common.search': 'Buscar',
'common.searchEllipsis': 'Buscar…',
'common.loading': 'Cargando…',
'common.all': 'Todos',
'common.none': 'Ninguno',
'common.default': 'Predeterminado',
'common.installed': 'instalado',
'common.notInstalled': 'no instalado',
'common.active': 'activo',
'common.offline': 'sin conexión',
'common.selected': 'seleccionado',
'common.create': 'Crear',
'common.openPreview': 'Abrir vista previa',
'common.exitFullscreen': 'Salir de pantalla completa',
'common.fullscreen': 'Pantalla completa',
'common.openInNewTab': 'Abrir en pestaña nueva',
'common.exportPdf': 'Exportar como PDF',
'common.exportZip': 'Descargar como .zip',
'common.exportHtml': 'Exportar como HTML independiente',
'common.justNow': 'justo ahora',
'common.minutesAgo': 'hace {n} min',
'common.hoursAgo': 'hace {n} h',
'common.daysAgo': 'hace {n} d',
'common.now': 'ahora',
'common.minutesShort': '{n} min',
'common.hoursShort': '{n} h',
'common.daysShort': '{n} d',
'common.untitled': 'Sin título',
'app.brand': 'Open Design',
'app.brandPill': 'Vista previa de investigación',
'app.brandSubtitle': 'por Nexu Labs',
'app.welcomeLoading': 'Cargando espacio de trabajo…',
'settings.welcomeKicker': 'Bienvenido',
'settings.welcomeTitle': 'Configura Open Design',
'settings.welcomeSubtitle':
'Elige cómo quieres ejecutar las generaciones. Puedes cambiarlo en cualquier momento desde el botón Ajustes en la barra superior.',
'settings.kicker': 'Ajustes',
'settings.title': 'Ejecución y modelo',
'settings.subtitle':
'Elige entre una CLI local de agente de código y la API de Anthropic (BYOK). Tu clave de API se guarda solo en este navegador.',
'settings.modeAria': 'Modo de ejecución',
'settings.modeDaemon': 'CLI local',
'settings.modeDaemonHelp': 'Ejecuta a través de una CLI de agente de código en tu máquina',
'settings.modeDaemonOffline': 'El daemon no está en ejecución',
'settings.modeDaemonOfflineMeta': 'daemon sin conexión',
'settings.modeDaemonInstalledMeta': '{count} instalados',
'settings.modeApi': 'API de Anthropic',
'settings.modeApiMeta': 'BYOK',
'settings.codeAgent': 'Agente de código',
'settings.codeAgentHint':
'Detectado al escanear tu PATH. Elige la CLI por la que quieres que pasen las generaciones.',
'settings.rescan': '↻ Reescanear',
'settings.rescanTitle': 'Reescanear PATH',
'settings.noAgentsDetected':
'Aún no se ha detectado ningún agente. Instala Claude Code, Codex, Gemini CLI, OpenCode, Cursor Agent, Qwen o GitHub Copilot CLI y pulsa Reescanear.',
'settings.apiSection': 'API de Anthropic',
'settings.apiKey': 'Clave de API',
'settings.showKey': 'Mostrar clave',
'settings.hideKey': 'Ocultar clave',
'settings.show': 'Mostrar',
'settings.hide': 'Ocultar',
'settings.model': 'Modelo',
'settings.baseUrl': 'URL base',
'settings.apiHint':
'Las llamadas van directamente desde este navegador a la URL base que indiques. Sin proxy. La clave nunca sale de localStorage.',
'settings.skipForNow': 'Omitir por ahora',
'settings.getStarted': 'Empezar',
'settings.envConfigure': 'Configurar el modo de ejecución',
'settings.localCli': 'CLI local',
'settings.anthropicApi': 'API de Anthropic',
'settings.noAgentSelected': 'ningún agente seleccionado',
'settings.language': 'Idioma',
'settings.languageHint': 'Cambia el idioma de la interfaz. Se guarda en este navegador.',
'settings.modelPicker': 'Modelo',
'settings.reasoningPicker': 'Esfuerzo de razonamiento',
'settings.modelPickerHint':
'Se obtiene de la CLI cuando expone un comando `models`. «Predeterminado» deja la elección a la propia configuración de la CLI; «Personalizado…» permite escribir cualquier id de modelo aceptado por la CLI.',
'settings.modelCustom': 'Personalizado (escribe abajo)…',
'settings.modelCustomLabel': 'Id de modelo personalizado',
'settings.modelCustomPlaceholder': 'p. ej., anthropic/claude-sonnet-4-6',
'settings.mediaProviders': 'Proveedores de medios',
'settings.mediaProvidersHint':
'Claves de API para generación de imagen, vídeo y audio. Se guardan localmente y se sincronizan con el daemon local.',
'settings.mediaProviderApiKey': 'Clave de API',
'settings.mediaProviderBaseUrl': 'URL base',
'settings.mediaProviderConfigured': 'Configurado',
'settings.mediaProviderUnset': 'Sin configurar',
'settings.mediaProviderClear': 'Limpiar',
'settings.mediaProviderPlaceholder': 'Pega la clave de API',
'settings.mediaProviderBaseUrlPlaceholder': 'Sobrescribir URL base por defecto',
'entry.tabDesigns': 'Diseños',
'entry.tabExamples': 'Ejemplos',
'entry.tabDesignSystems': 'Sistemas de diseño',
'entry.openSettingsTitle': 'Ajustes',
'entry.openSettingsAria': 'Abrir ajustes',
'entry.resizeAria': 'Redimensionar barra lateral',
'entry.loadingWorkspace': 'Cargando espacio de trabajo…',
'entry.tabImageTemplates': 'Prompts de imagen',
'entry.tabVideoTemplates': 'Prompts de vídeo',
'promptTemplates.searchPlaceholder': 'Buscar plantillas…',
'promptTemplates.countLabel': '{n} resultados',
'promptTemplates.emptyImage': 'Aún no hay plantillas de prompt de imagen instaladas.',
'promptTemplates.emptyVideo': 'Aún no hay plantillas de prompt de vídeo instaladas.',
'promptTemplates.emptyNoMatch': 'Ninguna plantilla coincide con tu búsqueda.',
'promptTemplates.attributionFooter':
'Adaptadas de bibliotecas públicas de prompts. Cada tarjeta enlaza al autor original.',
'promptTemplates.openPreviewTitle': 'Abrir prompt y vista previa',
'promptTemplates.sourcePrefix': 'Fuente:',
'promptTemplates.fetchError': 'No se pudo cargar el cuerpo de esta plantilla.',
'promptTemplates.promptLabel': 'Cuerpo del prompt',
'promptTemplates.copyPrompt': 'Copiar prompt',
'promptTemplates.copyDone': '¡Copiado!',
'promptTemplates.modelHint': 'Modelo sugerido: {model}',
'promptTemplates.openSource': 'Ver original',
'promptTemplates.openFullscreen': 'Abrir vista previa en pantalla completa',
'promptTemplates.closeFullscreen': 'Cerrar vista previa en pantalla completa',
'newproj.tabPrototype': 'Prototipo',
'newproj.tabDeck': 'Presentación',
'newproj.tabTemplate': 'Desde plantilla',
'newproj.tabOther': 'Otro',
'newproj.titlePrototype': 'Nuevo prototipo',
'newproj.titleDeck': 'Nueva presentación',
'newproj.titleTemplate': 'Empezar desde una plantilla',
'newproj.titleImage': 'Nueva imagen',
'newproj.titleVideo': 'Nuevo vídeo',
'newproj.titleAudio': 'Nuevo audio',
'newproj.titleOther': 'Nuevo proyecto',
'newproj.namePlaceholder': 'Nombre del proyecto',
'newproj.fidelityLabel': 'Fidelidad',
'newproj.fidelityWireframe': 'Wireframe',
'newproj.fidelityHigh': 'Alta fidelidad',
'newproj.toggleSpeakerNotes': 'Usar notas del orador',
'newproj.toggleSpeakerNotesHint': 'Menos texto en las diapositivas: deja los puntos clave en las notas.',
'newproj.toggleAnimations': 'Incluir animaciones',
'newproj.toggleAnimationsHint':
'Añade movimiento (entrada, hover, transiciones) sobre la plantilla.',
'newproj.templateLabel': 'Plantilla',
'newproj.noTemplatesTitle': 'Aún no hay plantillas',
'newproj.noTemplatesBody':
'Abre cualquier proyecto y usa el menú Compartir dentro del visor de archivos para convertirlo en plantilla. Las plantillas aparecerán aquí.',
'newproj.savedTemplate': 'Plantilla guardada',
'newproj.fileSingular': 'archivo',
'newproj.filePlural': 'archivos',
'newproj.create': 'Crear',
'newproj.createFromTemplate': 'Crear desde plantilla',
'newproj.createDisabledTitle':
'Guarda primero un proyecto como plantilla (menú Compartir dentro de cualquier proyecto).',
'newproj.importClaudeZip': 'Importar ZIP de Claude Design',
'newproj.importClaudeZipTitle': 'Importar una exportación .zip de Claude Design',
'newproj.importingClaudeZip': 'Importando…',
'newproj.privacyFooter': 'Por defecto, solo tú puedes ver tu proyecto.',
'newproj.designSystem': 'Sistema de diseño',
'newproj.dsNoneFreeform': 'Ninguno: estilo libre',
'newproj.dsNoneSubtitleEmpty': 'Sin tokens de sistema, elige tu propia paleta',
'newproj.dsNoneSubtitleSelected': 'Omitir tokens de sistema. El agente elige su propia paleta.',
'newproj.dsCategoryFallback': 'Sistema de diseño',
'newproj.dsSearch': 'Buscar sistemas de diseño…',
'newproj.dsModeAria': 'Modo de selección',
'newproj.dsModeSingle': 'Único',
'newproj.dsModeMulti': 'Múltiple',
'newproj.dsNoneTitle': 'Ninguno: estilo libre',
'newproj.dsNoneSub': 'Omitir tokens de sistema. El agente elige su propia paleta.',
'newproj.dsEmpty': 'Ningún sistema de diseño coincide con «{query}».',
'newproj.dsFootSingular': 'es solo inspiración.',
'newproj.dsFootPlural': 'son solo inspiración.',
'newproj.dsFootClear': 'Limpiar',
'newproj.dsBadgeDefault': 'PREDETERMINADO',
'newproj.dsPrimaryFallback': 'Principal',
'newproj.surfaceImage': 'Imagen',
'newproj.surfaceVideo': 'Vídeo',
'newproj.surfaceAudio': 'Audio',
'newproj.modelLabel': 'Modelo',
'newproj.aspectLabel': 'Proporción',
'newproj.imageStyleLabel': 'Notas de estilo',
'newproj.imageStylePlaceholder': 'Foto editorial, luz suave de día, paleta apagada',
'newproj.videoLengthLabel': 'Duración',
'newproj.videoLengthSeconds': '{n} s',
'newproj.audioKindLabel': 'Tipo de audio',
'newproj.audioKindMusic': 'Música',
'newproj.audioKindSpeech': 'Voz / TTS',
'newproj.audioKindSfx': 'Efecto de sonido',
'newproj.audioDurationLabel': 'Duración',
'newproj.audioDurationSeconds': '{n} s',
'newproj.voiceLabel': 'Voz',
'newproj.voicePlaceholder': 'Id de voz del proveedor, opcional',
'designs.subRecent': 'Recientes',
'designs.subYours': 'Tus diseños',
'designs.filterAria': 'Filtrar proyectos',
'designs.searchPlaceholder': 'Buscar…',
'designs.emptyNoProjects': 'Aún no hay proyectos. Crea uno a la izquierda.',
'designs.emptyNoMatch': 'Ningún proyecto coincide con tu búsqueda.',
'designs.deleteTitle': 'Eliminar proyecto',
'designs.deleteConfirm': '¿Eliminar «{name}»?',
'designs.cardFreeform': 'estilo libre',
'designs.status.notStarted': 'Sin empezar',
'designs.status.queued': 'En cola',
'designs.status.running': 'En ejecución',
'designs.status.awaitingInput': 'Necesita respuesta',
'designs.status.succeeded': 'Completado',
'designs.status.failed': 'Fallido',
'designs.status.canceled': 'Cancelado',
'designs.viewToggleAria': 'Modo de vista',
'designs.viewGrid': 'Vista en cuadrícula',
'designs.viewKanban': 'Vista en tablero',
'designs.kanbanEmptyColumn': 'Sin diseños',
'designs.deleteAria': 'Eliminar proyecto {name}',
'examples.typeLabel': 'Tipo',
'examples.surfaceLabel': 'Superficie',
'examples.surfaceWeb': 'Web',
'examples.surfaceImage': 'Imagen',
'examples.surfaceVideo': 'Vídeo',
'examples.surfaceAudio': 'Audio',
'examples.scenarioLabel': 'Escenario',
'examples.modeAll': 'Todos',
'examples.modePrototypeDesktop': 'Prototipos · Escritorio',
'examples.modePrototypeMobile': 'Prototipos · Móvil',
'examples.modeDeck': 'Diapositivas',
'examples.modeDocument': 'Documentos y plantillas',
'examples.scenarioGeneral': 'General',
'examples.scenarioEngineering': 'Ingeniería',
'examples.scenarioProduct': 'Producto',
'examples.scenarioDesign': 'Diseño',
'examples.scenarioMarketing': 'Marketing',
'examples.scenarioSales': 'Ventas',
'examples.scenarioFinance': 'Finanzas',
'examples.scenarioHr': 'RR. HH.',
'examples.scenarioOperations': 'Operaciones',
'examples.scenarioSupport': 'Soporte',
'examples.scenarioLegal': 'Legal',
'examples.scenarioEducation': 'Educación',
'examples.scenarioPersonal': 'Personal',
'examples.emptyNoSkills': 'No hay skills disponibles. ¿Está el daemon en ejecución?',
'examples.emptyNoMatch': 'Ningún ejemplo coincide con estos filtros.',
'examples.openPreview': '⤢ Abrir vista previa',
'examples.loadingPreview': 'Cargando vista previa…',
'examples.hoverPreview': 'Pasa el cursor para ver la vista previa',
'examples.usePrompt': 'Usar este prompt',
'examples.previewModalTitle': 'Abrir vista previa completa (modal)',
'examples.shareTitle': 'Compartir este ejemplo',
'examples.shareLoadFirst': 'Pasa el cursor para cargar primero la vista previa',
'examples.shareMenu': 'Compartir ▾',
'examples.exportPdfAllSlides': 'Exportar como PDF (todas las diapositivas)',
'examples.exportPptxLocked': 'Exportar como PPTX… (abre primero la plantilla)',
'examples.tagSlideDeck': 'Presentación',
'examples.tagTemplate': 'Plantilla',
'examples.tagDesignSystem': 'Sistema de diseño',
'examples.tagMobilePrototype': 'Prototipo móvil',
'examples.tagDesktopPrototype': 'Prototipo de escritorio',
'examples.tagImage': 'Imagen',
'examples.tagVideo': 'Vídeo',
'examples.tagAudio': 'Audio',
'examples.previewLabel': 'Vista previa',
'ds.surfaceLabel': 'Superficie',
'ds.surfaceWeb': 'Web',
'ds.surfaceImage': 'Imagen',
'ds.surfaceVideo': 'Vídeo',
'ds.surfaceAudio': 'Audio',
'ds.searchPlaceholder': 'Buscar sistemas de diseño…',
'ds.emptyNoMatch': 'Ningún sistema de diseño coincide con tu búsqueda.',
'ds.badgeDefault': 'PREDETERMINADO',
'ds.preview': 'Vista previa',
'ds.previewTitle': 'Vista previa del sistema de diseño',
'ds.categoryAll': 'Todos',
'ds.categoryUncategorized': 'Sin categoría',
'ds.showcase': 'Vitrina',
'ds.tokens': 'Tokens',
'avatar.title': 'Cuenta y ajustes',
'avatar.localCli': 'CLI local',
'avatar.anthropicApi': 'API de Anthropic',
'avatar.useLocal': 'Usar CLI local',
'avatar.useApi': 'Usar API de Anthropic',
'avatar.codeAgent': 'Agente de código',
'avatar.rescan': 'Reescanear PATH',
'avatar.settings': 'Ajustes',
'avatar.backToProjects': 'Volver a los proyectos',
'avatar.metaActive': 'activo',
'avatar.metaOffline': 'sin conexión',
'avatar.metaSelected': 'seleccionado',
'avatar.noAgentSelected': 'ningún agente seleccionado',
'avatar.modelSection': 'Modelo',
'avatar.modelLabel': 'Modelo',
'avatar.reasoningLabel': 'Razonamiento',
'avatar.customSuffix': '(personalizado)',
'project.backToProjects': 'Volver a los proyectos',
'project.metaFreeform': 'estilo libre',
'chat.tabChat': 'Chat',
'chat.tabComments': 'Comentarios',
'chat.commentsSoon': 'Comentarios — próximamente',
'chat.conversationsTitle': 'Conversaciones',
'chat.conversationsAria': 'Historial de conversaciones',
'chat.newConversation': 'Nueva conversación',
'chat.newConversationsTitle': 'Nueva conversación',
'chat.conversationsHeading': 'Conversaciones',
'chat.new': 'Nueva',
'chat.emptyConversations': 'Aún no hay conversaciones.',
'chat.deleteConversation': 'Eliminar conversación',
'chat.deleteConversationConfirm':
'¿Eliminar «{title}»? Se borrarán sus mensajes.',
'chat.untitledConversation': 'Conversación sin título',
'chat.startTitle': 'Empieza una conversación',
'chat.startHint':
'Suelta o pega imágenes como referencia visual, o escribe @ para adjuntar un archivo de este proyecto. O prueba uno de estos comienzos:',
'chat.fillInputTitle': 'Haz clic para rellenar el campo',
'chat.jumpToLatest': 'Ir al más reciente',
'chat.scrollToLatest': 'Desplazar al más reciente',
'chat.you': 'Tú',
'chat.openFile': 'Abrir {name}',
'chat.composerPlaceholder':
'Describe el diseño que quieres: pega o suelta imágenes, o usa @ para referenciar un archivo…',
'chat.composerHint':
'⌘/Ctrl + Intro para enviar · pega imágenes · @ para referenciar archivos',
'chat.cliSettingsTitle': 'Ajustes de CLI y modelo',
'chat.cliSettingsAria': 'Abrir ajustes de CLI y modelo',
'chat.attachTitle': 'Adjuntar archivos (o pegar / soltar)',
'chat.attachAria': 'Adjuntar archivos',
'chat.importTitle': 'Importar fuentes (próximamente)',
'chat.importLabel': 'Importar',
'chat.importComingSoon': 'Próximamente',
'chat.importSoon': 'Pronto',
'chat.importFig': 'Subir archivo .fig',
'chat.importGitHub': 'Conectar GitHub',
'chat.importWeb': 'Capturar elemento web',
'chat.importFolder': 'Vincular carpeta de código',
'chat.importSkills': 'Skills y sistemas de diseño',
'chat.importProject': 'Referenciar otro proyecto',
'chat.send': 'Enviar',
'chat.stop': 'Detener',
'chat.removeAria': 'Quitar {name}',
'chat.example1Title': 'Pitch deck editorial',
'chat.example1Tag': 'Revista',
'chat.example1Prompt':
'Una presentación editorial de 10 diapositivas para un estudio de diseño que levanta una ronda seed: maquetación con grid suizo, titulares serif enormes con capitulares marcadas, números de sección en monoespaciada, abundante espacio en blanco y diapositivas a sangre con foto intercaladas con otras densas en texto. Portada, visión, mercado, producto, tracción, equipo, petición y contacto.',
'chat.example2Title': 'Dashboard de analítica SaaS',
'chat.example2Tag': 'Datos',
'chat.example2Prompt':
'Un dashboard denso de analítica para un SaaS de herramientas para desarrolladores: tira de KPIs con variaciones semana a semana, dos gráficos de líneas apilados (MRR y workspaces activos), un mapa de calor mundial de uso, una rejilla de retención por cohortes, un ranking de clientes principales y un feed de eventos en tiempo real. Tema oscuro, números monoespaciados tabulares, acentos con sparklines.',
'chat.example3Title': 'Memoria anual long-scroll',
'chat.example3Tag': 'Editorial',
'chat.example3Prompt':
'Una memoria anual interactiva para una ONG climática: maquetación editorial long-scroll mezclando grandes bloques de citas, visualizaciones de datos (barras apiladas, contadores animados, un mapa coroplético de proyectos), separadores con fotografía, muro de donantes y llamada a la acción final. Cuerpo en serif moderna, etiquetas de gráficos en sans-serif, paleta terrosa de papel.',
'preview.shareMenu': 'Compartir ▾',
'preview.openInNewTab': 'Abrir en pestaña nueva',
'preview.exit': '⤓ Salir',
'preview.fullscreen': '⤢ Pantalla completa',
'preview.closeTitle': 'Cerrar (Esc)',
'preview.loading': 'Cargando {label}…',
'misc.savedTemplate': 'Plantilla guardada',
'misc.primary': 'Principal',
'misc.designSystem': 'Sistema de diseño',
'workspace.designFiles': 'Archivos de diseño',
'workspace.closeTab': 'Cerrar pestaña',
'workspace.deleteFileConfirm': '¿Eliminar «{name}» de la carpeta del proyecto?',
'workspace.openFromDesignFiles': 'Abre un archivo desde',
'workspace.designFilesLink': 'Archivos de diseño',
'workspace.loadingSketch': 'Cargando boceto…',
'designFiles.title': 'Archivos de diseño',
'designFiles.upload': 'Subir archivos',
'designFiles.pasteText': 'Pegar como archivo de texto',
'designFiles.newSketch': 'Nuevo boceto',
'designFiles.empty':
'Aquí no hay nada todavía. Suelta archivos abajo, o crea un boceto / pega texto.',
'designFiles.refresh': 'Actualizar',
'designFiles.delete': 'Eliminar',
'designFiles.searchPlaceholder': 'Buscar archivos…',
'designFiles.up': 'Subir',
'designFiles.back': 'Atrás',
'designFiles.crumbs': 'proyecto',
'designFiles.rowMenu': 'Menú de la fila',
'designFiles.openInTab': 'Abrir en pestaña',
'designFiles.download': 'Descargar',
'designFiles.dropTitle': '⤓ Suelta archivos aquí',
'designFiles.dropDesc':
'Imágenes, documentos, referencias, enlaces de Figma o carpetas: Claude los usará como contexto.',
'designFiles.upload.title': 'Subir archivos',
'designFiles.paste.title': 'Pegar texto como archivo',
'designFiles.upload.label': 'Subir',
'designFiles.paste.label': 'Pegar',
'designFiles.previewOpen': 'Abrir',
'designFiles.previewClose': 'Cerrar vista previa',
'designFiles.modified': 'Modificado {time} · {size}',
'designFiles.weeksAgo': 'hace {n} sem',
'designFiles.sectionPages': 'Páginas',
'designFiles.sectionScripts': 'Scripts',
'designFiles.sectionImages': 'Imágenes',
'designFiles.sectionSketches': 'Bocetos',
'designFiles.sectionOther': 'Otros',
'designFiles.kindHtml': 'Página HTML',
'designFiles.kindImage': 'Imagen',
'designFiles.kindSketch': 'Boceto',
'designFiles.kindText': 'Texto',
'designFiles.kindCode': 'Script',
'designFiles.kindPdf': 'PDF',
'designFiles.kindDocument': 'Documento',
'designFiles.kindPresentation': 'Presentación',
'designFiles.kindSpreadsheet': 'Hoja de cálculo',
'designFiles.kindBinary': 'Binario',
'pasteDialog.title': 'Pegar texto',
'pasteDialog.hint': 'Se guarda en la carpeta del proyecto. Elige cualquier nombre.',
'pasteDialog.fileNameLabel': 'Nombre del archivo',
'pasteDialog.namePlaceholder': 'notas.txt',
'pasteDialog.contentLabel': 'Contenido',
'pasteDialog.contentPlaceholder': 'Pega lo que quieras…',
'pasteDialog.save': 'Guardar',
'pasteDialog.cancel': 'Cancelar',
'sketch.save': 'Guardar boceto',
'sketch.cancel': 'Cancelar',
'sketch.saving': 'Guardando…',
'sketch.tooltipDirty': 'Cambios sin guardar',
'sketch.tooltipClean': 'Guardado',
'fileViewer.empty': 'Selecciona un archivo para verlo.',
'fileViewer.loading': 'Cargando…',
'fileViewer.exportPptx': 'Exportar como PPTX',
'fileViewer.openInNewTab': 'Abrir en pestaña nueva',
'fileViewer.copyPath': 'Copiar ruta',
'fileViewer.copied': '¡Copiado!',
'fileViewer.share': 'Compartir',
'fileViewer.binaryMeta': 'Binario · {size}',
'fileViewer.binaryNote':
'Archivo binario ({size} bytes). Descárgalo o ábrelo desde el disco para inspeccionarlo.',
'fileViewer.pdfMeta': 'PDF · {size}',
'fileViewer.documentMeta': 'Documento',
'fileViewer.presentationMeta': 'Presentación',
'fileViewer.spreadsheetMeta': 'Hoja de cálculo',
'fileViewer.previewUnavailable': 'Vista previa no disponible. Descarga o abre el archivo para inspeccionarlo.',
'fileViewer.download': 'Descargar',
'fileViewer.open': 'Abrir',
'fileViewer.imageMeta': 'Imagen · {size}',
'fileViewer.sketchMeta': 'Boceto · {size}',
'fileViewer.markdownStreamingMeta': 'Vista previa en streaming…',
'fileViewer.markdownErrorMeta': 'La vista previa puede estar incompleta (error de generación).',
'fileViewer.markdownStreamingStatus': 'Streaming… mostrando markdown parcial.',
'fileViewer.markdownErrorStatus': 'Error de generación. Mostrando el último contenido disponible.',
'fileViewer.videoMeta': 'Vídeo · {size}',
'fileViewer.audioMeta': 'Audio · {size}',
'fileViewer.reload': 'Recargar',
'fileViewer.reloadDisk': 'Recargar desde el disco',
'fileViewer.copy': 'Copiar',
'fileViewer.copyTitle': 'Copiar el contenido del archivo',
'fileViewer.saveDisabled': 'Guardar (visor de solo lectura)',
'fileViewer.save': 'Guardar',
'fileViewer.preview': 'Vista previa',
'fileViewer.source': 'Código fuente',
'fileViewer.tweaks': 'Ajustes',
'fileViewer.comment': 'Comentar',
'fileViewer.edit': 'Editar',
'fileViewer.draw': 'Dibujar',
'fileViewer.zoomOut': 'Reducir zoom',
'fileViewer.zoomIn': 'Aumentar zoom',
'fileViewer.resetZoom': 'Restablecer zoom',
'fileViewer.reloadAria': 'Recargar',
'fileViewer.previousSlide': 'Diapositiva anterior',
'fileViewer.nextSlide': 'Diapositiva siguiente',
'fileViewer.slideNavAria': 'Navegación de diapositivas',
'fileViewer.present': 'Presentar',
'fileViewer.presentInTab': 'En esta pestaña',
'fileViewer.presentFullscreen': 'Pantalla completa',
'fileViewer.presentNewTab': 'Pestaña nueva',
'fileViewer.exitPresentation': 'Salir de la presentación',
'fileViewer.shareLabel': 'Compartir',
'fileViewer.exportPdf': 'Exportar como PDF',
'fileViewer.exportPdfAllSlides': 'Exportar como PDF (todas las diapositivas)',
'fileViewer.exportPptxBusy': 'Espera a que termine el turno actual.',
'fileViewer.exportPptxHint':
'Envía una solicitud al agente para convertir este diseño a PPTX.',
'fileViewer.exportPptxNa': 'La exportación a PPTX no está disponible aquí.',
'fileViewer.exportZip': 'Descargar como .zip',
'fileViewer.exportHtml': 'Exportar como HTML independiente',
'fileViewer.saveAsTemplate': 'Guardar como plantilla…',
'fileViewer.savingTemplate': 'Guardando plantilla…',
'fileViewer.savedTemplate': 'Guardado como «{name}»',
'fileViewer.savedTemplateFail': 'No se pudo guardar la plantilla. Inténtalo de nuevo.',
'fileViewer.templateNamePrompt': 'Nombre de la plantilla',
'fileViewer.templateNameDefault': 'Plantilla sin título',
'fileViewer.templateDescPrompt':
'Descripción breve (opcional: ¿qué hace útil esta plantilla?)',
'fileViewer.deployToVercel': 'Desplegar en Vercel',
'fileViewer.redeployToVercel': 'Volver a desplegar',
'fileViewer.deployingToVercel': 'Desplegando en Vercel…',
'fileViewer.preparingPublicLink': 'Preparando enlace público…',
'fileViewer.copyDeployLink': 'Copiar enlace',
'fileViewer.deployModalTitle': 'Desplegar en Vercel',
'fileViewer.deployModalSubtitle':
'Despliega este artefacto HTML como Preview de Vercel usando tu propia cuenta.',
'fileViewer.vercelToken': 'Token de Vercel',
'fileViewer.vercelTokenGetLink': 'Obtener token de Vercel',
'fileViewer.vercelTokenPlaceholder': 'Pega tu token de Vercel',
'fileViewer.vercelTokenReuseHint':
'Se usará el token guardado. Introduce uno nuevo para reemplazarlo.',
'fileViewer.vercelTokenRequired': 'Introduce y guarda primero un token de Vercel.',
'fileViewer.vercelTeamId': 'Team ID',
'fileViewer.vercelTeamSlug': 'Team slug',
'fileViewer.optional': 'Opcional',
'fileViewer.vercelPreviewOnly': 'Por ahora los despliegues son solo Preview.',
'fileViewer.savingConfig': 'Guardando…',
'fileViewer.deployConfigSaveFailed': 'No se pudieron guardar los ajustes de Vercel.',
'fileViewer.deployFailed': 'El despliegue falló. Revisa los ajustes de Vercel e inténtalo de nuevo.',
'fileViewer.deployResultLabel': 'URL desplegada',
'fileViewer.deployLinkPreparingLabel': 'Enlace público pendiente',
'fileViewer.deployLinkDelayed':
'Tu sitio está desplegado. Vercel todavía está preparando el enlace público.',
'fileViewer.deployLinkProtectedLabel': 'Protección de Vercel activada',
'fileViewer.deployLinkProtected':
'Tu sitio se desplegó, pero Vercel exige autenticación para este enlace de preview. Desactiva Deployment Protection o usa un dominio personalizado.',
'fileViewer.retryLink': 'Reintentar ahora',
'questionForm.submit': 'Enviar',
'questionForm.skip': 'Omitir',
'questionForm.locked': 'Respondido',
'conv.switch': 'Cambiar de conversación',
'conv.label': 'Conversación',
'conv.heading': 'Conversaciones',
'conv.new': '+ Nueva',
'conv.empty': 'Aún no hay conversaciones.',
'conv.untitled': 'Conversación sin título',
'conv.renameTooltip': 'Doble clic para renombrar',
'conv.delete': 'Eliminar conversación',
'conv.deleteConfirm': '¿Eliminar «{title}»? Se borrarán sus mensajes.',
'agentPicker.label': 'Agente',
'agentPicker.modeChoose': 'Elige el modo de ejecución',
'agentPicker.localCli': 'CLI local',
'agentPicker.daemonOff': 'daemon apagado',
'agentPicker.byok': 'API de Anthropic · BYOK',
'agentPicker.selectAgent': 'Selecciona una CLI de agente de código detectada',
'agentPicker.noAgents': 'no hay agentes en el PATH',
'agentPicker.notInstalled': 'no instalado',
'agentPicker.rescan': 'Reescanear el PATH local en busca de agentes',
'tool.openInTab': 'Abrir {name} en una pestaña',
'tool.open': 'abrir',
'tool.todos': 'Tareas',
'tool.write': 'Escribir',
'tool.edit': 'Editar',
'tool.read': 'Leer',
'tool.bash': 'Bash',
'tool.glob': 'Glob',
'tool.grep': 'Grep',
'tool.fetch': 'Obtener',
'tool.search': 'Buscar',
'tool.lines': '{n} líneas',
'tool.changeSingular': 'cambio',
'tool.changePlural': 'cambios',
'tool.in': 'en {path}',
'tool.hide': 'ocultar',
'tool.output': 'salida',
'tool.running': 'ejecutando…',
'tool.error': 'error',
'tool.done': 'listo',
'assistant.role': 'Asistente',
'assistant.workingLabel': 'Trabajando',
'assistant.doneLabel': 'Listo',
'assistant.unfinishedLabel': 'Detenido con tareas pendientes',
'assistant.unfinishedSummary': 'quedan {n} tarea(s)',
'assistant.unfinishedMore': '+{n} más',
'assistant.continueRemaining': 'Continuar tareas pendientes',
'assistant.outTokens': '{n} salida',
'assistant.producedFiles': 'Archivos de este turno',
'assistant.openFile': 'Abrir',
'assistant.downloadFile': 'Descargar',
'assistant.thinking': 'Pensando',
'assistant.systemReminder': 'Recordatorio del sistema',
'assistant.waitingFirstOutput': 'Esperando la primera salida',
'assistant.statusBootingAgent': 'Iniciando agente',
'assistant.statusStarting': 'Iniciando',
'assistant.statusRequesting': 'Enviando solicitud',
'assistant.statusThinking': 'Pensando',
'assistant.statusStreaming': 'Transmitiendo',
'assistant.slowHint':
'Está tardando más de lo normal. El formulario suele aparecer en 5-10 s. Puedes pulsar Detener y reformular.',
'assistant.verbEditing': 'Editando',
'assistant.verbWriting': 'Escribiendo',
'assistant.verbReading': 'Leyendo',
'assistant.verbSearching': 'Buscando',
'assistant.verbRunning': 'Ejecutando',
'assistant.verbTodos': 'Tareas',
'assistant.verbFetching': 'Obteniendo',
'assistant.verbCalling': 'Llamando',
'qf.answered': 'respondido',
'qf.choose': 'Elige…',
'qf.required': 'obligatorio',
'qf.lockedSubmitted':
'Respuestas enviadas: el agente las usará durante el resto de la sesión.',
'qf.lockedPrev': 'Este formulario es de un turno anterior.',
'qf.hint':
'Elige lo que encaje. Omite los campos opcionales que no te importen: el agente usará valores predeterminados sensatos.',
'qf.submitDefault': 'Enviar respuestas',
'qf.submitDisabledTitle': 'Rellena primero los campos obligatorios',
'qf.submitTitle': 'Enviar respuestas',
'qf.cardSelected': 'seleccionado',
'qf.cardRefs': 'Refs:',
'qf.cardSampleText': 'El veloz murciélago hindú · 0123',
'sketch.toolSelect': 'Seleccionar (sin acción)',
'sketch.toolPen': 'Lápiz',
'sketch.toolText': 'Texto',
'sketch.toolRect': 'Rectángulo',
'sketch.toolArrow': 'Flecha',
'sketch.toolEraser': 'Borrador',
'sketch.color': 'Color',
'sketch.strokeSize': 'Grosor del trazo',
'sketch.undo': 'Deshacer',
'sketch.clear': 'Limpiar',
'sketch.close': 'Cerrar',
'sketch.textPrompt': 'Texto:',
};

View file

@ -1,14 +1,15 @@
// Supported UI locales. Adding a new locale requires creating a new
// dictionary in `./locales/` and registering it in `./index.tsx`.
export type Locale = 'en' | 'zh-CN' | 'zh-TW' | 'pt-BR' | 'ru' | 'fa';
export type Locale = 'en' | 'zh-CN' | 'zh-TW' | 'pt-BR' | 'es-ES' | 'ru' | 'fa';
export const LOCALES: Locale[] = ['en', 'zh-CN', 'zh-TW', 'pt-BR', 'ru', 'fa'];
export const LOCALES: Locale[] = ['en', 'zh-CN', 'zh-TW', 'pt-BR', 'es-ES', 'ru', 'fa'];
export const LOCALE_LABEL: Record<Locale, string> = {
'en': 'English',
'zh-CN': '简体中文',
'zh-TW': '繁體中文',
'pt-BR': 'Português (Brasil)',
'es-ES': 'Español (España)',
'ru': 'Русский',
'fa': 'فارسی',
};