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:
@@ -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),
|
||||
}));
|
||||
|
||||
@@ -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}}"
|
||||
}
|
||||
}
|
||||
@@ -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([]);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user