- Invitations: each user can invite two friends by email (sign-up works through the link even while registration is closed); admin-editable template, subject and sender. - Invitation sender defaults to the system-mail From address, which the SMTP account is allowed to send as (was postmaster@APP_DOMAIN, refused with 553 when the two differ). - Sign-in, sign-up and forgot-password fields show the fixed @domain after the typed name; the registration status reports it. - System mail gets a Date header; the invitation's plain-text part keeps its paragraphs and line breaks. - SMTP EHLO uses SMTP_HELO_NAME / APP_DOMAIN, not the container name. - DNS recommendations for the mail domains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
708 lines
35 KiB
TypeScript
708 lines
35 KiB
TypeScript
// English message catalog. Adding a locale = drop a sibling file with the same
|
||
// keys and register it in i18n/index.tsx. Keys are flat, dotted namespaces.
|
||
// Interpolate with {name} placeholders.
|
||
|
||
export const en = {
|
||
"common.appName": "Ultimo Email",
|
||
"common.loading": "Loading…",
|
||
"common.cancel": "Cancel",
|
||
"common.save": "Save",
|
||
"common.saving": "Saving…",
|
||
"common.delete": "Delete",
|
||
"common.remove": "Remove",
|
||
"common.edit": "Edit",
|
||
"common.close": "Close",
|
||
"common.clear": "Clear",
|
||
"common.copy": "Copy",
|
||
"common.back": "Back",
|
||
"common.next": "Next",
|
||
"common.signOut": "Sign out",
|
||
"common.retry": "Retry",
|
||
"common.optional": "optional",
|
||
|
||
"auth.signInTitle": "Sign in",
|
||
"auth.registerTitle": "Create account",
|
||
"auth.handle": "Handle",
|
||
"auth.handlePlaceholder": "e.g. alice",
|
||
"auth.localpartPlaceholder": "alice",
|
||
"auth.handleHint": "3–30 chars: a–z, 0–9, . _ -",
|
||
"auth.password": "Password",
|
||
"auth.passwordHint": "at least 8 characters",
|
||
"auth.totpCode": "2FA code",
|
||
"auth.totpPrompt": "Enter the 6-digit code from your authenticator app",
|
||
"auth.rememberDevice": "Don't ask for the code on this device in future",
|
||
"auth.signIn": "Sign in",
|
||
"auth.signingIn": "Signing in…",
|
||
"auth.create": "Create account",
|
||
"auth.creating": "Creating…",
|
||
"auth.noAccount": "No account?",
|
||
"auth.forgotPassword": "Forgot password?",
|
||
"auth.forgotTitle": "Reset your password",
|
||
"auth.forgotHint":
|
||
"Enter your user name. We'll email a link for choosing a new password to the recovery email address of the account.",
|
||
"auth.changePassword": "Change password",
|
||
"auth.sending": "Sending…",
|
||
"auth.forgotSent": "If this account exists you will receive an email to your recovery email address.",
|
||
"auth.backToSignIn": "Back to sign in",
|
||
"auth.resetTitle": "Choose a new password",
|
||
"auth.newPassword": "New password",
|
||
"auth.repeatPassword": "Repeat the new password",
|
||
"auth.passwordsDiffer": "The two passwords are different.",
|
||
"auth.passwordTooShort": "Use at least 8 characters.",
|
||
"auth.resetTotpPrompt":
|
||
"This account uses 2-step verification. Enter the 6-digit code from your authenticator app to finish.",
|
||
"auth.confirm": "Confirm",
|
||
"auth.resetDone": "Your password has been changed. You have been signed out everywhere — sign in with the new password.",
|
||
"auth.resetInvalid":
|
||
"This link is invalid, was already used, or has expired. Request a new one to change your password.",
|
||
"auth.requestNewLink": "Request a new link",
|
||
"auth.haveAccount": "Already have an account?",
|
||
"auth.register": "Register",
|
||
"auth.checking": "Checking…",
|
||
"auth.firstUserTitle": "Create the administrator account",
|
||
"auth.firstUserHint":
|
||
"This is the first account on this server, so it becomes the administrator. Registration closes automatically once it exists.",
|
||
"auth.registrationClosedTitle": "Registration is closed",
|
||
"auth.registrationClosed":
|
||
"This server is not accepting new accounts. Ask the administrator to open registration.",
|
||
|
||
"nav.mail": "Mail",
|
||
"nav.back": "Back",
|
||
"nav.settings": "Settings",
|
||
"nav.compose": "Compose",
|
||
"nav.collapseSidebar": "Collapse sidebar",
|
||
"nav.expandSidebar": "Expand sidebar",
|
||
"nav.allAccounts": "All accounts",
|
||
"nav.inbox": "Inbox",
|
||
"nav.archive": "Archive",
|
||
"nav.drafts": "Drafts",
|
||
"nav.sent": "Sent",
|
||
"nav.spam": "Spam",
|
||
"nav.trash": "Trash",
|
||
"nav.search": "Search mail…",
|
||
"nav.searchInTrash": "Search in Trash",
|
||
"nav.searchInSpam": "Search in Spam",
|
||
"search.save": "Save this search",
|
||
"search.saved": "Saved searches",
|
||
"search.saveNamePrompt": "Name this saved search:",
|
||
"nav.storageQuota": "Storage used",
|
||
"nav.refresh": "Refresh all folders",
|
||
|
||
"mail.noConversations": "No conversations.",
|
||
"mail.me": "me",
|
||
"nav.menu": "Menu",
|
||
"mail.selectConversation": "Select a conversation.",
|
||
"mail.loadingThread": "Loading thread…",
|
||
"mail.expandAll": "Expand all",
|
||
"mail.collapseAll": "Collapse all",
|
||
"mail.print": "Print",
|
||
"mail.previewVideoUnsupported": "This video can't be played in the browser.",
|
||
"mail.previewPage": "Page {current} / {total}",
|
||
"mail.previewResetZoom": "Reset zoom",
|
||
"mail.previewPrev": "Previous",
|
||
"mail.previewNext": "Next",
|
||
"preview.pdfProtected": "This PDF is password-protected",
|
||
"preview.password": "Password",
|
||
"preview.pdfWrongPassword": "Incorrect password — try again",
|
||
"preview.unlock": "Unlock",
|
||
"preview.pdfError": "Couldn't open this PDF.",
|
||
"mail.orderOldest": "Oldest first",
|
||
"mail.orderNewest": "Newest first",
|
||
"filter.all": "All mail",
|
||
"filter.unread": "Unread",
|
||
"filter.pinned": "Pinned",
|
||
"filter.sortOldest": "Sort oldest first",
|
||
"filter.sortNewest": "Sort newest first",
|
||
"pager.prev": "Previous page",
|
||
"pager.next": "Next page",
|
||
"mail.reply": "Reply",
|
||
"mail.replyAll": "Reply all",
|
||
"mail.forward": "Forward",
|
||
"mail.archive": "Archive",
|
||
"mail.markRead": "Mark read",
|
||
"mail.markUnread": "Mark unread",
|
||
"mail.star": "Star",
|
||
"mail.unstar": "Unstar",
|
||
"mail.pin": "Pin",
|
||
"mail.unpin": "Unpin",
|
||
"mail.delete": "Delete",
|
||
"mail.restore": "Restore",
|
||
"mail.select": "Select conversation",
|
||
"mail.selectAll": "Select all",
|
||
"mail.conversationSelected": "1 conversation selected",
|
||
"mail.conversationsSelected": "{count} conversations selected",
|
||
"mail.conversationsSelected_one": "1 conversation selected",
|
||
"mail.alsoIn": "Also delivered to",
|
||
"mail.emptyTrash": "Empty trash",
|
||
"mail.emptySpam": "Empty spam",
|
||
"mail.more": "More",
|
||
"mail.markAllRead": "Mark all as read",
|
||
"mail.labels": "Labels",
|
||
"mail.noLabels": "No labels yet",
|
||
"mail.createLabel": "Create new…",
|
||
"mail.labelName": "Label name",
|
||
|
||
"panel.toggle": "Toggle side panel",
|
||
"panel.calendar": "Calendar",
|
||
"panel.people": "People",
|
||
"panel.contacts": "Contacts",
|
||
"panel.attachments": "Attachments",
|
||
"panel.search": "Search",
|
||
"panel.newEvent": "New event",
|
||
"panel.miniCalendar": "Mini calendar",
|
||
"panel.week": "Week",
|
||
"panel.month": "Month",
|
||
"panel.view": "View",
|
||
"panel.day": "Day",
|
||
"panel.3days": "3 days",
|
||
"panel.agenda": "Agenda",
|
||
"panel.allCalendars": "All calendars",
|
||
"panel.searchEvents": "Search events",
|
||
"panel.today": "Today",
|
||
"panel.noEvents": "No events",
|
||
"panel.untitled": "(untitled)",
|
||
"panel.allDay": "All day",
|
||
"panel.openCalendar": "Open calendar in new tab",
|
||
"panel.inConversation": "In conversation",
|
||
"panel.allContacts": "All contacts",
|
||
"panel.recent": "Recent",
|
||
"panel.vips": "VIPs",
|
||
"panel.autosaved": "Autosaved",
|
||
"panel.senders": "Senders",
|
||
"panel.noPeople": "No people",
|
||
"panel.composeAll": "Compose to all",
|
||
"panel.inviteAll": "Invite all to new event",
|
||
"panel.call": "Call",
|
||
"panel.compose": "Compose",
|
||
"panel.invite": "Invite",
|
||
"panel.contactDetails": "Contact details",
|
||
"panel.showAll": "Show all",
|
||
"panel.mailSection": "Mail",
|
||
"panel.noSubject": "(no subject)",
|
||
"panel.findAll": "Find all conversations with {name}",
|
||
"panel.eventsSection": "Events",
|
||
"panel.noMatches": "No matches found",
|
||
"panel.openContact": "Open contact in new tab",
|
||
"panel.openConversation": "Open a conversation to see its attachments.",
|
||
"panel.noAttachments": "No attachments",
|
||
"panel.download": "Download",
|
||
"mail.emptyConfirm": "Permanently delete everything in this folder? This can't be undone.",
|
||
"mail.movedToTrash": "Moved to Trash",
|
||
"mail.loadFailed": "Couldn't load this message.",
|
||
"mail.imagesBlocked": "Images from this sender are blocked.",
|
||
"mail.loadImages": "Load images",
|
||
"mail.alwaysFromSender": "Always from this sender",
|
||
"mail.to": "to",
|
||
"mail.from": "From",
|
||
"mail.subjectLabel": "Subject",
|
||
"mail.dateLabel": "Date",
|
||
"mail.sizeLabel": "Size",
|
||
"mail.actions": "Actions",
|
||
"mail.forwardAsAttachment": "Forward as attachment",
|
||
"mail.showQuoted": "Show quoted text",
|
||
"mail.hideQuoted": "Hide quoted text",
|
||
"mail.markReadUnread": "Mark read / unread",
|
||
"mail.messageCount": "{count} messages",
|
||
"mail.messageCount_one": "1 message",
|
||
"mail.downloadAll": "Download all {count} attachments",
|
||
"mail.downloadZip": "Download zip",
|
||
"mail.download": "Download",
|
||
|
||
"compose.newMessage": "New message",
|
||
"compose.showQuoted": "Show or hide the quoted message",
|
||
"compose.to": "To",
|
||
"compose.cc": "Cc",
|
||
"compose.bcc": "Bcc",
|
||
"compose.subject": "Subject",
|
||
"compose.send": "Send",
|
||
"compose.sending": "Sending…",
|
||
"compose.discard": "Discard",
|
||
"compose.saveDraft": "Save draft",
|
||
"compose.closePrompt": "Save this message as a draft?",
|
||
"compose.sent": "Message sent.",
|
||
"compose.undoIn": "{count} seconds to",
|
||
"compose.undoIn_one": "1 second to",
|
||
"compose.undo": "Undo",
|
||
"compose.sendFailed": "Send failed.",
|
||
"compose.savingDraft": "Saving draft…",
|
||
"compose.draftSaved": "Draft saved",
|
||
"compose.noDrafts": "No drafts.",
|
||
"compose.otherClient": "other client",
|
||
"compose.noRecipient": "(no recipient)",
|
||
"compose.noSubject": "(no subject)",
|
||
"compose.from": "From",
|
||
"compose.attach": "Attach",
|
||
"compose.more": "More",
|
||
"compose.minimize": "Minimize",
|
||
"compose.restore": "Restore",
|
||
"compose.moreWindows": "More drafts",
|
||
"compose.expand": "Expand",
|
||
"compose.collapse": "Collapse",
|
||
"compose.popOut": "Pop out",
|
||
"compose.addRecipient": "Add recipient…",
|
||
"compose.fmtBold": "Bold",
|
||
"compose.fmtItalic": "Italic",
|
||
"compose.fmtUnderline": "Underline",
|
||
"compose.fmtStrike": "Strikethrough",
|
||
"compose.fmtBulletList": "Bulleted list",
|
||
"compose.fmtNumberList": "Numbered list",
|
||
"compose.fmtQuote": "Quote",
|
||
"compose.fmtLink": "Insert link",
|
||
"compose.fmtAlignLeft": "Align left",
|
||
"compose.fmtAlignCenter": "Align center",
|
||
"compose.fmtAlignRight": "Align right",
|
||
"compose.fmtClear": "Clear formatting",
|
||
"compose.fmtColor": "Text color",
|
||
"compose.fmtHighlight": "Highlight color",
|
||
"compose.fmtImage": "Insert image",
|
||
"compose.insertSignature": "Insert signature",
|
||
"compose.linkPrompt": "Link URL:",
|
||
"compose.linkOpen": "Open the link:",
|
||
"compose.linkEdit": "Edit",
|
||
"compose.linkDelete": "Delete",
|
||
"compose.linkSave": "Save",
|
||
"compose.spellTitle": "Spelling and grammar",
|
||
"compose.spellIgnore": "Ignore",
|
||
"compose.spellRemove": "(remove)",
|
||
"compose.spellMenu": "Spelling",
|
||
"compose.spellAuto": "Auto-detect",
|
||
"compose.spellOff": "Off",
|
||
"compose.spellOffMessage": "Off for this message",
|
||
"compose.imageTooLarge": "Image is too large (max 5 MB).",
|
||
"compose.attachTooLarge": "File exceeds the 25 MB limit.",
|
||
"compose.attachments": "Attachments",
|
||
"compose.dropAttach": "Drop to attach",
|
||
"compose.dropBody": "Drop image to insert · other files attach",
|
||
|
||
"wizard.title": "Add mail account",
|
||
"wizard.step1": "Your email address",
|
||
"wizard.emailPlaceholder": "you@example.com",
|
||
"wizard.discover": "Continue",
|
||
"wizard.discovering": "Looking up settings…",
|
||
"wizard.foundVia": "Found via {source}",
|
||
"wizard.imapServer": "IMAP server",
|
||
"wizard.smtpServer": "SMTP server",
|
||
"wizard.host": "Host",
|
||
"wizard.port": "Port",
|
||
"wizard.security": "Security",
|
||
"wizard.accountPassword": "Account password",
|
||
"wizard.appPasswordHint": "For Gmail, Yahoo, iCloud, or Outlook use an app password.",
|
||
"wizard.help": "Help",
|
||
"wizard.appPasswordHelp.title": "Set up an app password",
|
||
"wizard.appPasswordHelp.intro":
|
||
"These providers need a one-time app password instead of your normal password:",
|
||
"wizard.appPasswordHelp.prefix": "Make sure to",
|
||
"wizard.appPasswordHelp.twoStep": "turn on 2-step verification",
|
||
"wizard.appPasswordHelp.middle": "if you haven't done it yet, and then",
|
||
"wizard.appPasswordHelp.generate": "generate the app password",
|
||
"wizard.test": "Test & continue",
|
||
"wizard.testing": "Testing connection…",
|
||
"wizard.testOk": "Connection works.",
|
||
"wizard.create": "Add account",
|
||
"wizard.creating": "Adding…",
|
||
"wizard.created": "Account added — syncing your mail.",
|
||
"wizard.startReading": "Start reading now",
|
||
"wizard.backToAccounts": "Back to accounts",
|
||
"wizard.manualConfig": "Enter settings manually",
|
||
"wizard.displayName": "Display name",
|
||
"wizard.syncWindow": "How much mail to sync",
|
||
"wizard.syncWindow.all": "All mail",
|
||
"wizard.syncWindow.all.hint": "Imports the last 30 days first, then the rest in the background.",
|
||
"wizard.syncWindow.3months": "Last 3 months only",
|
||
"wizard.syncWindow.3months.hint": "Older mail stays on the server until you download it.",
|
||
"wizard.syncWindow.new": "New mail only",
|
||
"wizard.syncWindow.new.hint":
|
||
"Nothing from before now — download older mail anytime from account settings.",
|
||
"wizard.syncSpam": "Sync spam?",
|
||
"wizard.syncSpam.hint": "Also import the Spam/Junk folder. Off by default.",
|
||
|
||
// Provider credential-helper panel (app passwords, SPEC §6.2.2).
|
||
"wizard.appPassword.title": "Create an app password",
|
||
"wizard.appPassword.intro":
|
||
"This provider needs a one-time app password instead of your normal password. Open the page below, generate one, and paste it here.",
|
||
"wizard.appPassword.open": "Open {provider} app passwords",
|
||
"wizard.appPassword.appNameHint": "Suggested name: {hint}",
|
||
"wizard.appPassword.pastePlaceholder": "Paste the app password",
|
||
"wizard.appPassword.verifying": "Verifying…",
|
||
"wizard.appPassword.connected": "Connected ✓",
|
||
"wizard.appPassword.docs": "Provider help",
|
||
"wizard.appPassword.useManual": "Enter server settings manually",
|
||
"wizard.appPassword.provider.gmail": "Google",
|
||
"wizard.appPassword.provider.yahoo": "Yahoo",
|
||
"wizard.appPassword.provider.icloud": "iCloud",
|
||
"wizard.appPassword.provider.outlook": "Microsoft",
|
||
// auth_failed recovery branch (the two real dead-ends).
|
||
"wizard.appPassword.failTitle": "That password didn't work",
|
||
"wizard.appPassword.failCauses":
|
||
"Common causes: 2-Step Verification isn't fully enabled yet; a brand-new account for which the provider withholds app passwords until it ages; or a work/school account where an admin disabled the feature.",
|
||
"wizard.appPassword.oauthInstead": "Sign in with Google instead",
|
||
// Gmail steps.
|
||
"wizard.help.gmail.step1": "Turn on 2-Step Verification for your Google account if you haven't.",
|
||
"wizard.help.gmail.step2": "Click the button to generate an app password.",
|
||
"wizard.help.gmail.step3": "On the App passwords page, name the password (e.g. \"ultimo.email\") and create it.",
|
||
"wizard.help.gmail.step4": "Copy the 16-character password and paste it below.",
|
||
// Outlook / Microsoft personal steps.
|
||
"wizard.help.outlook.step1": "Turn on two-step verification in your Microsoft account security settings.",
|
||
"wizard.help.outlook.step2": "Under Advanced security options, create a new app password.",
|
||
"wizard.help.outlook.step3": "Copy the generated password and paste it below.",
|
||
// Yahoo steps.
|
||
"wizard.help.yahoo.step1": "Open Account Security and turn on two-step verification.",
|
||
"wizard.help.yahoo.step2": "Choose \"Generate app password\" and name it.",
|
||
"wizard.help.yahoo.step3": "Copy the password and paste it below.",
|
||
// iCloud steps.
|
||
"wizard.help.icloud.step1": "Turn on two-factor authentication for your Apple Account.",
|
||
"wizard.help.icloud.step2": "Under Sign-In and Security, generate an app-specific password.",
|
||
"wizard.help.icloud.step3": "Copy the password and paste it below.",
|
||
|
||
"settings.title": "Settings",
|
||
"settings.profile": "Profile",
|
||
"settings.security": "Security",
|
||
"settings.accounts": "Accounts",
|
||
"settings.downloadAllMail": "Sync remaining mail",
|
||
"settings.syncedPartially": "Synced partially",
|
||
"backfill.importing": "Importing messages… {done} of {total}",
|
||
"backfill.preparing": "Preparing to import messages…",
|
||
"settings.appearance": "Appearance",
|
||
"settings.handle": "Handle",
|
||
"settings.recoveryEmail": "Recovery email",
|
||
"settings.spellcheck": "Spelling and grammar check",
|
||
"settings.on": "On",
|
||
"settings.off": "Off",
|
||
"settings.spellcheckLanguage": "Spellchecking language",
|
||
"settings.spellcheckAuto": "Auto-detect (each paragraph)",
|
||
"settings.spellcheckUnavailable": "Not available: this server has no spell-checking engine set up.",
|
||
"settings.recoveryEmailHint":
|
||
"If you forget your password, a link to choose a new one is sent here.",
|
||
"settings.recoveryEmailNew": "Recovery email address",
|
||
"settings.recoveryEmailRemoveHint": "Leave empty to remove it.",
|
||
"settings.currentPassword": "Current password",
|
||
"settings.typePassword": "Type your password — for this confirmation it can't be filled in or pasted.",
|
||
"settings.change": "Change",
|
||
"settings.add": "Add",
|
||
"settings.saving": "Saving…",
|
||
"settings.twoFactor": "Two-factor authentication",
|
||
"settings.twoFactorOn": "2FA is enabled.",
|
||
"settings.twoFactorOff": "2FA is not enabled.",
|
||
"settings.enable2fa": "Enable 2FA",
|
||
"settings.disable2fa": "Disable 2FA",
|
||
"settings.disable2faPrompt": "Enter your password to turn off 2FA:",
|
||
"settings.disable": "Disable",
|
||
"settings.twoFactorDisabled": "2FA has been turned off.",
|
||
"settings.scanQr": "Scan this in your authenticator app, then enter a code:",
|
||
"settings.secret": "Secret",
|
||
"settings.confirm": "Confirm",
|
||
"settings.sessions": "Active sessions",
|
||
"appPasswords.title": "App passwords",
|
||
"appPasswords.help":
|
||
"Calendar and contacts apps — your phone's, Thunderbird, macOS — sign in to Ultimo with an app password, never your account password. Give each app its own, so you can revoke one without affecting the others.",
|
||
"appPasswords.helpMail":
|
||
"Mail apps — Thunderbird, your phone's Mail app, Outlook — and calendar and contacts apps sign in to Ultimo with an app password. Your account password never works in them. Give each app its own, so you can revoke one without affecting the others.",
|
||
"appPasswords.mailTitle": "External mail clients configuration:",
|
||
"appPasswords.mailIncoming": "Incoming (IMAP)",
|
||
"appPasswords.mailOutgoing": "Outgoing (SMTP)",
|
||
"appPasswords.mailPorts": "{host}, port {port}, SSL/TLS",
|
||
"appPasswords.mailPortsAlt": "or port {port}, STARTTLS",
|
||
"appPasswords.connectTitle": "External Calendars and Contacts apps configuration:",
|
||
"appPasswords.connectServer": "Server",
|
||
"appPasswords.connectUser": "User name",
|
||
"appPasswords.connectPassword": "Password",
|
||
"appPasswords.connectPasswordValue": "an app password (create one below)",
|
||
"appPasswords.connectHint":
|
||
"iPhone/iPad: Settings → Apps → Calendar (or Contacts) → Calendar Accounts → Add Account → Other → Add CalDAV (CardDAV) Account. Android: the DAVx⁵ app. Thunderbird: New Calendar → On the Network, and New Address Book → CardDAV.",
|
||
"appPasswords.new": "Create app password",
|
||
"appPasswords.name": "Name",
|
||
"appPasswords.namePlaceholder": "e.g. Thunderbird on my laptop",
|
||
"appPasswords.confirmPassword": "Your account password",
|
||
"appPasswords.create": "Create",
|
||
"appPasswords.madeFor": "App password for “{name}”:",
|
||
"appPasswords.copy": "Copy",
|
||
"appPasswords.copied": "Copied",
|
||
"appPasswords.onceOnly":
|
||
"Enter it in the app's password field, without spaces. You won't see it again — if you lose it, revoke it and create a new one.",
|
||
"appPasswords.done": "Done",
|
||
"appPasswords.created": "Created {date}",
|
||
"appPasswords.lastUsed": "last used {date}",
|
||
"appPasswords.neverUsed": "never used",
|
||
"appPasswords.lastUsedDav": "calendars or contacts last synced {date}",
|
||
"appPasswords.confirmRevoke": "Revoke the app password “{name}”? The app using it will stop signing in.",
|
||
"settings.thisDevice": "this device",
|
||
"settings.revoke": "Revoke",
|
||
"settings.threadOrder": "Conversation order",
|
||
"settings.timezone": "Time zone",
|
||
"settings.timeFormat": "Time format",
|
||
"settings.timeFormat24": "24-hour (14:30)",
|
||
"settings.timeFormat12": "12-hour (2:30 PM)",
|
||
"settings.calendars": "Calendars",
|
||
"settings.myCalendars": "My calendars",
|
||
"settings.calendarOptions": "Calendar options",
|
||
"settings.createCalendar": "Create calendar",
|
||
"settings.editCalendar": "Edit calendar",
|
||
"settings.export": "Export",
|
||
"settings.calendarDisplay": "Calendar display",
|
||
"settings.default": "Default",
|
||
"settings.defaultCalendar": "Default calendar",
|
||
"settings.firstCalendar": "First calendar",
|
||
"settings.defaultRemindersTimed": "Default reminders for timed events",
|
||
"settings.defaultRemindersAllday": "Default reminders for all-day events",
|
||
"settings.addReminder": "Add reminder",
|
||
"settings.name": "Name",
|
||
"settings.onlyYou": "Only you can see this calendar.",
|
||
"settings.publish": "Publish",
|
||
"settings.publishHint": "Share this calendar (read-only) with anyone.",
|
||
"settings.fullEventDetails": "Full event details",
|
||
"settings.freeBusy": "Free/busy information",
|
||
"settings.addAccountHint": "Connect an external calendar account.",
|
||
"settings.subscriptions": "Subscriptions",
|
||
"settings.subscriptionsHint": "Add a read-only calendar from an iCal (.ics) URL.",
|
||
"settings.subscribe": "Subscribe",
|
||
"settings.subscribeUrl": "iCal (.ics) URL",
|
||
"settings.subscribed": "Subscribed",
|
||
"settings.comingSoon": "Coming soon",
|
||
"settings.subscribeError": "Couldn't subscribe to that URL.",
|
||
"settings.connectTitle": "Connect {provider}",
|
||
"settings.connect": "Connect",
|
||
"settings.connecting": "Connecting…",
|
||
"settings.connectError": "Couldn't connect. Check the details and try again.",
|
||
"settings.connectAuthFailed":
|
||
"Sign-in was rejected. If you have two-factor auth on, use an app password (not your normal password).",
|
||
"settings.connectPrivateHost":
|
||
"That server is on a private network, which isn't reachable for security reasons. Use a publicly-accessible HTTPS address.",
|
||
"settings.connectUnreachable":
|
||
"Couldn't reach that server. Check the URL is correct and uses https://.",
|
||
"settings.connectNoCalendars": "Connected, but no calendars were found on that account.",
|
||
"settings.connectNeedsUrl": "Enter the CalDAV server URL.",
|
||
"settings.davServerUrl": "CalDAV server URL",
|
||
"settings.appleId": "Apple ID (email)",
|
||
"settings.username": "Username",
|
||
"settings.appPassword": "App-specific password",
|
||
"settings.password": "Password",
|
||
"settings.icloudHint":
|
||
"Use an app-specific password from account.apple.com → Sign-In and Security.",
|
||
"settings.calendarCount": "{count} calendars",
|
||
"settings.calendarCount_one": "1 calendar",
|
||
"settings.removeSubscription": "Remove subscription",
|
||
"settings.removeSubscriptionConfirm": "Stop syncing “{name}” and remove its events?",
|
||
"settings.deleteCalendar": "Delete calendar",
|
||
"settings.thisCalendar": "this calendar",
|
||
"settings.deleteCalendarConfirm": "Delete “{name}” and all of its events? This can't be undone.",
|
||
"settings.showAlert": "Show an alert",
|
||
"settings.emailMe": "Email me",
|
||
"settings.invitations": "Invitations",
|
||
"settings.inviteWhen": "When I receive events by email",
|
||
"settings.inviteAddUpdate": "Add new events to my calendar and update events that have changed",
|
||
"settings.inviteUpdateOnly": "Only update events that I have already added to my calendar",
|
||
"settings.inviteNone": "Do not automatically update my calendar",
|
||
"settings.addNewFrom": "Add new events from",
|
||
"settings.myContacts": "My contacts",
|
||
"settings.anyone": "Anyone",
|
||
"settings.addToCalendar": "Add to calendar",
|
||
"settings.alsoFile": "Also mark the message as read and file it",
|
||
"settings.integrations": "Integrations",
|
||
|
||
"admin.title": "Ultimo Email administration",
|
||
"admin.signInTitle": "Administrator sign-in",
|
||
"admin.signInHint": "Sign in with an administrator account to manage this server.",
|
||
"admin.signOut": "Sign out",
|
||
"admin.signedInAs": "Signed in as {handle}",
|
||
"admin.notAdminTitle": "Not an administrator",
|
||
"admin.notAdmin":
|
||
"{handle} is signed in, but does not have administrator rights on this server.",
|
||
"admin.registration": "New user registration",
|
||
"admin.registrationOn": "Open",
|
||
"admin.registrationOff": "Closed",
|
||
"admin.registrationHelp":
|
||
"While closed, the signup page is hidden and the server refuses new accounts.",
|
||
"admin.invitations": "Allow invitations",
|
||
"admin.invitationsOn": "On",
|
||
"admin.invitationsOff": "Off",
|
||
"admin.invitationsHelp":
|
||
"Each user can invite 2 friends from the sidebar. An invitation link signs up one person, even while registration is closed, and expires after 14 days (unused ones are given back).",
|
||
"admin.inviteMail": "Invitation email",
|
||
"admin.inviteConfigure": "Configure…",
|
||
"admin.inviteMailHelp":
|
||
"Sent through the Outgoing system mail account (on the right of the panel), which must be allowed to send from the sender address. Replies go to the user who sent the invitation.",
|
||
"admin.inviteFrom": "Sender address",
|
||
"admin.inviteFromHint": "Empty: the placeholder address shown.",
|
||
"admin.inviteSubject": "Subject",
|
||
"admin.inviteTemplateDefault": "Using the built-in template.",
|
||
"admin.inviteTemplateCustom": "Using your uploaded template.",
|
||
"admin.inviteUpload": "Upload HTML template…",
|
||
"admin.inviteDownload": "Download template",
|
||
"admin.inviteReset": "Back to the built-in template",
|
||
"admin.inviteResetConfirm": "Remove your template and use the built-in one again?",
|
||
"admin.invitePlaceholders": "Placeholders:",
|
||
"admin.invitePlaceholdersHelp":
|
||
"The template must contain {{invite_link}} or {{invite_button}}. The subject can use the names too. Images written into the HTML are sent inside the email.",
|
||
"admin.invitePreview": "Preview with sample names —",
|
||
"admin.inviteTestSent": "Test invitation sent (its link is a dummy).",
|
||
"admin.defaultQuota": "Default quota for new users",
|
||
"admin.quotaHelp":
|
||
"Applies to accounts created from now on. Existing mailboxes keep the quota they were given.",
|
||
"admin.save": "Save",
|
||
"admin.saving": "Saving…",
|
||
"admin.saved": "Saved",
|
||
"admin.quotaInvalid": "Enter a size greater than 0.",
|
||
"display.title": "Mailbox display",
|
||
"display.readingPane": "Reading pane",
|
||
"display.side": "Side",
|
||
"display.bottom": "Bottom",
|
||
"display.off": "Off",
|
||
"display.dividers": "Show a dividing line between rows",
|
||
"admin.mail": "Outgoing system mail",
|
||
"admin.mailHelp":
|
||
"The mail account the server sends password-reset links from. Without it, “Forgot password?” sends nothing.",
|
||
"admin.mailOn": "Set up — password-reset links can be sent.",
|
||
"admin.mailOff": "Not set up — password-reset links cannot be sent yet.",
|
||
"admin.smtpHost": "SMTP server",
|
||
"admin.smtpPort": "Port",
|
||
"admin.smtpSecurity": "Security",
|
||
"admin.smtpStarttls": "STARTTLS",
|
||
"admin.smtpSsl": "SSL/TLS",
|
||
"admin.smtpNone": "None",
|
||
"admin.smtpUsername": "Login",
|
||
"admin.smtpPassword": "Password",
|
||
"admin.smtpPasswordKept": "(stored — leave empty to keep)",
|
||
"admin.smtpPasswordRemove": "Remove the stored password",
|
||
"admin.smtpFrom": "From address",
|
||
"admin.publicUrl": "Public address of this server",
|
||
"admin.publicUrlHint": "Where users open Ultimo Email, e.g. https://mail.example.com — reset links point here.",
|
||
"admin.testTo": "Send a test email to",
|
||
"admin.sendTest": "Send test",
|
||
"admin.testSent": "Test email sent.",
|
||
"admin.users": "Users",
|
||
"admin.userSearch": "Search by login, email address or name…",
|
||
"admin.noUsers": "No users match.",
|
||
"admin.you": "you",
|
||
"admin.adminBadge": "admin",
|
||
"admin.blockedBadge": "blocked",
|
||
"admin.usage": "{used} of {quota}",
|
||
"admin.noMailAccounts": "No mail accounts connected",
|
||
"admin.userQuota": "Quota",
|
||
"admin.blockedSince": "Blocked since {date}. This user cannot sign in.",
|
||
"admin.block": "Block account",
|
||
"admin.unblock": "Unblock account",
|
||
"admin.blockConfirm":
|
||
"Block {handle}? They are signed out everywhere and cannot sign in until you unblock them. Their mail and data are kept.",
|
||
"admin.deleteUser": "Delete account",
|
||
"admin.deleteConfirm":
|
||
"Permanently delete {handle} and all of their mail, contacts, calendars and settings? This can't be undone.",
|
||
"admin.selfNote": "This is your own account: it cannot be blocked or deleted from here.",
|
||
"admin.cancel": "Cancel",
|
||
"admin.close": "Close",
|
||
"settings.jitsi": "Jitsi Meet",
|
||
"settings.jitsiHint":
|
||
"Server used to generate video-call links for calendar events. Leave empty to use the public https://meet.jit.si/ server.",
|
||
"settings.addAccount": "Add account",
|
||
"settings.syncState": "State: {state}",
|
||
"settings.confirmRemoveAccount": "Remove this account and all its mail?",
|
||
"settings.removingAccount": "Removing account…",
|
||
"settings.editAccount": "Edit account",
|
||
"settings.color": "Color",
|
||
"settings.serverSettings": "Change server settings / password",
|
||
"settings.serverSettingsHint": "Enter your mailbox password to apply server or password changes.",
|
||
"settings.signature": "Signature",
|
||
"settings.configureAccount": "Configure account",
|
||
"settings.yourMailbox": "Your mailbox",
|
||
"mail.darkMessages": "Dark message mode",
|
||
"mail.darkMessagesOn": "Dark message mode is on: messages are shown on a dark page. Click to show them as sent.",
|
||
"mail.darkMessagesOff": "Dark message mode is off: messages are shown as sent. Click to show them on a dark page.",
|
||
"settings.yourMailboxHint": "Your Ultimo address. It stays as long as your account does.",
|
||
"settings.editSignature": "Edit signature",
|
||
"settings.theme": "Theme",
|
||
"theme.light": "Light",
|
||
"theme.dark": "Dark",
|
||
"theme.system": "System",
|
||
"theme.toggle": "Toggle theme",
|
||
"offline.label": "Offline",
|
||
"offline.backOnline": "Back online",
|
||
"offline.explainSaved": "Offline — showing mail saved on this device, last updated {when}.",
|
||
"offline.explainSavedNoTime": "Offline — showing mail saved on this device.",
|
||
"offline.explainNotSaved":
|
||
"Can't reach the server. To read recent mail without a connection, turn on offline access in Settings → Accounts.",
|
||
"offline.noticeSaved": "You're offline. Recent mail is still available.",
|
||
"offline.noticeNotSaved": "You're offline — can't reach the server.",
|
||
"offline.notAvailable": "Not available offline",
|
||
"offline.threadNotSaved": "This conversation isn't saved on this device.",
|
||
"offline.folderNotSaved": "This folder isn't saved on this device.",
|
||
"offline.noticeScheduled": "Saved to Scheduled — it will be sent when you're back online.",
|
||
"offline.noticeSendingScheduled": "Sending {count} scheduled messages…",
|
||
"offline.noticeSendingScheduled_one": "Sending 1 scheduled message…",
|
||
"offline.draftsNotSaved": "Only drafts written on this device are available offline.",
|
||
"compose.sendLater": "Schedule",
|
||
"compose.savedOnDevice": "Saved on this device",
|
||
"compose.forwardAttachFailed": "Couldn't attach the original message's files.",
|
||
"compose.attachOnDevice": "On this device — uploaded when you're back online",
|
||
"compose.onDevice": "On this device",
|
||
"nav.scheduled": "Scheduled",
|
||
"scheduled.help": "These go out by themselves — when you're back online, or once the mail server takes them.",
|
||
"scheduled.empty": "Nothing scheduled.",
|
||
"scheduled.waiting": "Waiting",
|
||
"scheduled.sending": "Sending…",
|
||
"scheduled.failed": "Not sent",
|
||
"scheduled.retrying": "Retrying {when}",
|
||
"scheduled.retryNow": "Retry now",
|
||
"scheduled.edit": "Edit",
|
||
"scheduled.delete": "Delete",
|
||
"scheduled.statusRetrying":
|
||
"The mail server couldn't take this message yet ({count} tries). Next try {when}; it keeps trying until {until}.",
|
||
"scheduled.statusRetrying_one":
|
||
"The mail server couldn't take this message yet (1 try). Next try {when}; it keeps trying until {until}.",
|
||
"scheduled.statusFailed": "Not sent: {error}",
|
||
"scheduled.lastError": "Last error: {error}",
|
||
"scheduled.to": "To",
|
||
"send.noticeRetrying": "Couldn't send “{subject}” — it's in Scheduled and will be retried.",
|
||
"send.noticeFailed": "Couldn't send “{subject}” — it's in Scheduled: {error}",
|
||
"send.noticeSent": "Sent “{subject}”.",
|
||
"account.unreachable": "Can't reach the mail server since {when}",
|
||
"account.authFailed": "Sign-in failed — open Settings → Accounts → Configure account and enter the password again",
|
||
"settings.stateUnreachable": "Can't reach the server since {when}",
|
||
"settings.stateAuthFailed": "Sign-in failed — use Configure account to enter the password again",
|
||
"offline.searchPlaceholder": "Search (offline)",
|
||
"offline.cantReach": "Can't reach the server.",
|
||
"offline.settingTitle": "Offline access",
|
||
"offline.settingHelp":
|
||
"Keep your newest 100 Inbox conversations, and the ones you open, on this device, so you can read them without a connection. They are stored unencrypted in this browser and removed when you sign out — leave this off on shared computers.",
|
||
"offline.settingStatus": "{count} conversations saved · {size} · updated {when}",
|
||
"offline.settingStatus_one": "1 conversation saved · {size} · updated {when}",
|
||
"offline.settingStatusNoTime": "{count} conversations saved · {size}",
|
||
"offline.settingStatusNoTime_one": "1 conversation saved · {size}",
|
||
"offline.settingSaving": "Saving recent mail…",
|
||
"offline.settingUnsupported":
|
||
"Not available here: browsers allow offline access only when the app is opened over HTTPS.",
|
||
"push.settingTitle": "Notifications",
|
||
"push.settingHelp":
|
||
"Get a notification on this device when new mail arrives in an Inbox, even when Ultimo isn't open.",
|
||
"push.needsInstall":
|
||
"On iPhone and iPad, add Ultimo to your Home Screen first (Share → Add to Home Screen), then turn this on from the app.",
|
||
"push.blocked":
|
||
"Notifications are blocked for this site in your browser. Allow them in the browser's site settings, then turn this on.",
|
||
"push.unsupported": "Not available here: this browser can't show notifications from a website, or the app isn't opened over HTTPS.",
|
||
"push.notAllowed": "Notifications weren't allowed.",
|
||
"push.waiting":
|
||
"Waiting for your browser's permission. If it didn't ask, click the icon at the left of the address bar and set Notifications to Allow — they turn on by themselves then.",
|
||
"push.failed": "Couldn't turn notifications on.",
|
||
"install.entry": "Install app",
|
||
"invite.entry": "Invite a friend",
|
||
"invite.title": "Invite a friend",
|
||
"invite.help": "We'll email them a link to create an account. You have {count} invitations left; each link works once.",
|
||
"invite.help_one": "We'll email them a link to create an account. This is your last invitation; the link works once.",
|
||
"invite.name": "Friend's name",
|
||
"invite.email": "Friend's email address",
|
||
"invite.send": "Send invitation",
|
||
"invite.sending": "Sending…",
|
||
"invite.sent": "Invitation sent to {name}",
|
||
"invite.welcome": "Hi {name} — {inviter} invited you. Choose your address and password.",
|
||
"invite.linkInvalid": "This invitation has already been used or has expired.",
|
||
"install.title": "Install Ultimo",
|
||
"install.stepsIos":
|
||
"1. Tap the Share button (the square with an arrow) in Safari's toolbar.\n2. Choose Add to Home Screen.\n3. Tap Add. Ultimo opens from your Home Screen like an app, and can show notifications about new mail.",
|
||
"install.stepsOpera":
|
||
"1. Open Opera's menu (⋮).\n2. Choose Add to → Home screen.\n\nOpera adds a shortcut to Ultimo on your Home Screen. To install Ultimo as a full app, open this page in Chrome and tap Install app there.",
|
||
"install.stepsFirefox": "1. Open Firefox's menu (⋮).\n2. Choose Add app to Home screen (or Install).",
|
||
"install.hide": "Don't show this again",
|
||
"install.gotIt": "Got it",
|
||
} as const;
|
||
|
||
export type MessageKey = keyof typeof en;
|
||
export type Messages = Record<MessageKey, string>;
|