localization: ship es-ES

Complete Spanish catalog across all three namespaces, 1129 keys,
machine-translated then reviewed for terminology and plurals.

Fixed on review: an awkward literal fragment in settings.accounts.description
("Quién tiene acceso, y como qué") reworded to use the established
role → "función" glossary term instead of an ad-hoc phrase. Everything
else held up — "compositor" for the chat composer avoided the same
Editor-collision German needed fixing for, Minesweeper stayed
untranslated matching pt-PT/fr-FR/de-DE precedent, and the impersonal
"se" constructions used for the file-operation plurals (Se copió /
Se copiaron) read correctly at both n=1 and n=0 — Spanish's plural
rule is one/other like English, count=0 takes the plural branch.

All 17 plural entries verified at count 0/1/2.

This closes out the three-locale rollout: es-ES, de-DE and fr-FR all
now in SHIPPED_LOCALES and all three parity tests, each shipped in
its own commit only after passing review. pt-BR stays out per the
owner's call — European Portuguese first, Brazilian is a separate
decision.
This commit is contained in:
2026-08-23 17:21:37 +00:00
parent d6a3bea7c9
commit d7a4a18ce8
7 changed files with 1444 additions and 4 deletions
+1 -1
View File
@@ -19,7 +19,7 @@ const autonym = (code: string): string => {
return name.charAt(0).toUpperCase() + name.slice(1);
};
export const SHIPPED_LOCALES: ShippedLocale[] = ['en-GB', 'pt-PT', 'fr-FR', 'de-DE'].map((code) => ({
export const SHIPPED_LOCALES: ShippedLocale[] = ['en-GB', 'pt-PT', 'fr-FR', 'de-DE', 'es-ES'].map((code) => ({
code,
label: autonym(code),
}));
+704
View File
@@ -0,0 +1,704 @@
{
"common": {
"save": "Guardar",
"saving": "Guardando...",
"cancel": "Cancelar"
},
"settings": {
"profile": {
"userData": {
"email": "Correo electrónico",
"username": "Nombre de usuario",
"name": "Nombre",
"namePlaceholder": "Tu nombre",
"updated": "Perfil actualizado",
"updateFailed": "No se pudo actualizar el perfil",
"selectImage": "Selecciona un archivo de imagen",
"imageTooLarge": "La imagen debe ser menor de 384 KB"
},
"apiKeys": {
"intro": "Una clave de API inicia sesión como tú, sin contraseña y sin caducar. Una clave funciona en todas partes — una clave no está ligada a una aplicación. Dar a cada dispositivo la suya solo sirve para poder cortar una sin tocar las demás. Envíala como",
"loading": "Cargando claves…",
"mintedTitle": "Clave para “{{name}}” — se muestra una sola vez",
"savedIt": "Ya la he guardado",
"copyKey": "Copiar clave",
"copied": "Clave copiada",
"copyFailed": "No se pudo copiar — selecciona y copia manualmente",
"newKey": "Nueva clave",
"namePlaceholder": "iPhone, app de Música, CLI del portátil…",
"create": "Crear",
"createFailed": "No se pudo crear la clave",
"noneYet": "Todavía no hay claves.",
"noneInUse": "No hay claves en uso.",
"revoked": "revocada",
"expired": "caducada",
"lastUsed": "usada por última vez el {{date}}",
"neverUsed": "nunca usada",
"forget": "Eliminar este registro",
"forgetFailed": "No se pudo eliminar",
"revoke": "Revocar",
"revokeDone": "Revocada — todo lo que usaba esa clave se ha desconectado",
"revokeFailed": "No se pudo revocar",
"hideDead": "Ocultar revocadas y caducadas",
"showDead": {
"one": "Mostrar {{count}} clave revocada o caducada",
"other": "Mostrar {{count}} claves revocadas o caducadas"
}
},
"voice": {
"label": "Voz",
"refresh": "Actualizar voces",
"serverDefault": "Predeterminada del servidor",
"hint": "Elige una voz para la conversión de texto a voz. Déjala en la predeterminada del servidor para usar la voz configurada por el administrador.",
"stop": "Detener",
"listen": "Escuchar"
},
"dock": {
"visible": "Visibles",
"hidden": "Ocultos",
"dragToShow": "Arrastra elementos aquí para mostrarlos en el dock",
"allVisible": "Todos los elementos visibles",
"reset": "Restaurar valores predeterminados"
},
"languages": {
"spokenLabel": "Idiomas que hablas",
"addLanguage": "Añadir un idioma...",
"defaultLabel": "Idioma predeterminado",
"defaultHint": "Se usa para la localización de la interfaz.",
"translateToLabel": "Traducir a",
"translateToHint": "Idioma de destino al traducir contenido que no hablas."
},
"changePassword": {
"currentPasswordLabel": "Contraseña actual",
"currentPasswordPlaceholder": "Contraseña actual",
"newPasswordLabel": "Nueva contraseña",
"newPasswordPlaceholder": "Nueva contraseña",
"confirmPasswordLabel": "Confirmar nueva contraseña",
"confirmPasswordPlaceholder": "Confirma la nueva contraseña",
"changeButton": "Cambiar contraseña",
"changingButton": "Cambiando...",
"passwordChanged": "Contraseña cambiada",
"passwordChangeFailed": "No se pudo cambiar la contraseña"
},
"models": {
"defaultModel": "Modelo predeterminado",
"sameAsChat": "Igual que el predeterminado del chat",
"taskDefaultsSaved": "Valores predeterminados de tareas guardados",
"saveFailed": "No se pudieron guardar los ajustes",
"defaultChat": "Modelo predeterminado del chat",
"defaultChatHint": "Se usa al iniciar un chat nuevo desde la pantalla de inicio",
"defaultProject": "Modelo predeterminado del proyecto",
"defaultProjectHint": "Se usa al iniciar un chat nuevo dentro de un dashboard de proyecto",
"defaultTask": "Modelo predeterminado de tareas",
"defaultTaskHint": "Se usa al ejecutar tareas desde el explorador de archivos",
"aiDefaultsSaved": "Valores predeterminados de modelos de IA guardados"
}
},
"sections": {
"profile": {
"label": "Perfil",
"hint": "avatar, nombre, correo electrónico",
"description": "Avatar, nombre y correo electrónico"
},
"changePassword": {
"label": "Cambiar contraseña",
"description": "Actualiza tu contraseña"
},
"apiKeys": {
"label": "Claves de API",
"hint": "claves que inician sesión como tú",
"description": "Claves que inician sesión como tú, revocables una a una"
},
"languages": {
"label": "Idiomas",
"hint": "hablados y traducción",
"description": "Hablados, predeterminado y traducción"
},
"voice": {
"label": "Voz",
"hint": "conversión de texto a voz",
"description": "Preferencia de voz para la conversión de texto a voz"
},
"dock": {
"label": "Dock",
"hint": "elegir y reordenar",
"description": "Elige y reordena los elementos del dock"
},
"myModels": {
"label": "Mis modelos",
"description": "Muestra u oculta modelos solo para ti"
},
"channelModels": {
"label": "Modelos del canal",
"description": "Modelos accesibles para cuentas que no son del propietario"
},
"defaultModels": {
"label": "Modelos predeterminados",
"description": "Modelos predeterminados para chat, proyectos y tareas"
},
"providers": {
"label": "Proveedores",
"hint": "harnesses",
"description": "Proveedores de IA remotos y locales"
},
"tts": {
"label": "Texto a voz",
"description": "Proveedor de TTS y voz"
},
"stt": {
"label": "Voz a texto",
"description": "URL del servidor Whisper"
},
"ocr": {
"label": "OCR",
"description": "Modelo de visión para extracción de texto"
},
"maintenance": {
"label": "Reconstruir y reiniciar",
"hint": "mantenimiento",
"description": "Carga los cambios sin usar un terminal"
},
"smtp": {
"label": "SMTP",
"hint": "correo saliente",
"description": "Proveedor de entrega de correo electrónico"
},
"googleOauth": {
"label": "Google OAuth",
"description": "Client ID y secret para las APIs de Google"
},
"apify": {
"label": "Apify",
"description": "Token de API para actores de web scraping"
},
"davSync": {
"label": "Sincronización de Calendario y Contactos",
"hint": "contraseñas de aplicación",
"description": "Contraseñas por dispositivo para clientes CalDAV/CardDAV"
},
"accounts": {
"label": "Cuentas",
"hint": "usuarios",
"description": "Quién tiene acceso, y con qué función"
},
"permissions": {
"label": "Permisos",
"description": "Lo que cada función puede alcanzar"
}
},
"searchPlaceholder": "Buscar ajustes…",
"selectSection": "Selecciona una sección",
"groups": {
"models": "Modelos",
"defaults": "Predeterminados",
"providers": "Proveedores",
"ai": "IA",
"maintenance": "Mantenimiento",
"email": "Correo electrónico"
},
"nav": {
"profile": "Perfil",
"ai": "IA",
"system": "Sistema",
"integrations": "Integraciones",
"users": "Usuarios"
},
"ai": {
"noModels": "No hay modelos disponibles. Configura las claves de API en Proveedores.",
"dragToShow": "Arrastra modelos aquí para mostrarlos",
"allVisible": "Todos los modelos visibles",
"dragToEnable": "Arrastra modelos aquí para activarlos",
"allEnabled": "Todos los modelos activados",
"visible": "Visibles",
"hidden": "Ocultos",
"enabled": "Activados",
"disabled": "Desactivados",
"refresh": "Actualizar modelos desde los proveedores",
"refreshed": "Modelos actualizados",
"refreshFailed": "No se pudieron actualizar los modelos"
},
"integrations": {
"enterprise": "Empresa",
"personal": "Personal"
},
"server": {
"loading": "Cargando…",
"provider": "Proveedor",
"model": "Modelo",
"voice": "Voz",
"ocr": {
"serverUrl": "URL del servidor del modelo de visión",
"refreshModels": "Actualizar modelos",
"selectModel": "Selecciona un modelo",
"saved": "Ajustes de OCR guardados",
"saveFailed": "No se pudieron guardar los ajustes de OCR",
"reachable": "El servidor del modelo de visión está accesible"
},
"stt": {
"serverUrl": "URL del servidor Whisper",
"saved": "Ajustes de STT guardados",
"saveFailed": "No se pudieron guardar los ajustes de STT",
"reachable": "El servidor Whisper está accesible"
},
"tts": {
"openaiCompatible": "Compatible con OpenAI (Kokoro, OpenAI, etc.)",
"elevenLabs": "ElevenLabs",
"refreshVoices": "Actualizar voces",
"selectVoice": "Selecciona una voz",
"saved": "Ajustes de TTS guardados",
"saveFailed": "No se pudieron guardar los ajustes de TTS",
"playing": "Reproduciendo audio de prueba",
"testFailed": "La prueba falló — no se pudo contactar con el servidor de TTS"
},
"smtp": {
"mailhog": "MailHog (pruebas locales)",
"resend": "Resend",
"custom": "SMTP personalizado",
"apiKey": "Clave de API",
"host": "Host",
"port": "Puerto",
"username": "Nombre de usuario",
"password": "Contraseña",
"tls": "TLS / SSL",
"fromName": "Nombre del remitente",
"fromEmail": "Correo del remitente",
"sendTest": "Enviar correo de prueba",
"userExample": "usuario@ejemplo.com",
"recipientExample": "destinatario@ejemplo.com",
"saved": "Ajustes de SMTP guardados",
"saveFailed": "No se pudieron guardar los ajustes de SMTP",
"connected": "Conexión correcta",
"testSent": "Correo de prueba enviado a {{email}}"
},
"maintenance": {
"updateTitle": "Actualizar la plataforma",
"updateHint": "No cambia nada que esté en ejecución. Lo que la actualización necesita se indica aquí, y la decisión es tuya.",
"rebuild": "Reconstruir el frontend",
"restart": "Reiniciar el servidor",
"upToDate": "Ya está actualizado",
"rebuilt": "Frontend reconstruido — actualiza esta página para verlo",
"restarting": "Reiniciando — la página se reconectará sola",
"pulled": {
"one": "Se obtuvo {{count}} commit",
"other": "Se obtuvieron {{count}} commits"
}
},
"harnesses": {
"piMono": "Pi Mono",
"checking": "Comprobando…",
"localProviders": "Proveedores locales",
"remoteProviders": "Proveedores remotos",
"connect": "Conectar",
"authenticate": "Autenticar",
"connectLocal": "Conectar proveedor local",
"connectProvider": "Conectar proveedor",
"none": "No se encontraron proveedores.",
"updatePiMono": "Actualizar Pi Mono",
"removeProvider": "Eliminar proveedor",
"namePlaceholder": "Nombre (p. ej. Mi Ollama)",
"username": "Nombre de usuario",
"password": "Contraseña",
"apiKey": "Clave de API",
"editKey": "Editar clave",
"disconnect": "Desconectar proveedor",
"saveKey": "Guardar clave",
"enterKey": "Introduce la clave de API",
"search": "Buscar proveedores…",
"connectFailed": "No se pudo conectar",
"authFailed": "La autenticación falló",
"saveFailed": "No se pudo guardar el proveedor",
"connectedTo": "Conectado a {{name}}"
}
},
"users": {
"loadingPermissions": "Cargando permisos…",
"permissionsFailed": "No se pudieron cargar los permisos.",
"deniedUnlessGranted": "Todo está denegado a menos que se conceda aquí.",
"read": "Lectura",
"full": "Total",
"noAccess": "Sin acceso",
"role": "Función",
"permissionsSaved": "Guardado lo que pueden alcanzar los {{role}}",
"copyBeforeClosing": "Copia lo que necesites antes de cerrar — nada de esto se puede volver a mostrar.",
"password": "Contraseña",
"linuxAccount": "Cuenta Linux",
"sshKey": "Su clave pública SSH",
"addToGitea": "Añade esto a su cuenta de Gitea",
"linuxIncomplete": "La cuenta funciona, pero su parte Linux no terminó de configurarse",
"done": "Hecho",
"addAccount": "Añadir cuenta",
"newAccount": "Nueva cuenta",
"email": "Correo electrónico",
"name": "Nombre",
"username": "Nombre de usuario",
"usernameHint": "Letras, números, puntos, guiones y guiones bajos.",
"generatePassword": "Generar una contraseña",
"copyPassword": "Copiar la contraseña",
"passwordHint": "Al menos 12 caracteres, con mayúsculas y minúsculas, un número y un símbolo.",
"sshPlaceholder": "ssh-ed25519 AAAAC3Nza… ana@portatil",
"passwordCopied": "Contraseña copiada",
"loadingAccounts": "Cargando cuentas…",
"accountsFailed": "No se pudieron cargar las cuentas.",
"removeAccount": "Eliminar cuenta",
"generateNewPassword": "Generar una nueva contraseña",
"serverOwner": "Propietario del servidor",
"copySshTitle": "Copiar su clave pública SSH (añádela a su cuenta de Gitea)",
"resetPasswordTitle": "Generar una nueva contraseña — se muestra una sola vez, y cierra su sesión en todas partes",
"copyNewPassword": "Copiar la nueva contraseña",
"publicKeyCopied": "Clave pública copiada",
"copyFailed": "No se pudo copiar — selecciónala y copia a mano",
"repairFor": "Reparar la cuenta Linux de {{email}}",
"linuxAccountFor": "Cuenta Linux: {{osUser}} — haz clic para reparar o sustituir su clave SSH",
"copySshFor": "Copiar la clave pública SSH de {{email}}",
"resetPasswordFor": "Restablecer la contraseña de {{email}}",
"removeFor": "Eliminar {{email}}",
"provisionPrompt": "Cuenta Linux para {{email}}.\n\nPega una clave pública SSH para permitirle conectarse por SSH, o déjalo vacío para mantener la actual.",
"createLinux": "Crear una cuenta Linux",
"noLinux": "Sin cuenta Linux — haz clic para crear una",
"removeTitle": "¿Eliminar {{email}}?",
"removeBody": "Esto elimina la cuenta y todo lo que le pertenece — passkeys, dashboards, diseños guardados y todo lo que cualquier plugin instalado guarde para ella. No se puede deshacer.",
"resetTitle": "¿Restablecer la contraseña de {{email}}?",
"resetBody": "Se genera una nueva contraseña y se te muestra una sola vez — no se guarda en ningún sitio y no se puede consultar después. Su contraseña actual deja de funcionar de inmediato, y su sesión se cierra en todas partes.",
"resetLinuxNote": "Su cuenta Linux ({{osUser}}) no se ve afectada: no tiene contraseña, y las claves SSH no cambian."
},
"dav": {
"newDevice": "Nuevo dispositivo",
"create": "Crear",
"none": "Todavía no hay dispositivos.",
"placeholder": "Pixel 9, iPad, Thunderbird…",
"revoke": "Revocar",
"delete": "Eliminar",
"copyFailed": "No se pudo copiar — selecciona y copia manualmente",
"createFailed": "No se pudo crear la contraseña de aplicación",
"revoked": "Revocada — ese dispositivo dejará de sincronizar",
"revokeFailed": "No se pudo revocar",
"deleteFailed": "No se pudo eliminar",
"copyField": "Copiar {{field}}",
"copied": "{{what}} copiado"
},
"google": {
"guideToggle": "Guía de configuración paso a paso",
"step1": {
"title": "Crear un proyecto de Google Cloud",
"body": "Abre la página de creación de proyectos, dale un nombre (por ejemplo “Officer”) y haz clic en:",
"link": "New Project"
},
"step2": {
"title": "Activar las APIs",
"body": "Abre la biblioteca de APIs, busca cada una de estas y haz clic en:",
"link": "API Library"
},
"step3": {
"title": "Configurar la pantalla de consentimiento de OAuth",
"link": "OAuth Branding",
"appName": "Pon el nombre de tu organización, o “Officer”, como:",
"supportEmail": "Pon el correo del administrador como:",
"devContact": "Añade el correo del administrador en:",
"save": "Después haz clic en:"
},
"step4": {
"title": "Definir la audiencia",
"link": "OAuth Audience",
"internal": "Si tu equipo usa Google Workspace, elige — no hace falta verificación:",
"external": "En caso contrario elige, y añade los correos de tu equipo en Test users (obligatorio mientras la aplicación no esté verificada; límite de 100 usuarios de prueba):"
},
"step5": {
"title": "Añadir ámbitos",
"link": "Data Access",
"body": "Abre el acceso a datos, busca y añade los ámbitos de abajo, y luego haz clic en:",
"note": "Google clasifica el ámbito del calendario como sensible y el de Gmail como restringido. Eso no es un problema para aplicaciones Internal (Google Workspace) ni para aplicaciones External en modo de prueba; publicar en producción con ámbitos restringidos requiere verificación de Google."
},
"step6": {
"title": "Crear credenciales OAuth",
"link": "Clients",
"body": "Abre la página de clientes y haz clic en:",
"appType": "Tipo de aplicación:",
"nameAnything": "Nombre: el que quieras (por ejemplo “Officer”)",
"redirectUris": "Authorized redirect URIs — añade:",
"thenClick": "Después haz clic en:"
},
"step7": {
"title": "Copiar las credenciales",
"body": "Un cuadro de diálogo muestra tu client ID y tu client secret. Copia ambos y pégalos en los campos de abajo."
},
"scopeGmail": "Leer correos",
"scopeCalendar": "Leer eventos del calendario",
"verifying": "Verificando credenciales…",
"valid": "Credenciales válidas",
"invalid": "Credenciales no válidas",
"verifyFailed": "La solicitud de verificación falló",
"clientId": "Client ID",
"clientSecret": "Client Secret",
"redirectUri": "URI de redirección",
"redirectUriHint": "Añade este URI a los URIs de redirección autorizados de tu cliente OAuth de Google",
"saved": "Configuración de Google OAuth guardada",
"saveFailed": "No se pudo guardar la configuración de Google OAuth"
},
"googleAccount": {
"title": "Cuenta de Google",
"hint": "Conecta tu cuenta de Google para Calendario, Contactos y otros servicios de Google.",
"connected": "Conectada",
"disconnect": "Desconectar",
"connect": "Conectar cuenta de Google",
"connectedToast": "Cuenta de Google conectada",
"connectFailed": "No se pudo conectar la cuenta de Google",
"disconnectedToast": "Cuenta de Google desconectada",
"disconnectFailed": "No se pudo desconectar la cuenta de Google"
},
"apify": {
"token": "Token de API",
"saved": "Token de API de Apify guardado",
"saveFailed": "No se pudo guardar el token de API de Apify"
}
},
"header": {
"userMenu": {
"profile": "Perfil",
"systemSettings": "Ajustes del sistema",
"signOut": "Cerrar sesión",
"ai": "IA",
"integrations": "Integraciones",
"userManagement": "Gestión de usuarios"
},
"tabName": "Nombre de la pestaña",
"tabNameHint": "Haz clic para renombrar esta pestaña — bórralo para volver al nombre de la página",
"logoAlt": "Officer",
"navigation": "Navegación",
"jobsRunning": "Trabajo en ejecución",
"jobsNothingRunning": "Nada en ejecución",
"jobsQueued": "Trabajos en cola"
},
"nav": {
"home": "Inicio",
"files": "Archivos",
"chat": "Chat",
"commandHq": "Command HQ",
"editor": "Editor",
"jobs": "Trabajos",
"terminal": "Terminal",
"browser": "Navegador",
"monitor": "Monitor",
"activity": "Actividad",
"dashboards": "Dashboards",
"sendOff": "SendOff",
"calendar": "Calendario",
"contacts": "Contactos",
"appStore": "Tienda de aplicaciones",
"marketplace": "Marketplace",
"codeEditor": "Editor de código"
},
"theme": {
"pillTitle": "Tema: {{name}} · ctrl+shift+←/→ recorrer · ctrl+shift+space explorar · ctrl+shift+f {{starAction}}",
"pillLabel": "Tema: {{name}}",
"star": "marcar",
"unstar": "desmarcar",
"cycleHint": "ctrl+shift+←/→ recorrer · ctrl+shift+space explorar",
"everyShortcutHint": "ctrl+? para todos los atajos",
"favouritesOnly": "Solo favoritos ({{count}})",
"favourites": "Favoritos ({{count}})",
"noFavourites": "Todavía no hay favoritos — marca uno con el botón de su fila.",
"starNamed": "Marcar {{name}}",
"unstarNamed": "Desmarcar {{name}}",
"addToFavourites": "Añadir a favoritos",
"removeFromFavourites": "Quitar de favoritos",
"addToFavouritesKey": "Añadir a favoritos (f)",
"removeFromFavouritesKey": "Quitar de favoritos (f)",
"active": "activo",
"browseHint": "j/k o ↑/↓ mover · l o → previsualizar · f marcar · h o ← reiniciar · enter mantener · esc cancelar"
},
"spotlight": {
"placeholder": "Ir a…",
"noResults": "Nada coincide con “{{query}}”."
},
"shortcutsModal": {
"title": "Atajos de teclado",
"hint": "Ctrl+? · Esc para cerrar"
},
"screenError": {
"title": "Esta pantalla no se pudo mostrar",
"description": "No se ha perdido nada — este es un fallo de visualización, no de datos. Las transcripciones del agente, los trabajos y los archivos están intactos.",
"unknownError": "Error desconocido",
"tryAgain": "Reintentar",
"reload": "Recargar",
"goHome": "Ir al inicio",
"resetHint": "Si vuelve a fallar en el mismo sitio, la causa habitual es un diseño de panel guardado. Reiniciar devuelve los paneles de todas las pantallas a sus valores predeterminados.",
"dashboardsSafe": "Tus dashboards no se ven afectados.",
"resetting": "Reiniciando…",
"resetConfirm": "Sí — reiniciar el diseño de todas las pantallas",
"reset": "Reiniciar diseños de pantallas"
},
"rescan": {
"label": "Reanalizar elementos",
"title": "Reanalizar officer-items (aplicar cambios sin reiniciar)",
"failed": "No se pudieron reanalizar los elementos",
"done": "Elementos reanalizados — {{summary}}",
"counts": {
"tasks": {
"one": "{{count}} tarea",
"other": "{{count}} tareas"
},
"agents": {
"one": "{{count}} agente",
"other": "{{count}} agentes"
},
"tools": {
"one": "{{count}} herramienta",
"other": "{{count}} herramientas"
},
"skills": {
"one": "{{count}} skill",
"other": "{{count}} skills"
},
"processes": {
"one": "{{count}} proceso",
"other": "{{count}} procesos"
},
"affordances": {
"one": "{{count}} affordance",
"other": "{{count}} affordances"
}
},
"newChatsOnly": "Se aplica a los chats nuevos — uno abierto mantiene lo que tenía al empezar.",
"noDescription": {
"one": "{{count}} skill no tiene descripción, así que no se ofrece a ningún agente.",
"other": "{{count}} skills no tienen descripción, así que no se ofrecen a ningún agente."
}
},
"bugReport": {
"label": "Informar de un error",
"title": "Informar de un error",
"describePlaceholder": "Describe qué ha ido mal...",
"screenshot": "Captura de pantalla",
"noScreenshot": "No se obtuvo ninguna captura de pantalla",
"collectedNote": "Los registros de la consola, la información del navegador y los errores recientes de la API se recogen automáticamente.",
"submitted": "Informe de error enviado",
"failed": "No se pudo enviar el informe de error",
"submit": "Enviar"
},
"auth": {
"signInTitle": "Bienvenido de nuevo",
"signInSubtitle": "Inicia sesión en tu cuenta",
"emailOrUsername": "Correo electrónico o nombre de usuario",
"password": "Contraseña",
"forgotPassword": "¿Olvidaste tu contraseña?",
"emailPlaceholder": "tu@ejemplo.com",
"passwordPlaceholder": "Tu contraseña",
"forgotTitle": "Recuperar contraseña",
"forgotSubtitle": "Introduce tu correo electrónico para recibir un enlace de restablecimiento",
"email": "Correo electrónico",
"backToLogin": "Volver al inicio de sesión",
"checkEmail": "Revisa tu correo electrónico",
"checkEmailHint": "Haz clic en él para restablecer tu contraseña.",
"resetOk": "Contraseña restablecida correctamente. Inicia sesión.",
"verifying": "Verificando…",
"invalidLink": "Enlace no válido",
"invalidLinkHint": "Este enlace de restablecimiento no es válido o ha caducado.",
"resetTitle": "Restablecer contraseña",
"resetSubtitle": "Introduce tu nueva contraseña",
"confirmPassword": "Confirmar contraseña",
"minChars": "Mínimo 12 caracteres",
"confirmPlaceholder": "Confirma tu contraseña",
"bootstrapTitle": "Bienvenido, administrador",
"bootstrapSubtitle": "Crea tu cuenta de administrador",
"name": "Nombre",
"username": "Nombre de usuario",
"namePlaceholder": "Tu nombre",
"adminEmailPlaceholder": "admin@ejemplo.com",
"bootstrapOk": "Cuenta de administrador creada. Inicia sesión.",
"debug": {
"controls": "Controles:",
"camera": "Cámara:",
"model": "Modelo:"
}
},
"shortcuts": {
"navigation": "Navegación",
"spotlight": "Spotlight — ve a cualquier pantalla, plugin o ajuste por su nombre",
"thisList": "Esta lista",
"themes": "Temas",
"themesNote": "El explorador aplica el tema a medida que te mueves, para que veas la aplicación cambiar en vez de leer nombres.",
"openBrowser": "Abrir el explorador de temas",
"prevNextTheme": "Tema anterior / siguiente, sin abrir nada",
"starCurrent": "Marcar o desmarcar el tema actual, desde cualquier lugar",
"inBrowser": "En el explorador de temas",
"moveList": "Moverse por la lista",
"applyKeepBrowsing": "Aplicar el tema enfocado y seguir explorando",
"restoreStart": "Volver al tema con el que empezaste",
"starFocused": "Marcar o desmarcar el tema enfocado",
"keepLooking": "Mantener lo que estás viendo",
"cancelRestore": "Cancelar y restaurar",
"inSpotlight": "En Spotlight",
"moveResults": "Moverse por los resultados",
"goThere": "Ir allí",
"close": "Cerrar",
"chat": "Chat",
"chatNote": "La recuperación solo usa la tecla de flecha en un compositor VACÍO, y cualquier otra tecla termina la recuperación — así que un borrador nunca se sobrescribe.",
"prevNextPrompt": "Prompt anterior / siguiente que enviaste, al estilo de una shell",
"send": "Enviar · en un compositor vacío con algo en cola, envía eso ahora",
"newline": "Salto de línea",
"stopTurn": "Detener el turno que se está generando"
},
"jobs": {
"runningQueued": "En ejecución y en cola",
"loading": "Cargando…",
"nothingRunning": "Nada en ejecución",
"history": "Historial",
"clearAll": "Limpiar todo",
"selectJob": "Selecciona un trabajo",
"notFound": "Trabajo no encontrado.",
"backToJobs": "Volver a trabajos",
"stop": "Detener",
"testNotification": "Enviar una notificación de prueba a todos los canales configurados",
"search": "Buscar…",
"deleteFinished": "Eliminar todos los trabajos terminados",
"noChannels": "No hay canales configurados",
"notifyFailed": "No se pudo enviar la notificación",
"stopRequested": "Detención solicitada",
"stopFailed": "No se pudo detener",
"titles": "Títulos",
"download": "Descargar",
"input": "Entrada",
"output": "Salida",
"steps": "Pasos",
"selectStep": "Selecciona un paso o subtarea para ver la salida",
"noOutput": "Todavía no hay salida",
"tokens": "Tokens:",
"cost": "Coste:",
"status": {
"running": "En ejecución",
"queued": "En cola",
"completed": "Completado",
"failed": "Fallido",
"stopped": "Detenido",
"interrupted": "Interrumpido"
},
"failedWithCode": "Fallido (salida {{code}})"
},
"activity": {
"title": "Actividad",
"backgroundTasks": "Tareas en segundo plano",
"detached": "Separada",
"backToList": "Volver a la lista",
"selectTask": "Selecciona una tarea para seguir su salida en directo",
"noneRunning": "ninguna en ejecución"
},
"passkeyGate": {
"setUp": "Configura tu passkey"
},
"chatHistory": {
"loadFailed": "No se pudo cargar esta conversación: {{reason}}"
},
"capability": {
"frontmatter": "Frontmatter",
"noMatches": "Sin coincidencias",
"emptyFile": "Archivo vacío",
"createFailed": "No se pudo crear el {{kind}}",
"deleteFailed": "No se pudo eliminar el {{kind}}",
"searchPlaceholder": "Buscar {{kind}}…",
"selectOne": "Selecciona un {{kind}}",
"selectToView": "Selecciona un {{kind}} para ver su contenido",
"delete": "Eliminar",
"createPrompt": "Ayúdame a crear el contenido de este nuevo archivo de {{kind}}",
"improvePrompt": "Ayúdame a entender y mejorar este archivo de {{kind}}"
}
}
+2 -1
View File
@@ -4,11 +4,12 @@ import en from './en-GB.json';
import ptPT from './pt-PT.json';
import frFR from './fr-FR.json';
import deDE from './de-DE.json';
import esES from './es-ES.json';
// D2: every shipped locale ships a COMPLETE catalog. A key en-GB has and another locale lacks is a red
// build, not a warning — there is no regional fallback to paper over the gap.
describe('officer-web (app.*) locale catalogs', () => {
test('every shipped locale has every key en-GB has', () => {
expect(findMissingKeys(en, { 'pt-PT': ptPT, 'fr-FR': frFR, 'de-DE': deDE })).toEqual([]);
expect(findMissingKeys(en, { 'pt-PT': ptPT, 'fr-FR': frFR, 'de-DE': deDE, 'es-ES': esES })).toEqual([]);
});
});