diff --git a/web/src/lib/languages.ts b/web/src/lib/languages.ts index 2f3face..15124c3 100644 --- a/web/src/lib/languages.ts +++ b/web/src/lib/languages.ts @@ -42,6 +42,8 @@ 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 }, { tag: "zh-Hans", 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/__tests__/uk-plurals.test.ts b/web/src/locales/__tests__/uk-plurals.test.ts new file mode 100644 index 0000000..db7a28a --- /dev/null +++ b/web/src/locales/__tests__/uk-plurals.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it, afterEach } from "vitest"; +import { plural, setCatalog } from "@/lib/i18n"; +import { catalog as uk } from "@/locales/uk"; + +/** + * Ukrainian needs `few` and `many` where English has one plural, and the rule + * is not "n === 1": 11 is `many` despite ending in 1, and 21 is `one` again. + * English's two-form assumption would render "5 лист", which is the kind of + * wrong that makes a translation read as machine output whatever the + * vocabulary is. + */ +const FORMS = { one: "{n} message", other: "{n} messages" }; +afterEach(() => setCatalog("en", { strings: {}, plurals: {} })); + +describe("Ukrainian plurals", () => { + it("picks one, few and many by the language's own rule", () => { + setCatalog("uk", uk); + expect(plural(1, FORMS)).toBe("1 лист"); + expect(plural(2, FORMS)).toBe("2 листи"); + expect(plural(4, FORMS)).toBe("4 листи"); + expect(plural(5, FORMS)).toBe("5 листів"); + expect(plural(11, FORMS)).toBe("11 листів"); // many, despite ending in 1 + expect(plural(21, FORMS)).toBe("21 лист"); // one again + expect(plural(0, FORMS)).toBe("0 листів"); + }); + + it("carries every form for each counted string it ships", () => { + // A missing `few` falls back to `other` silently, and is grammatical often + // enough to go unnoticed while being wrong the rest of the time. + for (const [key, forms] of Object.entries(uk.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}" }, + }, +}; diff --git a/web/src/locales/uk.ts b/web/src/locales/uk.ts new file mode 100644 index 0000000..48bd318 --- /dev/null +++ b/web/src/locales/uk.ts @@ -0,0 +1,859 @@ +import type { Catalog } from "@/lib/i18n"; + +/** + * Ukrainian — generated by AI, and not reviewed by a native speaker. + * + * 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 ────────────────────────────── + * + * This is a translation, not a transliteration of the Russian one. The two + * languages share a plural structure and a script and almost nothing else + * that matters here: «Вхідні» is not «Входящие», «Кошик» is not «Корзина», + * «Листування» is not «Цепочка». Producing Ukrainian by adapting Russian is + * the failure mode a Ukrainian reader will spot in the first sentence and + * will rightly resent, so the vocabulary was chosen against what Ukrainian + * mail clients say rather than against the neighbouring file. + * + * Register: **ви**, lowercase — the neutral polite address, matching the + * decision every other catalogue took. As in Russian, most of the interface + * sidesteps it by using the infinitive for actions. + * + * 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 folder: both are used, and «тека» is the + * form Ukrainian software has settled on. «Мітка» for label rather than + * Russian's «ярлык», which in Ukrainian means a shortcut. + * + * 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: { + /* + * Ukrainian takes the same three forms as Russian and the same rule, but + * not the same words. Sharing a plural structure is not sharing a + * language, and a catalogue produced by adapting the Russian one is the + * thing a Ukrainian reader would notice first. + */ + "{n} messages": { one: "{n} лист", few: "{n} листи", many: "{n} листів", other: "{n} листа" }, + "{n} conversations": { one: "{n} листування", few: "{n} листування", many: "{n} листувань", other: "{n} листування" }, + "{n} selected": { one: "Вибрано: {n}", few: "Вибрано: {n}", many: "Вибрано: {n}", other: "Вибрано: {n}" }, + }, +};