{
  "@@locale": "en",
  "appTitle": "FidoMail",
  "bootErrorTitle": "FidoMail could not start",
  "bootErrorHint": "Startup failed before the app could open its storage. The details below can help diagnose it.",
  "bootErrorRetry": "Try again",
  "backupWorking": "Working on the backup…",
  "@appTitle": {
    "description": "Application title (brand name; normally left untranslated)"
  },
  "commonCancel": "Cancel",
  "commonDelete": "Delete",
  "commonSave": "Save",
  "commonDiscard": "Discard",
  "commonUndo": "Undo",
  "commonRemove": "Remove",
  "commonRefresh": "Refresh",
  "commonClear": "Clear",
  "commonOpen": "Open",
  "commonDone": "Done",
  "commonApply": "Apply",
  "commonCreate": "Create",
  "commonContinue": "Continue",
  "commonBack": "Back",
  "commonAdvanced": "Advanced",
  "commonMenu": "Menu",
  "commonMore": "More",
  "commonSearch": "Search",
  "commonNoMatches": "No matches",
  "commonRequired": "Required",
  "@commonRequired": {
    "description": "Form validator: the field must not be empty"
  },
  "commonNotAnFtnAddress": "Not an FTN address",
  "commonNotAnFtnAddressValue": "Not an FTN address: {value}",
  "@commonNotAnFtnAddressValue": {
    "placeholders": {
      "value": {
        "type": "String"
      }
    }
  },
  "commonCouldNotSave": "Could not save: {error}",
  "@commonCouldNotSave": {
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "commonError": "Error: {error}",
  "@commonError": {
    "description": "Generic wrapper around a raw exception shown in an error state",
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "commonPassword": "Password",
  "sessionPasswordLabel": "Session password",
  "yourNameFromLineLabel": "Your name (From line)",
  "akasLabel": "Additional AKAs (comma-separated)",
  "defaultCharsetLabel": "Default charset",
  "binkpHostLabel": "binkp host",
  "freshBadge": " (+{fresh})",
  "@freshBadge": {
    "description": "Fresh-message badge appended to a server/group row; leading space is part of the format",
    "placeholders": {
      "fresh": {
        "type": "int"
      }
    }
  },
  "noSubject": "(no subject)",
  "fieldFrom": "From",
  "@fieldFrom": {
    "description": "Message field name: author. Used as sort mode, filter field and composer label."
  },
  "fieldTo": "To",
  "fieldSubject": "Subject",
  "fieldDate": "Date",
  "sortModeThread": "Thread",
  "sortModeArrival": "Arrival",
  "@sortModeArrival": {
    "description": "Sort mode: the order messages were downloaded and tossed by this client (storage order), as opposed to the written Date."
  },
  "sortDescending": "Descending",
  "layoutAuto": "Auto",
  "layoutContentOnly": "Content only",
  "layoutListOnly": "List only",
  "layoutVerticalSplit": "Vertical split",
  "layoutHorizontalSplit": "Horizontal split",
  "themeWhite": "White",
  "themeBlack": "Black",
  "themeBlue": "Blue",
  "themeCustom": "Custom",
  "@themeCustom": {
    "description": "Theme picker option: the user-defined palette (the only editable one)"
  },
  "settingsTheme": "Theme",
  "settingsEditCustomTheme": "Edit custom theme…",
  "themeEditorTitle": "Custom theme",
  "themeEditorUse": "Use this theme",
  "@themeEditorUse": {
    "description": "Button shown while a preset theme is selected: switches the app to the custom palette being edited"
  },
  "themeEditorStartFrom": "Start from…",
  "themeEditorStartedFrom": "Colors copied from {theme}",
  "@themeEditorStartedFrom": {
    "description": "Confirmation after seeding the custom palette from a preset",
    "placeholders": {
      "theme": {
        "type": "String"
      }
    }
  },
  "themeEditorLowContrast": "Some of these colors are hard to read against each other.",
  "themePreviewSubject": "Re: Message subject",
  "themePreviewFrom": "John Doe",
  "@themePreviewFrom": {
    "description": "Sample author name in the theme preview; use a plausible local name"
  },
  "themePreviewBody": "Ordinary message text.",
  "themePreviewQuote": "quoted text",
  "themeColorHexLabel": "Hex",
  "themeSectionReader": "Reader",
  "themeSectionList": "Message list",
  "themeSectionAccents": "Accents",
  "themeSectionQuotes": "Quote colors",
  "themeSectionEditorQuotes": "Editor quote shades",
  "themeColorMessageBackground": "Message background",
  "themeColorMessageHeaderBackground": "Message header background",
  "@themeColorMessageHeaderBackground": {
    "description": "Custom-theme color row: the band behind the reader's Date/From/To/Subj/Area block. Equal to the message background means no band."
  },
  "themeColorMessageText": "Message text",
  "themeColorMessageFooterText": "Footer text (tearline, origin)",
  "themeColorRowEven": "List row, even",
  "themeColorRowOdd": "List row, odd",
  "themeColorRowText": "List row text",
  "themeColorSelectedBackground": "Selected row",
  "themeColorSelectedText": "Selected row text",
  "themeColorLink": "Links",
  "themeColorSplitDivider": "Split divider",
  "themeColorStarred": "Star marker",
  "themeColorScorePositive": "Positive score",
  "themeColorScoreNegative": "Negative score",
  "themeColorScorePositiveSelected": "Positive score, selected row",
  "themeColorScoreNegativeSelected": "Negative score, selected row",
  "themeColorQuote": "Quote color {index}",
  "@themeColorQuote": {
    "description": "Row label for one entry of the reader quote-color cycle",
    "placeholders": {
      "index": {
        "type": "int"
      }
    }
  },
  "themeColorEditorQuote": "Editor quote shade {index}",
  "@themeColorEditorQuote": {
    "description": "Row label for one editor quote shade, by quote depth",
    "placeholders": {
      "index": {
        "type": "int"
      }
    }
  },
  "composeSavedToDrafts": "Saved to drafts",
  "composeSaveDraftDialogTitle": "Save draft?",
  "composeUnsavedChangesBody": "This message has unsaved changes.",
  "composeSaveDraft": "Save draft",
  "composeSubjectRequired": "Subject is required",
  "composeSendUtf8": "Send in UTF-8",
  "composeSubjectOverflow": "Subject too long to send: {bytes} bytes in {charset} — the FTN field holds {max}",
  "@composeSubjectOverflow": {
    "placeholders": {
      "bytes": {
        "type": "int"
      },
      "charset": {
        "type": "String"
      },
      "max": {
        "type": "int"
      }
    }
  },
  "composeNetmailAddressInvalid": "Netmail needs a valid address, e.g. 2:5020/100.1",
  "composeQueuedSnack": "Queued — sends on the next mail exchange",
  "composeSendingSnack": "Sending…",
  "composeSyncNowAction": "Exchange now",
  "settingsSendImmediately": "Send messages immediately",
  "settingsSendImmediatelySubtitle": "Exchange mail as soon as a message is queued",
  "badmailRetossAction": "Re-toss to areas",
  "badmailRetossDone": "{delivered, plural, one{Re-tossed {delivered} message} other{Re-tossed {delivered} messages}} — {remaining} left quarantined",
  "@badmailRetossDone": {
    "placeholders": {
      "delivered": {
        "type": "int"
      },
      "remaining": {
        "type": "int"
      }
    }
  },
  "composeQueueFailed": "Could not queue: {error}",
  "@composeQueueFailed": {
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "composeSaveFailed": "Could not save draft: {error}",
  "@composeSaveFailed": {
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "composePartDeleted": "Part deleted",
  "composeFreeEditTooltip": "Edit as plain text",
  "composePartEditTooltip": "Edit as parts",
  "composeFreeEditUueBlocked": "A message with an attachment is edited as parts",
  "composeSplitPart": "Split part",
  "composeDeletePartsAbove": "Delete all parts above",
  "composeDeletePartsBelow": "Delete all parts below",
  "composeClearToTop": "Clear to top of part",
  "composeClearToBottom": "Clear to bottom of part",
  "splitPartHint": "Tap where the part should split, or select the fragment you need.",
  "splitPartSplitHere": "Split here",
  "splitPartKeepSelection": "Keep only selection",
  "splitPartExtractSelection": "Split out selection",
  "composeDeleteOverquoting": "Delete overquoting",
  "composeDeleteOverquotingBody": "{threshold, plural, one{Remove all lines quoted {threshold} level or deeper? This action cannot be undone.} other{Remove all lines quoted {threshold} levels or deeper? This action cannot be undone.}}",
  "@composeDeleteOverquotingBody": {
    "placeholders": {
      "threshold": {
        "type": "int"
      }
    }
  },
  "composeOverquotingAtSendBody": "{threshold, plural, one{The message contains lines quoted {threshold} level or deeper. Delete them before sending?} other{The message contains lines quoted {threshold} levels or deeper. Delete them before sending?}}",
  "@composeOverquotingAtSendBody": {
    "placeholders": {
      "threshold": {
        "type": "int"
      }
    }
  },
  "composeSendAsIs": "Send as-is",
  "composeDiscardDialogTitle": "Discard message?",
  "composeDiscardBody": "The typed text will be lost.",
  "composeReplyTitle": "Reply",
  "@composeReplyTitle": {
    "description": "Composer AppBar title when replying (noun); the reader's reply button uses messagesReplyTooltip (verb)"
  },
  "composeNewMessage": "New message",
  "composeSend": "Send",
  "composeMenuTooltip": "Composer menu",
  "composeFromLine": "From: {name}",
  "@composeFromLine": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "composeFromLineWithAddress": "From: {name}, {address}",
  "@composeFromLineWithAddress": {
    "placeholders": {
      "name": {
        "type": "String"
      },
      "address": {
        "type": "String"
      }
    }
  },
  "composeAddressLabel": "Address (zone:net/node.point)",
  "composeGroupLine": "Group: {groupName}",
  "@composeGroupLine": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "composeChangeGroupTitle": "Post to which group?",
  "@composeChangeGroupTitle": {
    "description": "Group-picker dialog title when retargeting the composer's Group line"
  },
  "composeTapToWrite": "Tap to write",
  "composeFooterCaption": "Added automatically when sent",
  "messagesNoAreaListFound": "No area list found in this reply",
  "messagesDeleteConfirmTitle": "Delete message?",
  "messagesReplyTooltip": "Reply",
  "messagesReplyToRecipient": "Reply to recipient",
  "@messagesReplyToRecipient": {
    "description": "Menu action: reply addressed to the original message's To: (not its author) — e.g. continuing from one's own message"
  },
  "messagesReplyInGroup": "Reply in another group",
  "@messagesReplyInGroup": {
    "description": "Menu action (HotdogEd's Reply-in-another-echo): quote the selected message but post the reply into a different group, picked in a dialog"
  },
  "messagesReplyInGroupTitle": "Reply in which group?",
  "messagesSortTooltip": "Sort",
  "messagesViewMenu": "View…",
  "messagesLayoutTooltip": "Layout",
  "messagesJumpNewestTooltip": "Go to the newest message",
  "messagesMarkAllRead": "Mark all read",
  "messagesMarkAllReadTitle": "Mark all read?",
  "messagesMarkAllReadBody": "{count, plural, one{One unread message} other{{count} unread messages}} will be marked as read.",
  "@messagesMarkAllReadBody": {
    "description": "Confirm-dialog body for the reader's mark-all-read button, with the number of unread messages",
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "messagesMarkedAllRead": "Marked read: {count}",
  "@messagesMarkedAllRead": {
    "description": "Snackbar after mark-all-read, with the number of messages that were unread",
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "messagesForward": "Forward",
  "messagesMarkRead": "Mark read",
  "messagesMarkUnread": "Mark unread",
  "messagesViewRaw": "View raw article",
  "messagesAnsiTruncated": "ANSI art truncated: the message is longer than the reader can lay out. The raw article shows all of it.",
  "messagesShare": "Share",
  "messagesShowRead": "Show read",
  "messagesEmpty": "No messages",
  "messagesForwardToGroup": "Forward to group",
  "messagesHeaderDate": "Date: {date}",
  "@messagesHeaderDate": {
    "description": "Reader header line; labels are column-aligned in monospace — keep every header label padded to the same width",
    "placeholders": {
      "date": {
        "type": "String"
      }
    }
  },
  "messagesHeaderFrom": "From: {from}",
  "@messagesHeaderFrom": {
    "placeholders": {
      "from": {
        "type": "String"
      }
    }
  },
  "messagesHeaderTo": "To:   {to}",
  "@messagesHeaderTo": {
    "placeholders": {
      "to": {
        "type": "String"
      }
    }
  },
  "messagesHeaderSubject": "Subj: {subject}",
  "@messagesHeaderSubject": {
    "placeholders": {
      "subject": {
        "type": "String"
      }
    }
  },
  "messagesHeaderArea": "Area: {areaName}",
  "@messagesHeaderArea": {
    "placeholders": {
      "areaName": {
        "type": "String"
      }
    }
  },
  "messagesHeaderAttr": "Attr: {attrs}",
  "@messagesHeaderAttr": {
    "placeholders": {
      "attrs": {
        "type": "String"
      }
    }
  },
  "messagesBodyNotFound": "Body not found",
  "messagesGoToParent": "Go to the replied-to message",
  "messagesParentNotFound": "The replied-to message is not in the message base",
  "messagesOpenLinkTitle": "Open link?",
  "groupListTitle": "Groups",
  "groupListNewArea": "New echo area",
  "groupListAreaTagInvalid": "Area tags are printable characters, no spaces",
  "groupListImapAreaPathInvalid": "IMAP areas are folder paths: Echoes/<network>/<tag>",
  "groupListAreaExists": "{name} already exists",
  "@groupListAreaExists": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "groupListSubscribeLabel": "Subscribe {name}",
  "@groupListSubscribeLabel": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "groupListAreafixQueued": "{label} — areafix queued; reply on the next mail exchange",
  "@groupListAreafixQueued": {
    "placeholders": {
      "label": {
        "type": "String"
      }
    }
  },
  "areafixFailed": "Areafix failed: {error}",
  "@areafixFailed": {
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "groupListAreafixQueryLabel": "My subscriptions",
  "groupListAreafixListLabel": "Available areas",
  "groupListAreafixHelpLabel": "Areafix help",
  "groupListMenuUnreadOnly": "Unread groups only",
  "groupListMenuMarkAllEchoes": "Mark all echoes as read…",
  "groupListMarkAllEchoesTitle": "Mark all echoes as read?",
  "groupListMarkAllEchoesBody": "{count, plural, one{One unread message} other{{count} unread messages}} in {echoes, plural, one{one echo} other{{echoes} echoes}} will be marked as read.",
  "@groupListMarkAllEchoesBody": {
    "placeholders": {
      "count": {
        "type": "int"
      },
      "echoes": {
        "type": "int"
      }
    }
  },
  "groupListMarkAllEchoesNothing": "No unread messages in echoes",
  "groupListMarkReadAction": "Mark all in {groupName} as read",
  "@groupListMarkReadAction": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListNoUnread": "No unread groups",
  "groupListShowAllGroups": "Show all groups",
  "groupListMenuShowInvisible": "Show invisible",
  "groupListAllHidden": "All groups are hidden",
  "groupListHideAction": "Hide {groupName}",
  "@groupListHideAction": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListHideHint": "Removed from the group list; mail keeps arriving",
  "groupListShowAction": "Show {groupName}",
  "@groupListShowAction": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListHidden": "{groupName} hidden — «Show invisible» in the menu brings it back",
  "@groupListHidden": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListEditFilterAction": "Edit filter group…",
  "groupListMenuSendUnsent": "Send unsent (full mail exchange)",
  "groupListMenuAreafixQuery": "Areafix: my subscriptions",
  "groupListMenuAreafixList": "Areafix: list areas",
  "groupListMenuAreafixHelp": "Areafix: help",
  "groupListEchoFolderPathLabel": "Echo folder path",
  "groupListAreaTagLabel": "Area tag",
  "groupListNewsgroupLabel": "Newsgroup",
  "groupListEchoFolderPathHint": "Echoes/fidonet/binkd",
  "groupListAreaTagHint": "RU.TEST",
  "groupListNewsgroupHint": "fido7.ru.golded",
  "groupListBrowseServerList": "Browse server list",
  "groupListBrowseTitle": "Newsgroups on the server",
  "groupListBrowseFilterHint": "Filter",
  "groupListBrowseAdd": "Add ({count})",
  "@groupListBrowseAdd": {
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "groupListBrowseAdded": "Added {count} newsgroups",
  "@groupListBrowseAdded": {
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "groupListBrowseAlreadyAdded": "already added",
  "groupListBrowseEmpty": "The server advertises no newsgroups",
  "groupListBrowseFetchError": "Couldn't fetch the group list: {error}",
  "@groupListBrowseFetchError": {
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "groupListSubscribeViaAreafix": "Also subscribe via areafix",
  "groupListSubscribeViaAreafixHint": "Sends +TAG to the uplink on the next mail exchange",
  "groupListCounters": "T/U: {total}/{unsent} {unread}",
  "@groupListCounters": {
    "description": "Terse per-group counter row: total/unsent unread (original HotdogEd format)",
    "placeholders": {
      "total": {
        "type": "int"
      },
      "unsent": {
        "type": "int"
      },
      "unread": {
        "type": "int"
      }
    }
  },
  "groupListLastDate": "Last: {date}",
  "@groupListLastDate": {
    "placeholders": {
      "date": {
        "type": "String"
      }
    }
  },
  "groupListRescanAction": "Rescan {groupName}",
  "@groupListRescanAction": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListRescanHint": "Asks the uplink to resend recent messages",
  "rescanCountFieldLabel": "Messages to request",
  "rescanCountWarning": "The uplink will resend up to this many of the newest messages. Careful with large numbers: a busy echo can hold millions of messages, and requesting them all means a huge download.",
  "rescanCountLargeWarning": "That is a very large request — the download can run to many megabytes and take a long time.",
  "rescanCountInvalid": "Enter a number from 1 to {max}",
  "@rescanCountInvalid": {
    "placeholders": {
      "max": {
        "type": "String"
      }
    }
  },
  "rescanNoCountDBridge": "This uplink's tosser (D'Bridge) accepts no message limit: how much comes back is decided by the remote system. It may resend everything the echo holds.",
  "rescanSubscribesFastEcho": "This uplink's tosser (FastEcho) also subscribes you to the echo if you are not linked to it yet — a rescan there is not read-only.",
  "rescanCountConfirm": "Request",
  "groupListUnsubscribeAction": "Unsubscribe from {groupName}",
  "@groupListUnsubscribeAction": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListUnsubscribeHint": "Sends -TAG to the uplink on the next mail exchange",
  "groupListUnsubscribeDeleteAction": "Unsubscribe and delete {groupName}",
  "@groupListUnsubscribeDeleteAction": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListUnsubscribeDeleteHint": "Sends -TAG to the uplink and removes the area from this device",
  "groupListUnsubscribeDeleteDialogTitle": "Unsubscribe and delete echo area?",
  "groupListUnsubscribeDeleteNote": "An unsubscribe request will be queued to the uplink. Mail already in transit can still re-create the area until the uplink processes it.",
  "groupListUnsubscribeDeleted": "{groupName} deleted — unsubscribe queued",
  "@groupListUnsubscribeDeleted": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListUnsubscribeDeleteDeleteFailed": "Unsubscribe from {groupName} is queued, but the delete failed: {error}",
  "@groupListUnsubscribeDeleteDeleteFailed": {
    "placeholders": {
      "groupName": {
        "type": "String"
      },
      "error": {
        "type": "String"
      }
    }
  },
  "groupListRescanQueued": "Rescan {groupName} — areafix queued",
  "@groupListRescanQueued": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListUnsubscribeQueued": "Unsubscribe {groupName} — areafix queued",
  "@groupListUnsubscribeQueued": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListDeleteAction": "Delete {groupName}",
  "@groupListDeleteAction": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListDeleteHint": "Removes the area and its messages from this device",
  "groupListDeleteDialogTitle": "Delete echo area?",
  "groupListDeleteDialogBody": "{groupName}, all of its messages, and any unsent drafts in it will be deleted from this device.",
  "@groupListDeleteDialogBody": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListDeleteAreafixNote": "No unsubscribe is sent — if the uplink still feeds this area, incoming mail will re-create it.",
  "groupListDeleteSyncBusy": "A mail exchange is running — try again when it finishes",
  "groupListDeleted": "{groupName} deleted",
  "@groupListDeleted": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListEmptyAction": "Empty {groupName}",
  "@groupListEmptyAction": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "groupListEmptyDialogTitle": "Empty group?",
  "groupListEmptyDialogBody": "All messages in {groupName} will be deleted from this device. Starred messages are kept.",
  "@groupListEmptyDialogBody": {
    "placeholders": {
      "groupName": {
        "type": "String"
      }
    }
  },
  "areafixTitle": "AreaFix subscriptions",
  "areafixNoChanges": "No changes",
  "areafixQueued": "Areafix queued: +{subscribeCount} / -{unsubscribeCount}",
  "@areafixQueued": {
    "placeholders": {
      "subscribeCount": {
        "type": "int"
      },
      "unsubscribeCount": {
        "type": "int"
      }
    }
  },
  "areafixNoAreas": "No areas in this reply",
  "areafixSearchHint": "Filter areas",
  "areafixNoMatches": "No areas match \"{query}\"",
  "@areafixNoMatches": {
    "placeholders": {
      "query": {
        "type": "String"
      }
    }
  },
  "areafixInstructions": "Check to subscribe, uncheck to unsubscribe. Applying sends the areafix request on the next mail exchange.",
  "echoTreeCount": "({count})",
  "@echoTreeCount": {
    "description": "Entry-count suffix on a collapsible branch row in the echo/newsgroup pickers; rendered into the branch title so it never duplicates a same-named leaf",
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "echoTreeCountChecked": "({checked}/{count})",
  "@echoTreeCountChecked": {
    "description": "Branch-row count suffix when some entries beneath are checked, so selections stay visible inside a collapsed branch",
    "placeholders": {
      "checked": {
        "type": "int"
      },
      "count": {
        "type": "int"
      }
    }
  },
  "areafixSubscribedLabel": "subscribed",
  "areafixAvailableLabel": "available",
  "areafixRejectedLabel": "rejected",
  "areafixRobotReported": "The robot reported:",
  "areafixGroupsCreated": "Local groups created: {count}",
  "@areafixGroupsCreated": {
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "welcomeTitle": "Set up a Fidonet point",
  "welcomeSkip": "Skip",
  "welcomeNoPasswordTitle": "No session password?",
  "welcomeNoPasswordBody": "Without a password the binkp session is unauthenticated. Your uplink will treat it as untrusted, so every echomail message it sends you is quarantined to BadMail instead of its area. Most point setups have a password from the sysop.\n\nContinue without one?",
  "welcomeGoBack": "Go back",
  "welcomeContinueAnyway": "Continue anyway",
  "welcomeFinish": "Finish",
  "welcomeStepIntro": "Welcome",
  "welcomeIntroBody": "FidoMail reads and writes Fidonet echomail and netmail through your uplink (boss node) over binkp. To get started you need a point account — a node number and password your uplink sysop gives you.",
  "welcomeNoPointTitle": "Don't have a point yet?",
  "welcomeNoPointBody": "Find a nearby node willing to host a point and ask for a point number and password. Node lists live at fidonet.org and in the NODELIST. Once you have those, come back here — this wizard only configures a point you already hold.",
  "welcomeSetupOtherInstead": "Set up an NNTP or IMAP server instead",
  "welcomeStepUplink": "Your uplink",
  "welcomeUplinkBody": "The boss node you poll — its FTN address and binkp host.",
  "welcomeUplinkAddressLabel": "Uplink address (e.g. 2:5001/100)",
  "welcomeBinkpHostLabel": "binkp host (e.g. fido.example.net)",
  "welcomePortLabel": "Port (blank = {defaultPort})",
  "@welcomePortLabel": {
    "placeholders": {
      "defaultPort": {
        "type": "int"
      }
    }
  },
  "welcomeStepIdentity": "Your identity",
  "welcomePointNumberLabel": "Your point number (e.g. 56)",
  "welcomeFullAddressLabel": "Your full address (e.g. 2:5001/100.56)",
  "welcomeAdvancedExplainer": "Turn this on to type your address directly — for a node (not a point), or a point whose address doesn't sit under the uplink you poll.",
  "welcomeServerNameLabel": "Server name (blank = auto)",
  "welcomePasswordBody": "The session password your sysop gave you. It authenticates the binkp session and signs your packets.",
  "welcomeDistinctPktToggle": "My packet password differs",
  "welcomePktPasswordLabel": "PKT password",
  "welcomeDistinctAreafixToggle": "My AreaFix password differs",
  "welcomeAreafixPasswordLabel": "AreaFix password",
  "welcomeStepReview": "Review",
  "welcomeReviewYourAddress": "Your address",
  "welcomeReviewUplink": "Uplink",
  "welcomeReviewHost": "Host",
  "welcomeReviewNoPassword": "(none — echomail will BadMail)",
  "welcomeRequestAreaList": "Request the area list (%LIST) on the first mail exchange",
  "welcomeSyncNow": "Exchange mail now",
  "welcomeNotifyNewMail": "Notify me about new mail",
  "@welcomeNotifyNewMail": {
    "description": "Onboarding review-step row: turns the new-mail notification on and asks for the OS permission"
  },
  "welcomeAddressPreview": "Your address: {address}",
  "@welcomeAddressPreview": {
    "placeholders": {
      "address": {
        "type": "String"
      }
    }
  },
  "welcomeAddressPreviewPending": "Your address: …",
  "onboardingBossNotFtnAddress": "Not an FTN address (e.g. 2:5001/100)",
  "onboardingBossIncludeZone": "Include the zone, e.g. 2:5001/100",
  "onboardingBossIsPoint": "That's a point address — enter your boss node, e.g. 2:5001/100",
  "onboardingEnterNumber": "Enter a number",
  "onboardingPointNumberMin": "Point number must be 1 or more",
  "onboardingPointNumberMax": "Point number must be {max} or less",
  "@onboardingPointNumberMax": {
    "placeholders": {
      "max": {
        "type": "int"
      }
    }
  },
  "onboardingOwnIncludeZone": "Include the zone, e.g. 2:5001/100.56",
  "onboardingPortRange": "Port must be 1–65535",
  "onboardingDefaultServerName": "Fidonet via {uplink}",
  "@onboardingDefaultServerName": {
    "description": "Default server name seeded by the wizard (stored, user-editable afterwards)",
    "placeholders": {
      "uplink": {
        "type": "String"
      }
    }
  },
  "settingsTitle": "Settings",
  "settingsLanguage": "Language",
  "@settingsLanguage": {
    "description": "Settings row: UI language picker"
  },
  "settingsLanguageSystem": "System default",
  "@settingsLanguageSystem": {
    "description": "Language picker option: follow the OS locale"
  },
  "settingsSectionStartup": "Startup",
  "settingsLaunchGroup": "Open at launch…",
  "@settingsLaunchGroup": {"description": "Settings row that opens the launch-target picker; its subtitle shows the chosen group, the chosen server's group list, or the off label"},
  "settingsLaunchGroupOff": "Off — the app starts on the server list",
  "settingsLaunchServerList": "{server} · group list",
  "@settingsLaunchServerList": {
    "description": "Settings subtitle when the launch target is a server's group list",
    "placeholders": {
      "server": {
        "type": "String"
      }
    }
  },
  "launchGroupTitle": "Open at launch",
  "launchGroupOff": "Nothing",
  "launchGroupOffHint": "Start on the server list, as before",
  "launchServerList": "Group list",
  "@launchServerList": {"description": "Picker row under each server: start on that server's list of groups"},
  "launchServerListHint": "All groups on {server}",
  "@launchServerListHint": {
    "placeholders": {
      "server": {
        "type": "String"
      }
    }
  },
  "settingsSectionLook": "Look",
  "settingsMessageTextSize": "Message text size",
  "settingsTextSizeSmaller": "Smaller",
  "settingsTextSizeLarger": "Larger",
  "settingsSplitListHeight": "Message list height (split view)",
  "@settingsSplitListHeight": {
    "description": "Title above the Auto/quarter/third/half share picker for the vertical split's list band; the divider drag writes the same value"
  },
  "settingsSplitListAuto": "Auto",
  "@settingsSplitListAuto": {
    "description": "Split list height option: the adaptive band (about four rows)"
  },
  "settingsSectionReading": "Reading",
  "settingsConfirmLinks": "Confirm before opening links",
  "settingsDefaultSort": "Default sort",
  "settingsShowRead": "Show read messages",
  "settingsEntryAnchor": "Open a group at",
  "entryAnchorFirstNew": "First new message",
  "entryAnchorLastRead": "Last message read",
  "settingsReplyToSelf": "Reply to your own messages",
  "settingsReplyToSelfSubtitle": "Offer Reply on messages you wrote yourself",
  "settingsSectionQuoting": "Quoting",
  "settingsQuoteWrapWidth": "Quote wrap width",
  "settingsOverquotingThreshold": "Overquoting threshold (lines)",
  "settingsComposeSwipeAnimation": "Animate swipe-to-delete",
  "settingsComposeSwipeAnimationSubtitle": "A swiped quote block slides off and the gap closes; off deletes it on the spot",
  "settingsOverquotingAction": "Overquoting at send",
  "settingsOverquotingActionHint": "What to do when the message quotes at the threshold depth or deeper",
  "overquotingActionNone": "Do nothing",
  "overquotingActionAsk": "Ask before sending",
  "overquotingActionAuto": "Delete automatically",
  "settingsReplyRe": "\"Re:\" in reply subjects",
  "settingsReplyReHint": "How a reply transforms the original subject. FidoNet links replies by hidden kludges, so the subject is traditionally left unchanged",
  "replyReOff": "Leave the subject unchanged",
  "replyRePlain": "Add a single \"Re:\"",
  "replyReNumeric": "Count replies: \"Re:\", \"Re^2:\", \"Re^3:\"…",
  "settingsSectionScoring": "Scoring",
  "settingsScoringEnabled": "Enable scoring",
  "settingsScoringEnabledSubtitle": "Score tags, row tinting and the twit behavior below. Score rules are set on filters.",
  "settingsScoringSkipNegative": "Skip negative-scored messages",
  "settingsScoringSkipNegativeSubtitle": "Navigation passes over messages with score below zero; a score of -100 or lower hides them entirely",
  "settingsScoringUnreadAction": "Unread negative-scored on leaving a group",
  "settingsScoringUnreadActionHint": "Skipped messages stay unread; this settles them on the way out",
  "scoringUnreadActionNone": "Leave unread",
  "scoringUnreadActionAsk": "Ask to mark read",
  "scoringUnreadActionMarkRead": "Mark read automatically",
  "scoringMarkNegativeReadTitle": "Mark negative-scored read?",
  "scoringMarkNegativeReadBody": "{count, plural, one{The group has {count} unread message with a negative score.} other{The group has {count} unread messages with a negative score.}} Mark read before leaving?",
  "@scoringMarkNegativeReadBody": {
    "description": "Body of the confirm dialog shown when leaving a group that still holds unread negative-scored messages",
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "scoringMarkReadAction": "Mark read",
  "messagesNoPositiveScore": "No more messages with positive score",
  "settingsSectionUpload": "File upload",
  "settingsUploadHost": "Upload host",
  "settingsUploadHostCatbox": "catbox.moe (200 MB)",
  "settingsUploadHostNullPointer": "0x0.st (512 MB)",
  "settingsUploadHostImageban": "imageban.ru (images, 10 MB)",
  "settingsUploadHostCustom": "Custom endpoint",
  "settingsUploadCustomUrl": "Upload API URL (catbox-compatible)",
  "settingsUploadCustomUrlInvalid": "Must be an https:// address",
  "settingsUploadCatboxRuNote": "File links are blocked by some Russian ISPs",
  "settingsUploadImagebanNote": "Requires your own API keys from your imageban.ru profile",
  "settingsUploadImagebanClientId": "CLIENT_ID (guest uploads)",
  "settingsUploadImagebanSecretKey": "SECRET_KEY (uploads into your account)",
  "settingsUploadHostPostimages": "postimages.org (images, 32 MB)",
  "settingsUploadHostFastpic": "fastpic.org (images, 25 MB, no account)",
  "settingsUploadPostimagesNote": "Requires your own API key, generated at postimages.org/login/api",
  "settingsUploadPostimagesApiKey": "API key",
  "settingsSectionSchedule": "Schedule",
  "settingsSyncAutomatically": "Exchange mail automatically",
  "settingsSyncAutomaticallySubtitle": "Exchanges mail with every server on a timer while the app is open",
  "settingsSyncIntervalMinutes": "Exchange every (minutes)",
  "settingsRetryIntervalMinutes": "Retry failed exchange after (minutes, 0 = off)",
  "settingsBackgroundSync": "Exchange mail in background",
  "settingsBackgroundSyncSubtitle": "Checks mail even while the app is closed (at most every 15 minutes)",
  "settingsBackgroundLastRun": "Last background exchange {time}: {count, plural, one{{count} message received} other{{count} messages received}}",
  "@settingsBackgroundLastRun": {
    "description": "Subtitle under the background mail-exchange toggle summarizing the last worker run",
    "placeholders": {
      "time": {
        "type": "String"
      },
      "count": {
        "type": "int"
      }
    }
  },
  "notificationNewMailTitle": "New mail",
  "notificationNewMailBodyGroups": "{count, plural, one{{count} new message: {groups}} other{{count} new messages: {groups}}}",
  "@notificationNewMailBodyGroups": {
    "description": "Body of the new-mail notification; groups is the wire-named list like 'Netmail (1), RU.TEST (3)'",
    "placeholders": {
      "count": {
        "type": "int"
      },
      "groups": {
        "type": "String"
      }
    }
  },
  "notificationDefaultAction": "Open",
  "@notificationDefaultAction": {
    "description": "Default action label required by Linux desktop notifications"
  },
  "notificationChannelNewMail": "New mail",
  "notificationChannelNewMailDescription": "Mail that arrived during a background mail exchange",
  "notificationChannelBackgroundSync": "Background mail exchange",
  "notificationBackgroundSyncTitle": "FidoMail",
  "notificationBackgroundSyncText": "Checking for new mail…",
  "serverEditTitleNew": "New server",
  "serverEditTitleEdit": "Edit server",
  "serverEditUnsavedTitle": "Save changes?",
  "serverEditUnsavedBody": "These server settings have unsaved changes.",
  "unsavedChangesTitle": "Save changes?",
  "unsavedChangesBody": "There are unsaved changes.",
  "serverEditDeleteDialogTitle": "Delete server?",
  "serverEditDeleteDialogBody": "“{serverName}” and all its groups and messages will be removed.",
  "@serverEditDeleteDialogBody": {
    "placeholders": {
      "serverName": {
        "type": "String"
      }
    }
  },
  "serverEditHostNntp": "NNTP host",
  "serverEditHostImap": "IMAP host",
  "serverEditName": "Name",
  "@serverEditName": {
    "description": "Server name label (a title, not a person's name)"
  },
  "serverEditDescription": "Description",
  "serverEditActive": "Active",
  "serverEditKindFtn": "FTN",
  "serverEditKindNntp": "NNTP",
  "serverEditKindImap": "IMAP",
  "serverEditPort": "Port (blank = default)",
  "serverEditUsernameAnonymous": "Username (blank = anonymous)",
  "serverEditUsername": "Username",
  "serverEditTlsMode": "Encryption",
  "serverEditTlsModeAuto": "Auto (TLS on port 563, else STARTTLS if offered)",
  "serverEditTlsModeImplicit": "TLS from connect (NNTPS)",
  "serverEditTlsModeStarttls": "STARTTLS, required",
  "serverEditTlsModePlain": "None (cleartext)",
  "serverEditAddressFamily": "Connect over",
  "serverEditAddressFamilyAuto": "Automatic (IPv6 when available)",
  "serverEditAddressFamilyPreferIpv6": "Prefer IPv6",
  "serverEditAddressFamilyForceIpv4": "IPv4 only",
  "serverEditCertPin": "TLS certificate SHA-256 pin (blank = system trust)",
  "serverEditCertPinInvalid": "Not a SHA-256 fingerprint (64 hex digits, separators allowed)",
  "serverEditPktPassword": "PKT password (blank = reuse session)",
  "serverEditAreafixPassword": "AreaFix password (blank = reuse session)",
  "serverEditAreafixRobot": "AreaFix robot name (blank = automatic)",
  "serverEditAreafixRobotHint": "The name your uplink's echo robot answers to. Most tossers accept AreaFix; MBSE answers only AreaMgr. Automatic uses AreaMgr once the uplink's packets identify MBSE — for a brand-new MBSE link, enter AreaMgr here.",
  "serverEditPktPasswordTooLong": "At most 8 characters (FTS-0001 packet header)",
  "serverEditTosserDialect": "Tosser dialect",
  "serverEditTosserDialectHint": "Which tosser your uplink runs. Tossers disagree on how some commands are spelled — today this decides the form \"Rescan\" sends to the AreaFix robot. Automatic recognizes D'Bridge, FMail and FastEcho uplinks by their packets and otherwise uses the hpt form.",
  "serverEditTosserDialectAuto": "Automatic (detect from the uplink's packets)",
  "serverEditTosserDialectHpt": "hpt / Husky (%RESCAN TAG)",
  "serverEditTosserDialectFsc0057": "FSC-0057 / fidomail (=TAG,R)",
  "serverEditTosserDialectFmail": "FMail (=TAG)",
  "serverEditTosserDialectDbridge": "D'Bridge (%RESCAN + tag lines)",
  "serverEditTosserDialectFastecho": "FastEcho (%RESCAN + %MSGS + tag lines)",
  "serverEditPackBundles": "Pack outbound mail into ARCmail bundles",
  "serverEditPackBundlesHint": "Zip-compressed bundles, several packets per file — the usual link setup. Turn off only if this link is configured for uncompressed mail (bare .pkt files).",
  "serverEditOurAddress": "Our address (e.g. 2:5020/848.1)",
  "serverEditUplink": "Uplink address (e.g. 2:5020/848)",
  "serverEditOrigin": "Origin line text",
  "serverEditLocation": "Your location (city)",
  "serverEditLocationHint": "Announced during binkp sessions; some nodes show your name only when a location is sent too",
  "serverEditSignature": "Signature",
  "serverEditTemplateGreeting": "New message template",
  "serverEditTemplateReplyGreeting": "Reply greeting template",
  "serverEditTemplateQuoteHeader": "Quote header template",
  "serverEditTemplateHint": "Placeholders",
  "serverEditTemplateQuoteHeaderHint": "Describes the quoted message; blank = the stock attribution",
  "serverListAddServer": "Add server",
  "serverListEmptyTitle": "No servers yet.",
  "serverListEmptyHint": "…or tap + to add a server manually.",
  "serverListGroupsCount": "Groups: {count}",
  "@serverListGroupsCount": {
    "description": "count is a number or an ellipsis while loading, so it stays a string",
    "placeholders": {
      "count": {
        "type": "String"
      }
    }
  },
  "addressBookTitle": "Address book",
  "addressBookFilterHint": "Address book — filter",
  "addressBookAddContact": "Add contact",
  "addressBookEmpty": "No contacts yet — tap + to add one.",
  "addressBookUncategorized": "Uncategorized",
  "addressEditTitleNew": "New contact",
  "addressEditTitleEdit": "Edit contact",
  "addressEditDeleteContactTitle": "Delete contact?",
  "addressEditDeleteContactBody": "“{name}” will be removed.",
  "@addressEditDeleteContactBody": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "addressEditName": "Name",
  "@addressEditName": {
    "description": "Contact name label (a person's name)"
  },
  "addressEditCategory": "Category",
  "addressEditFtnAddress": "FTN address (e.g. 2:5020/848.1)",
  "addressEditEmail": "Email",
  "addressEditRouteFlavor": "Route flavor",
  "routeFlavorNormal": "normal",
  "@routeFlavorNormal": {
    "description": "FTN routing flavor names; conventionally kept in Latin in every locale"
  },
  "routeFlavorCrash": "crash",
  "routeFlavorHold": "hold",
  "routeFlavorDirect": "direct",
  "filterEditScoreMatchesAll": "This rule would score every message in the store. Add a condition, clear the score adjustment, or delete the rule.",
  "scoreRuleSavedRescored": "{count, plural, =0{Rule saved — no stored messages changed} one{Rule saved — {count} stored message rescored} other{Rule saved — {count} stored messages rescored}}",
  "@scoreRuleSavedRescored": {
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "scoreRuleRescored": "{count, plural, =0{No stored messages changed} one{{count} stored message rescored} other{{count} stored messages rescored}}",
  "@scoreRuleRescored": {
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "scoreRuleRescoreFailed": "The rule change was saved, but rescoring stored messages failed: {error}",
  "@scoreRuleRescoreFailed": {
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "messagesCreateScoreRule": "Create score rule…",
  "messagesBlockSender": "Block sender…",
  "messagesReportMessage": "Report message…",
  "blockSenderTitle": "Block sender?",
  "blockSenderBody": "Messages from {from} will be hidden from every list. You can unblock them later in Settings → Blocked senders.",
  "@blockSenderBody": {
    "placeholders": {
      "from": {
        "type": "String"
      }
    }
  },
  "blockSenderConfirm": "Block",
  "blockSenderDone": "Blocked {name}",
  "@blockSenderDone": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "blockedSendersTitle": "Blocked senders",
  "blockedSendersSubtitle": "Hidden senders — view and unblock",
  "blockedSendersEmpty": "No blocked senders.\nYou can block a sender from a message's menu in the reader.",
  "blockedSendersUnblock": "Unblock",
  "blockedSendersUnblocked": "Unblocked {name}",
  "@blockedSendersUnblocked": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "ugcTermsTitle": "Before you post",
  "ugcTermsBody": "Echomail and newsgroups are public forums: your message is distributed to other systems around the world and cannot be recalled or edited once sent.\n\nBy posting you agree not to post content that is unlawful, or that constitutes harassment, threats, hate speech, sexual content involving minors, spam, or deliberate disruption of a conference — and to follow each conference's own rules.\n\nSystem operators may reject or remove content on their systems. You can report a message to the operator from its menu, and block a sender from the same menu. Netmail is delivered person-to-person through other systems and is not end-to-end encrypted.",
  "ugcTermsAgree": "Agree",
  "aboutAcceptableUse": "Acceptable use policy",
  "scoreRuleDialogTitle": "Create score rule",
  "scoreRuleSenderNameContains": "Sender name contains “{value}”",
  "@scoreRuleSenderNameContains": {
    "description": "Property checkbox label for the sender-name row; matches the name alone (FilterField.fromName)",
    "placeholders": {
      "value": {
        "type": "String"
      }
    }
  },
  "scoreRuleSenderAddressContains": "Sender address contains “{value}”",
  "@scoreRuleSenderAddressContains": {
    "description": "Property checkbox label for the sender-address row; matches the address alone (FilterField.fromAddress)",
    "placeholders": {
      "value": {
        "type": "String"
      }
    }
  },
  "scoreRuleSubjectContains": "Subject contains “{value}”",
  "@scoreRuleSubjectContains": {
    "placeholders": {
      "value": {
        "type": "String"
      }
    }
  },
  "scoreRuleScoreLabel": "Score adjustment",
  "scoreRuleScoreHint": "e.g. -100 hides matching messages",
  "scoreRuleNoProperties": "This message has no usable properties to build a rule from.",
  "scoreRuleScoringDisabledNote": "Scoring is turned off in Settings: the rule is stored and applied, but tint, skip and hide are currently inactive.",
  "scoreRuleDefaultName": "Score: {name}",
  "@scoreRuleDefaultName": {
    "description": "Default filter-group name for a rule created from a message",
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "scoreRuleAdvanced": "Advanced…",
  "filterEditTitleNew": "New filter group",
  "filterEditTitleEdit": "Edit filter group",
  "filterEditDeleteTooltip": "Delete filter group",
  "filterEditNameLabel": "Name",
  "@filterEditNameLabel": {
    "description": "Filter group name label (a title, not a person's name)"
  },
  "filterEditAllConditions": "All conditions",
  "filterEditAnyCondition": "Any condition",
  "filterEditAddCondition": "Add condition",
  "filterEditRemoveConditionTooltip": "Remove condition",
  "filterEditValueLabel": "Value",
  "filterEditDateHint": "yyyy-mm-dd",
  "filterEditScoringHeading": "Scoring",
  "filterEditScoreAdjustmentLabel": "Score adjustment (e.g. -5, empty = none)",
  "filterEditAbsoluteLabel": "Absolute",
  "filterEditScoringHelp": "Matching messages get this score at toss time: relative adds to the running score, absolute sets it.",
  "filterEditNameRequired": "Name is required",
  "filterEditConditionError": "{field} condition: {error}",
  "@filterEditConditionError": {
    "placeholders": {
      "field": {
        "type": "String"
      },
      "error": {
        "type": "String"
      }
    }
  },
  "filterEditValueRequired": "Value is required",
  "filterEditDateFormatError": "Dates are yyyy-mm-dd",
  "filterEditScoreNumberError": "Score is a number",
  "filterEditScoreAdjustmentInvalid": "Score adjustment is a number, e.g. -5",
  "filterEditDeleteDialogTitle": "Delete filter group?",
  "filterEditDeleteDialogBody": "“{name}” is a virtual view — the messages it lists stay in their groups.",
  "@filterEditDeleteDialogBody": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "filterEditFieldBody": "Body",
  "filterEditFieldMsgId": "Message-ID",
  "filterEditFieldScore": "Score",
  "scoreScopeLabel": "Applies to",
  "@scoreScopeLabel": {
    "description": "Label of the score-rule scope control; scopes the SCORE RULE, never the filter group's own message list"
  },
  "scoreScopeAll": "All servers",
  "scoreScopeThisServer": "This server only",
  "scoreScopeThisGroup": "This group only",
  "scoreScopeChooseGroups": "Selected groups…",
  "scoreScopeChooseButton": "Choose…",
  "scoreScopeNoGroups": "No groups selected",
  "scoreScopePickerTitle": "Groups this rule scores",
  "scoreScopeNoEligibleGroups": "This server has no echo or netmail groups yet.",
  "scoreScopeEmptyError": "Select at least one group, or change what the rule applies to.",
  "scoreScopeHelp": "Scoping applies to the score rule only. The filter group itself always lists its own server's messages.",
  "filterEditFieldFromAny": "Sender (name and address)",
  "@filterEditFieldFromAny": {
    "description": "Condition-field choice for the composite FilterField.from; deliberately not the shared fieldFrom string, which labels the message header and the sort menu"
  },
  "filterEditFieldFromName": "Sender name",
  "filterEditFieldFromAddress": "Sender address",
  "filterEditRelEquals": "equals",
  "filterEditRelContains": "contains",
  "filterEditRelStartsWith": "starts with",
  "filterEditRelMatchesRegex": "matches regex",
  "filterEditRelLessThan": "less than",
  "filterEditRelGreaterThan": "greater than",
  "searchHint": "Search subject / sender / text",
  "searchTypeQueryPrompt": "Type a query, then search",
  "searchScopeThisGroup": "This group",
  "searchScopeAllGroups": "All groups",
  "draftsTitle": "Drafts",
  "draftsEmpty": "No drafts",
  "draftsToLine": "To {recipient}",
  "@draftsToLine": {
    "placeholders": {
      "recipient": {
        "type": "String"
      }
    }
  },
  "draftsDeleteTooltip": "Delete draft",
  "draftsDeleteDialogTitle": "Delete draft?",
  "outboxTitle": "Outbox",
  "outboxRemovedSnack": "Removed {filename}",
  "@outboxRemovedSnack": {
    "placeholders": {
      "filename": {
        "type": "String"
      }
    }
  },
  "outboxRemoveDialogTitle": "Remove from outbox?",
  "outboxRemoveDeliveredBody": "This was already sent — removing it only clears the record.",
  "outboxRemoveUnsentBody": "This message has not been sent yet; it will not go out.",
  "outboxEmpty": "Nothing queued",
  "outboxStatusReceived": "received",
  "@outboxStatusReceived": {
    "description": "Spool entry status; lowercase like the original enum display"
  },
  "outboxStatusTossed": "tossed",
  "outboxStatusQuarantined": "quarantined",
  "outboxSizeBytes": "{size} B",
  "@outboxSizeBytes": {
    "description": "File size with a unit abbreviation, not a pluralized noun",
    "placeholders": {
      "size": {
        "type": "int"
      }
    }
  },
  "outboxQueuedAt": "queued {date}",
  "@outboxQueuedAt": {
    "placeholders": {
      "date": {
        "type": "String"
      }
    }
  },
  "outboxAckedAt": "acked {date}",
  "@outboxAckedAt": {
    "placeholders": {
      "date": {
        "type": "String"
      }
    }
  },
  "inboundTitle": "Inbound files",
  "inboundEmpty": "Nothing received",
  "inboundReceivedAt": "received {date}",
  "@inboundReceivedAt": {
    "placeholders": {
      "date": {
        "type": "String"
      }
    }
  },
  "inboundTossedAt": "tossed {date}",
  "@inboundTossedAt": {
    "placeholders": {
      "date": {
        "type": "String"
      }
    }
  },
  "inboundFileMissing": "file no longer on disk",
  "inboundSave": "Save…",
  "inboundSavedSnack": "Saved to {path}",
  "@inboundSavedSnack": {
    "placeholders": {
      "path": {
        "type": "String"
      }
    }
  },
  "inboundRemovedSnack": "Removed {filename}",
  "@inboundRemovedSnack": {
    "placeholders": {
      "filename": {
        "type": "String"
      }
    }
  },
  "inboundRemoveDialogTitle": "Remove inbound file?",
  "inboundRemovePendingBody": "This file has not been tossed yet — its messages will be lost.",
  "inboundRemoveKeptBody": "Removes the kept file and its record.",
  "logTitle": "Mail activity",
  "logEmpty": "No mail activity yet",
  "logCopy": "Copy diagnostics",
  "logCopied": "Diagnostics copied to clipboard",
  "settingsVolumeNav": "Volume keys navigate messages",
  "settingsVolumeNavSubtitle": "Read hands-on: the volume keys turn pages and switch messages",
  "settingsVolumePageScroll": "Scroll long messages screen by screen",
  "settingsVolumePageScrollSubtitle": "A press scrolls the message one screen first; at its end the key switches messages",
  "settingsVolumeShortUp": "Volume up",
  "settingsVolumeShortDown": "Volume down",
  "settingsVolumeLongUp": "Volume up, long press",
  "settingsVolumeLongDown": "Volume down, long press",
  "volumeActionPrevArticle": "Previous message",
  "volumeActionNextArticle": "Next message",
  "volumeActionPrevUnread": "Previous unread",
  "volumeActionNextUnread": "Next unread",
  "volumeActionPrevThread": "Previous thread",
  "volumeActionNextThread": "Next thread",
  "volumeActionNextUnreadThread": "Next unread thread",
  "volumeActionFirstArticle": "First message",
  "volumeActionLastArticle": "Last message",
  "volumeActionFirstUnread": "First unread",
  "volumeActionLastUnread": "Last unread",
  "volumeActionNone": "Do nothing",
  "settingsSectionBackup": "Backup",
  "backupExportAction": "Export backup…",
  "backupExportConfirmAction": "Export",
  "backupImportAction": "Import backup…",
  "backupIncludePasswords": "Include passwords",
  "backupExportWarning": "The backup holds all mail, settings and — if included — your server passwords. Keep the file private.",
  "backupExportedSnack": "Backup saved to {path}",
  "@backupExportedSnack": {
    "placeholders": {
      "path": {
        "type": "String"
      }
    }
  },
  "backupImportConfirmTitle": "Restore this backup?",
  "backupImportConfirmBody": "FidoMail {version} (build {build}), created {date}, {passwords}.\n\nALL current data — servers, mail, drafts, settings — will be replaced.",
  "@backupImportConfirmBody": {
    "placeholders": {
      "version": {
        "type": "String"
      },
      "build": {
        "type": "int"
      },
      "date": {
        "type": "String"
      },
      "passwords": {
        "type": "String"
      }
    }
  },
  "backupImportWithPasswords": "with passwords",
  "backupImportWithoutPasswords": "without passwords",
  "backupImportConfirmAction": "Restore",
  "backupImportStagedTitle": "Restart to finish",
  "backupImportStagedBody": "The backup is staged and will be applied when FidoMail starts next. The app will close now — reopen it to finish the restore.",
  "backupQuitAction": "Close app",
  "backupFailed": "Backup failed: {error}",
  "@backupFailed": {
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "welcomeRestoreAction": "Restore from backup",
  "updateCheckAction": "Check for updates",
  "updateUpToDate": "You have the latest version ({version})",
  "@updateUpToDate": {
    "placeholders": {
      "version": {
        "type": "String"
      }
    }
  },
  "updateAvailableTitle": "Update available",
  "updateAvailableBody": "Version {version} (build {build}) is available; installed: {currentVersion} (build {currentBuild}). Download and install?",
  "@updateAvailableBody": {
    "placeholders": {
      "version": {
        "type": "String"
      },
      "build": {
        "type": "int"
      },
      "currentVersion": {
        "type": "String"
      },
      "currentBuild": {
        "type": "int"
      }
    }
  },
  "updateInstallAction": "Update",
  "updateDownloading": "Downloading update…",
  "updateFailed": "Update failed: {error}",
  "@updateFailed": {
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "aboutVersion": "Version {version} (build {build})",
  "@aboutVersion": {
    "placeholders": {
      "version": {
        "type": "String"
      },
      "build": {
        "type": "int"
      }
    }
  },
  "partEditorTitleReply": "Reply to part",
  "partEditorTitleEdit": "Edit part",
  "partEditorDiscardTitle": "Discard changes",
  "partEditorDiscardBody": "Really discard the changes? They will not be included in the article.",
  "partEditorDiscardTooltip": "Discard part edit",
  "partEditorReplyingTo": "Replying to:",
  "partEditorYourReply": "Your reply:",
  "partEditorReplyHint": "Write your text here",
  "aboutTitle": "About",
  "aboutDescription": "Simple point software for Fidonet and FTN-like networks: echomail and netmail over binkp, offline reading and composing. Also an IMAP and NNTP client for the Fidomail server software.",
  "syncThisServerTooltip": "Exchange mail with this server",
  "syncAllTooltip": "Exchange mail with all servers",
  "syncCompleteReceived": "{received, plural, one{Mail exchange complete — {received} received} other{Mail exchange complete — {received} received}}",
  "@syncCompleteReceived": {
    "placeholders": {
      "received": {
        "type": "int"
      }
    }
  },
  "syncFailed": "Mail exchange failed: {errors}",
  "@syncFailed": {
    "placeholders": {
      "errors": {
        "type": "String"
      }
    }
  },
  "syncError": "Mail exchange error: {message}",
  "@syncError": {
    "placeholders": {
      "message": {
        "type": "String"
      }
    }
  },
  "uueUnnamedFile": "unnamed file",
  "@uueUnnamedFile": {
    "description": "Placeholder name for a UUE payload that carried no filename"
  },
  "uueUnsupportedCoder": "Unsupported encoding inside the UUE frame: {coder}",
  "@uueUnsupportedCoder": {
    "placeholders": {
      "coder": {
        "type": "String"
      }
    }
  },
  "uueSectionOfTotal": "UUE: section {n} of {m} of {name}",
  "@uueSectionOfTotal": {
    "description": "Multipart attachment tile title",
    "placeholders": {
      "n": {
        "type": "int"
      },
      "m": {
        "type": "int"
      },
      "name": {
        "type": "String"
      }
    }
  },
  "uueSectionOpenEnded": "UUE: section {n} of {name}",
  "@uueSectionOpenEnded": {
    "description": "Multipart tile title when the producer declared no total",
    "placeholders": {
      "n": {
        "type": "int"
      },
      "name": {
        "type": "String"
      }
    }
  },
  "uueMultipartHint": "Part of a multi-message posting",
  "uueAssemble": "Assemble",
  "@uueAssemble": {
    "description": "Button: collect the other sections from this group and decode the file"
  },
  "uueDecodeFailed": "Could not decode ({skipped} damaged lines)",
  "@uueDecodeFailed": {
    "placeholders": {
      "skipped": {
        "type": "String"
      }
    }
  },
  "uueNotAnImage": "Not a decodable image — save to view",
  "uueChecksumMismatch": "File is damaged — it does not match the sender's checksum ({detail})",
  "@uueChecksumMismatch": {
    "description": "Shown when every section arrived but the assembled bytes fail the poster's whole-file sum -r: the parts do not belong to one file, or one was damaged in transit. Waiting for more parts will not help.",
    "placeholders": {
      "detail": {
        "type": "String"
      }
    }
  },
  "uueIncomplete": "File is not complete: {reason}",
  "@uueIncomplete": {
    "placeholders": {
      "reason": {
        "type": "String"
      }
    }
  },
  "uueNoSections": "No matching sections found in this group",
  "uueUnsafeName": "Unsafe filename refused: {reason}",
  "@uueUnsafeName": {
    "placeholders": {
      "reason": {
        "type": "String"
      }
    }
  },
  "uueSavedSnack": "Saved to {path}",
  "@uueSavedSnack": {
    "placeholders": {
      "path": {
        "type": "String"
      }
    }
  },
  "postFileAction": "Post file…",
  "@postFileAction": {
    "description": "Messages-screen menu action: post a file via UUE or an uploaded link"
  },
  "attachMethodTitle": "Attach \"{name}\"",
  "@attachMethodTitle": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "attachMethodUue": "Embed in the message (UUE)",
  "attachMethodUueTooLarge": "Over {maxKb} KB — too large to embed",
  "@attachMethodUueTooLarge": {
    "placeholders": {
      "maxKb": {
        "type": "String"
      }
    }
  },
  "attachMethodUpload": "Upload to {host} and insert a link",
  "@attachMethodUpload": {
    "placeholders": {
      "host": {
        "type": "String"
      }
    }
  },
  "uploadTooLargeForHost": "File is {mb} MB; {host} accepts up to {maxMb} MB",
  "@uploadTooLargeForHost": {
    "placeholders": {
      "mb": {
        "type": "String"
      },
      "host": {
        "type": "String"
      },
      "maxMb": {
        "type": "String"
      }
    }
  },
  "uploadConfirmTitle": "Upload to {host}?",
  "@uploadConfirmTitle": {
    "placeholders": {
      "host": {
        "type": "String"
      }
    }
  },
  "uploadConfirmBody": "\"{name}\" ({kb} KB) will become a publicly accessible link on {host}. Anonymous uploads may be impossible to delete, and the file is sent as-is — including any embedded metadata such as photo location tags.",
  "@uploadConfirmBody": {
    "placeholders": {
      "name": {
        "type": "String"
      },
      "kb": {
        "type": "String"
      },
      "host": {
        "type": "String"
      }
    }
  },
  "uploadConfirmAction": "Upload",
  "uploadInProgress": "Uploading {name}…",
  "@uploadInProgress": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "uploadFailed": "Upload failed: {error}",
  "@uploadFailed": {
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "uploadCancelledSnack": "Upload cancelled",
  "uploadTimedOutSnack": "Upload timed out",
  "uploadMaybePublishedSnack": "Upload aborted — the file may still have been published",
  "uploadCustomNotConfigured": "Set the upload host in Settings first",
  "uploadImagesOnlyHost": "{host} accepts images only",
  "@uploadImagesOnlyHost": {
    "placeholders": {
      "host": {"type": "String"}
    }
  },
  "uuePostTitle": "Post file",
  "uuePostEmptyFile": "The file is empty; there is nothing to post",
  "uuePostTooLarge": "File is {kb} KB; the largest postable file is {maxKb} KB",
  "@uuePostTooLarge": {
    "placeholders": {
      "kb": {
        "type": "String"
      },
      "maxKb": {
        "type": "String"
      }
    }
  },
  "uuePostInfo": "{n, plural, one{Encodes to {n} message ({kb} KB)} other{Encodes to {n} messages ({kb} KB total)}}",
  "@uuePostInfo": {
    "placeholders": {
      "n": {
        "type": "int"
      },
      "kb": {
        "type": "String"
      }
    }
  },
  "uuePostFileName": "File name on the wire",
  "uuePostComment": "Comment (goes above the first section)",
  "uuePostConfirm": "{n, plural, one{Queue 1 message} other{Queue {n} messages}}",
  "@uuePostConfirm": {
    "placeholders": {
      "n": {
        "type": "int"
      }
    }
  },
  "uuePostQueuedSnack": "{n, plural, one{{n} message queued — sends on the next mail exchange} other{{n} messages queued — send on the next mail exchange}}",
  "@uuePostQueuedSnack": {
    "placeholders": {
      "n": {
        "type": "int"
      }
    }
  },
  "uuePostPartialError": "Queued {queued} of {total} sections, then failed: {error}. The queued sections are in the outbox.",
  "@uuePostPartialError": {
    "placeholders": {
      "queued": {
        "type": "int"
      },
      "total": {
        "type": "int"
      },
      "error": {
        "type": "String"
      }
    }
  },
  "settingsProcessUue": "Decode UUE attachments",
  "settingsProcessUueSubtitle": "Show files encoded in message text as attachments",
  "settingsMessageFooterBand": "Message footer band",
  "settingsMessageFooterBandSubtitle": "Show the tearline, origin and tagline dimmed below the message instead of as its last lines.",
  "settingsReflowBody": "Reflow message text",
  "settingsReflowBodySubtitle": "Regroup hard-wrapped paragraphs and re-wrap them to the screen. Helps on narrow screens; leaves tables and pseudographics alone.",
  "settingsAnsiArt": "ANSI colour art",
  "settingsAnsiArtSubtitle": "Replay ANSI escape codes in message text on an 80-column screen with DOS colours. Off leaves the codes in the text.",
  "settingsShowInlineImages": "Show images inline",
  "settingsShowInlineImagesSubtitle": "Preview UUE images in place and load linked images from the web",
  "uuePostSyncBusy": "A mail exchange is running for this server — try again when it finishes",
  "@uuePostSyncBusy": {
    "description": "Post-file refused because the server's mail-exchange lease is held"
  },
  "uueRepairedLines": "{n, plural, one{{n} line repaired in transit} other{{n} lines repaired in transit}}",
  "@uueRepairedLines": {
    "description": "Warning that whitespace-stripped UUE lines were reconstructed",
    "placeholders": {
      "n": {
        "type": "int"
      }
    }
  },
  "composeAttachFile": "Attach file…",
  "@composeAttachFile": {
    "description": "Composer menu: uuencode a file into this message below the text"
  },
  "composeAttachPhoto": "Take photo…",
  "@composeAttachPhoto": {
    "description": "Composer menu (Android/iOS only): capture with the camera and attach"
  },
  "composeCameraFailed": "Couldn't take a photo: {error}",
  "@composeCameraFailed": {
    "description": "Snackbar when the camera is unavailable or permission is denied",
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "imageScaleOriginal": "Original — {width}×{height} ({kb} KB)",
  "@imageScaleOriginal": {
    "description": "Scale dialog: keep the image as picked",
    "placeholders": {
      "width": {
        "type": "int"
      },
      "height": {
        "type": "int"
      },
      "kb": {
        "type": "String"
      }
    }
  },
  "imageScaleTo": "Fit to {px} px — {width}×{height}",
  "@imageScaleTo": {
    "description": "Scale dialog: downscale option, longest side {px}",
    "placeholders": {
      "px": {
        "type": "int"
      },
      "width": {
        "type": "int"
      },
      "height": {
        "type": "int"
      }
    }
  },
  "imageScaleWorking": "Scaling image…",
  "@imageScaleWorking": {
    "description": "Modal spinner while the image is decoded and re-encoded"
  },
  "imageScaleFailed": "Couldn't decode the image — attaching the original.",
  "@imageScaleFailed": {
    "description": "Snackbar when the picked image fails to decode for scaling"
  },
  "attachMethodUueEncoded": "As text in the message, ≈ {kb} KB encoded",
  "@attachMethodUueEncoded": {
    "description": "Chooser subtitle: the uuencoded size estimate before committing",
    "placeholders": {
      "kb": {
        "type": "String"
      }
    }
  },
  "composeUueAttachment": "UUE attachment: {name} ({size})",
  "@composeUueAttachment": {
    "description": "Chip shown in the part list instead of the encoded text",
    "placeholders": {
      "name": {
        "type": "String"
      },
      "size": {
        "type": "String"
      }
    }
  },
  "composeUueTooLarge": "File is {kb} KB — too big for one message ({maxKb} KB max). Use “Post file (UUE)…” on the message list to split it into sections.",
  "@composeUueTooLarge": {
    "placeholders": {
      "kb": {
        "type": "String"
      },
      "maxKb": {
        "type": "String"
      }
    }
  },
  "aboutSupport": "Support: ask in the FIDOMAIL (English) and RU.FIDOMAIL (Russian) Fidonet echoes. Both are available from the 2:5001/100@fidonet node.",
  "aboutPrivacyPolicy": "Privacy policy",
  "@aboutSupport": {
    "description": "About screen: where users get help. The echo tags FIDOMAIL / RU.FIDOMAIL are network identifiers and stay verbatim in every language."
  },
  "aboutContact": "Contact the developer: {email}",
  "@aboutContact": {
    "description": "About screen: developer contact line (App Store guideline 1.2 published contact). Tapping opens the mail app.",
    "placeholders": {"email": {"type": "String"}}
  },
  "shareTargetServerTitle": "Post to which server?",
  "shareTargetGroupTitle": "Post to which echo?",
  "shareNothingToPost": "Nothing to post — the shared content has no text",
  "shareNoServers": "No active servers — add one in Settings first",
  "shareNoEchoes": "No echo areas on this server yet",
  "serverEditScheduleMode": "Scheduled mail exchange",
  "serverEditScheduleGlobal": "Global interval",
  "serverEditScheduleCustom": "Custom interval",
  "serverEditScheduleOff": "Manual only",
  "serverEditScheduleMinutes": "Exchange every (minutes)",
  "serverEditScheduleMinutesHint": "Applies while the app is open; background exchange runs at most every 15 minutes",
  "serverEditKeepDays": "Keep messages for (days)",
  "serverEditKeepCount": "Keep messages per echo (count)",
  "serverEditRetentionHint": "Empty = keep forever. Applies to this server's echo areas; starred messages are never deleted",
  "retentionInvalidNumber": "Enter a positive number or leave empty",
  "retentionEnableTitle": "Enable message expiry?",
  "retentionEnableBody": "Messages over the limits — including unread ones — will be deleted from this server's echo areas after each mail exchange. Starred messages and messages you are replying to are always kept.",
  "retentionEnableConfirm": "Enable",
  "groupSettingsTitle": "Group settings",
  "groupSettingsAction": "Settings for {name}",
  "@groupSettingsAction": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  },
  "groupSettingsRetentionHeader": "Retention (overrides the server settings)",
  "retentionInheritOption": "Server default",
  "retentionUnlimitedOption": "Unlimited",
  "retentionCustomOption": "Custom",
  "groupSettingsKeepDays": "Keep (days)",
  "groupSettingsKeepCount": "Keep (messages)",
  "groupSettingsPurgeRead": "Delete read messages",
  "groupSettingsPurgeReadHint": "Read, unstarred messages are deleted at the next purge regardless of age",
  "groupSettingsEffectiveLabel": "Effective policy: {policy}",
  "@groupSettingsEffectiveLabel": {
    "placeholders": {
      "policy": {
        "type": "String"
      }
    }
  },
  "retentionKeepForever": "keep everything",
  "retentionKeepDaysValue": "{days} days",
  "@retentionKeepDaysValue": {
    "placeholders": {
      "days": {
        "type": "int"
      }
    }
  },
  "retentionKeepCountValue": "{count} messages",
  "@retentionKeepCountValue": {
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "retentionPurgeReadShort": "purge read",
  "groupSettingsPurgeNow": "Purge now",
  "groupSettingsPurgeDone": "Purged {deleted} messages ({unread} unread)",
  "@groupSettingsPurgeDone": {
    "placeholders": {
      "deleted": {
        "type": "int"
      },
      "unread": {
        "type": "int"
      }
    }
  },
  "groupSettingsPurgeNothing": "Nothing to purge",
  "groupSettingsPurgeBusy": "A mail exchange is running — try again when it finishes",
  "settingsSectionNotifications": "Notifications",
  "settingsNotificationsEnabled": "New-mail notification",
  "settingsNotificationsEnabledSubtitle": "Sound alert when new mail arrives in the chosen groups",
  "settingsNotifyGroups": "Groups that notify…",
  "settingsNotifyGroupsSubtitle": "Netmail is on by default; pick the echoes you want",
  "settingsNotificationsBlocked": "Notifications are blocked by the system",
  "@settingsNotificationsBlocked": {
    "description": "Settings warning shown when the master toggle is on but the OS denies the notification permission"
  },
  "settingsNotificationsBlockedHint": "Tap to ask again, or allow notifications for FidoMail in your system settings",
  "@settingsNotificationsBlockedHint": {
    "description": "Subtitle of the blocked-notifications warning"
  },
  "notifyGroupsBlocked": "The system is blocking notifications — these choices stay silent until you allow them in system settings",
  "@notifyGroupsBlocked": {
    "description": "Banner atop the notify-groups picker when the OS denies the notification permission"
  },
  "notifyGroupsTitle": "New-mail notifications",
  "notifyGroupsAll": "All",
  "notifyGroupsNone": "None",
  "notifyGroupsPersonalHint": "Messages addressed to you in any echo area",
  "groupSettingsNotify": "Notify about new mail",
  "groupSettingsNotifyHint": "Sound notification when a mail exchange stores new mail here",
  "groupCharsetLabel": "Charset",
  "groupCharsetServerDefault": "Server default ({charset})",
  "@groupCharsetServerDefault": {
    "placeholders": {
      "charset": {
        "type": "String"
      }
    }
  },
  "settingsSectionPurging": "Purging",
  "settingsPurgePeriod": "Purge period",
  "settingsPurgePeriodHint": "How often each echo area is trimmed to its retention limits (set per server, overridable per group). The Dupes and BadMail areas are cleaned automatically after 30 days.",
  "purgePeriodNever": "Never",
  "purgePeriodEverySync": "On every mail exchange",
  "purgePeriodHoursOption": "Every {hours} h",
  "@purgePeriodHoursOption": {
    "placeholders": {
      "hours": {
        "type": "int"
      }
    }
  },
  "settingsCompactDb": "Compact database",
  "settingsCompactDbHint": "Rebuild the database file to reclaim the space freed by purging. Runs only while no mail exchange is active.",
  "settingsCompactDbDone": "Database compacted — {mb} MB reclaimed",
  "@settingsCompactDbDone": {
    "placeholders": {
      "mb": {
        "type": "String"
      }
    }
  },
  "settingsLastRunPurgedSuffix": "· purged {count}",
  "@settingsLastRunPurgedSuffix": {
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "syncPhaseConnecting": "connecting",
  "syncPhaseHandshake": "handshake",
  "syncPhaseAuthenticating": "authentication",
  "syncPhaseReceiving": "receiving",
  "syncPhaseSending": "sending",
  "syncPhaseFinishing": "finishing",
  "@syncPhaseConnecting": {
    "description": "Step name appended to a failure reason in parentheses, lower case: 'Connection refused (connecting)'"
  },
  "syncStatusRunningConnecting": "Connecting…",
  "syncStatusRunningHandshake": "Handshake…",
  "syncStatusRunningAuthenticating": "Authenticating…",
  "syncStatusRunningReceiving": "Receiving…",
  "syncStatusRunningSending": "Sending…",
  "syncStatusRunningFinishing": "Finishing…",
  "syncStatusReceivedSuffix": "· {count} received",
  "@syncStatusReceivedSuffix": {
    "description": "Appended to the live status while messages arrive",
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "syncStatusLastOk": "Last exchange {time}",
  "@syncStatusLastOk": {
    "description": "Server-row status line after a clean exchange; time is DD.MM.YY HH:MM",
    "placeholders": {
      "time": {
        "type": "String"
      }
    }
  },
  "syncStatusLastOkWarnings": "Last exchange {time} · {count, plural, one{{count} warning} other{{count} warnings}}",
  "@syncStatusLastOkWarnings": {
    "placeholders": {
      "time": {
        "type": "String"
      },
      "count": {
        "type": "int"
      }
    }
  },
  "syncStatusLastFailed": "Failed {time}: {reason}",
  "@syncStatusLastFailed": {
    "placeholders": {
      "time": {
        "type": "String"
      },
      "reason": {
        "type": "String"
      }
    }
  },
  "syncFailureWithPhase": "{reason} ({phase})",
  "@syncFailureWithPhase": {
    "description": "A failure reason with its step: 'Connection refused (connecting)'",
    "placeholders": {
      "reason": {
        "type": "String"
      },
      "phase": {
        "type": "String"
      }
    }
  },
  "syncFailureHostLookup": "Host name not found",
  "syncFailureConnectionRefused": "Connection refused",
  "syncFailureNetworkUnreachable": "Network unreachable",
  "syncFailureConnectTimeout": "Connection timed out",
  "syncFailureTls": "TLS or certificate error",
  "syncFailureRemoteBusy": "The node is busy — try again later",
  "syncFailureAuthRejected": "Password rejected by the node",
  "syncFailureProtocolTimeout": "No reply from the node while waiting for {what}",
  "@syncFailureProtocolTimeout": {
    "description": "what = protocol vocabulary as logged, e.g. 'M_OK' or 'remote M_EOB, M_GOT/M_SKIP for 2 file(s)'",
    "placeholders": {
      "what": {
        "type": "String"
      }
    }
  },
  "syncFailureConnectionClosed": "The node closed the connection while waiting for {what}",
  "@syncFailureConnectionClosed": {
    "placeholders": {
      "what": {
        "type": "String"
      }
    }
  },
  "syncFailureConnectionClosedPlain": "The node closed the connection",
  "syncFailureStorage": "Mail storage failed: {detail}",
  "@syncFailureStorage": {
    "placeholders": {
      "detail": {
        "type": "String"
      }
    }
  },
  "syncFailureCancelled": "Cancelled",
  "syncCompleteWarningsSuffix": "{count, plural, one{, {count} warning} other{, {count} warnings}}",
  "@syncCompleteWarningsSuffix": {
    "description": "Appended to syncCompleteReceived when the session raised warnings",
    "placeholders": {
      "count": {
        "type": "int"
      }
    }
  },
  "syncDetailsAction": "Details",
  "@syncDetailsAction": {
    "description": "Snackbar action opening the mail-activity log"
  },
  "settingsLastRunFailedSuffix": "· failed: {error}",
  "@settingsLastRunFailedSuffix": {
    "description": "Appended to the background last-run line when that run failed; error is the raw English journal text",
    "placeholders": {
      "error": {
        "type": "String"
      }
    }
  },
  "logShowProtocolDetails": "Protocol details",
  "@logShowProtocolDetails": {
    "description": "Toggle on the mail-activity screen showing/hiding debug-level lines (the binkp frame dump)"
  }
}
