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([]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"button": {
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Confirmar",
|
||||
"ok": "Aceptar",
|
||||
"close": "Cerrar"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Buscar",
|
||||
"open": "Abrir búsqueda",
|
||||
"close": "Cerrar búsqueda",
|
||||
"clear": "Borrar búsqueda"
|
||||
},
|
||||
"select": {
|
||||
"placeholder": "Seleccionar..."
|
||||
},
|
||||
"tabs": {
|
||||
"filterPlaceholder": "Filtrar"
|
||||
},
|
||||
"commandBlock": {
|
||||
"run": "Ejecutar en el terminal",
|
||||
"copy": "Copiar comando"
|
||||
},
|
||||
"colorPicker": {
|
||||
"placeholder": "Color hexadecimal"
|
||||
},
|
||||
"state": {
|
||||
"loading": "Cargando…"
|
||||
},
|
||||
"dataTable": {
|
||||
"empty": "No se encontraron datos.",
|
||||
"pagination": {
|
||||
"showingPage": "Mostrando página {{current}} de {{total}}",
|
||||
"showingPageShort": "p {{current}}/{{total}}",
|
||||
"rowsPerPage": "Filas por página",
|
||||
"perPage": "{{size}} / página",
|
||||
"perPageShort": "{{size}}/p",
|
||||
"first": "Primera",
|
||||
"prev": "Anterior",
|
||||
"next": "Siguiente",
|
||||
"last": "Última"
|
||||
}
|
||||
},
|
||||
"pagination": {
|
||||
"label": "Paginación",
|
||||
"previous": "Anterior",
|
||||
"next": "Siguiente",
|
||||
"morePages": "Más páginas",
|
||||
"goToPrevious": "Ir a la página anterior",
|
||||
"goToNext": "Ir a la página siguiente"
|
||||
},
|
||||
"carousel": {
|
||||
"previous": "Diapositiva anterior",
|
||||
"next": "Diapositiva siguiente"
|
||||
},
|
||||
"breadcrumb": {
|
||||
"more": "Más"
|
||||
},
|
||||
"theme": {
|
||||
"toggle": "Alternar modo de color"
|
||||
},
|
||||
"error": {
|
||||
"forbidden": {
|
||||
"title": "Acceso no autorizado",
|
||||
"description": "No tienes autorización para realizar esta acción.",
|
||||
"hint": "Si crees que esto es un error, contacta con tu responsable."
|
||||
},
|
||||
"unauthorized": {
|
||||
"title": "Credenciales no válidas",
|
||||
"description": "Tu token de acceso ha caducado",
|
||||
"hint": "Inicia sesión de nuevo"
|
||||
},
|
||||
"server": {
|
||||
"title": "Error del servidor"
|
||||
}
|
||||
},
|
||||
"logo": {
|
||||
"icon": "Icono de Officer",
|
||||
"logo": "Logotipo de Officer"
|
||||
}
|
||||
}
|
||||
@@ -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('shared components (ui.*) 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([]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,652 @@
|
||||
{
|
||||
"common": {
|
||||
"save": "Guardar",
|
||||
"delete": "Eliminar"
|
||||
},
|
||||
"minesweeper": {
|
||||
"notInstalled": "Minesweeper no está instalado en este servidor.",
|
||||
"needs": "Necesita wine, un prefijo de 32 bits y este paquete junto a la plataforma:",
|
||||
"notRunning": "La sesión de Minesweeper no está en ejecución.",
|
||||
"error": {
|
||||
"connectionFailed": "La conexión a la sesión de Minesweeper falló.",
|
||||
"refused": "El servidor VNC rechazó la conexión.",
|
||||
"authUnsupported": "El servidor VNC pide autenticación, que este cliente no implementa.",
|
||||
"handshakeRejected": "El servidor VNC rechazó el handshake.",
|
||||
"unknownMessage": "El servidor VNC envió un tipo de mensaje desconocido ({{type}}).",
|
||||
"unknownEncoding": "El servidor VNC usó la codificación {{encoding}}, que este cliente no solicitó."
|
||||
}
|
||||
},
|
||||
"qrTransfer": {
|
||||
"chooseFile": "Elige un archivo para enviar",
|
||||
"startScanning": "Empezar a escanear",
|
||||
"receiveAnother": "Recibir otro",
|
||||
"stop": "Detener"
|
||||
},
|
||||
"dav": {
|
||||
"empty": "Aquí no hay nada todavía. Añade uno desde un cliente de móvil o de escritorio mediante CalDAV/CardDAV.",
|
||||
"calendar": "Calendario",
|
||||
"contacts": "Contactos",
|
||||
"readFailed": "No se pudo leer {{name}}: {{reason}}"
|
||||
},
|
||||
"terminal": {
|
||||
"title": "Terminal",
|
||||
"find": "Buscar",
|
||||
"runningShells": "Shells en ejecución",
|
||||
"loading": "Cargando…",
|
||||
"noShells": "No hay ninguna shell en ejecución.",
|
||||
"refresh": "Actualizar",
|
||||
"kill": "Terminar esta shell"
|
||||
},
|
||||
"appStore": {
|
||||
"loading": "Cargando",
|
||||
"loadFailed": "No se pudo cargar la tienda de aplicaciones.",
|
||||
"installed": "Instaladas",
|
||||
"available": "Disponibles",
|
||||
"needsYou": "Te necesita",
|
||||
"needsYouShort": "te necesita",
|
||||
"selectApp": "Selecciona una aplicación",
|
||||
"installFailed": "La instalación falló",
|
||||
"uninstall": "Desinstalar",
|
||||
"enable": "Activar",
|
||||
"disable": "Desactivar",
|
||||
"enabled": "activada",
|
||||
"disabled": "desactivada",
|
||||
"removalNote": "Desactivar detiene el sidecar y su contenedor. Desinstalar también elimina los contenedores — tus datos, la configuración y las tablas de esta aplicación se conservan en cualquier caso.",
|
||||
"installing": "instalando",
|
||||
"failed": "falló",
|
||||
"installedIcon": "instalada"
|
||||
},
|
||||
"systemMonitor": {
|
||||
"cpuPackage": "Paquete de CPU",
|
||||
"user": "Usuario",
|
||||
"cpuPct": "CPU%",
|
||||
"memPct": "MEM%",
|
||||
"command": "Comando",
|
||||
"memory": "Memoria",
|
||||
"disks": "Discos",
|
||||
"temperature": "Temperatura",
|
||||
"network": "Red",
|
||||
"power": "Energía",
|
||||
"topProcesses": "Procesos principales",
|
||||
"filterPlaceholder": "filtrar por nombre o imagen…",
|
||||
"name": "Nombre",
|
||||
"status": "Estado",
|
||||
"mem": "Mem",
|
||||
"uptime": "Tiempo activo",
|
||||
"scopeDockers": "dockers"
|
||||
},
|
||||
"codeEditor": {
|
||||
"closeFile": "Cerrar {{name}}",
|
||||
"loading": "Cargando…",
|
||||
"noFiles": "Sin archivos",
|
||||
"explorer": "Explorador",
|
||||
"openAFile": "Abre un archivo desde el explorador para empezar a editar",
|
||||
"refresh": "Actualizar el árbol y recargar los archivos abiertos sin modificar",
|
||||
"readFailed": "No se pudo leer el archivo",
|
||||
"saved": "Archivo guardado",
|
||||
"saveFailed": "No se pudo guardar el archivo",
|
||||
"title": "Editor de código"
|
||||
},
|
||||
"widgets": {
|
||||
"resync": "Resincronizar widgets (recarga para incluir los widgets recién implementados)"
|
||||
},
|
||||
"preview": {
|
||||
"title": "Vista previa",
|
||||
"reload": "Recargar",
|
||||
"changeUrl": "Cambiar URL",
|
||||
"openNewTab": "Abrir en una pestaña nueva",
|
||||
"pointAtApp": "Apunta este panel a una aplicación en ejecución",
|
||||
"open": "Abrir",
|
||||
"hint": "Cualquier cosa que el navegador pueda alcanzar. Se queda en este panel y sobrevive a una recarga.",
|
||||
"connecting": "Conectando…"
|
||||
},
|
||||
"sendOff": {
|
||||
"files": "Archivos",
|
||||
"where": "Dónde",
|
||||
"loading": "Cargando…",
|
||||
"landsIn": "Llega a su",
|
||||
"landedIn": "Llegó a",
|
||||
"whoMaySend": "Quién puede enviarme",
|
||||
"allowedLandIn": "Los archivos de quien autorices llegan a",
|
||||
"removeFile": "Eliminar {{name}}",
|
||||
"sendTo": "Enviar a {{name}}",
|
||||
"turningOff": "Desactivar a alguien detiene los envíos futuros y deja intacto lo que ya envió."
|
||||
},
|
||||
"panelName": {
|
||||
"appStore": "Tienda de aplicaciones",
|
||||
"appDetail": "Detalle de la aplicación",
|
||||
"calendar": "Calendario",
|
||||
"contacts": "Contactos",
|
||||
"categories": "Categorías",
|
||||
"chat": "Chat",
|
||||
"chatSessions": "Sesiones",
|
||||
"codeEditor": "Editor de código",
|
||||
"commander": "Commander",
|
||||
"commanders": "Commanders",
|
||||
"dashboardPreview": "Vista previa del Dashboard",
|
||||
"dashboards": "Dashboards",
|
||||
"fileBrowser": "Explorador de archivos",
|
||||
"pluginDetail": "Detalle del plugin",
|
||||
"plugins": "Plugins",
|
||||
"preview": "Vista previa",
|
||||
"qrReceive": "Recibir por QR",
|
||||
"qrSend": "Enviar por QR",
|
||||
"scope": "Ámbito",
|
||||
"systemMonitor": "Monitor del sistema",
|
||||
"widgets": "Widgets",
|
||||
"terminal": "Terminal",
|
||||
"hostTerminal": "Terminal del host",
|
||||
"runningShells": "Shells en ejecución",
|
||||
"pm2Processes": "procesos pm2"
|
||||
},
|
||||
"dashboards": {
|
||||
"title": "Dashboards",
|
||||
"new": "Nuevo Dashboard",
|
||||
"delete": "Eliminar dashboard",
|
||||
"confirmDelete": "¿Seguro que quieres eliminar",
|
||||
"search": "Buscar dashboards",
|
||||
"name": "Nombre",
|
||||
"description": "Descripción",
|
||||
"open": "Abrir Dashboard",
|
||||
"selectOne": "Selecciona un dashboard o crea uno nuevo",
|
||||
"namePlaceholder": "Mi Dashboard",
|
||||
"descriptionPlaceholder": "¿Para qué es este dashboard?",
|
||||
"template": "Plantilla",
|
||||
"create": "Crear",
|
||||
"templates": {
|
||||
"single": "Único",
|
||||
"twoColumns": "2 columnas",
|
||||
"mainSide": "Principal + lateral",
|
||||
"sidebar": "Barra lateral",
|
||||
"grid": "Cuadrícula 2x2",
|
||||
"colsBottom": "Columnas + inferior"
|
||||
}
|
||||
},
|
||||
"fileViewer": {
|
||||
"readAloud": "Leer en voz alta",
|
||||
"ocr": "Extraer texto (OCR)",
|
||||
"transcribe": "Transcribir",
|
||||
"extractAudio": "Extraer audio",
|
||||
"extract": "Extraer",
|
||||
"saveNextTo": "Guardar junto al original",
|
||||
"download": "Descargar",
|
||||
"pdfViewer": "Visor de PDF",
|
||||
"videoFailed": "No se pudo cargar el vídeo",
|
||||
"imageFailed": "No se pudo cargar la imagen",
|
||||
"audioFailed": "No se pudo cargar el archivo de audio",
|
||||
"audioTrack": "Pista de audio",
|
||||
"subtitles": "Subtítulos",
|
||||
"track": "Pista {{n}}",
|
||||
"saved": "Archivo guardado",
|
||||
"saveFailed": "No se pudo guardar el archivo",
|
||||
"scrollTop": "Ir arriba",
|
||||
"speechFailed": "No se pudo generar el audio de voz",
|
||||
"ocrFailed": "No se pudo extraer el texto de la imagen",
|
||||
"transcribeFailed": "No se pudo transcribir el audio",
|
||||
"extractAudioFailed": "No se pudo extraer el audio del vídeo",
|
||||
"extractFailed": "No se pudo extraer el archivo comprimido",
|
||||
"savedAs": "Guardado como “{{name}}”",
|
||||
"extractedTo": "Extraído en “{{name}}”",
|
||||
"downloadInstead": "Descargar en su lugar",
|
||||
"archiveFile": "Archivo comprimido"
|
||||
},
|
||||
"plugins": {
|
||||
"loading": "Cargando…",
|
||||
"onThisMachine": "En esta máquina",
|
||||
"noPluginsIn": "No hay plugins en",
|
||||
"available": "Disponibles",
|
||||
"needsOnThisMachine": "Requisitos en esta máquina",
|
||||
"install": "Instalar",
|
||||
"clonesInto": "Clona el repositorio en",
|
||||
"deleteData": "Eliminar también todos sus datos",
|
||||
"noTables": "Este plugin no declara tablas, por lo que no hay datos que conservar.",
|
||||
"selectOne": "Selecciona un plugin.",
|
||||
"disable": "Desactivar",
|
||||
"enable": "Activar",
|
||||
"publisher": "Editor",
|
||||
"version": "Versión",
|
||||
"needsPlatform": "Requiere la plataforma",
|
||||
"wouldMount": "Se montaría en",
|
||||
"ships": "Incluye",
|
||||
"permissions": "Permisos",
|
||||
"source": "Origen",
|
||||
"mountsAt": "Se monta en",
|
||||
"sidecar": "Sidecar",
|
||||
"deleteNamed": "Eliminar {{name}}",
|
||||
"updateTo": "Actualizar a {{version}}"
|
||||
},
|
||||
"commandHq": {
|
||||
"selectOne": "Selecciona un commander, o inicia uno nuevo.",
|
||||
"startConversation": "Iniciar la conversación",
|
||||
"name": "Nombre",
|
||||
"nameHint": "Se aplica a la conversación al iniciarse, en lugar de que el harness la nombre a partir de tu primer mensaje.",
|
||||
"workingDirectory": "Directorio de trabajo",
|
||||
"cwdHint": "Desde donde se resuelve cada comando que ejecuta, y donde se guarda su historial. No se puede mover después.",
|
||||
"new": "Nuevo commander",
|
||||
"spawned": "Iniciado",
|
||||
"deleteQ": "¿Eliminar?",
|
||||
"uncategorised": "Sin categoría",
|
||||
"loading": "Cargando…",
|
||||
"platformDeploys": "Despliegues de la plataforma",
|
||||
"endSession": "Terminar sesión — la libera para que pueda reanudarse en otro lugar",
|
||||
"confirmDeleteHint": "Confirmar eliminación — elimina también la conversación, no solo la entrada de Command HQ",
|
||||
"confirmDelete": "Confirmar eliminación",
|
||||
"cancelDelete": "Cancelar eliminación",
|
||||
"deleteCommander": "Eliminar commander",
|
||||
"none": "Todavía no hay commanders aquí.",
|
||||
"startOne": "Inicia uno",
|
||||
"confirmDeleteNamed": "Confirmar la eliminación de {{name}}",
|
||||
"deleteNamed": "Eliminar {{name}}",
|
||||
"categories": "Categorías",
|
||||
"noCategories": "Todavía no hay categorías",
|
||||
"newCategory": "Nueva categoría",
|
||||
"allCommanders": "Todos los commanders",
|
||||
"categoryName": "Nombre de la categoría",
|
||||
"guide": {
|
||||
"whatIsIt": "Qué es un commander",
|
||||
"starting": "Cómo iniciar uno",
|
||||
"examples": "Ejemplos de un primer mensaje",
|
||||
"whileRunning": "Mientras se ejecuta",
|
||||
"whatIsItBody1": "Un agente que sigue trabajando cuando no estás — espera a que ocurra algo, actúa en consecuencia y te informa.",
|
||||
"whatIsItBody2": "Es una conversación normal. Empiezas diciéndole qué vigilar y qué hacer al respecto, con tus propias palabras.",
|
||||
"startingBody1": "Describe aquí el trabajo, como se lo dirías a cualquiera. Di qué debe vigilar, dónde, y qué hacer cuando se dispare.",
|
||||
"startingBody2": "TODO: los pasos concretos, cuando el flujo de creación esté definido. Esto sustituye a “abrir el diálogo de trabajo en segundo plano y armar un vigilante”, que nadie podría adivinar.",
|
||||
"examplesBody1": "TODO: dos o tres ejemplos de mensajes iniciales, cuando el flujo de creación esté definido. Son lo que convierte “describe el trabajo” de una instrucción en algo sobre lo que un usuario novato puede actuar.",
|
||||
"whileRunningBody1": "TODO: lo que ve el propietario — dónde aparece su coste, cómo leer lo que están haciendo los agentes que ha iniciado, y cómo detenerlo.",
|
||||
"draft": "borrador"
|
||||
},
|
||||
"startHint": "Explorará este directorio y luego te preguntará qué debe vigilar.",
|
||||
"startBlocked": "{{missing}} — y entonces esto lo inicia.",
|
||||
"confirmDeletingNamed": "Confirmar la eliminación de {{name}}"
|
||||
},
|
||||
"chatHistory": {
|
||||
"newChat": "Nuevo chat",
|
||||
"tryAgain": "Reintentar",
|
||||
"refresh": "Actualizar",
|
||||
"refreshSessions": "Actualizar sesiones",
|
||||
"newChatInDir": "Nuevo chat en un directorio…",
|
||||
"loadFailed": "No se pudieron cargar las sesiones",
|
||||
"reading": "Leyendo transcripciones…",
|
||||
"noSessions": "Todavía no hay sesiones",
|
||||
"liveFailed": "No se pudieron leer las sesiones activas",
|
||||
"asking": "Preguntando al agente…",
|
||||
"tabs": {
|
||||
"tree": "Árbol",
|
||||
"latest": "Recientes",
|
||||
"live": "Activas",
|
||||
"agents": "Agentes",
|
||||
"commanders": "Commanders"
|
||||
},
|
||||
"notifyPreference": "Preferencia de notificaciones",
|
||||
"notify": {
|
||||
"everyTurn": "Al final de cada turno",
|
||||
"inputNeeded": "Solo cuando se necesita una respuesta",
|
||||
"none": "Ninguna"
|
||||
},
|
||||
"notificationsLabel": "Notificaciones: {{choice}}",
|
||||
"chooseDir": "Elige un directorio de trabajo",
|
||||
"create": "Crear",
|
||||
"newFolder": "Nueva carpeta",
|
||||
"selectFolder": "Seleccionar esta carpeta",
|
||||
"newFolderName": "Nombre de la nueva carpeta",
|
||||
"noSubfolders": {
|
||||
"one": "Sin subcarpetas visibles — se ha filtrado {{count}} oculta",
|
||||
"other": "Sin subcarpetas visibles — se han filtrado {{count}} ocultas"
|
||||
},
|
||||
"showHidden": "Mostrar ocultas",
|
||||
"showHiddenCount": "Mostrar ocultas ({{count}})",
|
||||
"selectSession": "Selecciona una sesión para verla",
|
||||
"endSession": "Terminar sesión — detiene cualquier turno en curso y la libera para que pueda reanudarse en otro lugar",
|
||||
"noReadable": "No hay conversaciones legibles aquí.",
|
||||
"noConversations": "Todavía no hay conversaciones",
|
||||
"newChatIn": "Nuevo chat en {{path}}",
|
||||
"sessionTitle": "Título de la sesión",
|
||||
"saveTitle": "Guardar título",
|
||||
"cancelRename": "Cancelar cambio de nombre",
|
||||
"confirmDelete": "Confirmar eliminación",
|
||||
"cancelDelete": "Cancelar eliminación",
|
||||
"rename": "Renombrar",
|
||||
"deleteSession": "Eliminar sesión",
|
||||
"renameFailed": "No se pudo renombrar la sesión: {{reason}}",
|
||||
"deleteFailed": "No se pudo eliminar la sesión: {{reason}}",
|
||||
"deleteAll": "¿Eliminar las {{count}}?",
|
||||
"confirmDeletingNamed": "Confirmar la eliminación de {{name}}",
|
||||
"renameNamed": "Renombrar {{name}}",
|
||||
"deleteNamed": "Eliminar {{name}}",
|
||||
"newChatTitle": "Nuevo chat",
|
||||
"renameHint": "Haz clic para renombrar este chat",
|
||||
"hideHidden": "Ocultar ocultas"
|
||||
},
|
||||
"chat": {
|
||||
"newChat": "Nuevo chat",
|
||||
"rename": "Renombrar",
|
||||
"deleteQ": "¿Eliminar “{{title}}”?",
|
||||
"duplicateAgent": "Ya existe un agente llamado “{{name}}” en este dashboard",
|
||||
"composerPlaceholder": "¿En qué quieres trabajar ahora?",
|
||||
"turnFinished": "Turno terminado · sin mensaje de cierre",
|
||||
"job": {
|
||||
"title": "Trabajo en segundo plano",
|
||||
"runsIn": "Se ejecuta en",
|
||||
"command": "Comando — ejecutar exactamente esto",
|
||||
"prompt": "Prompt — descríbelo y el agente lo resuelve",
|
||||
"watch": "Vigilar algo",
|
||||
"watchHint": "En texto libre. El agente preguntará antes de armar si algo no queda claro.",
|
||||
"handBack": "Salir y devolver el control al agente, luego rearmar",
|
||||
"keepGoing": "Continuar — actuar cada vez y seguir",
|
||||
"stopAfter": "Detener después de",
|
||||
"start": "Iniciar",
|
||||
"watchExample": "vigila nuestros repositorios de Gitea; con cada nuevo push, tráelo y envíalo al espejo de GitHub",
|
||||
"startJob": "Iniciar un trabajo en segundo plano o un vigilante"
|
||||
},
|
||||
"tasks": {
|
||||
"restart": "Reiniciar",
|
||||
"pinned": "Fijado",
|
||||
"clearFinished": "Limpiar todos los terminados",
|
||||
"clearFinishedTasks": "Limpiar todas las tareas terminadas",
|
||||
"stopJob": "Detener este trabajo",
|
||||
"dismiss": "Descartar",
|
||||
"rerun": "Detenerlo y ejecutar el mismo comando de nuevo",
|
||||
"collapse": "Contraer",
|
||||
"collapseDetail": "Contraer el detalle de la tarea",
|
||||
"stopNamed": "Detener {{label}}",
|
||||
"dismissNamed": "Descartar {{label}}",
|
||||
"status": "Tarea {{status}}."
|
||||
},
|
||||
"usage": {
|
||||
"noSignIn": "No hay ninguna sesión guardada — ejecuta /login para usar esta",
|
||||
"updating": "Actualizando…",
|
||||
"unreadable": "No se pudo leer el consumo en esta máquina.",
|
||||
"loading": "Cargando…",
|
||||
"limits": "Límites",
|
||||
"byDay": "Tokens por día",
|
||||
"byModel": "Tokens por modelo",
|
||||
"title": "Consumo y límites",
|
||||
"modelBreakdown": "Entrada {{input}} · salida {{output}} · lectura de caché {{cacheRead}} · escritura de caché {{cacheWrite}}",
|
||||
"switchTo": "Cambiar a {{account}}",
|
||||
"switchToOrg": "Cambiar a {{account}} ({{org}})",
|
||||
"signInExpired": "{{account}} — sesión caducada, ejecuta /login"
|
||||
},
|
||||
"attach": {
|
||||
"image": "Imagen",
|
||||
"textFile": "Archivo de texto",
|
||||
"webpageUrl": "URL de página web",
|
||||
"attach": "Adjuntar",
|
||||
"readFailed": "No se pudo leer {{name}}: {{reason}}",
|
||||
"unknownError": "error desconocido",
|
||||
"webpageTitle": "Adjuntar página web",
|
||||
"webpageHint": "Introduce una URL para extraerla y adjuntarla como contexto.",
|
||||
"scrapeFailed": "No se pudo extraer la página web",
|
||||
"uploadFailed": "No se pudo subir la imagen",
|
||||
"dropImages": "Suelta imágenes para adjuntarlas"
|
||||
},
|
||||
"signIn": {
|
||||
"title": "Iniciar sesión en Claude",
|
||||
"done": "Sesión iniciada. Los turnos nuevos usan estas credenciales — no hace falta reiniciar.",
|
||||
"asking": "Pidiendo a la CLI un enlace de inicio de sesión…",
|
||||
"openHint": "Ábrelo, autoriza y pega aquí el código que te dé.",
|
||||
"authorise": "Autorizar en claude.com",
|
||||
"copyLink": "Copia el enlace, para abrirlo en otro navegador o en tu teléfono",
|
||||
"pasteCode": "pega el código"
|
||||
},
|
||||
"message": {
|
||||
"copyCode": "Copiar el código",
|
||||
"copyMarkdown": "Copiar como bloque markdown",
|
||||
"showMore": "Mostrar más ({{count}} líneas más)",
|
||||
"subagent": "Subagente",
|
||||
"outputError": "Salida — error",
|
||||
"contextCleared": "Contexto borrado — nada de lo anterior está en memoria",
|
||||
"interrupted": "Interrumpido por el usuario",
|
||||
"agentRestarted": "Agente reiniciado — turno interrumpido",
|
||||
"retry": "Reintentar",
|
||||
"planUnchanged": "Modo de plan sin cambios",
|
||||
"approve": "Aprobar",
|
||||
"frontmatter": "Frontmatter",
|
||||
"systemPrompt": "Prompt de sistema",
|
||||
"reviseHint": "¿Qué debería cambiar? El agente revisa el plan a partir de esto.",
|
||||
"waiting": "Esperando una respuesta",
|
||||
"narrationFailed": "La narración se generó pero no se pudo reproducir.",
|
||||
"readAloudFailed": "No se pudo leer este mensaje en voz alta: {{reason}}",
|
||||
"compacted": "Contexto compactado",
|
||||
"compactedAuto": "Contexto compactado automáticamente",
|
||||
"answerSent": "Respuesta enviada — esperando al agente",
|
||||
"other": "Otro..."
|
||||
},
|
||||
"composer": {
|
||||
"stop": "Detener",
|
||||
"sendIntoTurn": "Enviar esto al turno que ya está en curso",
|
||||
"removeFromQueue": "Quitar de la cola",
|
||||
"send": "Enviar",
|
||||
"startHint": "Envía un mensaje para empezar",
|
||||
"jumpToLatest": "Ir al último mensaje",
|
||||
"noAudio": "No se captó ningún audio"
|
||||
},
|
||||
"agent": {
|
||||
"gone": "El agente de este panel ya no existe.",
|
||||
"forget": "Olvidarlo",
|
||||
"name": "Nombra este agente",
|
||||
"peers": "Pares: {{names}}"
|
||||
},
|
||||
"copy": "Copiar"
|
||||
},
|
||||
"files": {
|
||||
"folderGone": "Esa carpeta ya no existe — de vuelta al inicio",
|
||||
"searchFailed": "La búsqueda falló",
|
||||
"createFolderFailed": "No se pudo crear la carpeta",
|
||||
"createFileFailed": "No se pudo crear el archivo",
|
||||
"uploadFailed": "No se pudieron subir los archivos",
|
||||
"renameFailed": "No se pudo renombrar",
|
||||
"deleteFailed": "No se pudo eliminar",
|
||||
"deleteSomeFailed": "No se pudieron eliminar algunos elementos",
|
||||
"downloadFailed": "No se pudo descargar",
|
||||
"pathCopied": "Ruta copiada",
|
||||
"generatingSpeech": "Generando audio de voz…",
|
||||
"speechFailed": "No se pudo generar el audio de voz",
|
||||
"extracting": "Extrayendo el archivo comprimido…",
|
||||
"extractFailed": "No se pudo extraer el archivo comprimido",
|
||||
"cloned": "Repositorio clonado",
|
||||
"cloneFailed": "No se pudo clonar el repositorio",
|
||||
"cloning": "Clonando…",
|
||||
"duplicateFailed": "No se pudo duplicar",
|
||||
"compressing": "Comprimiendo…",
|
||||
"compressFailed": "No se pudo comprimir",
|
||||
"pasteFailed": "No se pudo pegar",
|
||||
"pasteNeedsSecure": "Pegar desde el portapapeles necesita un contexto seguro (https). Arrastra el archivo en su lugar.",
|
||||
"copiedItems": {
|
||||
"one": "Se copió {{count}} elemento",
|
||||
"other": "Se copiaron {{count}} elementos"
|
||||
},
|
||||
"cutItems": {
|
||||
"one": "Se cortó {{count}} elemento",
|
||||
"other": "Se cortaron {{count}} elementos"
|
||||
},
|
||||
"pastedItems": {
|
||||
"one": "Se pegó {{count}} elemento",
|
||||
"other": "Se pegaron {{count}} elementos"
|
||||
},
|
||||
"uploadedFiles": {
|
||||
"one": "Se subió {{count}} archivo",
|
||||
"other": "Se subieron {{count}} archivos"
|
||||
},
|
||||
"deleteItemsQ": {
|
||||
"one": "¿Eliminar {{count}} elemento?",
|
||||
"other": "¿Eliminar {{count}} elementos?"
|
||||
},
|
||||
"deletedItems": {
|
||||
"one": "Se eliminó {{count}} elemento",
|
||||
"other": "Se eliminaron {{count}} elementos"
|
||||
},
|
||||
"createdFolder": "Carpeta “{{name}}” creada",
|
||||
"created": "“{{name}}” creado",
|
||||
"renamedTo": "Renombrado a “{{name}}”",
|
||||
"deleteQ": "¿Eliminar “{{name}}”?",
|
||||
"deleted": "“{{name}}” eliminado",
|
||||
"extractedTo": "Extraído en “{{name}}”",
|
||||
"duplicated": "“{{name}}” duplicado",
|
||||
"pastedInto": "Pegado en “{{name}}”",
|
||||
"unpinned": "“{{name}}” quitado de fijados",
|
||||
"pinned": "“{{name}}” fijado",
|
||||
"menu": {
|
||||
"copyPath": "Copiar ruta",
|
||||
"chatAboutThis": "Chatear sobre esto",
|
||||
"paste": "Pegar",
|
||||
"newFile": "Nuevo archivo",
|
||||
"newFolder": "Nueva carpeta",
|
||||
"uploadFiles": "Subir archivos",
|
||||
"uploadFolder": "Subir carpeta",
|
||||
"cloneRepository": "Clonar repositorio",
|
||||
"hideHiddenFiles": "Ocultar archivos ocultos",
|
||||
"showHiddenFiles": "Mostrar archivos ocultos",
|
||||
"createDashboardHere": "Crear Dashboard aquí",
|
||||
"downloadVideo": "Descargar vídeo",
|
||||
"dictate": "Dictar",
|
||||
"dropToUpload": "Suelta archivos para subirlos",
|
||||
"openFolder": "Abrir carpeta",
|
||||
"showLocation": "Mostrar ubicación",
|
||||
"download": "Descargar",
|
||||
"noResults": "No se encontraron resultados",
|
||||
"open": "Abrir",
|
||||
"openInEditor": "Abrir en el editor",
|
||||
"openInEditorTooLarge": "Abrir en el editor (demasiado grande)",
|
||||
"pasteIntoFolder": "Pegar en la carpeta",
|
||||
"readAloud": "Leer en voz alta",
|
||||
"extract": "Extraer",
|
||||
"runTask": "Ejecutar tarea",
|
||||
"runAgent": "Ejecutar agente",
|
||||
"cut": "Cortar",
|
||||
"copy": "Copiar",
|
||||
"duplicate": "Duplicar",
|
||||
"rename": "Renombrar",
|
||||
"compress": "Comprimir",
|
||||
"compressSelection": "Comprimir selección",
|
||||
"unpin": "Quitar de fijados",
|
||||
"pin": "Fijar",
|
||||
"chat": "Chat...",
|
||||
"delete": "Eliminar",
|
||||
"gitClone": "Clonar con Git",
|
||||
"searchFiles": "Buscar archivos...",
|
||||
"clearSelection": "Limpiar selección",
|
||||
"selected": "seleccionados",
|
||||
"refresh": "Actualizar"
|
||||
},
|
||||
"grid": {
|
||||
"empty": "Esta carpeta está vacía",
|
||||
"sort": "Ordenar:",
|
||||
"name": "Nombre",
|
||||
"type": "Tipo",
|
||||
"size": "Tamaño",
|
||||
"date": "Fecha"
|
||||
}
|
||||
},
|
||||
"taskRunner": {
|
||||
"stop": "Detener",
|
||||
"taskFailed": "La tarea falló",
|
||||
"taskComplete": "Tarea completada",
|
||||
"noSubtitles": "Sin subtítulos",
|
||||
"none": "Ninguno",
|
||||
"noVideos": "No se encontraron vídeos en esta carpeta.",
|
||||
"differentLayout": "Disposición diferente — ejecuta estos por separado:",
|
||||
"skipped": "Omitidos (convertir por separado):",
|
||||
"analyzing": "Analizando archivos…",
|
||||
"close": "Cerrar",
|
||||
"runningOn": "Ejecutándose en",
|
||||
"queue": "Cola",
|
||||
"concurrency": "Concurrencia",
|
||||
"model": "Modelo",
|
||||
"steps": "Pasos",
|
||||
"stopPipeline": "Detener el pipeline",
|
||||
"pipelineFailed": "El pipeline falló",
|
||||
"pipelineComplete": "Pipeline completado",
|
||||
"viewInJobs": "Ver en Trabajos",
|
||||
"copyOutput": "Copiar salida",
|
||||
"track": "Pista {{n}}",
|
||||
"runFromStep": "Ejecutar desde el paso {{n}}"
|
||||
},
|
||||
"newEntry": {
|
||||
"nameReserved": "Ese nombre está reservado",
|
||||
"nameSlash": "El nombre no puede contener \"/\"",
|
||||
"nameExists": "\"{{name}}\" ya existe aquí",
|
||||
"urlSpaces": "Una URL no puede contener espacios",
|
||||
"cancel": "Cancelar",
|
||||
"file": {
|
||||
"title": "Nuevo archivo",
|
||||
"description": "Incluye la extensión — es lo que el editor usa para elegir un lenguaje. Se abre en cuanto se crea.",
|
||||
"label": "Nombre del archivo",
|
||||
"placeholder": "notas.txt",
|
||||
"submit": "Crear y abrir"
|
||||
},
|
||||
"folder": {
|
||||
"title": "Nueva carpeta",
|
||||
"description": "Se crea en la carpeta que estás viendo.",
|
||||
"label": "Nombre de la carpeta",
|
||||
"placeholder": "documentos",
|
||||
"submit": "Crear carpeta"
|
||||
},
|
||||
"clone": {
|
||||
"title": "Clonar repositorio",
|
||||
"description": "Se clona en la carpeta que estás viendo, con su propio nombre.",
|
||||
"label": "URL del repositorio",
|
||||
"placeholder": "https://github.com/owner/repo.git",
|
||||
"submit": "Clonar"
|
||||
}
|
||||
},
|
||||
"videoDownload": {
|
||||
"title": "Descargar vídeo",
|
||||
"descriptionInput": "Pega la URL de un vídeo o lista de reproducción — se obtienen los detalles antes de descargar.",
|
||||
"descriptionPreview": "Revisa y descarga.",
|
||||
"urlPlaceholder": "https://www.youtube.com/watch?v=… o …/playlist?list=…",
|
||||
"audioOnly": "Extraer solo el audio (mp3)",
|
||||
"fetch": "Obtener",
|
||||
"back": "Volver",
|
||||
"audioOnlyLabel": "Solo audio",
|
||||
"video": "Vídeo",
|
||||
"itemCount": {
|
||||
"one": "{{count}} elemento",
|
||||
"other": "{{count}} elementos"
|
||||
},
|
||||
"subfolderPlaceholder": "Subcarpeta (opcional) — déjalo en blanco para esta carpeta",
|
||||
"downloadAll": "Descargar todo",
|
||||
"couldNotFetch": "No se pudo obtener",
|
||||
"downloading": "Descargando…",
|
||||
"saving": "Guardando…",
|
||||
"saved": "Guardado",
|
||||
"retry": "Reintentar",
|
||||
"download": "Descargar",
|
||||
"couldNotFetchInfo": "No se pudo obtener la información",
|
||||
"timedOut": "Tiempo agotado",
|
||||
"downloadFailed": "La descarga falló",
|
||||
"couldNotStart": "No se pudo iniciar la descarga"
|
||||
},
|
||||
"fileBrowserWidget": {
|
||||
"title": "Explorador de archivos",
|
||||
"search": "Buscar...",
|
||||
"browse": "Explorar",
|
||||
"recent": "Recientes",
|
||||
"pinned": "Fijados",
|
||||
"noResults": "Sin resultados",
|
||||
"emptyDirectory": "Directorio vacío",
|
||||
"noPinnedFiles": "Sin archivos fijados",
|
||||
"noRecentFiles": "Sin archivos recientes",
|
||||
"uploading": "Subiendo...",
|
||||
"empty": "Esta carpeta está vacía",
|
||||
"sort": "Ordenar:"
|
||||
},
|
||||
"agentRunner": {
|
||||
"agentRunning": "Agente en ejecución",
|
||||
"keepsGoing": "Sigue ejecutándose tanto si esto se queda abierto como si no. Síguelo en el chat — la sesión más reciente aparece arriba.",
|
||||
"openChat": "Abrir chat",
|
||||
"target": "Objetivo",
|
||||
"starting": "Iniciando…",
|
||||
"runAgent": "Ejecutar agente",
|
||||
"startFailed": "No se pudo iniciar el agente"
|
||||
},
|
||||
"dictate": {
|
||||
"title": "Dictar",
|
||||
"description": "Grabando audio. Pulsa Intro o haz clic en Detener para guardar.",
|
||||
"recording": "Grabando...",
|
||||
"startingStatus": "Iniciando...",
|
||||
"stopSave": "Detener y guardar",
|
||||
"noAudioCaptured": "No se captó ningún audio",
|
||||
"micAccessFailed": "No se pudo acceder al micrófono",
|
||||
"recordingFailed": "La grabación falló"
|
||||
}
|
||||
}
|
||||
@@ -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('officerdev (panel.*) 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