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.4 KiB
JSON
149 lines
5.4 KiB
JSON
{
|
|
"common": {
|
|
"appName": "LambdaMail",
|
|
"userPortal": "Webmail",
|
|
"adminPortal": "Management Console",
|
|
"loading": "Loading...",
|
|
"save": "Save Changes",
|
|
"cancel": "Cancel",
|
|
"delete": "Delete",
|
|
"confirm": "Confirm",
|
|
"search": "Search",
|
|
"status": "Status",
|
|
"actions": "Actions",
|
|
"refresh": "Refresh",
|
|
"logout": "Log Out"
|
|
},
|
|
"auth": {
|
|
"userLoginTitle": "Webmail Sign In",
|
|
"adminLoginTitle": "Admin Console Sign In",
|
|
"emailLabel": "Email Address",
|
|
"passwordLabel": "Password",
|
|
"signInButton": "Sign In",
|
|
"totpCodeLabel": "6-Digit Authenticator Code",
|
|
"verifyCodeButton": "Verify Code",
|
|
"invalidCredentials": "Invalid email or password",
|
|
"mfaRequired": "Two-factor authentication code required"
|
|
},
|
|
"mail": {
|
|
"inbox": "Inbox",
|
|
"sent": "Sent",
|
|
"drafts": "Drafts",
|
|
"trash": "Trash",
|
|
"junk": "Spam",
|
|
"archive": "Archive",
|
|
"compose": "Compose Email",
|
|
"noMessages": "No messages in this folder",
|
|
"unreadCount": "{count, plural, =0 {No unread messages} one {# unread message} other {# unread messages}}",
|
|
"loadImages": "Load Remote Images",
|
|
"reply": "Reply",
|
|
"forward": "Forward",
|
|
"undoSend": "Undo Send ({seconds}s remaining)"
|
|
},
|
|
"settings": {
|
|
"title": "Account Settings",
|
|
"security": "Security & 2FA",
|
|
"appPasswords": "App Passwords",
|
|
"sessions": "Active Sessions",
|
|
"mfaStatus": "Two-Factor Authentication Status",
|
|
"mfaEnabled": "2FA is Active",
|
|
"mfaDisabled": "2FA is Disabled",
|
|
"enableMfa": "Enable 2FA",
|
|
"generateAppPassword": "Generate App Password",
|
|
"recoveryCodesTitle": "Recovery Codes",
|
|
"saveRecoveryCodes": "Save these recovery codes in a safe place. They will not be shown again.",
|
|
"language": "Language",
|
|
"signOut": "Sign out",
|
|
"langEn": "English",
|
|
"langPtBR": "Portuguese (Brazil)",
|
|
"langEs": "Spanish"
|
|
},
|
|
"admin": {
|
|
"dashboardTitle": "System Dashboard",
|
|
"domainsTitle": "Domains & DNS (13 Records)",
|
|
"mailboxesTitle": "Mailboxes & Accounts",
|
|
"aliasesTitle": "Aliases & Routing",
|
|
"queueTitle": "Outbound Delivery Queue",
|
|
"dmarcTitle": "DMARC Analytics",
|
|
"securityTitle": "Security & Audit Log",
|
|
"preflightTitle": "Preflight Diagnostics",
|
|
"reconcileDns": "Reconcile DNS Records",
|
|
"dnsStatusVerified": "VERIFIED",
|
|
"dnsStatusDrift": "DRIFT DETECTED",
|
|
"dnsStatusPartial": "PARTIAL",
|
|
"retryJob": "Retry Delivery",
|
|
"cancelJob": "Cancel Job",
|
|
"freezeDomain": "Freeze Destination"
|
|
},
|
|
"errors": {
|
|
"unauthorized": "Session expired or unauthorized",
|
|
"forbidden": "Access forbidden for this account surface",
|
|
"serverError": "Internal server error occurred"
|
|
},
|
|
"ui": {
|
|
"accountStatus": "Account Status",
|
|
"actions": "Actions",
|
|
"active": "ACTIVE",
|
|
"activeSessions": "Active Webmail Sessions",
|
|
"actor": "Actor / Account",
|
|
"actualRecord": "Actual DNS Record (Cloudflare)",
|
|
"allChecksPassed": "ALL CHECKS PASSED",
|
|
"appPasswordGenerated": "App Password Generated:",
|
|
"appPasswordsSection": "App Passwords (IMAP / SMTP Clients)",
|
|
"attempts": "Attempts",
|
|
"clientIp": "Client IP",
|
|
"copyPasswordNow": "Copy this password now. It will not be shown again.",
|
|
"coreInfra": "Core Infrastructure Status",
|
|
"currentSession": "Current Webmail Browser Session",
|
|
"daneVerified": "DANE / MTA-STS verified",
|
|
"destination": "Destination",
|
|
"diskUsed": "Disk Capacity Used",
|
|
"dkimResult": "DKIM Result",
|
|
"dkimAlignment": "DKIM Signature Alignment",
|
|
"dmarcEnforcement": "DMARC Policy Enforcement",
|
|
"domainVerification": "Domain Verification Status",
|
|
"emailAddress": "Email Address",
|
|
"eventAction": "Event Action",
|
|
"expectedValue": "Expected Specification Value",
|
|
"healthy": "HEALTHY",
|
|
"imapEngine": "IMAP Protocol Engine (143/993)",
|
|
"inboundVolume": "Inbound Volume (24h)",
|
|
"jobId": "Job ID",
|
|
"lastError": "Last Error",
|
|
"liveMetrics": "Live operational metrics for LambdaMail mail node.",
|
|
"localDisk": "Local disk storage driver",
|
|
"preflightTitle": "Mail Server Preflight Diagnostics",
|
|
"messageBody": "Message Body",
|
|
"messageVolume": "Message Volume",
|
|
"noAppPasswords": "No app passwords generated yet.",
|
|
"online": "ONLINE",
|
|
"outboundDelivered": "Outbound Delivered (24h)",
|
|
"queueDepth": "Outbound Queue Depth",
|
|
"postgresRunner": "Postgres job runner active",
|
|
"provisionMailbox": "Provision New Mailbox Account",
|
|
"recipient": "Recipient",
|
|
"recordName": "Record Name",
|
|
"reportingOrg": "Reporting Organization",
|
|
"scanners": "Rspamd Anti-Spam Scanner & ClamAV",
|
|
"sender": "Sender",
|
|
"smtpListener": "SMTP Protocols Listener (25/587/465)",
|
|
"sourceIp": "Source IP",
|
|
"spfRatio": "SPF Alignment Pass Ratio",
|
|
"spfResult": "SPF Result",
|
|
"storageQuota": "Storage Quota",
|
|
"subject": "Subject",
|
|
"targetObject": "Target Object",
|
|
"timestamp": "Timestamp",
|
|
"toRecipients": "To (Recipients)",
|
|
"totalEvaluated": "Total Evaluated Messages",
|
|
"twoFactorSection": "Two-Factor Authentication (TOTP RFC 6238)",
|
|
"watching": "WATCHING",
|
|
"passwordChanged": "Password changed",
|
|
"signOutOthers": "Sign out other sessions",
|
|
"changePassword": "Change password",
|
|
"currentPassword": "Current password",
|
|
"newPassword": "New password (min. 12 characters)",
|
|
"toggleMenu": "Toggle navigation menu"
|
|
}
|
|
}
|