The console demanded a second factor and refused to open without one, but
enrolment lived on the other surface - so an operator whose only account
was the administrator had no way in. The password was already verified at
that point, so the refusal now carries a short-lived grant that permits
enrolling a factor and nothing else, and the admin login screen walks
through it: secret, confirmation, recovery codes, sign in. Two tests cover
it, including that the grant opens no other endpoint.
The rewrite also undid work that was already in place:
- The postcss override was dropped and the advisory came back, along
with a critical one in vitest. postcss is a direct dependency now, so
the fix is the version plus an override scoped to Next's own copy;
vitest moves to 3.2.7. The lockfile needed regenerating for either to
take effect. Zero advisories now.
- 100 language-lint violations: the admin console had been rewritten
with its strings in Portuguese, hardcoded. That fails CI, and it also
puts those strings beyond the reach of the translation bundles - an
English or Spanish user would have read Portuguese. They are English
in the source again.
- The mail screen put a fixed 320px list beside the reader with no
breakpoint, so on a phone the viewport overflowed and the message was
a few pixels wide. One pane at a time below md, with a way back.
- The icon-only navigation toggles had nothing for a screen reader to
announce.
The layouts' own mobile navigation and every previously fixed behaviour
survived the rewrite - checked rather than assumed.
Also fixes a marker collision I introduced: the E2E helper locates the
repository by a migrations directory, and services/migrations satisfied
that one directory too early. It now requires the SQL to actually be
there.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
149 lines
5.8 KiB
JSON
149 lines
5.8 KiB
JSON
{
|
|
"common": {
|
|
"appName": "LambdaMail",
|
|
"userPortal": "Webmail",
|
|
"adminPortal": "Consola de Gestión",
|
|
"loading": "Cargando...",
|
|
"save": "Guardar Cambios",
|
|
"cancel": "Cancelar",
|
|
"delete": "Eliminar",
|
|
"confirm": "Confirmar",
|
|
"search": "Buscar",
|
|
"status": "Estado",
|
|
"actions": "Acciones",
|
|
"refresh": "Actualizar",
|
|
"logout": "Cerrar Sesión"
|
|
},
|
|
"auth": {
|
|
"userLoginTitle": "Iniciar Sesión en Webmail",
|
|
"adminLoginTitle": "Iniciar Sesión en Consola Admin",
|
|
"emailLabel": "Dirección de Correo",
|
|
"passwordLabel": "Contraseña",
|
|
"signInButton": "Iniciar Sesión",
|
|
"totpCodeLabel": "Código del Autenticador (6 dígitos)",
|
|
"verifyCodeButton": "Verificar Código",
|
|
"invalidCredentials": "Correo o contraseña no válidos",
|
|
"mfaRequired": "Código de autenticación de dos factores requerido"
|
|
},
|
|
"mail": {
|
|
"inbox": "Bandeja de Entrada",
|
|
"sent": "Enviados",
|
|
"drafts": "Borradores",
|
|
"trash": "Papelera",
|
|
"junk": "Spam",
|
|
"archive": "Archivo",
|
|
"compose": "Redactar Correo",
|
|
"noMessages": "No hay mensajes en esta carpeta",
|
|
"unreadCount": "{count, plural, =0 {Sin mensajes no leídos} one {# mensaje no leído} other {# mensajes no leídos}}",
|
|
"loadImages": "Cargar Imágenes Remotas",
|
|
"reply": "Responder",
|
|
"forward": "Reenviar",
|
|
"undoSend": "Deshacer Envío ({seconds}s restantes)"
|
|
},
|
|
"settings": {
|
|
"title": "Configuración de la Cuenta",
|
|
"security": "Seguridad y 2FA",
|
|
"appPasswords": "Contraseñas de Aplicación",
|
|
"sessions": "Sesiones Activas",
|
|
"mfaStatus": "Estado de Autenticación de Dos Factores",
|
|
"mfaEnabled": "2FA está Activo",
|
|
"mfaDisabled": "2FA está Desactivado",
|
|
"enableMfa": "Activar 2FA",
|
|
"generateAppPassword": "Generar Contraseña de Aplicación",
|
|
"recoveryCodesTitle": "Códigos de Recuperación",
|
|
"saveRecoveryCodes": "Guarde estos códigos de recuperación en un lugar seguro. No se volverán a mostrar.",
|
|
"language": "Idioma",
|
|
"signOut": "Cerrar sesión",
|
|
"langEn": "Inglés",
|
|
"langPtBR": "Portugués (Brasil)",
|
|
"langEs": "Español"
|
|
},
|
|
"admin": {
|
|
"dashboardTitle": "Panel del Sistema",
|
|
"domainsTitle": "Dominios y DNS (13 Registros)",
|
|
"mailboxesTitle": "Buzones y Cuentas",
|
|
"aliasesTitle": "Alias y Enrutamiento",
|
|
"queueTitle": "Cola de Entrega de Salida",
|
|
"dmarcTitle": "Análisis DMARC",
|
|
"securityTitle": "Seguridad y Registro de Auditoría",
|
|
"preflightTitle": "Diagnóstico Preflight",
|
|
"reconcileDns": "Reconciliar Registros DNS",
|
|
"dnsStatusVerified": "VERIFICADO",
|
|
"dnsStatusDrift": "DESVÍO DETECTADO",
|
|
"dnsStatusPartial": "PARCIAL",
|
|
"retryJob": "Reintentar Entrega",
|
|
"cancelJob": "Cancelar Trabajo",
|
|
"freezeDomain": "Congelar Destino"
|
|
},
|
|
"errors": {
|
|
"unauthorized": "Sesión expirada o no autorizada",
|
|
"forbidden": "Acceso prohibido para esta superficie de cuenta",
|
|
"serverError": "Ocurrió un error interno en el servidor"
|
|
},
|
|
"ui": {
|
|
"accountStatus": "Estado de la cuenta",
|
|
"actions": "Acciones",
|
|
"active": "ACTIVA",
|
|
"activeSessions": "Sesiones activas del webmail",
|
|
"actor": "Autor / cuenta",
|
|
"actualRecord": "Registro DNS actual (Cloudflare)",
|
|
"allChecksPassed": "TODAS LAS COMPROBACIONES PASARON",
|
|
"appPasswordGenerated": "Contrasena de aplicacion generada:",
|
|
"appPasswordsSection": "Contrasenas de aplicacion (clientes IMAP / SMTP)",
|
|
"attempts": "Intentos",
|
|
"clientIp": "IP del cliente",
|
|
"copyPasswordNow": "Copie esta contrasena ahora. No se mostrara de nuevo.",
|
|
"coreInfra": "Estado de la infraestructura",
|
|
"currentSession": "Sesion actual de este navegador",
|
|
"daneVerified": "DANE / MTA-STS verificado",
|
|
"destination": "Destino",
|
|
"diskUsed": "Uso de disco",
|
|
"dkimResult": "Resultado DKIM",
|
|
"dkimAlignment": "Alineacion de la firma DKIM",
|
|
"dmarcEnforcement": "Aplicacion de la politica DMARC",
|
|
"domainVerification": "Estado de la verificacion del dominio",
|
|
"emailAddress": "Direccion de correo",
|
|
"eventAction": "Accion registrada",
|
|
"expectedValue": "Valor esperado por la especificacion",
|
|
"healthy": "SALUDABLE",
|
|
"imapEngine": "Servidor IMAP (143/993)",
|
|
"inboundVolume": "Volumen de entrada (24h)",
|
|
"jobId": "ID del trabajo",
|
|
"lastError": "Ultimo error",
|
|
"liveMetrics": "Metricas operativas del nodo de correo.",
|
|
"localDisk": "Almacenamiento en disco local",
|
|
"preflightTitle": "Diagnostico de preflight del servidor",
|
|
"messageBody": "Cuerpo del mensaje",
|
|
"messageVolume": "Volumen de mensajes",
|
|
"noAppPasswords": "Aun no se generaron contrasenas de aplicacion.",
|
|
"online": "EN LINEA",
|
|
"outboundDelivered": "Entregados en salida (24h)",
|
|
"queueDepth": "Profundidad de la cola",
|
|
"postgresRunner": "Ejecutor de tareas Postgres activo",
|
|
"provisionMailbox": "Crear nuevo buzon",
|
|
"recipient": "Destinatario",
|
|
"recordName": "Nombre del registro",
|
|
"reportingOrg": "Organizacion que informo",
|
|
"scanners": "Rspamd (antispam) y ClamAV",
|
|
"sender": "Remitente",
|
|
"smtpListener": "Servidor SMTP (25/587/465)",
|
|
"sourceIp": "IP de origen",
|
|
"spfRatio": "Tasa de alineacion SPF",
|
|
"spfResult": "Resultado SPF",
|
|
"storageQuota": "Cuota de almacenamiento",
|
|
"subject": "Asunto",
|
|
"targetObject": "Objeto destino",
|
|
"timestamp": "Fecha y hora",
|
|
"toRecipients": "Para (destinatarios)",
|
|
"totalEvaluated": "Total de mensajes evaluados",
|
|
"twoFactorSection": "Autenticacion en dos pasos (TOTP RFC 6238)",
|
|
"watching": "OBSERVANDO",
|
|
"passwordChanged": "Contrasena cambiada",
|
|
"signOutOthers": "Cerrar las otras sesiones",
|
|
"changePassword": "Cambiar contrasena",
|
|
"currentPassword": "Contrasena actual",
|
|
"newPassword": "Nueva contrasena (min. 12 caracteres)",
|
|
"toggleMenu": "Abrir o cerrar el menu"
|
|
}
|
|
}
|