diff --git a/web/src/lib/languages.ts b/web/src/lib/languages.ts index fd6934e..91e92ed 100644 --- a/web/src/lib/languages.ts +++ b/web/src/lib/languages.ts @@ -42,6 +42,7 @@ export const UI_LANGUAGES: readonly UiLanguage[] = [ { tag: "fr", name: "Français", beta: true }, { tag: "nl", name: "Nederlands", beta: true }, { tag: "pt-BR", name: "Português (Brasil)", beta: true }, + { tag: "ru", name: "Русский", beta: true }, { tag: "uk", name: "Українська", beta: true }, ]; diff --git a/web/src/locales/__tests__/ru-plurals.test.ts b/web/src/locales/__tests__/ru-plurals.test.ts new file mode 100644 index 0000000..a52101d --- /dev/null +++ b/web/src/locales/__tests__/ru-plurals.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, it, afterEach } from "vitest"; +import { plural, setCatalog } from "@/lib/i18n"; +import { catalog as ru } from "@/locales/ru"; + +/** + * Russian is the first shipped catalogue that needs `few` and `many`, so this + * checks the real entries rather than a fixture. English would have rendered + * "5 письмо" for all of these, which is the kind of wrong that makes a + * translation read as machine output however good the vocabulary is. + */ +const FORMS = { one: "{n} message", other: "{n} messages" }; +afterEach(() => setCatalog("en", { strings: {}, plurals: {} })); + +describe("Russian plurals", () => { + it("picks one, few and many by the language's own rule", () => { + setCatalog("ru", ru); + expect(plural(1, FORMS)).toBe("1 письмо"); // one + expect(plural(2, FORMS)).toBe("2 письма"); // few + expect(plural(3, FORMS)).toBe("3 письма"); + expect(plural(5, FORMS)).toBe("5 писем"); // many + expect(plural(11, FORMS)).toBe("11 писем"); // 11-14 are many, not few + expect(plural(21, FORMS)).toBe("21 письмо"); // 21 is one again + expect(plural(22, FORMS)).toBe("22 письма"); + expect(plural(25, FORMS)).toBe("25 писем"); + expect(plural(0, FORMS)).toBe("0 писем"); + }); + + it("carries every form for each counted string it ships", () => { + // A catalogue missing `few` silently falls back to `other`, which is + // grammatical often enough to go unnoticed and wrong the rest of the time. + for (const [key, forms] of Object.entries(ru.plurals)) { + for (const cat of ["one", "few", "many", "other"] as const) { + expect(forms[cat], `${key} is missing "${cat}"`).toBeTruthy(); + } + } + }); +}); diff --git a/web/src/locales/ru.ts b/web/src/locales/ru.ts new file mode 100644 index 0000000..30956c0 --- /dev/null +++ b/web/src/locales/ru.ts @@ -0,0 +1,867 @@ +import type { Catalog } from "@/lib/i18n"; + +/** + * Russian — generated by AI, and not reviewed by a native speaker. + * + * First of Phase 2, and the first catalogue where the plural machinery earns + * its keep: Russian needs three forms where English has two, and choosing + * between them is not a question about the number 1. `plural()` was built + * around `Intl.PluralRules` for exactly this, and the entries below are the + * first real use of `few` and `many` rather than a test fixture. + * + * Marked Beta, with the report link doing the job a native speaker would. A + * missing string renders its English source, so deleting a bad entry is a + * valid fix. + * + * ── Decisions this file is consistent about ────────────────────────────── + * + * Register: **вы**, lowercase, which is the neutral polite address every + * Russian interface uses. Capitalised «Вы» is correspondence style — it reads + * as a letter addressed to one person, not as software — and using it here + * would be a small, constant wrongness on every screen. This follows the + * formal-address decision the other languages took, and in Russian it costs + * nothing: it is simply what software says. + * + * Most of the interface avoids the question anyway, because Russian UI + * convention is the infinitive for actions — «Удалить», «Ответить» — rather + * than an imperative addressed at the reader. + * + * Terminology, fixed once so it cannot drift: + * + * Inbox Входящие Archive (verb) архивировать + * Drafts Черновики Delete удалить + * Sent Отправленные Move to переместить в + * Deleted Items Корзина Reply ответить + * Junk / Spam Спам Reply all ответить всем + * Folder Папка Forward переслать + * Label Ярлык Star отметить + * Conversation Цепочка Read / unread прочитано / непрочитано + * Message Письмо Settings Настройки + * Attachment Вложение Signature Подпись + * Contact Контакт Identity Профиль отправителя + * + * «Письмо» rather than «сообщение» for a mail message: it is what Russian mail + * clients call one, and «сообщение» reads as a chat message. «Ярлык» for + * label, which is Gmail's word in Russian — the same rule as French, Spanish + * and Portuguese, and a fifth answer to it. + * + * Product names are never translated: ihasmail, Stalwart, JMAP, Sieve, vCard. + */ +export const catalog: Catalog = { + strings: { + // ── Actions ──────────────────────────────────────────────────────── + "Archive": "Архивировать", + "Archive (e)": "Архивировать (e)", + "Delete": "Удалить", + "Delete (#)": "Удалить (#)", + "Reply": "Ответить", + "Reply (r)": "Ответить (r)", + "Reply all": "Ответить всем", + "Forward": "Переслать", + "Move to…": "Переместить в…", + "Move to (v)": "Переместить в (v)", + "Move to folder": "Переместить в папку", + "Move here": "Переместить сюда", + "Mark as read": "Отметить как прочитанное", + "Mark as read (Shift+I)": "Отметить как прочитанное (Shift+I)", + "Mark as unread": "Отметить как непрочитанное", + "Mark as unread (Shift+U)": "Отметить как непрочитанное (Shift+U)", + "Mark all as read": "Отметить всё как прочитанное", + "Mark all as read, incl. subfolders": "Отметить всё как прочитанное, включая вложенные папки", + "Star": "Отметить", + "Labels": "Ярлыки", + "Labels (l)": "Ярлыки (l)", + "Label as": "Присвоить ярлык", + "Label…": "Ярлык…", + "Compose": "Написать", + "Compose message": "Написать письмо", + "Send": "Отправить", + "Send at": "Отправить в", + "Cancel send": "Отменить отправку", + "Schedule send": "Отложить отправку", + "Save": "Сохранить", + "Save & activate": "Сохранить и включить", + "Save & close (Esc)": "Сохранить и закрыть (Esc)", + "Save as template": "Сохранить как шаблон", + "Save draft now": "Сохранить черновик сейчас", + "Cancel": "Отмена", + "Close": "Закрыть", + "Done": "Готово", + "Continue": "Продолжить", + "Edit": "Изменить", + "Edit…": "Изменить…", + "Rename": "Переименовать", + "Remove": "Убрать", + "Restore": "Восстановить", + "Retry": "Повторить", + "Reload": "Перезагрузить", + "Refresh": "Обновить", + "Copy": "Копировать", + "Copy email address": "Копировать адрес", + "Download": "Скачать", + "Download all": "Скачать всё", + "Download (.eml)": "Скачать (.eml)", + "Download latest as .eml": "Скачать последнее в .eml", + "Upload": "Загрузить", + "Upload files…": "Загрузить файлы…", + "Print": "Печать", + "Print conversation": "Напечатать цепочку", + "Undo (Ctrl+Z)": "Отменить (Ctrl+Z)", + "Redo": "Вернуть", + "Dismiss": "Закрыть", + "Discard changes": "Отменить изменения", + "Discard draft": "Удалить черновик", + "Duplicate": "Дублировать", + "Validate": "Проверить", + "Revoke": "Отозвать", + "Turn off": "Отключить", + "Clear": "Очистить", + "Clear selection": "Снять выделение", + "Clear custom colour": "Убрать свой цвет", + "Select": "Выбрать", + "Select all": "Выбрать всё", + "Unsubscribe": "Отписаться", + "Share…": "Поделиться…", + "Stop sharing": "Закрыть доступ", + "Open": "Открыть", + "Open in new tab": "Открыть в новой вкладке", + "Open in calendar": "Открыть в календаре", + "Back": "Назад", + "Back (u)": "Назад (u)", + "Back to list": "Назад к списку", + "Back to my files": "Назад к моим файлам", + "Go back to the list": "Вернуться к списку", + "Next": "Далее", + "Previous": "Назад", + "More": "Ещё", + "More actions": "Другие действия", + "More options": "Другие параметры", + "Move up": "Вверх", + "Move down": "Вниз", + "Drag to reorder": "Перетащите, чтобы изменить порядок", + "Right-click for options": "Правая кнопка мыши — параметры", + + // ── Mail ─────────────────────────────────────────────────────────── + "Mail": "Почта", + "Message": "Письмо", + "Messages": "Письма", + "Message body": "Текст письма", + "Message headers": "Заголовки письма", + "Message size": "Размер письма", + "Message-ID": "Message-ID", + "Original message": "Исходное письмо", + "Delete this message": "Удалить это письмо", + "New message to this address": "Новое письмо на этот адрес", + "Conversation view": "Показывать цепочками", + "Draft": "Черновик", + "Unread": "Непрочитанные", + "Unread only": "Только непрочитанные", + "All mail": "Вся почта", + "Sender": "Отправитель", + "Sender domain": "Домен отправителя", + "Recipients": "Получатели", + "From": "От", + "To": "Кому", + "Cc": "Копия", + "Bcc": "Скрытая копия", + "Subject": "Тема", + "Subject (optional)": "Тема (необязательно)", + "Body": "Текст", + "Body text": "Обычный текст", + "Attach files": "Прикрепить файлы", + "Attach from Files": "Прикрепить из Файлов", + "Remove attachment": "Убрать вложение", + "Has attachment": "Есть вложение", + "Has the words": "Содержит слова", + "Header name": "Имя заголовка", + "Show headers": "Показать заголовки", + "Show original": "Показать исходник", + "Show details": "Показать подробности", + "Show images": "Показать изображения", + "Remote images": "Внешние изображения", + "Remote images are blocked to protect your privacy.": "Внешние изображения заблокированы, чтобы защитить вашу приватность.", + "Always from {email}": "Всегда от {email}", + "This looks like a mailing list.": "Похоже, это рассылка.", + "This folder is empty": "Папка пуста", + "This folder is empty.": "Папка пуста.", + "Delete all spam now": "Удалить весь спам сейчас", + "Deleting spam is permanent — it does not go to Deleted Items first.": "Удаление спама необратимо — он не попадает сначала в корзину.", + "Keep in Inbox": "Оставить во входящих", + "Newer (k)": "Новее (k)", + "Older (j)": "Старее (j)", + "Open the next (older) conversation": "Открыть следующую цепочку (более старую)", + "Open the previous (newer) conversation": "Открыть предыдущую цепочку (более новую)", + "Loading conversation…": "Загрузка цепочки…", + "Important": "Важное", + "Unverified": "Не проверено", + "Priority": "Приоритет", + "High": "Высокий", + "Normal": "Обычный", + "Low": "Низкий", + "to {recipients}": "кому: {recipients}", + "From: {sender}": "От: {sender}", + "Waiting on the server — goes out {when}.": "Ожидает на сервере — будет отправлено {when}.", + "Scheduled — click to clear the schedule": "Отложено — нажмите, чтобы отменить", + "Nothing scheduled": "Ничего не отложено", + "The message waits on the server, so it goes out whether or not ihasmail is open.": "Письмо ждёт на сервере и будет отправлено независимо от того, открыт ihasmail или нет.", + "This server holds a message for up to {span}.": "Этот сервер удерживает письмо до {span}.", + "Date and time to send": "Дата и время отправки", + "Undo send window": "Время на отмену отправки", + "Read receipt requested": "Запрошено уведомление о прочтении", + "The sender asked for a read receipt.": "Отправитель запросил уведомление о прочтении.", + "Request read receipt": "Запросить уведомление о прочтении", + "Always request read receipts": "Всегда запрашивать уведомление о прочтении", + "Receipt": "Уведомление", + "Never send one": "Никогда не отправлять", + "Not this time": "Не в этот раз", + "It would go to {address}, which is not where the message came from.": "Оно ушло бы на {address}, а письмо пришло не оттуда.", + "Use “Show original” for the complete raw message.": "Нажмите «Показать исходник», чтобы увидеть письмо целиком.", + + // ── Folders, calendar, contacts, files ───────────────────────────── + "Folder": "Папка", + "Folders": "Папки", + "Folder options": "Параметры папки", + "New folder": "Новая папка", + "New subfolder": "Новая вложенная папка", + "Delete folder": "Удалить папку", + "No matching folders": "Подходящих папок нет", + "No subfolders here.": "Здесь нет вложенных папок.", + "Type a folder name…": "Введите имя папки…", + "+ New folder…": "+ Новая папка…", + "Create, rename and hide folders.": "Создание, переименование и скрытие папок.", + "Show unsubscribed (hidden) folders": "Показывать неподписанные (скрытые) папки", + "Storage: {used} of {total} used.": "Хранилище: занято {used} из {total}.", + "{used} of {total}": "{used} из {total}", + + "Calendar": "Календарь", + "My calendars": "Мои календари", + "New calendar": "Новый календарь", + "Calendar options": "Параметры календаря", + "Calendar & contacts": "Календарь и контакты", + "Calendar is not available": "Календарь недоступен", + "Event": "Событие", + "New event": "Новое событие", + "(new event)": "(новое событие)", + "New all-day event": "Новое событие на весь день", + "Add title": "Добавить название", + "Add location": "Добавить место", + "Add to calendar": "Добавить в календарь", + "Add to my calendar": "Добавить в мой календарь", + "Remove from calendar": "Убрать из календаря", + "Remove from my calendar": "Убрать из моего календаря", + "All day": "Весь день", + "all-day": "весь день", + "Starts": "Начало", + "Starts (optional)": "Начало (необязательно)", + "Ends": "Окончание", + "Ends (optional)": "Окончание (необязательно)", + "Day": "День", + "Week": "Неделя", + "Month": "Месяц", + "Agenda": "Список", + "Today": "Сегодня", + "Go to day": "Перейти к дню", + "Go to week": "Перейти к неделе", + "Previous month": "Предыдущий месяц", + "Next month": "Следующий месяц", + "Does not repeat": "Не повторяется", + "Daily": "Ежедневно", + "Every weekday": "По будням", + "Yearly": "Ежегодно", + "Custom…": "Свой вариант…", + "Weekly on {weekday}": "Еженедельно, {weekday}", + "Monthly on day {day}": "Ежемесячно, {day}-го числа", + "Repeat every": "Повторять каждые", + "Repeat until": "Повторять до", + "after N times": "после N раз", + "on date": "до даты", + "never": "никогда", + "day(s)": "дн.", + "week(s)": "нед.", + "month(s)": "мес.", + "year(s)": "г.", + "Reminders": "Напоминания", + "Add reminder": "Добавить напоминание", + "Remove reminder": "Убрать напоминание", + "Default reminder": "Напоминание по умолчанию", + "At time of event": "В момент события", + "5 minutes before": "За 5 минут", + "10 minutes before": "За 10 минут", + "15 minutes before": "За 15 минут", + "30 minutes before": "За 30 минут", + "1 hour before": "За 1 час", + "1 day before": "За 1 день", + "15 minutes": "15 минут", + "30 minutes": "30 минут", + "45 minutes": "45 минут", + "1 hour": "1 час", + "1.5 hours": "1,5 часа", + "2 hours": "2 часа", + "Default event length": "Длительность события по умолчанию", + "Default view": "Вид по умолчанию", + "Guests": "Участники", + "Add guests by name or email": "Добавить участников по имени или адресу", + "Send invitation emails to guests": "Отправлять участникам приглашения по почте", + "Going?": "Придёте?", + "Yes": "Да", + "No": "Нет", + "Maybe": "Возможно", + "Confirmed": "Подтверждено", + "Tentative": "Под вопросом", + "Cancelled": "Отменено", + "organizer": "организатор", + "Organizer: {name}": "Организатор: {name}", + "Free": "Свободен", + "Busy": "Занят", + "Free/busy": "Занятость", + "Show as": "Показывать как", + "Availability on {date}": "Занятость на {date}", + "Count all events as busy": "Считать все события занятостью", + "Only events I'm attending": "Только события, где я участвую", + "Don't include in availability": "Не учитывать в занятости", + "Meeting link": "Ссылка на встречу", + "No events in the next 60 days.": "В ближайшие 60 дней событий нет.", + "Working hours": "Рабочее время", + "Working hours start": "Начало рабочего времени", + "Working hours end": "Конец рабочего времени", + "Colour categories": "Цветовые категории", + "Category": "Категория", + "No category": "Без категории", + "New category": "Новая категория", + "Delete category": "Удалить категорию", + "Manage categories…": "Управление категориями…", + "Use category color": "Цвет категории", + "Use calendar color": "Цвет календаря", + "Use the default colour": "Цвет по умолчанию", + "+{n} more": "+{n}", + + "Contacts": "Контакты", + "Contacts are not available": "Контакты недоступны", + "New contact": "Новый контакт", + "Edit contact": "Изменить контакт", + "Select a contact": "Выберите контакт", + "All contacts": "Все контакты", + "Search contacts": "Поиск по контактам", + "Search contacts to add…": "Найдите контакты, чтобы добавить…", + "Loading contacts…": "Загрузка контактов…", + "Add to contacts": "Добавить в контакты", + "Add to my contacts": "Добавить в мои контакты", + "Remove from my contacts": "Убрать из моих контактов", + "Address book": "Адресная книга", + "Address books": "Адресные книги", + "All address books": "Все адресные книги", + "My address books": "Мои адресные книги", + "New address book": "Новая адресная книга", + "No address books yet.": "Адресных книг пока нет.", + "Choose from address books": "Выбрать из адресных книг", + "Import vCard": "Импорт vCard", + "Export all": "Экспортировать всё", + "Export book": "Экспортировать книгу", + "Email group": "Написать группе", + "Email everyone": "Написать всем", + "Members": "Участники", + "Members ({count})": "Участники ({count})", + "Group": "Группа", + "· group": "· группа", + "Person": "Человек", + "First name": "Имя", + "Last name": "Фамилия", + "Middle name": "Отчество", + "More name fields": "Другие поля имени", + "Nickname": "Псевдоним", + "Prefix": "Обращение", + "Suffix": "Суффикс", + "Dr.": "Д-р", + "Jr.": "Мл.", + "Display name": "Отображаемое имя", + "Job title": "Должность", + "Organization": "Организация", + "Company": "Компания", + "Birthday": "День рождения", + "Notes": "Заметки", + "Website": "Сайт", + "Phone": "Телефон", + "Add phone": "Добавить телефон", + "Add email": "Добавить адрес", + "Add address": "Добавить почтовый адрес", + "Address": "Адрес", + "Street": "Улица", + "City": "Город", + "State / Region": "Область / регион", + "Postal code": "Индекс", + "Country": "Страна", + "Change photo": "Сменить фото", + "Remove photo": "Убрать фото", + "Updated {date}": "Обновлено {date}", + "Modified": "Изменено", + "Search names and addresses": "Поиск по именам и адресам", + "Add a person or group…": "Добавить человека или группу…", + "Choose recipients": "Выбрать получателей", + "Available to add": "Можно добавить", + "vCard": "vCard", + "vCard attachment": "Вложение vCard", + + "Files": "Файлы", + "My files": "Мои файлы", + "File storage is not available": "Хранилище файлов недоступно", + "Drag files here or use Upload.": "Перетащите файлы сюда или нажмите «Загрузить».", + "Shared": "Общий доступ", + "Shared with me": "Доступные мне", + "Nothing is shared with you.": "Вам ничего не открыли.", + "Not shared with anyone yet.": "Доступ пока никому не открыт.", + "Check for new shares": "Проверить новые", + "Shared files are copied to your account when attached.": "При вложении общие файлы копируются в вашу учётную запись.", + "Viewer": "Чтение", + "Editor": "Изменение", + "Size": "Размер", + "Add files": "Добавить файлы", + "Minimize": "Свернуть", + + // ── Settings ─────────────────────────────────────────────────────── + "Settings": "Настройки", + "All settings": "Все настройки", + "Sections": "Разделы", + "General": "Общие", + "Appearance": "Внешний вид", + "Make ihasmail yours.": "Настройте ihasmail под себя.", + "Reading": "Чтение", + "Reading pane": "Область чтения", + "Reading, sending and list behaviour. Settings are stored in this browser.": "Поведение при чтении, отправке и в списке. Настройки хранятся в этом браузере.", + "Right of the list": "Справа от списка", + "Below the list": "Под списком", + "Hidden (open full width)": "Скрыта (открывать во всю ширину)", + "Off (open messages full width)": "Выключена (письма во всю ширину)", + "Off": "Выключено", + "Composing": "Написание", + "Default format": "Формат по умолчанию", + "Rich text (HTML)": "Форматированный текст (HTML)", + "Plain text": "Обычный текст", + "Quote original message in replies": "Цитировать исходное письмо в ответах", + "Place signature above quoted text": "Ставить подпись над цитатой", + "Attachment reminder": "Напоминание о вложении", + "Warn when the message mentions an attachment but none is attached.": "Предупреждать, если письмо упоминает вложение, но его нет.", + "Spell check while typing": "Проверять орфографию при вводе", + "Confirm before deleting": "Спрашивать перед удалением", + "Show message snippets": "Показывать начало письма", + "Preview the first line of each message in the list.": "Показывать первую строку каждого письма в списке.", + "Show sender avatars": "Показывать аватары отправителей", + "Group messages from the same thread together.": "Объединять письма одной цепочки.", + "After archiving or deleting": "После архивирования или удаления", + "Ask before showing (recommended)": "Спрашивать перед показом (рекомендуется)", + "Always (all messages)": "Всегда (все письма)", + "Show automatically from my contacts": "Автоматически для моих контактов", + "Immediately when opened": "Сразу при открытии", + "After 2 seconds": "Через 2 секунды", + "After 5 seconds": "Через 5 секунд", + "Never automatically": "Никогда автоматически", + "When someone requests a read receipt": "Когда запрашивают уведомление о прочтении", + "Ask me on each message": "Спрашивать для каждого письма", + "5 seconds": "5 секунд", + "8 seconds": "8 секунд", + "15 seconds": "15 секунд", + "30 seconds": "30 секунд", + "Locale": "Регион", + "Language": "Язык", + "Interface language": "Язык интерфейса", + "Language & region": "Язык и регион", + "Date format": "Формат даты", + "Time format": "Формат времени", + "Time zone": "Часовой пояс", + "Week starts on": "Неделя начинается с", + "Monday": "Понедельник", + "Tuesday": "Вторник", + "Wednesday": "Среда", + "Thursday": "Четверг", + "Friday": "Пятница", + "Saturday": "Суббота", + "Sunday": "Воскресенье", + "12-hour clock (6:23 PM)": "12-часовой формат (6:23 PM)", + "24-hour clock (18:23)": "24-часовой формат (18:23)", + "Browser default ({zone})": "Как в браузере ({zone})", + "Default ({zone})": "По умолчанию ({zone})", + "Automatic ({example})": "Автоматически ({example})", + "Automatic ({locale})": "Автоматически ({locale})", + "Automatic": "Автоматически", + "Preview: {example}": "Пример: {example}", + "Dates, times and month names follow this choice.": "Даты, время и названия месяцев следуют этому выбору.", + "Your mail server reports {name} ({tag}).": "Ваш почтовый сервер сообщает {name} ({tag}).", + "Your mail server does not report a locale, so the browser's is used.": "Ваш почтовый сервер не сообщает язык, поэтому используется язык браузера.", + "Dates": "Даты", + "Date": "Дата", + "Time": "Время", + "When": "Когда", + "Then": "Затем", + "then": "затем", + "Theme": "Тема", + "Accent color": "Акцентный цвет", + "Color": "Цвет", + "Colour": "Цвет", + "Text color": "Цвет текста", + "Density & text": "Плотность и текст", + "Display density": "Плотность отображения", + "Comfortable": "Свободная", + "Cozy (default)": "Средняя (по умолчанию)", + "Compact": "Плотная", + "Text size": "Размер текста", + "Font size": "Размер шрифта", + "Small": "Мелкий", + "Medium": "Средний", + "Large": "Крупный", + "Huge": "Очень крупный", + "Sidebar": "Боковая панель", + "Show labels in the sidebar": "Показывать ярлыки на боковой панели", + "Collapse sidebar to icons": "Свернуть боковую панель до значков", + "Apply the theme to messages too": "Применять тему и к письмам", + "Swiping": "Жесты смахивания", + "Swipe left": "Смахнуть влево", + "Swipe right": "Смахнуть вправо", + "Backup": "Резервная копия", + "Export settings": "Экспорт настроек", + "Import settings": "Импорт настроек", + "Settings imported": "Настройки импортированы", + "Invalid settings file": "Неверный файл настроек", + "Reset to defaults": "Сбросить к значениям по умолчанию", + "Default mail app": "Почтовая программа по умолчанию", + "Documentation": "Документация", + "About ihasmail": "О программе ihasmail", + "About": "О программе", + "Server": "Сервер", + "Server capabilities": "Возможности сервера", + "Accounts": "Учётные записи", + "Account": "Учётная запись", + "Max upload": "Максимальная загрузка", + "{size} MB": "{size} МБ", + "KB": "КБ", + "Image privacy proxy": "Прокси приватности изображений", + "enabled": "включён", + "disabled": "выключен", + "Enabled": "Включено", + "active": "активен", + "hidden": "скрыта", + "connected": "подключено", + "reconnecting…": "переподключение…", + "AGPL-3.0 source": "Исходный код AGPL-3.0", + + // ── Identities, templates, filters ───────────────────────────────── + "Identities & signatures": "Профили отправителя и подписи", + "Add identity": "Добавить профиль", + "Delete identity": "Удалить профиль", + "Make default": "Сделать основным", + "Default": "Основной", + "Show when composing": "Показывать при написании", + "Hide when composing": "Скрывать при написании", + "Signature": "Подпись", + "Your signature…": "Ваша подпись…", + "Reply-To": "Обратный адрес", + "Reply-To (optional)": "Обратный адрес (необязательно)", + "Reply-To: {addresses}": "Обратный адрес: {addresses}", + "Replies go to…": "Ответы приходят на…", + "Set a Reply-To address": "Указать обратный адрес", + "{email} is now your default identity": "{email} теперь ваш основной профиль", + "Templates": "Шаблоны", + "New template": "Новый шаблон", + "Delete template": "Удалить шаблон", + "Insert template": "Вставить шаблон", + "Template text…": "Текст шаблона…", + "Subject: {subject}": "Тема: {subject}", + "Filters & rules": "Фильтры и правила", + "Filters unavailable": "Фильтры недоступны", + "Rules": "Правила", + "Rule name": "Название правила", + "New rule": "Новое правило", + "Delete rule": "Удалить правило", + "No filters yet": "Фильтров пока нет", + "Add condition": "Добавить условие", + "Remove condition": "Убрать условие", + "Add action": "Добавить действие", + "Remove action": "Убрать действие", + "all of the following match": "выполняются все условия", + "any of the following match": "выполняется любое из условий", + "contains": "содержит", + "does not contain": "не содержит", + "is": "равно", + "is not": "не равно", + "matches (wildcards * ?)": "совпадает с (шаблоны * ?)", + "does not match": "не совпадает с", + "matches regex": "совпадает с регулярным выражением", + "does not match regex": "не совпадает с регулярным выражением", + "exists": "существует", + "does not exist": "не существует", + "is larger than": "больше чем", + "is smaller than": "меньше чем", + "Stop processing more rules": "Прекратить обработку остальных правил", + "keep copy": "оставить копию", + "Forward to": "Переслать на", + "Reject with message": "Отклонить с сообщением", + "Scripts": "Скрипты", + "Scripts (advanced)": "Скрипты (для опытных)", + "Script name": "Название скрипта", + "New script": "Новый скрипт", + "Delete script": "Удалить скрипт", + "Sieve source": "Исходный код Sieve", + "Preview generated Sieve script": "Посмотреть созданный скрипт Sieve", + "Start with rules": "Начать с правил", + "Switch to rules?": "Перейти к правилам?", + "Create filter": "Создать фильтр", + "Filter messages like this": "Фильтровать похожие письма", + "Filter messages like this…": "Фильтровать похожие письма…", + "Also apply to existing messages in": "Применить и к письмам в", + "keyword (e.g. $important, work)": "ключевое слово (например, $important, work)", + "Other header…": "Другой заголовок…", + "Out of office": "Автоответ об отсутствии", + "Auto-reply enabled": "Автоответ включён", + + // ── Security, sessions, notifications ────────────────────────────── + "Security & sessions": "Безопасность и сеансы", + "Password": "Пароль", + "Your password": "Ваш пароль", + "Current password": "Текущий пароль", + "New password": "Новый пароль", + "Confirm new password": "Подтвердите новый пароль", + "Current code": "Текущий код", + "Code from your authenticator": "Код из приложения-аутентификатора", + "Two-factor authentication": "Двухфакторная аутентификация", + "Turn off two-factor authentication": "Отключить двухфакторную аутентификацию", + "Your password alone will be enough to sign in again.": "Для входа снова будет достаточно одного пароля.", + "App passwords": "Пароли приложений", + "New app password for": "Новый пароль приложения для", + "Your new app password": "Ваш новый пароль приложения", + "Secret": "Секрет", + "Thunderbird on my laptop": "Thunderbird на ноутбуке", + "Active webmail sessions": "Активные сеансы веб-почты", + "Sign out": "Выйти", + "Sign out here": "Выйти здесь", + "Sign out all other sessions": "Завершить все остальные сеансы", + "Signed in as": "Вход выполнен как", + "This is my own device": "Это моё личное устройство", + "this device": "это устройство", + "Device": "Устройство", + "IP": "IP", + "Last active": "Последняя активность", + "Created": "Создан", + "Expires": "Истекает", + "Status": "Состояние", + "Online": "В сети", + "Reason": "Причина", + "Type": "Тип", + "Email or username": "Адрес или имя пользователя", + "Use your usual address as the username.": "В качестве имени пользователя укажите свой обычный адрес.", + "Fast, friendly webmail. Your mailbox, your way.": "Быстрая и удобная веб-почта. Ваш ящик — по-вашему.", + + "Notifications": "Уведомления", + "Notifications are blocked in your browser settings.": "Уведомления заблокированы в настройках браузера.", + "Not supported in this browser.": "Не поддерживается в этом браузере.", + "Desktop notifications while ihasmail is open": "Системные уведомления, пока ihasmail открыт", + "Notify me even when ihasmail is closed": "Уведомлять, даже когда ihasmail закрыт", + "Play a sound for new mail": "Звук при новом письме", + "Test notification": "Проверить уведомление", + "Background notifications are on": "Фоновые уведомления включены", + "The tab title and favicon always show your unread Inbox count.": "Заголовок вкладки и значок всегда показывают число непрочитанных во входящих.", + "Live updates are delivered via JMAP push ({state}).": "Обновления в реальном времени приходят через JMAP push ({state}).", + "Shows a system notification when new mail arrives in your Inbox while the tab is in the background.": "Показывает системное уведомление, когда во входящие приходит письмо, а вкладка в фоне.", + + // ── Editor, search, shortcuts, misc ──────────────────────────────── + "Formatting": "Форматирование", + "Formatting options": "Параметры форматирования", + "Remove formatting": "Убрать форматирование", + "Bold (Ctrl+B)": "Полужирный (Ctrl+B)", + "Italic (Ctrl+I)": "Курсив (Ctrl+I)", + "Underline (Ctrl+U)": "Подчёркнутый (Ctrl+U)", + "Strikethrough": "Зачёркнутый", + "Highlight": "Выделение цветом", + "Bulleted list": "Маркированный список", + "Numbered list": "Нумерованный список", + "Increase indent": "Увеличить отступ", + "Decrease indent": "Уменьшить отступ", + "Align left": "По левому краю", + "Align right": "По правому краю", + "Center": "По центру", + "Quote": "Цитата", + "Code block": "Блок кода", + "Normal text": "Обычный текст", + "Insert link (Ctrl+K)": "Вставить ссылку (Ctrl+K)", + "Insert image": "Вставить изображение", + "Link": "Ссылка", + "List": "Список", + "Emoji": "Эмодзи", + "Write your message…": "Напишите письмо…", + "Search": "Поиск", + "Search mail": "Поиск по почте", + "Advanced search": "Расширенный поиск", + "Keyboard shortcuts": "Сочетания клавиш", + "Keyboard shortcuts (?)": "Сочетания клавиш (?)", + "Shortcuts": "Сочетания", + "Go to": "Перейти", + "Menu": "Меню", + "Options": "Параметры", + "Send options": "Параметры отправки", + "Name": "Имя", + "Email": "Адрес", + "Email address": "Адрес электронной почты", + "Description": "Описание", + "Location": "Место", + "Visibility": "Видимость", + "Private": "Личное", + "Work": "Работа", + "Loading…": "Загрузка…", + "None": "Нет", + "optional": "необязательно", + "Always show": "Всегда показывать", + "to": "кому", + "Received": "Получено", + "In-Reply-To": "In-Reply-To", + "References": "References", + "Add label / keyword": "Добавить ярлык или ключевое слово", + "Manage labels": "Управление ярлыками", + "Create “{name}”": "Создать «{name}»", + "Type a name to create your first label.": "Введите название, чтобы создать первый ярлык.", + "Labels are IMAP keywords stored on your messages, so they sync to other clients. Names and colours are kept in this browser.": "Ярлыки — это ключевые слова IMAP, которые хранятся в самих письмах и синхронизируются с другими клиентами. Названия и цвета остаются в этом браузере.", + "New label": "Новый ярлык", + "Delete label": "Удалить ярлык", + "PDF": "PDF", + "Large attachments may be rejected by some servers": "Некоторые серверы отклоняют большие вложения", + "Images are stored in your Files (folder “ihasmail”) and embedded when you send.": "Изображения хранятся в ваших Файлах (папка «ihasmail») и вставляются при отправке.", + "Thanks for your message. I'm away until … and will reply when I'm back.": "Спасибо за письмо. Я отсутствую до … и отвечу после возвращения.", + "Automatically reply to people who email you while you're away. Each sender gets at most one reply.": "Автоматически отвечать тем, кто напишет вам во время отсутствия. Каждый отправитель получит не больше одного ответа.", + "Sort incoming mail automatically. Rules run on the server (Sieve), so they work for every client you use.": "Автоматически сортировать входящую почту. Правила выполняются на сервере (Sieve), поэтому работают во всех клиентах.", + "Canned responses you can insert into any message from the composer's template button.": "Готовые ответы, которые можно вставить в любое письмо кнопкой шаблонов в редакторе.", + "Create a rule to move newsletters to a folder, flag important senders, or forward mail.": "Создайте правило, чтобы складывать рассылки в папку, отмечать важных отправителей или пересылать почту.", + "Advanced: manage raw Sieve scripts. Only one script can be active at a time.": "Для опытных: работа со скриптами Sieve напрямую. Одновременно активен только один скрипт.", + "Only part of your filter script arrived.": "Скрипт фильтрации получен не полностью.", + "Your active script “{name}” was written by hand.": "Ваш активный скрипт «{name}» написан вручную.", + "Another script (“{name}”) is active. Saving rules here will activate the “ihasmail” script instead.": "Активен другой скрипт («{name}»). Если сохранить правила здесь, вместо него включится скрипт «ihasmail».", + "“{name}” will be deactivated (not deleted) and a new “ihasmail” script will take over.": "«{name}» будет отключён (не удалён), а его место займёт новый скрипт «ihasmail».", + "Sieve filtering is not available for this account.": "Фильтрация Sieve недоступна для этой учётной записи.", + "Sieve filtering is not enabled for this account.": "Фильтрация Sieve не включена для этой учётной записи.", + "Vacation responses are not available for this account.": "Автоответы об отсутствии недоступны для этой учётной записи.", + "This account does not have the JMAP calendars capability.": "У этой учётной записи нет возможности JMAP «календари».", + "This account does not have the JMAP contacts capability.": "У этой учётной записи нет возможности JMAP «контакты».", + "This account does not have the JMAP file storage capability.": "У этой учётной записи нет возможности JMAP «хранилище файлов».", + + // ── Labels held in constants, translated where they render ───────── + "Add": "Добавить", + "Create subfolders": "Создавать вложенные папки", + "Dark": "Тёмная", + "Light": "Светлая", + "Match system": "Как в системе", + "Day.Month.Year": "День.Месяц.Год", + "Day/Month/Year": "День/Месяц/Год", + "Month/Day/Year": "Месяц/День/Год", + "Year-Month-Day (ISO 8601)": "Год-Месяц-День (ISO 8601)", + "Edit all": "Изменять всё", + "Edit contents": "Изменять содержимое", + "Edit own": "Изменять своё", + "Flag": "Отмечать", + "Mark read": "Отмечать прочитанным", + "Private props": "Личные свойства", + "Read": "Читать", + "Read events": "Читать события", + "RSVP": "Отвечать на приглашения", + "See free/busy": "Видеть занятость", + "Share": "Открывать доступ", + "Write": "Писать", + "Live updates connected": "Обновления в реальном времени подключены", + "Live updates reconnecting…": "Переподключение обновлений в реальном времени…", + "Live updates off — checking periodically instead": "Обновления в реальном времени выключены — идёт периодическая проверка", + "Mark as read / unread": "Отметить как прочитанное / непрочитанное", + "Star / unstar": "Отметить / снять отметку", + "Report spam / not spam": "Пометить как спам / не спам", + "Report spam": "Пометить как спам", + "Not spam": "Не спам", + "Nothing": "Ничего", + "Later today": "Сегодня позже", + "Tomorrow morning": "Завтра утром", + "Tomorrow afternoon": "Завтра днём", + "Monday morning": "В понедельник утром", + "Open draft": "Открыть черновик", + "Undo": "Отменить", + "Deleted Items": "Корзина", + "Choose a date": "Выберите дату", + "Choose a date and time": "Выберите дату и время", + "Pick date and time…": "Выбрать дату и время…", + "After": "После", + "Before": "До", + + // ── Folder names shown for a JMAP role (see lib/mailboxName.ts) ──── + "folder\u0004Inbox": "Входящие", + "folder\u0004Archive": "Архив", + "folder\u0004Drafts": "Черновики", + "folder\u0004Sent": "Отправленные", + "folder\u0004Deleted Items": "Корзина", + "folder\u0004Junk Mail": "Спам", + "folder\u0004Important": "Важное", + "folder\u0004All mail": "Вся почта", + "folder": "папка", + "“{name}” moved into “{parent}”": "«{name}» перемещена в «{parent}»", + "“{name}” moved to the top level": "«{name}» перемещена на верхний уровень", + "Could not move “{name}”: {reason}": "Не удалось переместить «{name}»: {reason}", + "Delete “{name}”?": "Удалить «{name}»?", + "Rename folder": "Переименовать папку", + "Search: {query}": "Поиск: {query}", + "No conversation selected": "Цепочка не выбрана", + "Drop here for the top level": "Перетащите сюда, чтобы вынести на верхний уровень", + + // ── Longer prose ─────────────────────────────────────────────────── + "Search mail (from:, to:, subject:, has:attachment, is:unread, in:, before:, after:)": "Поиск по почте (from:, to:, subject:, has:attachment, is:unread, in:, before:, after:)", + "Settings → Filters & rules": "Настройки → Фильтры и правила", + "Open the Mail view to see all shortcuts.": "Откройте раздел «Почта», чтобы увидеть все сочетания клавиш.", + "Gmail-style shortcuts are always on. Press {key} anywhere to see this list.": "Сочетания клавиш в стиле Gmail всегда включены. Нажмите {key} в любом месте, чтобы увидеть этот список.", + "Select a conversation to read it here · Press {key} for shortcuts": "Выберите цепочку, чтобы прочитать её здесь · {key} — сочетания клавиш", + "Tip: press {key} on a conversation to apply labels. Search with {operator}.": "Совет: нажмите {key} на цепочке, чтобы присвоить ярлыки. Ищите через {operator}.", + "A fast, friendly, open-source webmail for {server}, built on JMAP.": "Быстрая и удобная веб-почта с открытым кодом для {server}, построенная на JMAP.", + "Defaults for the calendar views and new events.": "Значения по умолчанию для видов календаря и новых событий.", + "Replies will go to this address instead of the From address": "Ответы будут приходить на этот адрес, а не на адрес отправителя", + "Replies to mail sent from this identity go here instead of the From address.": "Ответы на письма из этого профиля приходят сюда, а не на адрес отправителя.", + "New identities must use an address this account is allowed to send from (aliases configured on the server).": "Новый профиль должен использовать адрес, с которого этой учётной записи разрешено отправлять (псевдонимы настраиваются на сервере).", + "Not offered when composing. It still receives mail, and you can still send from it by showing it again.": "Не предлагается при написании письма. Адрес по-прежнему принимает почту, и с него снова можно отправлять, если показать его обратно.", + "Each identity is a sender address with its own name, Reply-To and signature. The default identity is preselected when you compose; set a Reply-To when replies should go somewhere other than the From address.": "Каждый профиль — это адрес отправителя со своим именем, обратным адресом и подписью. Основной профиль подставляется при написании письма; укажите обратный адрес, если ответы должны приходить не на адрес отправителя.", + "This signature is larger than the server's {limit}-byte limit. ihasmail will keep the full version in your Files and store a short text fallback on the server — other mail clients will see the plain-text version.": "Эта подпись больше серверного предела в {limit} байт. ihasmail сохранит полную версию в ваших Файлах, а на сервере оставит короткий текстовый вариант — другие почтовые клиенты увидят именно его.", + "Outlook-style categories you can assign to events from the right-click menu or the event editor. The category name is stored on the event, so it syncs to other clients.": "Категории в стиле Outlook, которые можно присваивать событиям через контекстное меню или редактор события. Название категории хранится в самом событии и синхронизируется с другими клиентами.", + "Plain-text mail already follows the theme. With this on, HTML mail that brings no colours of its own does as well, instead of sitting on a white card. Messages that style themselves are left exactly as the sender designed them.": "Письма в обычном тексте уже следуют теме. С этой настройкой ей следуют и HTML-письма без собственных цветов, а не показываются на белом фоне. Письма с собственным оформлением остаются ровно такими, какими их задумал отправитель.", + "This is separate from {setting} in General, which decides how dates, times and numbers are written. You can read an English interface with German dates, or the other way round.": "Это не то же самое, что {setting} в разделе «Общие», где задаётся, как пишутся даты, время и числа. Можно читать английский интерфейс с русскими датами — или наоборот.", + "On a touchscreen, drag a message sideways to act on it. Each direction can do one thing, or nothing. These follow your account, so a phone and a tablet agree; a mouse ignores them and keeps dragging messages into folders instead.": "На сенсорном экране смахните письмо в сторону, чтобы выполнить над ним действие. Каждое направление может делать что-то одно — или ничего. Настройка привязана к учётной записи, поэтому телефон и планшет ведут себя одинаково; мышь её игнорирует, и письма по-прежнему перетаскиваются в папки.", + "This screen has no touchscreen, so nothing here changes what it does. Your phone or tablet will pick these up.": "У этого экрана нет сенсорного ввода, поэтому здесь ничего не изменится. Настройку подхватят телефон или планшет.", + "Holding a message selects it, and holding a folder opens its menu. Pull the top of the message list down to check for new mail.": "Долгое нажатие на письме выделяет его, а на папке — открывает её меню. Потяните список писем вниз, чтобы проверить почту.", + "A receipt tells whoever asked that this address is live and when the message was read, and the sender chooses where it goes — so there is no automatic option. Bulk mail, mailing lists and anything marked auto-submitted are never offered one at all.": "Уведомление сообщает запросившему, что адрес действующий и когда письмо было прочитано, а отправитель сам выбирает, куда его отправить, — поэтому автоматического варианта нет. Для массовых рассылок, списков рассылки и всего помеченного как отправленное автоматически оно не предлагается вовсе.", + "This browser cannot register apps for {scheme} links. Safari, in particular, has no such API — you can still make ihasmail the default from your operating system if you install it as an app.": "Этот браузер не умеет регистрировать программы для ссылок {scheme}. В частности, в Safari нет такого интерфейса — но ihasmail всё равно можно сделать программой по умолчанию средствами операционной системы, установив его как приложение.", + "Registering for {scheme} links requires a secure (HTTPS) connection.": "Для регистрации ссылок {scheme} нужно защищённое соединение (HTTPS).", + "Open {scheme} links — in web pages, documents and other apps — in ihasmail instead of a desktop mail client. Your browser will ask you to confirm, and you can change it later in its own settings (Chrome: Settings › Privacy and security › Site settings › Protocol handlers; Firefox: Settings › General › Applications).": "Открывать ссылки {scheme} — на веб-страницах, в документах и других программах — в ihasmail, а не в почтовой программе на компьютере. Браузер попросит подтверждение, и позже это можно изменить в его настройках (Chrome: Настройки › Конфиденциальность и безопасность › Настройки сайтов › Обработчики протоколов; Firefox: Настройки › Основные › Приложения).", + "Requested in this browser. Whether it took effect is up to the browser — check its settings if mail links still open elsewhere.": "Запрошено в этом браузере. Сработало ли это, решает он сам — проверьте его настройки, если почтовые ссылки по-прежнему открываются в другом месте.", + "For a system-wide default, install ihasmail as an app first (in Chrome: the install icon in the address bar). Your operating system can then offer ihasmail directly wherever it asks which mail app to use.": "Чтобы задать программу по умолчанию для всей системы, сначала установите ihasmail как приложение (в Chrome — значок установки в адресной строке). После этого операционная система сможет предлагать ihasmail везде, где спрашивает, какой почтовой программой воспользоваться.", + "Needs a browser with the Push API and a mail server that publishes a push key.": "Нужен браузер с Push API и почтовый сервер, публикующий push-ключ.", + "Your mail server delivers these straight to your browser, so they arrive with no ihasmail tab open, naming the sender and subject. Your browser still has to be running — if you quit it completely, notifications wait and arrive when you open it again.": "Почтовый сервер доставляет их прямо в браузер, поэтому они приходят без открытой вкладки ihasmail и содержат отправителя и тему. Браузер при этом должен быть запущен: если закрыть его полностью, уведомления подождут и придут при следующем запуске.", + "Your mail server can wake this browser, but will not include the sender or subject. Your browser still has to be running.": "Почтовый сервер может разбудить этот браузер, но не сообщит отправителя и тему. Браузер при этом должен быть запущен.", + "This is what a new-mail notification looks like.": "Так выглядит уведомление о новом письме.", + "You're signed in as {user}. Your password is never stored in the browser; the server keeps it encrypted per-session for talking to Stalwart.": "Вы вошли как {user}. Пароль никогда не хранится в браузере: сервер держит его в зашифрованном виде на время сеанса, чтобы общаться со Stalwart.", + "App passwords are managed by your mail administrator.": "Паролями приложений управляет ваш почтовый администратор.", + "Changing your password signs out your other webmail sessions. Any app passwords keep working.": "Смена пароля завершает остальные сеансы веб-почты. Пароли приложений продолжают работать.", + "This account has two-factor authentication on. ihasmail can't sign you in with a code yet, so signing in on another device needs an app password — or you can turn two-factor authentication off here.": "Для этой учётной записи включена двухфакторная аутентификация. ihasmail пока не умеет входить по коду, поэтому для входа на другом устройстве нужен пароль приложения — либо двухфакторную аутентификацию можно отключить здесь.", + "A separate password for a mail app or device, which you can revoke on its own. App passwords skip two-factor codes, so they keep working in apps that can't ask for one.": "Отдельный пароль для почтовой программы или устройства, который можно отозвать по отдельности. Пароли приложений обходят двухфакторные коды и поэтому работают там, где запросить код невозможно.", + "Copy it into {name} now — it isn't shown again.": "Скопируйте его в {name} сейчас — больше он не показывается.", + "No other users found in the directory, so nobody new can be added. Sharing already in place is listed below and can still be removed.": "В каталоге не найдено других пользователей, поэтому добавить некого. Уже открытый доступ перечислен ниже, и его по-прежнему можно закрыть.", + "Stalwart does not publish its version number to mail clients, so ihasmail reports the edition where the server gives one. ihasmail requires 0.16 or newer, and sign-in refuses anything older.": "Stalwart не сообщает почтовым клиентам номер версии, поэтому ihasmail показывает редакцию, если сервер её называет. ihasmail требует версию 0.16 или новее, и вход с более старой не выполняется.", + "It {damage}, so the rules in it can't be shown or edited — saving what did arrive would write it back over the rest. Reload the page to try again. Your rules are still on the server; nothing here has changed them.": "Он {damage}, поэтому правила в нём нельзя показать или изменить: сохранение полученной части затёрло бы остальное. Перезагрузите страницу и попробуйте снова. Ваши правила остаются на сервере, здесь их ничто не меняло.", + "The visual rule editor only manages scripts it created. You can edit the script in the {tab} tab, or start fresh with rules (the existing script will be kept but deactivated).": "Визуальный редактор правил работает только со скриптами, которые создал сам. Скрипт можно изменить на вкладке {tab} или начать заново с правил (существующий скрипт сохранится, но будет отключён).", + "Your filter script {damage}, so only part of it arrived. Adding a rule would write that part back over the whole thing. Reload the page and try again.": "Ваш скрипт фильтрации {damage}, поэтому получена только его часть. Добавление правила затёрло бы этой частью весь скрипт. Перезагрузите страницу и попробуйте снова.", + "Your filter script couldn't be read just now, so adding a rule would risk overwriting it. Reload the page and try again.": "Скрипт фильтрации сейчас не удалось прочитать, поэтому добавление правила рискует его перезаписать. Перезагрузите страницу и попробуйте снова.", + "Your active Sieve script was written by hand, so rules can't be added automatically. Open {where} to edit the script or switch to managed rules.": "Ваш активный скрипт Sieve написан вручную, поэтому правила нельзя добавить автоматически. Откройте {where}, чтобы изменить скрипт или перейти к управляемым правилам.", + "Only languages ihasmail has been translated into appear here, so this list grows as translations land rather than ahead of them — a language offered without strings behind it would leave the page claiming to be in a language it is not.": "Здесь показаны только языки, на которые ihasmail переведён, поэтому список растёт вместе с переводами, а не опережает их: язык без текстов заставил бы страницу утверждать, что она написана на языке, которым не является.", + "tell us about it": "сообщите нам", + "This translation was generated by AI and has not been checked by a native speaker, so it is marked Beta until somebody who speaks it signs it off. Anything that reads wrongly is worth reporting — {report}.": "Этот перевод сделан ИИ и не проверен носителем языка, поэтому помечен как Beta до тех пор, пока кто-нибудь его не подтвердит. Обо всём, что звучит неправильно, стоит сообщить — {report}.", + "{name} is the palette from {site}, and what a new account starts on. It is a dark theme, so it counts as dark wherever that matters, and the accent colour below still applies on top of it.": "{name} — это палитра с {site}, с которой начинает новая учётная запись. Тема тёмная, поэтому везде, где это важно, считается тёмной, а акцентный цвет ниже применяется поверх неё.", + "ihasmail's own version is the date of the commit it was built from, followed by where that commit came from: {example} was built from a commit dated the 30th of August 2026 that arrived through pull request 129. A commit that did not come through one carries its short SHA instead — {sha}. The version deliberately says nothing about Stalwart; what this build needs from the server is the line above.": "Собственная версия ihasmail — это дата коммита, из которого он собран, и указание, откуда этот коммит взялся: {example} собран из коммита от 30 августа 2026 года, пришедшего через pull request 129. Коммит, пришедший иначе, несёт вместо этого короткий SHA — {sha}. Версия намеренно ничего не сообщает о Stalwart; то, что этой сборке нужно от сервера, указано строкой выше.", + }, + plurals: { + /* + * Three forms, which is the whole reason plural() takes a map rather than + * (one, other). Intl.PluralRules picks: 1 is `one`, 2-4 are `few`, 5-20 + * and most others are `many`. English needs none of this and would have + * shipped "1 писем" without it. + */ + "{n} messages": { one: "{n} письмо", few: "{n} письма", many: "{n} писем", other: "{n} письма" }, + "{n} conversations": { one: "{n} цепочка", few: "{n} цепочки", many: "{n} цепочек", other: "{n} цепочки" }, + // Impersonal, so the count needs no agreement at all — which is what + // Russian interfaces actually do here. + "{n} selected": { one: "Выбрано: {n}", few: "Выбрано: {n}", many: "Выбрано: {n}", other: "Выбрано: {n}" }, + }, +};