Files
LambdaMail/services/webmail/messages/en.json
T
Lucas RayanandClaude Opus 5 e5edee096c #32: file composed mail, and verify DNS records for real
Three things the console and the mail client were getting wrong.

**Sent stayed empty and drafts would not save.** Both write through the same
persistence path, and both failed on the same constraint: spf_result,
dkim_result and dmarc_result are restricted to the RFC verdict vocabulary and
are nullable, so "not evaluated" has to be NULL. The compose path left them at
Go's zero value, which sends an empty string - satisfying neither the CHECK nor
the meaning - and the insert was rejected. Filing the Sent copy is deliberately
non-fatal, so it failed silently; saving a draft reported the error. Inbound
mail was unaffected because it always supplies a real verdict, which is also
why the existing test never caught it.

**DNS reconciliation could not verify anything.** The console posted to the
auth service, which has no resolver, so the endpoint recorded the request and
re-read the status already in the database. The machinery to do it properly
already existed - the background reconciler resolves every expected record
through public resolvers - it just was not reachable from the console.

Adds GET /api/v1/admin/dns/verify to the protocols service, which owns both the
resolver and the record spec, and wires the domains screen to it: every
expected record, its expected value, and whether it actually resolves. A
proxied record is reported as present rather than matching, because behind a
proxy the published answer is the provider's address and comparing values would
always disagree. Reconciliation still runs afterwards so the stored status and
the audit trail stay in step.

The spec is read, never provisioned: opening a screen must not create DKIM keys
as a side effect.

Verified: the persistence test fails without the fix with the exact constraint
violation (email_messages_dkim_result_check), 22 Go packages and 36 webmail
tests green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 14:35:09 -03:00

293 lines
11 KiB
JSON

{
"admin": {
"addAlias": "Add alias",
"aliasesTitle": "Aliases",
"auditLog": "Audit log",
"backToWebmail": "Back to webmail",
"cancelJob": "Cancel",
"certificateState": "Certificate",
"checksPassed": "{passed} of {total} passed",
"createAccount": "Create account",
"createAlias": "Create a routing alias",
"csvPreview": "Preview",
"dashboardSubtitle": "Live figures read from the database.",
"dashboardTitle": "Overview",
"dkimAlgorithm": "Key type",
"dkimOverlap": "Both keys sign outbound mail for {days} days so nothing fails while DNS propagates.",
"dkimPublishRecord": "Publish this record in DNS:",
"dkimRotate": "Generate a new key",
"dkimSelector": "Selector",
"dkimTitle": "DKIM key rotation",
"dmarcSubtitle": "Breakdown of the aggregate XML reports that have been ingested.",
"dmarcTitle": "DMARC reports",
"dnsRecordsFor": "DNS records for {domain}",
"dnsStatusDrift": "Drift",
"dnsStatusPartial": "Partial",
"dnsStatusVerified": "Verified",
"domainName": "Domain name",
"domainsTitle": "Domains",
"expiresInDays": "Expires in {days} days",
"freezeDomain": "Freeze domain",
"greylistScore": "Greylist score",
"headerScore": "Header-tagging score",
"jobCancelled": "Job {id} was cancelled.",
"jobRetried": "Job {id} was queued for another attempt.",
"lastChecked": "Last checked: {when}",
"lastReload": "Last reload",
"mailHost": "Mail host",
"mailboxCount": "{count} mailboxes",
"mailboxesSubtitle": "Accounts, aliases, CSV import and the second-factor policy.",
"mailboxesTitle": "Mailboxes",
"mfaAdmins": "Required for admins",
"mfaEveryone": "Required for everyone",
"mfaOptional": "Optional",
"mfaPolicyIntro": "Choose how strictly this domain requires a second factor.",
"mfaPolicyTitle": "Second-factor requirement",
"noCertificate": "No certificate is loaded for this host.",
"noChecks": "No checks reported.",
"noDomains": "No domains have been onboarded yet.",
"notPublished": "Not published",
"onboardIntro": "Creates the domain and its standard RFC 2142 aliases, pointed at your address.",
"onboardTitle": "Add a domain",
"openAdmin": "Admin console",
"preflightTitle": "Readiness checks",
"presentProxied": "Present (proxied)",
"queueEmpty": "The outbound queue is empty.",
"queueSubtitle": "Inspect the outbound queue, retry a job, or cancel one.",
"queueTitle": "Outbound queue",
"readinessIntro": "Checks the server reports about itself before it carries production mail.",
"reconcileDns": "Reconcile DNS",
"reconcileNotImplemented": "Per-record DNS verification is not implemented yet: this records the request and re-reads the stored status, it does not query a resolver.",
"rejectScore": "Reject score",
"retryJob": "Retry",
"rspamdIntro": "Scores that trigger greylisting, header tagging and rejection.",
"rspamdSaved": "Thresholds saved.",
"saveThresholds": "Save thresholds",
"securitySubtitle": "Readiness checks, TLS state, spam thresholds and the audit trail.",
"securityTitle": "Security",
"tabAudit": "Audit trail",
"tabReadiness": "Readiness",
"tabRspamd": "Spam thresholds",
"tabTls": "TLS",
"tlsMode": "TLS mode",
"tlsTitle": "Certificate and transport",
"traceNoResults": "No trace found for that queue ID.",
"tracePlaceholder": "Queue ID",
"traceTitle": "Trace a message",
"unknownSni": "Unknown SNI requests",
"verifyIntro": "Resolves every expected record against public resolvers and reports each one.",
"watcherHealthy": "Certificate watcher"
},
"auth": {
"adminLoginTitle": "Admin console",
"adminStepUpNote": "The admin console asks for your second factor again, even though you are already signed in to webmail.",
"authFailed": "Authentication failed",
"cantScanQr": "Cannot scan? Enter this key manually:",
"emailLabel": "Email address",
"enrolmentFailed": "Could not start the second-factor setup",
"enrolmentIntro": "The admin console requires a second factor. Set one up now to continue.",
"genericError": "Something went wrong",
"invalidCredentials": "Invalid email or password",
"mfaRequired": "Enter the six-digit code from your authenticator app.",
"passwordLabel": "Password",
"qrCodeAlt": "QR code for two-factor setup",
"scanQr": "Scan this code with Google Authenticator, Aegis, Authy or 1Password.",
"signInButton": "Sign in",
"signOutOfAdmin": "Leave admin",
"totpCodeLabel": "Authentication code",
"userLoginTitle": "Sign in to your mailbox",
"verificationFailed": "Verification failed",
"verifyCodeButton": "Verify code"
},
"common": {
"actions": "Actions",
"add": "Add",
"adminPortal": "Admin",
"appName": "LambdaMail",
"back": "Back",
"cancel": "Cancel",
"confirm": "Confirm",
"continue": "Continue",
"copied": "Copied",
"copy": "Copy",
"delete": "Delete",
"loading": "Loading...",
"logout": "Sign out",
"never": "Never",
"none": "None",
"refresh": "Refresh",
"retry": "Retry",
"save": "Save",
"search": "Search",
"status": "Status",
"unavailable": "Unavailable",
"userPortal": "Webmail"
},
"errors": {
"forbidden": "You do not have access to this",
"loadFailed": "Could not load the data",
"serverError": "Something went wrong on the server",
"unauthorized": "Please sign in again"
},
"mail": {
"addFiles": "Add files...",
"allMessages": "All",
"archive": "Archive",
"attachments": "Attachments ({count})",
"attachmentsFilter": "With attachments",
"attachmentsUnsupported": "Attachments are listed by name only; file upload is not wired up yet.",
"backToList": "Back to the message list",
"bold": "Bold",
"bulletList": "Bulleted list",
"compose": "Compose",
"discard": "Discard",
"draftSaveFailed": "Draft could not be saved",
"draftSaved": "Draft saved automatically",
"draftSaving": "Saving draft...",
"drafts": "Drafts",
"forward": "Forward",
"hideCcBcc": "- Hide Cc/Bcc",
"inbox": "Inbox",
"insertLink": "Insert link",
"insertUrl": "Enter the URL:",
"italic": "Italic",
"junk": "Spam",
"loadImages": "Load images",
"noMessages": "No messages",
"numberedList": "Numbered list",
"reply": "Reply",
"sendMessage": "Send message",
"sending": "Sending...",
"sent": "Sent",
"showCcBcc": "+ Add Cc/Bcc",
"strikethrough": "Strikethrough",
"trash": "Trash",
"underline": "Underline",
"undoSend": "Sending in {seconds}s",
"undoSendAction": "Undo",
"unreadCount": "{count} unread",
"unreadFilter": "Unread"
},
"settings": {
"actionDiscard": "Discard",
"actionFlag": "Flag message",
"actionMove": "Move to Archive",
"addRule": "Add rule",
"appPasswordPlaceholder": "Thunderbird / Outlook Mobile",
"appPasswords": "App passwords",
"autoReplySaveFailed": "Could not save the auto-reply",
"enableMfa": "Enable two-factor",
"fieldFrom": "From",
"fieldHeader": "Header",
"fieldSubject": "Subject",
"generateAppPassword": "Generate",
"langEn": "English",
"langEs": "Español",
"langPtBR": "Português (Brasil)",
"language": "Language",
"matchContains": "contains",
"matchEquals": "is exactly",
"matchRegex": "matches regex",
"mfaDisabled": "Disabled",
"mfaEnabled": "Enabled",
"mfaStatus": "Two-factor status",
"recoveryCodesTitle": "Recovery codes",
"ruleIf": "IF",
"ruleThen": "THEN",
"saveAutoReply": "Save auto-reply",
"saveRecoveryCodes": "Save these somewhere safe. Each one works once, and they are shown only now.",
"security": "Security",
"sessions": "Sessions",
"settingsSaved": "Settings saved.",
"sieveIntro": "Rules that sort incoming mail automatically.",
"sieveTitle": "Filters (Sieve)",
"signOut": "Sign out",
"signatureIntro": "Appended automatically to the messages you compose.",
"signaturePlaceholder": "Kind regards,\nYour name\nYour role",
"signatureSaveFailed": "Could not save the signature",
"signatureSaved": "Signature saved.",
"signatureTitle": "Email signature",
"sixDigitCode": "Six-digit code",
"startOverMfa": "Lost the entry? Start over with a new key",
"subtitle": "Two-factor authentication, filters, auto-reply and your signature.",
"title": "Settings",
"twoFactorIntro": "Protect your account with Google Authenticator, Aegis, Authy or 1Password.",
"vacationBodyLabel": "Reply message",
"vacationDefaultBody": "Thank you for your message. I am currently away and will reply when I return.",
"vacationDefaultSubject": "Out of office",
"vacationIntro": "Reply automatically to incoming mail while you are away.",
"vacationSubjectLabel": "Reply subject",
"vacationTitle": "Out-of-office auto-reply",
"valuePlaceholder": "Value to match..."
},
"ui": {
"accountStatus": "Account status",
"actions": "Actions",
"active": "Active",
"activeSessions": "Active sessions",
"actor": "Actor",
"actualRecord": "Actual value",
"allChecksPassed": "All checks passed",
"appPasswordGenerated": "App password generated",
"appPasswordsSection": "App passwords",
"attempts": "Attempts",
"bounceRate": "Bounce rate",
"changePassword": "Change password",
"clientIp": "Client IP",
"copyPasswordNow": "Copy it now. It is not shown again.",
"coreInfra": "Core services",
"currentPassword": "Current password",
"currentSession": "This device",
"daneVerified": "DANE verified",
"destination": "Destination",
"diskUsed": "Storage used",
"dkimAlignment": "DKIM alignment",
"dkimResult": "DKIM",
"dmarcEnforcement": "DMARC policy",
"domainVerification": "Domain verification",
"domainsVerified": "Domains verified",
"emailAddress": "Email address",
"eventAction": "Action",
"expectedValue": "Expected value",
"healthy": "Healthy",
"imapEngine": "IMAP service",
"inboundVolume": "Received (24h)",
"jobId": "Job",
"lastError": "Last error",
"liveMetrics": "Live metrics",
"localDisk": "Local disk",
"mailboxesActive": "Active mailboxes",
"messageBody": "Message",
"messageVolume": "Messages",
"newPassword": "New password",
"noAppPasswords": "No app passwords yet.",
"noData": "No data yet",
"online": "Online",
"outboundDelivered": "Sent (24h)",
"passwordChanged": "Password changed.",
"postgresRunner": "Postgres-backed queue",
"preflightTitle": "Readiness",
"provisionMailbox": "Create mailbox",
"queueDepth": "Queue depth",
"recipient": "Recipient",
"recordName": "Record",
"reportingOrg": "Reporting organisation",
"scanners": "Spam and virus scanning",
"sender": "Sender",
"signOutOthers": "Sign out other devices",
"smtpListener": "SMTP service",
"sourceIp": "Source IP",
"spfRatio": "SPF pass rate",
"spfResult": "SPF",
"storageQuota": "Storage quota",
"subject": "Subject",
"targetObject": "Target",
"timestamp": "Time",
"toRecipients": "To",
"toggleMenu": "Toggle menu",
"totalEvaluated": "Messages evaluated",
"twoFactorSection": "Two-factor authentication",
"watching": "Watching"
}
}