- Implemented tests for ingesting TLS RPT reports from emails and ensuring they are stored correctly in the database. - Added tests to verify that the same report can be ingested multiple times without duplication. - Created tests for backfilling reports that were previously delivered to the inbox. - Developed WebSocket event handling tests to ensure events are correctly routed to subscribers based on mailbox ownership. - Included tests for the mail API to validate session handling, mailbox isolation, and error mapping. - Ensured that the API rejects unauthorized requests and handles malformed JSON gracefully.
328 lines
13 KiB
JSON
328 lines
13 KiB
JSON
{
|
|
"admin": {
|
|
"addAlias": "Add alias",
|
|
"aliasTarget": "Destination address",
|
|
"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",
|
|
"csvImportFailed": "The CSV import failed",
|
|
"csvImported": "Imported {count} mailboxes.",
|
|
"csvIntro": "Paste CSV to provision several accounts with their RFC 6154 folders. Columns: email, role, quota_mb.",
|
|
"csvPreview": "Preview",
|
|
"csvRun": "Run import",
|
|
"csvTitle": "Bulk mailbox import (CSV)",
|
|
"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",
|
|
"lockAccount": "Lock",
|
|
"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",
|
|
"quotaMb": "Quota (MB)",
|
|
"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",
|
|
"tabAccounts": "Accounts",
|
|
"tabAliases": "Aliases",
|
|
"tabAudit": "Audit trail",
|
|
"tabCsv": "Bulk import",
|
|
"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",
|
|
"traceResultFor": "Trace for {id}",
|
|
"traceStep": "Step {n}",
|
|
"traceTitle": "Trace a message",
|
|
"unknownSni": "Unknown SNI requests",
|
|
"unlockAccount": "Unlock",
|
|
"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.",
|
|
"orRecoveryCode": "Lost your phone? A recovery code works here too.",
|
|
"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",
|
|
"stepUpIntro": "You are already signed in, so only your second factor is needed. Your password is not asked for again.",
|
|
"stepUpSignedInAs": "Signed in as {email}",
|
|
"stepUpTitle": "Open the admin console",
|
|
"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",
|
|
"emptyBody": "This message has no text body.",
|
|
"forward": "Forward",
|
|
"imagesEnabled": "Images loaded",
|
|
"hideCcBcc": "- Hide Cc/Bcc",
|
|
"inbox": "Inbox",
|
|
"insertLink": "Insert link",
|
|
"insertUrl": "Enter the URL:",
|
|
"italic": "Italic",
|
|
"junk": "Spam",
|
|
"reports": "Reports",
|
|
"loadImages": "Load images",
|
|
"markRead": "Mark as read",
|
|
"markUnread": "Mark as unread",
|
|
"messagesInFolder": "{count} messages",
|
|
"noMatches": "Nothing matched that search",
|
|
"noMessages": "No messages",
|
|
"noSubject": "(No subject)",
|
|
"numberedList": "Numbered list",
|
|
"remoteContentBlocked": "Remote images were blocked so this message cannot track you.",
|
|
"reply": "Reply",
|
|
"searchMatches": "{count} found",
|
|
"searchPlaceholder": "Search (from:, subject:)...",
|
|
"selectAMessage": "Select a message to read it",
|
|
"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": {
|
|
"accountLocked": "Locked",
|
|
"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",
|
|
"ccRecipients": "Cc",
|
|
"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",
|
|
"mfaActive": "TOTP active",
|
|
"mfaNone": "No second factor",
|
|
"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",
|
|
"role": "Role",
|
|
"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"
|
|
}
|
|
}
|