mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
parent
7e916a2f03
commit
98d8f58b06
3 changed files with 635 additions and 2 deletions
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
630
apps/web/src/i18n/locales/es-ES.ts
Normal file
630
apps/web/src/i18n/locales/es-ES.ts
Normal 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:',
|
||||
};
|
||||
|
|
@ -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': 'فارسی',
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue