diff --git a/public/locales/ru.json b/public/locales/ru.json index 91f96efb..43b494cb 100644 --- a/public/locales/ru.json +++ b/public/locales/ru.json @@ -1,4 +1,13 @@ { + "admin_reauth": { + "title": "Подтвердите, что это вы", + "hint": "Для резервных копий и восстановления нужно снова ввести пароль и код двухфакторной аутентификации, если вы ею пользуетесь.", + "password": "Ваш пароль", + "code": "Код двухфакторной аутентификации (если используете)", + "continue": "Продолжить", + "need_password": "Введите пароль", + "failed": "Не удалось начать загрузку" + }, "_meta": { "locale": "ru", "language": "Русский", @@ -6,10 +15,12 @@ "direction": "ltr" }, "auth": { + "page_title": "Haven | Вход", "tagline": "Приватный чат, твои правила", "tabs": { "login": "Войти", - "register": "Регистрация" + "register": "Регистрация", + "sso": "Привязка сервера" }, "login": { "username_label": "Имя пользователя", @@ -18,7 +29,9 @@ "forgot_password": "Забыли пароль?", "locked_out": "Не можете войти? Восстановление администратора", "admin_recover_hint": "Введите учётные данные администратора выше и нажмите «Восстановить»", - "admin_recover_btn": "Восстановить доступ администратора" + "admin_recover_code": "Код двухфакторной аутентификации", + "admin_recover_btn": "Восстановить доступ администратора", + "consent_note": "Нажимая «Войти», вы официально соглашаетесь с действующими условиями использования, которые могут отличаться от условий, действовавших при вашей регистрации." }, "register": { "username_label": "Имя пользователя", @@ -26,7 +39,89 @@ "password_label": "Пароль", "password_hint": "Минимум 8 символов", "confirm_label": "Подтвердите пароль", - "submit": "Создать аккаунт" + "submit": "Создать аккаунт", + "token_label": "Токен приглашения", + "token_placeholder": "Вставьте токен, который вам передал администратор", + "token_hint": "Этот сервер требует токен. Если его нет, спросите администратора." + }, + "sso": { + "instruction": "Зарегистрируйтесь с помощью аккаунта на другом сервере Haven. Ваше имя пользователя и аватар будут импортированы.", + "server_label": "Ваш сервер Haven", + "server_hint": "Введите адрес сервера Haven, на котором у вас уже есть аккаунт", + "connect": "Подключиться", + "imported_from": "Импортировано с вашего домашнего сервера", + "username_label": "Имя пользователя на этом сервере", + "username_hint": "Взято с вашего домашнего сервера. Если оно здесь уже занято, выберите другое. 3-20 символов: буквы, цифры, подчёркивания.", + "username_unavailable": "Это имя нельзя использовать на этом сервере. Выберите другое выше и повторите попытку.", + "password_label": "Задайте пароль для этого сервера", + "password_hint": "Нужен для шифрования. Минимум 8 символов.", + "confirm_label": "Подтвердите пароль", + "register": "Создать аккаунт", + "back": "← Начать заново", + "unreachable": "Не удалось связаться с домашним сервером. Повторите попытку", + "enter_address": "Введите адрес вашего сервера Haven", + "waiting": "Ожидание подтверждения…", + "timeout": "Время ожидания подтверждения SSO истекло. Попробуйте подключиться снова", + "failed": "Ошибка SSO. Повторите попытку", + "connect_first": "Сначала подключитесь к домашнему серверу", + "invalid_username": "Имя пользователя: 3-20 символов, буквы, цифры и подчёркивания." + }, + "oidc": { + "submit": "Войти через SSO", + "errors": { + "cancelled": "Вход отменён.", + "disabled": "SSO не включён на этом сервере.", + "no_account": "К этому входу не привязан ни один аккаунт Haven, а этот сервер не создаёт их автоматически.", + "banned": "Этот аккаунт заблокирован на сервере.", + "expired": "Вход занял слишком много времени. Повторите попытку.", + "provider_unreachable": "Не удалось связаться с провайдером SSO. Попросите администратора проверить настройки сервера.", + "failed": "Не удалось войти через SSO. Повторите попытку." + } + }, + "guest": { + "prompt": "Нет аккаунта? Хотите просто осмотреться?", + "desc": "Выберите временное имя пользователя. Без пароля и без восстановления. Аккаунт будет удалён, когда вы отключитесь.", + "username_label": "Имя пользователя", + "username_hint": "3-20 символов: буквы, цифры, подчёркивания", + "submit": "Войти как гость", + "back": "← Назад ко входу", + "errors": { + "empty": "Введите имя пользователя", + "failed": "Не удалось войти как гость" + } + }, + "e2e_pass": { + "title": "Задайте парольную фразу шифрования", + "desc": "Ваши личные сообщения шифруются ключом, который есть только у вас. При входе через SSO Haven не получает пароль, которым можно было бы его защитить, поэтому придумайте парольную фразу. Она понадобится вам на любом другом устройстве.", + "label": "Парольная фраза", + "hint": "Не менее 8 символов. Никто не сможет сбросить её за вас, включая администратора сервера.", + "confirm_label": "Подтвердите парольную фразу", + "continue": "Продолжить", + "skip": "Пропустить пока", + "unlock_title": "Введите парольную фразу шифрования", + "unlock_desc": "Чтобы разблокировать личные сообщения, этому устройству нужна парольная фраза, заданная при первом входе.", + "unlock_desc_own": "Зашифрованные сообщения этого аккаунта защищены отдельной парольной фразой. Введите её, чтобы разблокировать их на этом устройстве.", + "unlock_hint": "Неверная парольная фраза? Ваши другие устройства продолжат работать. Ничего не будет перезаписано.", + "errors": { + "too_short": "Парольная фраза должна содержать не менее 8 символов.", + "mismatch": "Парольные фразы не совпадают." + } + }, + "forced_change": { + "instruction": "🔒 Администратор сбросил ваш пароль. Задайте новый, чтобы продолжить.", + "dm_warning": "⚠️ Если вы зададите здесь новый пароль, история ваших зашифрованных ЛС будет стёрта навсегда. Ключ-обёртка создаётся из вашего пароля, поэтому после смены пароля старые ЛС станут нечитаемыми. Если вы всё ещё помните свой прежний пароль, раскройте раздел ниже, чтобы отменить сброс и сохранить ЛС.", + "new_password_label": "Новый пароль", + "new_password_hint": "Минимум 8 символов", + "confirm_password_label": "Подтвердите новый пароль", + "recall_summary": "Я помню свой прежний пароль (сохранить мои ЛС)", + "recall_hint": "Введите прежний пароль ниже. Если он совпадёт, сброс администратором будет отменён, и вы войдёте как обычно, без смены пароля. История зашифрованных ЛС останется нетронутой.", + "old_password_label": "Прежний пароль", + "submit": "Продолжить", + "errors": { + "too_short": "Новый пароль должен содержать не менее 8 символов", + "mismatch": "Новые пароли не совпадают", + "old_invalid": "Прежний пароль не совпал" + } }, "totp": { "instruction": "🔐 Введите 6-значный код из приложения-аутентификатора", @@ -47,12 +142,34 @@ "submit": "Сбросить пароль", "back": "← Назад ко входу" }, + "ban_appeal": { + "instruction": "🚫 Ваш аккаунт заблокирован на этом сервере.", + "reason_prefix": "Причина:", + "no_reason": "Причина блокировки не указана.", + "text_label": "Апелляция администраторам", + "text_placeholder": "Объясните, почему блокировку стоит снять...", + "text_hint": "Администраторы сервера увидят это рядом с вашей блокировкой. Макс. 2000 символов.", + "submit": "Отправить апелляцию", + "back": "← Назад ко входу", + "submitted": "Апелляция отправлена. Администратор её рассмотрит.", + "errors": { + "empty": "Сначала напишите текст апелляции", + "failed": "Не удалось отправить апелляцию. Повторите попытку" + } + }, "eula": { "age_confirm": "Я подтверждаю, что мне 18 лет или более (или я достиг совершеннолетия в моей стране)", "tos_confirm": "Я прочитал и согласен с Условиями использования и Соглашением об ограничении ответственности", "modal_title": "⚖️ Условия использования и Соглашение об ограничении ответственности", "decline": "Не принимаю", - "accept": "Принимаю" + "accept": "Принимаю", + "modal_title_plain": "Условия использования и соглашение об освобождении от ответственности", + "default_terms": "── Стандартные условия использования Haven ──", + "terms_body": "
HAVEN: УСЛОВИЯ ИСПОЛЬЗОВАНИЯ, ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ С КОНЕЧНЫМ ПОЛЬЗОВАТЕЛЕМ И ОСВОБОЖДЕНИЕ ОТ ОТВЕТСТВЕННОСТИ
Дата вступления в силу: 12 февраля 2026 г. | Версия 2.0
Получая доступ к данному экземпляру сервера Haven (далее "Сервис"), регистрируясь на нём или используя его, вы (далее "Пользователь" или "вы") подтверждаете, что прочитали, поняли и соглашаетесь соблюдать нижеследующие условия (далее "Соглашение") как юридически обязывающие. Если вы не согласны с каждым положением настоящего Соглашения, вы должны немедленно прекратить любое использование Сервиса.
1.1. Минимальный возраст. Для доступа к Сервису и его использования вам должно быть не менее восемнадцати (18) лет (или вы должны достичь возраста совершеннолетия в вашей юрисдикции, если он выше). Отмечая флажок подтверждения возраста и используя Сервис, вы заявляете и гарантируете, что соответствуете этому требованию.
1.2. Уведомление для родителей. Сервис не предназначен для лиц младше 18 лет. Мы сознательно не собираем персональные данные несовершеннолетних. Если нам станет известно, что несовершеннолетний предоставил персональные данные, мы удалим эти данные и заблокируем связанный аккаунт без уведомления.
1.3. Правоспособность. Вы заявляете, что обладаете правоспособностью для заключения обязывающего соглашения в вашей юрисдикции.
2.1. Haven это самостоятельно размещаемое программное обеспечение для общения с открытым исходным кодом, распространяемое по лицензии AGPL-3.0. Сервис обеспечивает обмен текстовыми сообщениями, голосовое общение, обмен файлами и связанные функции между согласными на это совершеннолетними пользователями на частном экземпляре сервера.
2.2. Работа в процессе. Программное обеспечение предоставляется в состоянии активной разработки. Функции могут быть неполными, нестабильными или изменяться без уведомления.
3.1. СЕРВИС ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ" И "ПО МЕРЕ ДОСТУПНОСТИ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ГАРАНТИИ ТОВАРНОГО СОСТОЯНИЯ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ, ОТСУТСТВИЯ НАРУШЕНИЙ, ТОЧНОСТИ, НАДЁЖНОСТИ ИЛИ ДОСТУПНОСТИ.
3.2. Поставщики (определены ниже) не гарантируют, что Сервис будет работать бесперебойно, без ошибок, безопасно и без вредоносных компонентов.
4.1. Вы добровольно принимаете на себя все риски, связанные с использованием Сервиса, включая, помимо прочего: потерю данных, перебои в работе, уязвимости безопасности, столкновение с неприемлемым или незаконным контентом, опубликованным другими пользователями, и любые последствия общения через Сервис.
4.2. Вы признаёте, что Сервис работает с создаваемым пользователями контентом в реальном времени, который не проверяется заранее, не модерируется искусственным интеллектом и не гарантированно свободен от вредных материалов.
5.1. Освобождение. В максимальной степени, разрешённой применимым законодательством, вы настоящим освобождаете от ответственности и не предъявляете претензий к разработчику(ам), операторам сервера, хостинг-провайдерам, участникам разработки и любым связанным сторонам (совместно "Поставщики") по любым требованиям, искам, основаниям для иска, убыткам, потерям, обязательствам, издержкам и расходам (включая, помимо прочего, расходы на адвокатов), возникающим из следующего или связанным с ним:
5.2. Ограничение. Совокупная ответственность Поставщиков ни при каких обстоятельствах не превышает сумму, уплаченную вами за использование Сервиса (для бесплатного ПО это $0.00). Ни один Поставщик ни при каких обстоятельствах не несёт ответственности за косвенный, случайный, особый, последующий или штрафной ущерб любого рода.
6.1. Вы соглашаетесь возместить убытки, защитить и не предъявлять претензий к Поставщикам по любым требованиям, обязательствам, ущербу, потерям, издержкам и расходам (включая разумные расходы на адвокатов), возникающим из следующего или связанным с ним: (a) использование вами Сервиса; (b) нарушение вами настоящего Соглашения; (c) нарушение вами любого применимого закона или нормативного акта; или (d) любой контент, который вы передаёте через Сервис.
7.1. Вы несёте единоличную ответственность за своё поведение и любой контент, который вы создаёте, передаёте или распространяете через Сервис.
7.2. Вы соглашаетесь не использовать Сервис для: (a) нарушения любого применимого закона или нормативного акта; (b) передачи контента, который эксплуатирует несовершеннолетних или причиняет им вред; (c) преследования, угроз или оскорблений других пользователей; (d) распространения вредоносного ПО или фишинга; (e) нарушения прав интеллектуальной собственности третьих лиц.
7.3. Оператор сервера оставляет за собой право удалить любой контент и ограничить или прекратить доступ любого пользователя в любое время, по любой причине и без предварительного уведомления.
8.1. Сообщения, файлы и пользовательские данные хранятся на оборудовании оператора сервера и управляются по его собственному усмотрению. Не даётся никаких гарантий конфиденциальности, резервного копирования, хранения или неразглашения.
8.2. Вы признаёте, что оператор сервера может получить доступ к общению в Сервисе, и что оно по умолчанию не защищено сквозным шифрованием.
8.3. Haven не передаёт данные сторонним сервисам аналитики, рекламы или отслеживания. Обращения к сторонним сервисам (например, Tenor или GIPHY) выполняются только по явному действию пользователя.
8.4. Вы соглашаетесь на сбор и хранение вашего IP-адреса, имени пользователя и записей о принятии соглашения в целях безопасности, предотвращения злоупотреблений и соблюдения законодательства.
9.1. Программное обеспечение Haven лицензировано по лицензии AGPL-3.0. Вы сохраняете право собственности на создаваемый вами контент, но предоставляете оператору сервера неисключительную безвозмездную лицензию на хранение, отображение и передачу вашего контента в объёме, необходимом для работы Сервиса.
9.2. Вы заявляете, что вправе распространять любой загружаемый вами контент и что он не нарушает права третьих лиц.
10.1. Применимое право. Настоящее Соглашение регулируется и толкуется в соответствии с законами штата, в котором проживает оператор сервера, без учёта норм коллизионного права.
10.2. Неформальное урегулирование. Прежде чем начинать любое официальное разбирательство, вы соглашаетесь сначала попытаться урегулировать спор неформально, напрямую связавшись с оператором сервера.
10.3. Срок исковой давности. Любое требование, вытекающее из настоящего Соглашения, должно быть предъявлено в течение одного (1) года с даты его возникновения, иначе оно утрачивает силу навсегда.
10.4. Отказ от коллективных исков. Вы соглашаетесь, что любое разбирательство по спору будет проводиться только в индивидуальном порядке, а не в форме коллективного, объединённого или представительского иска.
11.1. Оператор сервера может прекратить или приостановить ваш доступ в любое время, с указанием причины или без неё, с уведомлением или без него.
11.2. После прекращения доступа все права, предоставленные вам по настоящему Соглашению, немедленно прекращаются. Разделы 1, 3, 4, 5, 6, 8, 10 и 12 сохраняют силу после прекращения.
12.1. Полнота соглашения. Настоящее Соглашение составляет полное соглашение между вами и Поставщиками и заменяет все предыдущие соглашения, касающиеся Сервиса.
12.2. Делимость. Если какое-либо положение будет признано не имеющим силы, остальные положения сохраняют полную силу.
12.3. Отказ от прав. Неприменение какого-либо положения не означает отказ от этого положения.
12.4. Изменения. Поставщики вправе изменять настоящее Соглашение в любое время. Продолжение использования после публикации изменений означает согласие с ними. О существенных изменениях будет сообщено повышением номера версии и, по возможности, уведомлением в приложении.
12.5. Не является юридической консультацией. Настоящее Соглашение не является юридической консультацией. Если вам нужна юридическая помощь, обратитесь к лицензированному адвокату в вашей юрисдикции.
12.6. Уступка прав. Вы не вправе уступать или передавать свои права по настоящему Соглашению. Поставщики вправе уступать свои права без ограничений.
" + }, + "aria": { + "show_password": "Показать пароль", + "hide_password": "Скрыть пароль" }, "errors": { "fill_all_fields": "Заполните все поля", @@ -64,6 +181,7 @@ "connection_error": "Ошибка соединения — сервер запущен?", "passwords_no_match": "Пароли не совпадают", "password_too_short": "Пароль должен содержать минимум 8 символов", + "captcha_incomplete": "Пройдите проверку CAPTCHA.", "must_be_18": "Необходимо подтвердить, что вам 18 лет или более", "must_accept_tos": "Необходимо принять Условия использования и Соглашение об ограничении ответственности", "enter_admin_credentials": "Сначала введите имя пользователя и пароль администратора выше", @@ -87,23 +205,83 @@ "temporary_hint": "(автоудаление)", "add_all_members": "Добавить всех участников сервера", "add_all_hint": "(все присоединяются автоматически)", + "forum_channel": "Форум", + "forum_hint": "(каждое сообщение начинает тему)", "hours": "часов", "channels": "Каналы", "direct_messages": "Личные сообщения", "add_server": "Добавить сервер", "manage_servers": "Управление серверами", - "this_server": "Этот сервер" + "sync_servers": "Синхронизировать список серверов", + "this_server": "Этот сервер", + "templates": { + "hint": "Начните с шаблона: он сам отметит флажки и задаст тему, режим «только чтение», объявления и медленный режим", + "chat": "Чат", + "announcements": "Объявления", + "forum": "Форум", + "team": "Закрытая команда", + "event": "Событие (24 ч)", + "slow": "Медленный чат", + "text_only": "Только текст", + "delete_title": "Удалить шаблон", + "delete_prompt": "Удалить сохранённый шаблон «{{name}}»?" + } }, "theme": { "title": "Тема", + "seasonal": "Сезонные", + "layout": "Расположение", "effect_overlay": "Оверлей эффектов", + "layout_original": "Оригинальное", + "braid_layout": "Расположение «Коса»", + "compact_layout": "Компактное расположение", "close": "Закрыть", "speed": "Скорость", "vibrancy": "Интенсивность", - "effect_speed": "Скорость эффекта" + "effect_speed": "Скорость эффекта", + "match_theme": "Как у темы", + "no_effects": "Без эффектов", + "sacred_intensity": "Интенсивность свечения", + "glitch_frequency": "Частота глитчей", + "crt_vignette": "Виньетка ЭЛТ", + "crt_scanlines": "Строки развёртки ЭЛТ", + "matrix_rain": "Дождь Матрицы", + "matrix_scan_lines": "Линии сканирования Матрицы", + "snowfall": "Снегопад", + "campfire": "Костёр", + "golden_grace": "Золотая благодать", + "blood_vignette": "Кровавая виньетка", + "phosphor_glow": "Свечение люминофора", + "water_flow": "Течение воды", + "frost_shimmer": "Морозное мерцание", + "glitch": "Глитч", + "candlelight": "Свет свечи", + "ocean_depth": "Глубины океана", + "cross_light": "Свет креста", + "stained_glass": "Витраж", + "divine_radiance": "Божественное сияние", + "light_mode": "Светлый режим", + "picker": { + "search": "Поиск тем", + "no_match": "Подходящих тем нет.", + "results": "Найдено тем: {{count}}", + "section_community": "От сообщества", + "section_available": "Доступны для публикации", + "section_builtin": "Haven", + "available_hint": "Это видят только те, кто управляет сервером. Включите переключатель, чтобы добавить тему в список тем для всех.", + "card_by": "{{name}}, автор {{author}}", + "publish_label": "Опубликовать «{{name}}» для всех", + "publish": "Опубликовать", + "published": "Опубликована", + "published_hint": "Опубликована: её может выбрать любой", + "unpublished_hint": "Не опубликована: её видят только те, кто управляет сервером", + "published_toast": "Тема «{{name}}» теперь есть в списке тем для всех", + "unpublished_toast": "Тема «{{name}}» убрана из списка тем для всех" + } }, "actions": { "logout": "Выйти", + "invite": "Пригласить пользователей", "change_display_name": "Изменить отображаемое имя", "close_sidebar": "Закрыть боковую панель", "message_actions": "Действия с сообщением", @@ -112,34 +290,83 @@ "organize_dms": "Упорядочить ЛС", "drag_to_resize": "Потяните для изменения размера", "toggle_members_panel": "Показать/скрыть панель участников", - "settings": "Настройки" + "settings": "Настройки", + "jump_to_bottom": "Перейти вниз", + "jump_to_message": "Перейти к сообщению" + }, + "status": { + "server_connection": "Подключение к серверу", + "connected": "Подключено", + "disconnected": "Отключено", + "error": "Ошибка" }, "messages": { "edited": "(изменено)", "edited_at": "Изменено в {{date}}", "pinned": "Закреплённое сообщение", + "official": "Официально", + "official_as": "Опубликовано официально от роли {{role}}", "protected": "Защищено от очистки", "e2e_encrypted": "Сквозное шифрование", "protect_btn": "Защитить от очистки", "unprotect_btn": "Снять защиту", + "protected_no_delete": "Это сообщение защищено. Сначала снимите защиту.", + "protected_no_edit": "Это сообщение защищено, поэтому его нельзя изменить. Сначала снимите защиту.", "unknown_user": "Неизвестный", "placeholder": "Напишите сообщение...", "placeholder_short": "Сообщение...", + "placeholder_forum": "Начните новую тему... (/ для команд)", + "read_only_note": "Канал только для чтения. Другие не могут здесь писать, а вы можете.", + "forum_empty_hint": "Это форум. Каждое отправленное здесь сообщение начинает тему. Ответ внутри темы возвращает её в новый конец канала, так что ничего не теряется.", "via_persona": "Отправлено от имени {{name}}", "spoiler": "Спойлер", + "e2e_image_alt": "Зашифрованное изображение", + "e2e_image_title": "🔒 Изображение со сквозным шифрованием", + "e2e_file_title": "🔒 Файл со сквозным шифрованием. Нажмите, чтобы скачать", + "e2e_file_parse_error": "[Зашифрованный файл: не удалось разобрать]", + "voice_message": "Голосовое сообщение", + "file": "файл", "mark_spoiler": "Отметить как спойлер", "spoiler_on": "Спойлер включён - нажмите, чтобы отправить обычно", "hide_image": "Скрыть изображение", "image_hidden": "Изображение скрыто", - "click_to_show": "нажмите, чтобы показать" + "click_to_show": "нажмите, чтобы показать", + "only_visible_to_you": "Видно только вам", + "real_account": "настоящий аккаунт", + "persona_badge": "персонаж", + "relayed_to_discord": "Переслано в Discord", + "discord_dm": "ЛС в Discord", + "temporary_guest": "Временный гостевой аккаунт", + "guest_badge": "ГОСТЬ", + "cannot_play_file": "Файл {{name}} нельзя воспроизвести в этом браузере", + "link": "Ссылка", + "embed_full": "Большой", + "embed_medium": "Средний", + "embed_small": "Маленький", + "embed_size_hint": "Размер вставки (отключить можно в Настройки ▸ Предпросмотр ссылок)", + "embed_volume": "Громкость", + "collapse": "Свернуть", + "silent_hint": "Отправлено тихо: ни звука, ни всплывающего окна, ни push-уведомления" }, "input_bar": { "emoji_btn": "Эмодзи", "gif_btn": "Поиск GIF", "gif_label": "GIF", "poll_btn": "Создать опрос", + "time_btn": "Вставить время", + "format_btn": "Форматирование и команды", + "voice_btn": "Записать голосовое сообщение", + "plus_btn": "Ещё", "burn_btn": "Удалить после прочтения (только ЛС)", - "burn_btn_armed": "Секретный режим запущен — следующее сообщение самоуничтожится через 30 секунд после просмотра" + "burn_btn_armed": "Секретный режим запущен — следующее сообщение самоуничтожится через 30 секунд после просмотра", + "self_destruct_btn": "Самоуничтожающееся сообщение", + "highlight_btn": "Официальное сообщение: отправить следующее сообщение от имени роли", + "highlight_btn_armed": "Официальный режим включён для следующего сообщения", + "highlight_btn_mode_on": "Официальный режим включён: это сообщение уйдёт от имени роли. Нажмите, чтобы отправить только это обычным", + "highlight_btn_mode_skip": "Официальный режим включён, но это сообщение уйдёт обычным. Нажмите, чтобы отправить его от имени роли", + "self_destruct_btn_armed": "Самоуничтожение включено: следующее сообщение удалится само", + "silent_btn": "Тихое сообщение: отправить без звука, всплывающего окна и push-уведомления для всех (или начните его с @silent)", + "silent_btn_armed": "Тихий режим включён: следующее сообщение никого не уведомит" }, "profile": { "login_username": "Ваше имя пользователя", @@ -149,7 +376,11 @@ "dnd": "Не беспокоить", "invisible": "Невидимый", "set_status": "Установить статус", - "custom_status_placeholder": "Произвольный статус..." + "custom_status_placeholder": "Произвольный статус...", + "music_activity": "Музыкальная активность", + "game_activity": "Игровая активность", + "share_activity_title": "Показывать активность", + "share_activity_hint": "Позвольте другим видеть, во что вы играете или что слушаете. Не показывается, пока у вас статус «Невидимка»." } }, "toasts": { @@ -160,18 +391,31 @@ "channel_deleted": "Канал был удалён", "channel_code_rotated": "Код канала #{{name}} обновлён", "a_moderator": "модератор", + "ban_appeal_received": "{{username}} подал(а) апелляцию на блокировку", + "banned_user": "Заблокированный пользователь", "kicked_from_voice": "{{by}} выгнал вас из голосового чата", "kicked_from_server": "Вас исключили с сервера", "kicked_from_server_reason": "Вас исключили с сервера: {{reason}}", + "kicked_from_channel": "Вас исключили из #{{channel}}", + "kicked_from_channel_reason": "Вас исключили из #{{channel}}: {{reason}}", "banned_from_server": "Вы заблокированы", "banned_from_server_reason": "Вы заблокированы: {{reason}}", "muted": "Вы заглушены на {{duration}} мин.", "muted_reason": "Вы заглушены на {{duration}} мин.: {{reason}}", + "unmuted": "Ваш тайм-аут закончился", "bio_updated": "Биография обновлена", + "birthday_updated": "День рождения обновлён", + "birthday_hidden": "День рождения скрыт из вашего профиля", + "birthday_shown": "День рождения показан в вашем профиле", "display_name_changed": "Отображаемое имя изменено на «{{name}}»", + "channel_auto_cleared": "🧹 Сообщения канала очищены автоматически", + "message_not_connected": "Нет подключения, сообщение не отправлено", + "tts_stopped": "Озвучивание остановлено", + "dm_link_blocked": "{{message}} У получателя она будет показана как заблокированная.", "channel_code_copied": "Код канала скопирован!", "channel_link_copied": "Ссылка на канал скопирована", "message_link_copied": "Ссылка на сообщение скопирована", + "link_address_copied": "Ссылка скопирована", "channel_link_unavailable": "Канал недоступен на этом сервере", "channel_muted": "Канал заглушен", "channel_unmuted": "Уведомления канала включены", @@ -186,18 +430,28 @@ "cleanup_triggered": "Очистка запущена — результаты в консоли сервера", "2fa_disabled": "Двухфакторная аутентификация отключена", "plugins_refreshing": "Обновление плагинов и тем…", + "popup_blocked": "Всплывающее окно заблокировано. Проверьте настройки браузера", "upload_failed": "Ошибка загрузки", + "upload_cancelled": "Загрузка отменена", + "invalid_json_response": "Некорректный ответ сервера", + "upload_failed_status": "Не удалось загрузить ({{status}})", + "upload_connection_failed": "Не удалось загрузить. Проверьте подключение", "image_too_large": "Изображение слишком большое (макс. {{max}} МБ)", + "not_an_image": "Это не файл изображения", "encrypted_image_failed": "Ошибка загрузки зашифрованного изображения", "display_name_too_short": "Отображаемое имя должно содержать минимум 2 символа", "display_name_invalid_chars": "Только буквы, цифры, подчёркивания и пробелы", + "display_name_too_many_marks": "Слишком много наложенных диакритических знаков", "select_channel_first": "Сначала выберите канал", "searching": "Поиск…", "encryption_key_unavailable": "Ключ шифрования недоступен — сообщение отправлено без E2E", "encryption_failed": "Ошибка шифрования — сообщение отправлено без E2E", + "encryption_failed_not_sent": "Не удалось зашифровать, поэтому сообщение не отправлено.", "join_voice_first": "Сначала войдите в голосовой чат для обмена музыкой", "join_voice_required": "Сначала войдите в голосовой чат", "paste_music_link": "Вставьте ссылку на музыку", + "playlist_not_found": "В этой ссылке нет плейлиста", + "music_stop_forbidden": "Остановить воспроизведение может только тот, кто его запросил, или модератор", "unsupported_music_link": "Неподдерживаемая ссылка — попробуйте Spotify, YouTube или SoundCloud", "no_more_results": "Больше нет результатов", "no_results_for": "Нет результатов для «{{query}}»", @@ -206,11 +460,53 @@ "record_set": "{{user}} установил новый рекорд в {{game}}: {{score}}!", "burn_armed": "🔥 Секретный режим запущен — следующее сообщение самоуничтожится через 30 секунд после просмотра", "burn_disarmed": "Секретный режим отключен", - "channel_hidden": "Channel \"{{name}}\" hidden" + "channel_hidden": "Channel \"{{name}}\" hidden", + "not_logged_in": "Вы не вошли в аккаунт", + "backup_started": "Подготовка резервной копии…", + "backup_pick_one": "Выберите хотя бы один раздел для резервной копии", + "backup_no_file": "Сначала выберите .zip-файл резервной копии", + "backup_restore_failed": "Не удалось восстановить: " + }, + "automod": { + "new_account_wait_one": "Новые аккаунты могут писать через 1 минуту.", + "new_account_wait_minutes": "Новые аккаунты могут писать через {{n}} мин.", + "new_account_wait_hours": "Новые аккаунты могут писать примерно через {{n}} ч.", + "new_account_check_failed": "Не удалось проверить, может ли ваш аккаунт уже писать. Повторите попытку через минуту.", + "block": { + "obfuscated": "Эта ссылка выглядит намеренно замаскированной, поэтому она заблокирована.", + "masked": "Эта ссылка подписана как один сайт, но ведёт на {{host}}, поэтому она заблокирована.", + "link": "Ссылки на {{host}} здесь запрещены ({{reason}})." + }, + "reason": { + "unparseable_host": "не удалось разобрать хост", + "blocklisted": "домен в чёрном списке", + "loopback": "петлевой адрес", + "raw_ip": "ссылки на голый IP-адрес запрещены", + "lookalike": "интернационализированный домен, похожий на другой", + "not_allowed": "домена нет в белом списке", + "blocked": "заблокировано политикой сервера" + } + }, + "banners": { + "disk_low": "Диск сервера почти заполнен", + "disk_low_detail": "На томе с данными свободно всего {{free}} МБ, меньше резерва в {{reserve}} МБ. Загрузки приостановлены, чтобы в базу данных можно было продолжать писать. Освободите место, чтобы возобновить их." }, "messages": { "burn_reveal": "Нажмите для просмотра", - "burn_done": "Сообщение удалено" + "burn_done": "Сообщение удалено", + "burn_pending_tooltip": "Самоуничтожится через {{seconds}} с после просмотра получателем", + "burn_reveal_hint": "({{seconds}} с после просмотра)", + "new_messages": "НОВЫЕ СООБЩЕНИЯ", + "self_destructing": "Самоуничтожится {{time}}", + "self_destruct_no_reply": "На самоуничтожающиеся сообщения нельзя отвечать и цитировать их", + "preview_picture": "Картинка", + "preview_pictures": "Картинок: {{count}}", + "preview_file": "Файл" + }, + "media_grid": { + "label": "Вложений: {{count}}", + "more": "Ещё {{count}}", + "play_video": "Воспроизвести видео" }, "utils": { "today_at": "Сегодня в {{time}}", @@ -218,13 +514,72 @@ }, "commands": { "play_usage": "Использование: /play <название песни> или /playlocalhost.",
+ "steam_step_3": "Скопируйте выданный ключ и вставьте его ниже.",
+ "spotify_blurb": "Прямое подключение. Нужен аккаунт Spotify Premium, настройка сложнее, а число пользователей ограничено примерно 25. Лучше используйте Last.fm выше.",
+ "spotify_help": "Открыть панель разработчика Spotify",
+ "spotify_step_1": "Перейдите по ссылке выше. Она ведёт на developer.spotify.com.",
+ "spotify_step_2": "Войдите в свой аккаунт Spotify. Для этого нужен Spotify Premium. С 2026 года Web API недоступен для бесплатных аккаунтов, поэтому остальные шаги без него не сработают (#5528). Если попросят, примите условия для разработчиков.",
+ "spotify_step_3": "Нажмите Create app. Вы не создаёте программу, это просто регистрация названия. Назовите её «Haven».",
+ "spotify_step_4": "Вставьте это в поле Redirect URI:{{uri}}",
+ "spotify_step_5": "Отметьте Web API, сохраните, затем откройте Settings только что созданного приложения.",
+ "spotify_step_6": "Скопируйте Client ID, затем нажмите View client secret и скопируйте и его.",
+ "username_placeholder": "ваше-имя",
+ "not_setup": "Пока не настроено",
+ "not_enabled": "Не включено на этом сервере. Спросите администратора",
+ "setup": "Настроить",
+ "linked_as": "Привязано как {{name}}",
+ "linked": "Привязано",
+ "unlink": "Отвязать",
+ "change_key": "Изменить ключ",
+ "remove_key": "Удалить ключ",
+ "connect": "Подключить",
+ "link": "Привязать",
+ "api_key": "Ключ API",
+ "client_id": "Client ID",
+ "client_secret": "Client Secret",
+ "key_placeholder": "32 шестнадцатеричных символа",
+ "save_hint": "Автоматически сохраняется в .env сервера. Перезапуск не нужен.",
+ "save_hint_replace": "Автоматически сохраняется в .env сервера. Это заменит текущий ключ. Перезапуск не нужен.",
+ "other_options": "Другие варианты",
+ "enter_lastfm": "Введите имя пользователя Last.fm",
+ "remove_key_confirm": "Удалить ключ {{provider}} с этого сервера? У всех, кто привязан к {{provider}}, перестанет показываться, во что они играют, пока не будет задан новый ключ.",
+ "fill_fields": "Сначала заполните все поля",
+ "link_success": "{{provider}} привязан",
+ "link_failed": "Не удалось привязать {{provider}}. Повторите попытку",
+ "allow_popups": "Разрешите всплывающие окна для этого сайта, чтобы привязать аккаунт"
+ }
+ },
+ "personas": {
+ "load_failed": "Не удалось загрузить персонажей",
+ "none": "Персонажей пока нет. Нажмите «+ Добавить персонажа», чтобы создать.",
+ "trigger_preview": "{{name}}: ваше сообщение",
+ "delete_confirm": "Удалить персонажа «{{name}}»? Прошлые сообщения останутся за ним.",
+ "delete_failed": "Не удалось удалить персонажа",
+ "name_placeholder": "Имя персонажа",
+ "upload_avatar": "Загрузить аватар",
+ "create": "Создать",
+ "avatar_too_large": "Аватар должен быть меньше 2 МБ",
+ "name_required": "Укажите имя",
+ "save_failed": "Не удалось сохранить персонажа",
+ "dropdown_none": "Персонажей пока нет",
+ "dropdown_create": "создайте в Профиль → Персонажи",
+ "dropdown_preview": "::{{name}} сообщение"
+ },
+ "theme_effects": {
+ "crt": "ЭЛТ",
+ "water": "Вода",
+ "frost": "Мороз",
+ "snow": "Снег",
+ "embers": "Угли",
+ "blood": "Кровь",
+ "matrix": "Матрица",
+ "glitch": "Глитч",
+ "candle": "Свеча",
+ "golden_grace": "Золотая благодать"
+ },
+ "media_runtime": {
+ "none": "Нет",
+ "delete": "Удалить",
+ "delete_failed": "Не удалось удалить",
+ "all_files_too_large": "Все файлы превысили лимит в {{max}} КБ",
+ "bulk_upload_failed": "Не удалось выполнить массовую загрузку",
+ "skipped": "(пропущено: {{count}})",
+ "ferry_reconnecting": "Переподключение к Discord…",
+ "move_up": "Вверх",
+ "move_down": "Вниз",
+ "toolbar": {
+ "pin": "Закрепить / Открепить",
+ "protect": "Защитить / Снять защиту"
+ },
+ "avatar": {
+ "alt": "Аватар",
+ "preview_alt": "Предпросмотр аватара",
+ "border_alt": "Рамка",
+ "border_preview_alt": "Предпросмотр рамки",
+ "unsaved": "Несохранённые изменения",
+ "saving": "Сохранение…",
+ "remove_failed": "Не удалось удалить аватар",
+ "border_remove_failed": "Не удалось удалить рамку",
+ "border_fit_failed": "Не удалось сохранить подгонку рамки",
+ "edit_failed": "Не удалось применить обрезку к этому изображению",
+ "shape_failed": "Не удалось сохранить форму",
+ "animation_failed": "Не удалось сохранить настройку анимации",
+ "saved": "✅ Сохранено!",
+ "saved_toast": "Настройки аватара сохранены!",
+ "save_failed": "Не удалось сохранить: {{error}}"
+ },
+ "sound": {
+ "select_file": "Выберите аудиофайл",
+ "enter_name": "Введите название звука",
+ "too_large": "Файл звука слишком большой (макс. {{max}})",
+ "uploading": "Загрузка звука…",
+ "uploaded": "Звук «{{name}}» загружен!",
+ "hotkey_set": "Горячая клавиша [{{hotkey}}] назначена для «{{name}}»",
+ "popout": "Открыть панель звуков в отдельном окне",
+ "no_matches": "Подходящих звуков нет",
+ "renamed": "Переименовано в «{{name}}»",
+ "rename_failed": "Не удалось переименовать",
+ "deleted": "Звук «{{name}}» удалён",
+ "remove_hotkey": "Убрать горячую клавишу",
+ "set_hotkey": "Назначить горячую клавишу",
+ "show": "Показать этот звук",
+ "hide": "Скрыть этот звук",
+ "press_hotkey": "Нажмите сочетание клавиш для «{{name}}» (Esc для отмены)",
+ "hotkey_removed": "Горячая клавиша для «{{name}}» убрана",
+ "pop_back_in": "Вернуть обратно"
+ },
+ "emoji": {
+ "select_file": "Выберите файл изображения",
+ "enter_name": "Введите название эмодзи (строчными буквами, без пробелов)",
+ "too_large": "Файл эмодзи слишком большой (макс. {{max}} КБ)",
+ "uploading": "Загрузка эмодзи…",
+ "uploaded": "Эмодзи :{{name}}: загружен!",
+ "uploading_one": "Загрузка эмодзи: {{count}}…",
+ "uploading_other": "Загрузка эмодзи: {{count}}…",
+ "uploaded_one": "Загружено эмодзи: {{count}}",
+ "uploaded_other": "Загружено эмодзи: {{count}}",
+ "deleted": "Эмодзи :{{name}}: удалён"
+ },
+ "sticker": {
+ "general_pack": "Общие",
+ "deleted": "Стикер :{{name}}: удалён",
+ "choose_file": "Сначала выберите файл",
+ "too_large": "Файл превышает лимит в {{max}} КБ",
+ "uploaded": "Стикер :{{name}}: загружен",
+ "uploading_one": "Загрузка стикеров: {{count}}…",
+ "uploading_other": "Загрузка стикеров: {{count}}…",
+ "uploaded_one": "Загружено стикеров: {{count}}",
+ "uploaded_other": "Загружено стикеров: {{count}}"
+ },
+ "bot": {
+ "hidden": "Скрыто: только владелец бота или администратор",
+ "callback_url": "URL обратного вызова",
+ "callback_url_hint": "(необязательно: Haven будет отправлять сообщения на этот URL методом POST)",
+ "callback_secret": "Секрет обратного вызова",
+ "callback_secret_hint": "(необязательно: используется для подписи данных через X-Haven-Signature)",
+ "moderation": "Модерация",
+ "moderation_hint": "(только для администратора: позволяет этому боту исключать, блокировать и заглушать пользователей через REST API)",
+ "allow_moderation": "Разрешить этому боту выполнять действия модерации",
+ "voice_access": "Доступ к голосу",
+ "voice_access_hint": "(только для администратора: позволяет этому боту заходить в голосовой чат как WebRTC-участник)",
+ "allow_voice": "Разрешить этому боту использовать голосовые каналы",
+ "name_required": "Укажите имя",
+ "delete_confirm": "Удалить бота «{{name}}»? Это действие нельзя отменить.",
+ "avatar_updated": "Аватар бота обновлён"
+ },
+ "modal": {
+ "expand_restore": "Развернуть / Восстановить",
+ "restore_size": "Восстановить размер",
+ "expand": "Развернуть"
+ },
+ "image": {
+ "alt": "Изображение",
+ "save": "Сохранить изображение",
+ "saved": "Изображение сохранено",
+ "saved_to": "Изображение сохранено в {{path}}",
+ "save_cancelled": "Сохранение отменено",
+ "save_failed": "Не удалось сохранить изображение: {{error}}",
+ "copy": "Копировать изображение",
+ "view": "Просмотр изображения",
+ "open_failed": "Не удалось открыть это изображение",
+ "open_new_tab": "Открыть в новой вкладке",
+ "copied": "Изображение скопировано в буфер обмена",
+ "url_copied_bytes_unavailable": "Скопирован URL изображения (данные изображения недоступны)",
+ "url_copied_desktop": "Скопирован URL изображения (не удалось скопировать само изображение)",
+ "url_copied_browser": "Скопирован URL изображения (браузер заблокировал копирование изображения)",
+ "clipboard_denied_desktop": "Нет доступа к буферу обмена. Нажмите внутри Haven и снова попробуйте «Копировать изображение»",
+ "clipboard_denied_browser": "Браузер заблокировал буфер обмена. Сначала нажмите на страницу, затем повторите",
+ "copy_failed": "Не удалось скопировать изображение: {{error}}"
}
},
"context": {
@@ -608,11 +1357,41 @@
"push_disabled": "Отключены",
"push_blocked": "Заблокированы",
"push_permission_denied": "Разрешение отклонено",
+ "push_subscribing": "Подписка…",
+ "push_error": {
+ "secure": "Для push-уведомлений нужно защищённое подключение (HTTPS). Настройка SSL описана в руководстве по установке Haven.",
+ "unsupported": "Ваш браузер не поддерживает push-уведомления.",
+ "ios_install": "На iOS push-уведомления работают, только если Haven установлен как приложение. Нажмите «Поделиться» → «На экран «Домой»», затем откройте Haven с домашнего экрана.",
+ "ios_version": "Push-уведомления не поддерживаются в этой версии браузера на iOS. Обновитесь до iOS 16.4 или новее.",
+ "service_worker": "Не удалось зарегистрировать service worker: {{error}}",
+ "ssl_required": "Для push-уведомлений нужен доверенный SSL-сертификат.\n\nСамоподписанные сертификаты push не поддерживают. Используйте Cloudflare Tunnel, заходите в Haven через localhost или установите доверенный сертификат, например Let's Encrypt.",
+ "ssl_chain": "Для push-уведомлений нужна цепочка сертификатов, которую браузер может проверить, а этот сервер отправляет сертификат без промежуточных сертификатов.\n\nСам сертификат может быть действительным (например, от Let's Encrypt). Администратору сервера нужно указать в SSL_CERT_PATH файл fullchain.pem вместо cert.pem и перезапустить Haven.",
+ "ssl_untrusted": "Для push-уведомлений нужен сертификат, которому доверяет браузер, а сертификат этого сервера не ведёт к доверенному центру сертификации. Обычно он выдан частным или самодельным центром, либо сертификаты в файле расположены в неверном порядке.\n\nАдминистратору сервера нужно использовать сертификат публичного центра, например Let's Encrypt (его fullchain.pem уже в правильном порядке), и перезапустить Haven.",
+ "ssl_expired": "Push-уведомления недоступны: срок действия SSL-сертификата этого сервера истёк. Администратору сервера нужно продлить его и перезапустить Haven.",
+ "brave_setup": "Brave по умолчанию блокирует push-уведомления. Включите Use Google Services for Push Messaging в настройках конфиденциальности Brave, перезапустите Brave и перезагрузите Haven. Если не поможет, попробуйте Chrome или Edge.",
+ "brave_copy_hint": "Вставьте это в адресную строку Brave, включите Use Google Services for Push Messaging и перезапустите Brave.",
+ "permission_denied": "Разрешение на уведомления отклонено. Разрешите уведомления для этого сайта в настройках браузера и повторите попытку.",
+ "permission_help_html": "Как исправить:.plugin.js в папку plugins/, а файлы .theme.css в папку themes/, после чего обновите страницу.",
"refresh_btn": "Обновить",
"plugins_label": "Плагины",
- "themes_label": "Темы"
+ "themes_label": "Темы",
+ "no_plugins": "Плагины не установлены",
+ "safe_mode_title": "Безопасный режим расширений",
+ "safe_mode_desc": "Пользовательские темы и плагины отключены на время этого сеанса. Вы можете сбросить их или выйти, не меняя сохранённый выбор.",
+ "recovery_pending_title": "Сброс ожидает синхронизации",
+ "recovery_pending_desc": "Темы и плагины остаются отключёнными, пока Haven не сохранит настройку базовой темы. Повторите сброс, когда соединение появится.",
+ "reset_customizations": "Сбросить темы и плагины",
+ "reset_sync_pending": "Локальный сброс выполнен, но Haven не смог сохранить его на сервере. Подключитесь заново и повторите.",
+ "exit_safe_mode": "Выйти из безопасного режима",
+ "legacy_theme": "Устаревшая тема",
+ "invalid_theme_api": "Недопустимое объявление Theme API",
+ "unsupported_theme_api": "Неподдерживаемый Theme API",
+ "suppressed_safe_mode": "отключено в безопасном режиме",
+ "incompatible_theme": "несовместимая тема",
+ "incompatible_theme_hint": "Эта тема объявляет недопустимую или неподдерживаемую версию Theme API.",
+ "theme_fallback": "Выбранная тема отсутствует или несовместима. Haven восстановлен.",
+ "not_published": "Не опубликовано",
+ "theme_not_published": "Эта тема не опубликована на этом сервере, поэтому Haven возвращён к прежнему виду.",
+ "no_published_themes": "На этом сервере пока не опубликовано ни одного файла темы."
},
"password_section": {
"title": "Пароль",
@@ -781,6 +1974,43 @@
"failed": "Ошибка изменения пароля",
"network_error": "Ошибка сети"
},
+ "e2e_passphrase": {
+ "title": "Парольная фраза шифрования",
+ "hint": "Ваши зашифрованные ЛС используют ключ, резервная копия которого хранится на сервере, чтобы им могли пользоваться и другие ваши устройства. Обычно эта копия защищена вашим паролем для входа, который сервер получает при каждом входе. Защитите её отдельной парольной фразой, и сервер никогда не сможет её открыть. Парольную фразу нужно ввести один раз на каждом новом устройстве, и никто не сможет сбросить её за вас, включая администратора сервера.",
+ "state_password": "Резервная копия вашего ключа шифрования защищена паролем для входа.",
+ "state_own": "Резервная копия вашего ключа шифрования защищена вашей собственной парольной фразой.",
+ "new_placeholder": "Новая парольная фраза (от 8 символов)",
+ "confirm_placeholder": "Подтвердите парольную фразу",
+ "save_btn": "Использовать эту парольную фразу",
+ "change_btn": "Изменить парольную фразу",
+ "password_placeholder": "Ваш пароль для входа",
+ "revert_btn": "Вернуться к паролю для входа",
+ "too_short": "Парольная фраза должна содержать не менее 8 символов.",
+ "mismatch": "Парольные фразы не совпадают.",
+ "unlock_first": "Сначала разблокируйте шифрование, после этого действие завершится.",
+ "saving": "Сохранение...",
+ "saved": "Резервная копия вашего ключа шифрования теперь защищена вашей парольной фразой.",
+ "reverted": "Резервная копия вашего ключа шифрования снова защищена паролем для входа.",
+ "enter_password": "Введите пароль для входа.",
+ "wrong_password": "Неверный пароль.",
+ "failed": "Что-то пошло не так. Попробуйте ещё раз."
+ },
+ "sessions_section": {
+ "title": "Активные сеансы",
+ "hint": "Устройства, на которых Haven открыт прямо сейчас. Устройство, где выполнен вход, но приложение закрыто, в списке не появится, поэтому выйдите везде, если думаете, что кто-то другой получил доступ к вашему аккаунту.",
+ "revoke_btn": "Выйти на всех остальных устройствах",
+ "none": "Других подключённых устройств нет",
+ "this_device": "Это устройство",
+ "confirm_prompt": "Введите пароль, чтобы выйти на всех остальных устройствах.",
+ "need_password": "Требуется пароль",
+ "working": "Выход на других устройствах...",
+ "done": "Выход на других устройствах выполнен.",
+ "failed": "Не удалось выйти на других устройствах.",
+ "just_now": "только что",
+ "mins": "{{n}} мин назад",
+ "hours": "{{n}} ч назад",
+ "days": "{{n}} д назад"
+ },
"two_factor_section": {
"title": "Двухфакторная аутентификация",
"enable_hint": "Защитите свой аккаунт с помощью TOTP-приложения (Google Authenticator, Authy, Yandex Key и др.).",
@@ -791,6 +2021,7 @@
"setup_hint": "Отсканируйте QR-код в вашем приложении аутентификации:",
"manual_hint": "Или введите секретный ключ вручную:",
"verify_placeholder": "Введите 6-значный код для подтверждения",
+ "password_placeholder": "Ваш пароль",
"verify_btn": "Подтвердить и активировать",
"backup_title": "Резервные коды",
"backup_hint": "Сохраните эти коды в надёжном месте. Каждый из них можно использовать один раз для входа в случае утери доступа к приложению.",
@@ -808,7 +2039,8 @@
"verify_failed": "Ошибка верификации",
"disable_prompt": "Введите пароль для отключения",
"failed": "Ошибка выполнения операции",
- "regen_prompt": "Введите пароль для генерации"
+ "regen_prompt": "Введите пароль для генерации",
+ "qr_alt": "QR-код"
},
"recovery_section": {
"title": "Восстановление аккаунта",
@@ -832,7 +2064,20 @@
"btn": "Удалить мой аккаунт",
"password_required": "Для удаления требуется ввести пароль",
"deleting": "Удаление аккаунта...",
- "password_placeholder": "Введите ваш пароль"
+ "password_placeholder": "Введите ваш пароль",
+ "delete_messages": "Удалить все мои сообщения",
+ "delete_messages_hint": "Если не отмечено, ваши сообщения будут отображаться как «[Deleted User]»."
+ },
+ "self_purge": {
+ "title": "Удалить все мои сообщения",
+ "desc": "Удалите сразу все сообщения и файлы, которые вы когда-либо здесь публиковали, сохранив аккаунт. Сообщения, защищённые модератором, остаются. Это действие нельзя отменить.",
+ "btn": "Удалить все мои сообщения",
+ "confirm_desc": "Все сообщения и файлы, опубликованные вами на этом сервере, будут удалены во всех каналах и ЛС. Ветки, которые вы начали, исчезнут вместе с ними, со всеми ответами. Ваш аккаунт останется.",
+ "confirm_title": "Удалить все сообщения, которые вы когда-либо здесь публиковали?",
+ "confirm_body": "Отмены нет, и копия не сохраняется.",
+ "done": "Удалено сообщений: {{n}}",
+ "done_kept": "Удалено сообщений: {{n}}. Защищённых модератором сообщений сохранено: {{kept}}.",
+ "failed": "Не удалось удалить ваши сообщения"
},
"desktop_shortcuts_section": {
"title": "Горячие клавиши",
@@ -843,7 +2088,13 @@
"ptt_toggle": "(переключение)",
"not_set": "Не задано",
"change_btn": "Изменить",
- "clear_btn": "Очистить"
+ "clear_btn": "Очистить",
+ "binding_hint": "Здесь можно назначить одиночные модификаторы (Alt / Ctrl / Shift) и дополнительные кнопки мыши (Mouse4 / Mouse5). Для регистрации некоторых назначений на уровне ОС нужна свежая сборка Haven Desktop.",
+ "ptt_hold": "удержание",
+ "ptt_toggle_mode": "переключение",
+ "ptt_mode_title": "Как работает клавиша PTT",
+ "ptm": "Нажать, чтобы заглушить (удержание)",
+ "ptm_hint": "Удерживайте, чтобы выключить микрофон. Удобно на той же клавише, что и «нажми и говори» в игре."
},
"desktop_app_section": {
"title": "Приложение для ПК",
@@ -854,36 +2105,466 @@
"start_hidden_hint": "При автоматическом запуске скрывать окно Haven в системный трей вместо вывода на экран.",
"minimize_to_tray": "Сворачивать в трей при закрытии окна",
"minimize_to_tray_hint": "Нажатие кнопки закрытия окна скрывает Haven в системный трей вместо полного выхода из приложения.",
+ "flash_taskbar": "Мигать значком на панели задач при уведомлениях",
+ "flash_taskbar_hint": "Когда Haven работает в фоне, уведомление также подсвечивает его кнопку на панели задач, пока вы не откроете Haven. Отключите, чтобы панель задач оставалась спокойной; уведомления всё равно будут показываться.",
"force_sdr": "Принудительный цветовой профиль SDR (sRGB)",
- "force_sdr_hint": "Исправляет блёклые или перенасыщенные цвета интерфейса на HDR-мониторах. Требуется перезапуск приложения."
+ "force_sdr_hint": "Исправляет блёклые или перенасыщенные цвета интерфейса на HDR-мониторах. Требуется перезапуск приложения.",
+ "hide_menu_bar": "Скрыть строку меню",
+ "hide_menu_bar_hint": "Скрыть панель File / Edit / View / Window / Help. Нажмите Alt, чтобы временно показать её."
+ },
+ "debug_section": {
+ "title": "Отладка",
+ "desc": "Экспериментальные переключатели на стороне клиента. Они ничего не меняют на сервере.",
+ "local_talk_indicator": "Локальный индикатор речи микрофона",
+ "local_talk_indicator_hint": "Подсвечивать ваш аватар сразу, как только микрофон превысит порог речи, не дожидаясь, пока сервер вернёт это обратно. По умолчанию выключено: обычно предпочтительнее ответ сервера, так как он подтверждает, что ваш звук действительно дошёл до сервера.",
+ "mute_on_join": "Всегда входить в голосовой канал с выключенным микрофоном",
+ "mute_on_join_hint": "Принудительно выключать микрофон при каждом входе в голосовой канал. Полезно, если вы сначала предпочитаете послушать или не хотите случайно оказаться с открытым микрофоном сразу после входа. Оказавшись в канале, вы можете включить микрофон как обычно.",
+ "listener_only": "Входить в голосовой канал без микрофона (только слушать)",
+ "listener_only_hint": "Входить в голосовые каналы, не запрашивая доступ к микрофону. Вы будете слышать всех, но не сможете говорить. Полезно, если у вас нет микрофона, вы сейчас не можете дать разрешение на его использование или просто хотите послушать. Haven также автоматически перейдёт в режим «только слушать», если микрофон по какой-либо причине не удалось открыть. (#5380)",
+ "screen_share_voice_proc": "Применять обработку голоса к звуку демонстрации экрана",
+ "screen_share_voice_proc_hint": "Снова включает эхоподавление, шумоподавление и автоматическую регулировку усиления для звука, захваченного при демонстрации экрана. Начиная с 3.17.3 по умолчанию выключено, так как эти фильтры портят музыку и звук игр. Включите, если вы делитесь голосовым контентом (закадровый текст урока, подкаст, встреча), где очистка действительно помогает. Не влияет на ваш микрофон, к которому всегда применяется полная обработка голоса.",
+ "screen_audio_webaudio": "Микширование через Web Audio для звука демонстрации экрана",
+ "screen_audio_webaudio_hint": "По умолчанию Haven воспроизводит входящий звук демонстрации экрана напрямую через аудиоэлемент, что сохраняет синхронизацию с видео при соединении через TURN/ретранслятор. Включите, чтобы направлять его через микшер Web Audio в Haven: это открывает усиление громкости отдельного потока выше 100%, но может вызывать заикания звука и рассинхронизацию звука и видео при ретрансляции (в локальной сети всё в порядке). Оставьте выключенным, если звук демонстрации экрана заикается или уходит из синхронизации. (#5426)",
+ "screen_relay_profile": "Более мягкая демонстрация экрана для соединений через ретранслятор",
+ "screen_relay_profile_hint": "Включите, если ваша демонстрация экрана заикается и уходит из синхронизации у зрителей, но только когда звонок идёт через TURN-сервер, а не в локальной сети. Битрейт видео снижается до значений, действовавших до 3.18.1, и кодировщик может пропускать кадры, когда соединение перегружено, вместо того чтобы держать частоту кадров и копить очередь. Качество картинки будет ниже. Включать нужно только тому, кто демонстрирует экран. (#5426)",
+ "recover_muted_streams": "Восстанавливать зависающие трансляции",
+ "recover_muted_streams_hint": "Включите, если трансляция кого-то зависает у вас, пока вы по-прежнему его слышите, и помогает только выход и повторный вход. Тогда Haven перезагрузит трансляцию за вас и, если это не поможет, попросит демонстрирующего отправить её заново. Он также может перезагрузить трансляцию, на которой просто статичная картинка, поэтому не включайте без необходимости. Включать нужно только тому, кто смотрит.",
+ "screen_relay_auto": "Автоматически смягчать демонстрацию экрана для зрителей через ретранслятор",
+ "screen_relay_auto_hint": "Включено по умолчанию. Когда зрителя можно достичь только через TURN-ретранслятор, для этого зрителя ваша демонстрация использует более мягкий профиль выше, а зрители с прямым соединением получают полное качество. Отключите, если хотите, чтобы решал только переключатель выше. (#5426)",
+ "voice_glare_ice_fix": "Восстанавливать звук после переподключения (экспериментально)",
+ "voice_glare_ice_fix_hint": "Включите, если после повторного входа в голосовой звонок вы иногда не слышите одного или нескольких человек, пока не выйдете и не зайдёте снова. Когда двое переподключаются одновременно, их соединения могут столкнуться в процессе восстановления, и звук в одну сторону остаётся мёртвым; эта опция заставляет Haven повторить восстановление, чтобы звук вернулся сам. По умолчанию выключено, пока функция тестируется. (#5444)",
+ "disable_gpu_vsync": "Отключить вертикальную синхронизацию GPU (исправление для Nvidia G-Sync)",
+ "disable_gpu_vsync_hint": "Обходной путь для мониторов Nvidia G-Sync / VRR, на которых Haven Desktop падает до ~5 FPS после сворачивания окна или перекрытия его другим окном. Указывает Chromium не ждать сигнала вертикальной синхронизации монитора перед отрисовкой кадров. На мониторах без переменной частоты обновления может вызывать заметные разрывы изображения. Для применения требуется перезапуск.",
+ "unlimit_frame_rate": "Снять ограничение частоты кадров Chromium (исправление для Nvidia G-Sync)",
+ "unlimit_frame_rate_hint": "Работает в паре с переключателем вертикальной синхронизации GPU выше. Снимает внутреннее ограничение частоты кадров Chromium, которое на некоторых конфигурациях Nvidia G-Sync застревает на очень низком значении и не восстанавливается. Полезно, только если одного переключателя вертикальной синхронизации оказалось недостаточно. Может увеличить нагрузку на CPU/GPU. Для применения требуется перезапуск.",
+ "linux_vaapi": "Аппаратное кодирование видео в Linux (VA-API)",
+ "linux_x11": "Запускать в режиме X11 в Linux",
+ "linux_x11_hint": "Только для Linux. Запускает Haven Desktop через X11 (XWayland) вместо нативного Wayland. Попробуйте, если окно мерцает, как это бывает на некоторых картах Nvidia в Wayland. В этом режиме при демонстрации экрана могут отображаться только некоторые окна. Для применения требуется перезапуск.",
+ "linux_vaapi_hint": "Только для Linux. Позволяет Haven Desktop использовать видеокодировщик VA-API вашей видеокарты для демонстрации экрана даже там, где его блокирует список драйверов Chromium, в том числе на картах Nvidia. Может снизить нагрузку на CPU во время демонстрации, но некоторые драйверы дают чёрное или искажённое видео, поэтому по умолчанию выключено. Для применения требуется перезапуск."
},
"admin": {
"title": "Администратор",
+ "update_title": "Обновления сервера",
+ "update_hint": "Проверяйте новые релизы Haven и применяйте их на месте. Сервер автоматически создаст резервную копию перед обновлением и перезапустится сам.",
+ "update_check_btn": "Проверить обновления",
+ "update_run_btn": "Обновить сейчас",
+ "update_checking": "Проверка…",
+ "update_run_on_host": "Выполнить на хосте:",
+ "update_copy_command": "Копировать команду",
+ "update_installed": "Установлено:",
+ "update_latest": "Последняя:",
+ "update_unknown": "неизвестно",
+ "update_install_method": "Способ установки:",
+ "update_current": "✅ У вас последняя версия.",
+ "update_available": "⚠️ Доступно обновление.",
+ "update_release_notes": "Примечания к релизу",
+ "update_check_failed": "Не удалось проверить: {{error}}",
+ "update_check_first": "Сначала проверяются обновления… нажмите «Обновить сейчас» ещё раз, когда проверка завершится.",
+ "update_nothing_to_install": "Уже установлена последняя версия. Устанавливать нечего.",
+ "update_not_supported": "Обновления из приложения не поддерживаются для способа установки «{{method}}». Выполните команду, показанную в панели, на вашем хосте.",
+ "update_confirm": "Применить обновление до v{{version}}? Сервер сделает автоматическую резервную копию, а затем завершит работу, чтобы супервизор перезапустил его с новым кодом. Вы будете отключены примерно на 30 секунд.",
+ "update_sending": "Отправка запроса на обновление…",
+ "update_started": "🔄 Обновление началось. Сервер скоро перезапустится.",
+ "update_failed": "Не удалось обновить: {{error}}",
+ "view_ip_bans_btn": "Просмотр банов по IP",
+ "admin_pw_reset_label": "Разрешить администраторам сбрасывать пароли",
+ "admin_pw_reset_hint": "⚠️ Если включено, администраторы могут сбросить пароль любого пользователя на одноразовое временное значение. Пользователь должен сменить его при следующем входе. Сброс пароля также стирает историю E2E ЛС этого пользователя (его ключ-обёртка выводится из пароля). Факт включения этой функции доступен через /api/public-config, чтобы пользователи могли видеть, есть ли у администраторов этого сервера такая возможность.",
+ "oidc_group": "Единый вход (OIDC)",
+ "oidc_desc": "Позвольте участникам входить с аккаунтом от вашего собственного провайдера идентификации (Authentik, Keycloak, Authelia, Auth0 и любого другого, поддерживающего OpenID Connect) вместо пароля Haven. Укажите здесь адрес эмитента и идентификатор клиента, затем добавьте клиентский секрет в файл .env как OIDC_CLIENT_SECRET и перезапустите сервер. Секрет намеренно хранится вне базы данных, чтобы он никогда не попадал в ваши резервные копии. Зарегистрируйте у провайдера этот адрес как URI перенаправления: https://your-haven-address/api/auth/oidc/callback",
+ "oidc_e2e_note": "Зашифрованные ЛС разблокируются ключом, выводимым из того, что вы вводите при входе, а участник, входящий через SSO, здесь пароль не вводит. При первом входе ему предлагается задать отдельную парольную фразу шифрования, и вводить её нужно снова на каждом новом устройстве. Никто, включая вас, не может сбросить эту парольную фразу за него.",
+ "oidc_enabled_label": "Включить вход через SSO",
+ "oidc_issuer_label": "URL эмитента",
+ "oidc_client_id_label": "Идентификатор клиента",
+ "oidc_scopes_label": "Области (scopes)",
+ "oidc_button_label_label": "Текст кнопки",
+ "oidc_button_placeholder": "Войти через SSO",
+ "oidc_create_users_label": "Создавать аккаунт Haven при первом входе",
+ "oidc_create_users_hint": "Если выключено, войти таким способом смогут только те, у кого уже есть аккаунт Haven, привязанный к вашему провайдеру. Поскольку привязка существующего аккаунта пока не реализована, при выключенной опции новым пользователям будет отказано.",
+ "oidc_secret_warning": "OIDC_CLIENT_SECRET не задан в окружении сервера, поэтому кнопка входа остаётся скрытой, пока он не будет задан.",
+ "referrer_recommended": "Рекомендуется",
+ "referrer_advanced": "Дополнительно: на ваше усмотрение",
+ "referrer_same_origin": "Same-Origin (по умолчанию)",
+ "referrer_no_referrer": "No-Referrer",
+ "referrer_strict_cross_origin": "Strict-Origin-When-Cross-Origin (значение Haven по умолчанию до 3.41.0)",
+ "media_proxy_group": "Приватность изображений",
+ "media_proxy_desc": "Haven сам загружает изображения с других сайтов и отдаёт их из собственного кэша, поэтому браузеры ваших участников никогда не обращаются к этим сайтам. Если опция выключена, любой, кто публикует ссылку на изображение, получает IP-адрес и данные браузера каждого, кто прокручивает чат мимо неё, без единого клика. Кроме того, вложения продолжают работать после того, как исходная ссылка устарела или сайт перестал работать. Это расходует трафик и место на диске вашего сервера; каждое изображение загружается один раз и хранится в кэше 30 дней.",
+ "media_proxy_label": "Проксировать и кэшировать удалённые изображения",
+ "voice_privacy_group": "Приватность голоса",
+ "voice_relay_desc": "Голос в Haven работает по принципу peer-to-peer, поэтому по умолчанию каждый участник звонка видит IP-адрес всех остальных. Так устанавливается соединение, для этого не нужно ничего нажимать, и никого об этом не уведомляют. Режим «только ретрансляция» направляет весь голос через ваш TURN-сервер, и участники видят только адрес TURN-сервера. Для этого нужно настроить TURN-сервер в разделе «Голос и соединение», и он расходует трафик вашего сервера на каждый звонок.",
+ "voice_relay_label": "Голос только через ретранслятор (скрыть IP участников)",
+ "automod_title": "Автомодерация",
+ "automod_desc": "Проверяет ссылки в сообщениях, правках, ЛС, профилях и темах каналов по политике доменов, которую вы контролируете. Заблокированный контент отклоняется до сохранения, поэтому он не доходит до других. Это важнее, чем кажется: Haven отображает изображения по ссылкам и предпросмотры ссылок напрямую с другого сайта, поэтому вредоносная ссылка раскрывает IP-адрес каждого, кто прокручивает чат мимо неё, а не только того, кто на неё нажал.",
+ "automod_enabled": "Включено",
+ "automod_mode_label": "Политика ссылок",
+ "automod_mode_hint": "Белый список это строгий вариант, который останавливает ссылки, которых вы раньше не видели. Чёрный список останавливает только домены, о которых вы уже знаете.",
+ "automod_mode_off": "Выкл.: разрешить все ссылки",
+ "automod_mode_allowlist": "Белый список: блокировать всё, чего нет в списке",
+ "automod_mode_blocklist": "Чёрный список: разрешить всё, кроме указанного",
+ "automod_allow": "Разрешить",
+ "automod_block": "Блокировать",
+ "automod_add": "Добавить",
+ "automod_domains_group": "Домены",
+ "automod_include_subs": "Включая поддомены",
+ "automod_min_age": "Новые аккаунты не могут публиковать ссылки в течение (часов)",
+ "automod_min_age_hint": "0 отключает правило. Действует даже для разрешённых доменов и является самым эффективным правилом против схемы «зарегистрироваться, опубликовать ссылку, получить бан, повторить».",
+ "automod_post_wait": "Новые аккаунты должны подождать перед публикацией (минут)",
+ "automod_post_wait_hint": "0 отключает правило. Новый аккаунт не может публиковать сообщения, темы форума, ответы в ветках, опросы и файлы или писать кому-либо, пока не достигнет этого возраста. До 10080 (одна неделя). Участники с уровнем роли не ниже указанного ниже не ограничиваются. Гостевые аккаунты всегда новые, поэтому при включённом правиле гости могут только читать.",
+ "automod_exempt_level": "Не фильтровать начиная с уровня роли",
+ "automod_exempt_hint": "Участники этого уровня и выше никогда не фильтруются. Администраторы всегда освобождены от фильтрации.",
+ "automod_rules_group": "Правила",
+ "automod_scan_edits": "Проверять правки сообщений",
+ "automod_scan_dms": "Проверять личные сообщения",
+ "automod_scan_dms_hint": "Личные сообщения защищены сквозным шифрованием, поэтому сервер действительно не может их прочитать и не может заблокировать ЛС при отправке. Вместо этого проверка выполняется в приложении получателя после расшифровки: ссылка на домен, который вы не разрешили, показывается обычным текстом с предупреждением, а не кликабельной, и изображения с этих доменов не загружаются. Отправителей предупреждают до отправки сообщения. Это зависит от того, что у получателя установлено приложение с такой функцией, поэтому считайте её сильным сдерживающим средством, а не гарантией.",
+ "automod_scan_profile": "Проверять профили и темы каналов",
+ "automod_block_ip_urls": "Блокировать ссылки на необработанные IP-адреса",
+ "automod_block_punycode": "Блокировать похожие (интернационализированные) домены",
+ "automod_block_obfuscated": "Блокировать замаскированные ссылки (hxxp://, evil[.]com)",
+ "automod_preview_allowlist": "Показывать предпросмотр только для разрешённых доменов",
+ "automod_preview_hint": "Настоятельно рекомендуется. Предпросмотры ссылок загружают изображения прямо с другого сайта в браузере каждого зрителя, что выдаёт этому сайту IP-адрес каждого без единого клика.",
+ "automod_escalation_group": "Эскалация",
+ "automod_words_group": "Слова",
+ "automod_words_hint": "Группы слов, блокирующие сообщение, каждая из которых даёт определённое число страйков для эскалации ниже. Только целые слова, регистр не важен, одно слово или фраза на строку. Сотрудники с уровнем не ниже порога пропуска не проверяются.",
+ "automod_words_add": "+ Добавить группу",
+ "automod_words_save": "Сохранить слова",
+ "automod_words_saved": "Группы слов сохранены",
+ "automod_words_name": "Название группы (показывается отправителю)",
+ "automod_words_strikes": "Страйки",
+ "automod_words_remove": "Удалить эту группу",
+ "automod_words_placeholder": "одно слово или фраза на строку",
+ "automod_escalation_hint": "Считает заблокированные попытки в скользящем окне. Заблокированная ссылка учитывается только для аккаунтов младше недели; остальным участникам просто сообщают, что сайт не разрешён. Установите любой порог в 0, чтобы отключить этот шаг. Учтите, что заглушенный участник вообще ничего не может отправлять, поэтому он перестаёт получать страйки, пока заглушение не закончится. Если нужен быстрый автоматический бан, задайте порог бана близким к порогу заглушения или отключите заглушение.",
+ "automod_window": "Окно (часов)",
+ "automod_warn_at": "Предупредить после",
+ "automod_mute_at": "Заглушить после",
+ "automod_mute_mins": "Длительность заглушения (минут)",
+ "automod_ban_at": "Забанить после",
+ "automod_ban_ip": "Автобаны также банят IP",
+ "automod_ban_ip_hint": "⚠️ Не включайте, если не понимаете риск. Из-за общих адресов и адресов мобильных операторов бан по IP может затронуть тех, кто ничего не сделал.",
+ "automod_log_channel": "Записывать в канал",
+ "automod_log_channel_placeholder": "код канала (необязательно)",
+ "automod_activity_group": "Недавняя активность",
+ "automod_refresh": "Обновить",
+ "bulk_preview_failed": "Не удалось показать предпросмотр",
+ "mention_everyone_desc": "Уведомить всех в канале",
+ "mention_here_desc": "Уведомить участников в сети",
+ "mention_role_desc": "Уведомить всех с этой ролью",
+ "template": {
+ "title": "Шаблон сервера",
+ "hint": "Сохраните структуру этого сервера в файл, по которому другие смогут настроить свой так же, или настройте этот сервер по чужому шаблону.",
+ "export_label": "Экспорт",
+ "export_posts": "Закреплённые посты настройки (приветствие, правила, описания каналов)",
+ "export_assets": "Значок сервера, баннер, значки ролей и темы",
+ "export_btn": "Скачать шаблон",
+ "export_note": "Включает название и оформление, категории, каналы и их настройки, роли и права, меню самоназначения ролей, слоты вебхуков и правила ссылок. Никогда не включает участников, сообщения, ЛС, ключи шифрования, коды приглашений, токены вебхуков, пароли и API-ключи.",
+ "import_label": "Импорт",
+ "mode_label": "Если что-то уже существует",
+ "mode_merge": "Добавить недостающее: не трогать существующее",
+ "mode_replace": "Заменить структуру: обновить под шаблон",
+ "opt_posts": "Добавить посты настройки и меню ролей",
+ "opt_webhooks": "Создать вебхуки из шаблона (с новыми токенами)",
+ "opt_join": "Добавить текущих участников в новые публичные каналы",
+ "apply_btn": "Применить шаблон",
+ "import_note": "Ни в одном из режимов ничего не удаляется: каналы и роли, которых нет в шаблоне, остаются как есть.",
+ "exported": "Шаблон скачан",
+ "export_failed": "Не удалось экспортировать шаблон",
+ "checking": "Проверка шаблона…",
+ "invalid": "Этот шаблон нельзя использовать:",
+ "summary": "{{name}}: каналов {{channels}}, ролей {{roles}}, постов {{posts}}",
+ "will_create": "Будет создано",
+ "will_update": "Будет обновлено",
+ "did_create": "Создано",
+ "did_update": "Обновлено",
+ "left_alone": "Уже есть, не тронуто",
+ "kept": "Нет в шаблоне, оставлено как есть",
+ "notes": "Заметки",
+ "channels": "Каналы",
+ "roles": "Роли",
+ "settings": "Настройки",
+ "webhooks": "Вебхуки",
+ "files": "Изображения",
+ "counts": "постов {{posts}}, меню ролей {{menus}}, правил ссылок {{domains}}",
+ "nothing": "Менять нечего: этот сервер уже соответствует шаблону.",
+ "confirm": "Применить этот шаблон к серверу сейчас?",
+ "applied": "Шаблон применён",
+ "apply_failed": "Не удалось применить шаблон"
+ },
+ "backup_title": "Резервная копия сервера",
+ "backup_hint": "Скачайте резервную копию этого сервера или восстановите данные из предыдущей копии. Полезно, когда у вас нет доступа к оболочке хост-машины.",
+ "backup_download_label": "Скачать резервную копию",
+ "backup_inc_channels": "Каналы и роли",
+ "backup_inc_users": "Пользователи (список аккаунтов)",
+ "backup_inc_settings": "Настройки сервера",
+ "backup_inc_messages": "Сообщения (история чата)",
+ "backup_inc_dms": "Личные сообщения",
+ "backup_inc_dms_hint": "(шифротекст E2E; прочитать могут только исходные владельцы ключей)",
+ "backup_inc_files": "Загруженные файлы",
+ "backup_download_btn": "Скачать резервную копию",
+ "backup_select_all": "Выбрать все",
+ "backup_select_none": "Снять выбор",
+ "backup_modes_hint": "Выберите, что включить. Сообщения и загруженные файлы могут сделать копию очень большой; одни каналы, пользователи и настройки обычно занимают немного. Чтобы восстановить или перенести сервер, отметьте «Сообщения»: это переносит всю базу данных, и у всех сохраняются аккаунты и пароли. Это также означает, что файл содержит данные для входа всех участников (пароли хранятся в искажённом виде и не читаются), секреты 2FA и адреса электронной почты, поэтому храните его в надёжном месте.",
+ "backup_restore_label": "Восстановить из резервной копии",
+ "backup_restore_btn": "Восстановить",
+ "backup_restore_full_note": "Здесь можно восстановить копию, созданную с отмеченными «Сообщениями»: это вся база данных. «Загруженные файлы» необязательны; если в копии их нет, папка загрузок остаётся как есть. В копии только с каналами, пользователями и настройками нет базы данных для восстановления.",
+ "backup_restore_warning": "Внимание: восстановление перезаписывает текущие данные сервера. Сервер перезапустится автоматически, поэтому ваша среда размещения должна поддерживать автоперезапуск (Docker, systemd, служба установщика Haven и т. д.). Предыдущая база данных сохраняется как haven.db.pre-restore на один цикл.",
+ "auto_backup_label": "Автоматические резервные копии",
+ "auto_backup_enable": "Включить резервное копирование по расписанию",
+ "auto_backup_interval": "Интервал",
+ "auto_backup_retention": "Хранить последние N копий",
+ "auto_backup_sections_label": "Включать в копии по расписанию:",
+ "auto_backup_save": "Сохранить расписание",
+ "auto_backup_run_now": "Запустить сейчас",
+ "auto_backup_refresh": "Обновить список",
+ "auto_backup_hint": "Автоматические копии сохраняются в каталоге данных сервера, и старые удаляются по заданному количеству. Они имеют тот же формат, что и ручные загрузки, поэтому любую из них можно восстановить выше.",
+ "auto_backup_every_6_hours": "Каждые 6 часов",
+ "auto_backup_every_12_hours": "Каждые 12 часов",
+ "auto_backup_daily": "Ежедневно",
+ "auto_backup_weekly": "Еженедельно",
+ "auto_backup_monthly": "Ежемесячно (~30 дн.)",
+ "auto_backup_inc_users": "Пользователи",
+ "auto_backup_inc_messages": "Сообщения",
+ "auto_backup_inc_dms_hint": "(шифротекст E2E)",
+ "restore_extract_progress": "Распаковка на сервере… {{pct}}% ({{done}} / {{total}})",
+ "restore_extracting": "Распаковка на сервере…",
+ "restore_upload_progress": "Загрузка… {{pct}}%",
+ "restore_upload_progress_bytes": "Загрузка… {{pct}}% ({{done}} / {{total}})",
+ "restore_uploading": "Загрузка…",
+ "restore_upload_complete": "Загрузка завершена. Распаковка на сервере…",
+ "restore_extracting_short": "Распаковка…",
+ "restore_network_error": "Сетевая ошибка при загрузке",
+ "restore_upload_timeout": "Время загрузки истекло",
+ "restore_done": "Готово. Сервер перезапускается…",
+ "restore_staged": "Восстановление подготовлено. Сервер перезапускается…",
+ "restore_restarting": "Перезапуск…",
+ "auto_backup_none": "Автоматических копий пока нет.",
+ "auto_backup_delete_confirm": "Удалить {{name}}?",
+ "auto_backup_delete_failed": "Не удалось удалить",
+ "auto_backup_load_failed": "Не удалось загрузить: {{error}}",
+ "auto_backup_saved": "Расписание автоматических копий сохранено",
+ "auto_backup_triggered": "Автоматическая копия запущена. Список скоро обновится…",
+ "auto_backup_run_failed": "Не удалось запустить: {{error}}",
+ "max_sticker": "Максимальный размер файла стикера (КБ)",
+ "max_sticker_hint": "Максимальный размер загружаемого стикера (256-10240 КБ, по умолчанию 1024 / 1 МБ). Увеличьте, чтобы разрешить более крупные стикеры в стиле GIF.",
+ "session_duration": "Срок действия сеанса входа",
+ "session_duration_never": "Не истекает (рекомендуется)",
+ "session_duration_1_day": "1 день",
+ "session_duration_7_days": "7 дней",
+ "session_duration_30_days": "30 дней",
+ "session_duration_90_days": "90 дней",
+ "session_duration_365_days": "365 дней",
+ "session_duration_hint": "Как долго токен входа остаётся действительным, прежде чем пользователям придётся войти снова. «Не истекает» оставляет пользователей в системе, пока они не нажмут «Выйти» или не сменят пароль. Применяется только к новым входам; существующие токены сохраняют прежний срок до истечения или обновления.",
+ "custom_tos_title": "Свои условия использования",
+ "custom_tos_hint": "Добавьте свои условия, которые появятся на странице входа перед стандартными условиями. Поддерживается обычный текст. Оставьте пустым, чтобы показывались только стандартные условия Haven.",
+ "custom_tos_placeholder": "Введите свои условия использования...",
+ "audit_log_title": "Журнал аудита",
+ "audit_log_hint": "Отслеживайте действия администраторов и модераторов: изменения каналов, обновления ролей, баны, кики, настройки сервера и многое другое.",
+ "audit_log_btn": "Открыть журнал аудита",
+ "no_banned_ips": "Заблокированных IP нет.",
+ "roles_inherited_label": "Унаследовано (только чтение)",
+ "roles_inherited_title": "Унаследовано от {{role}}",
+ "moderation_title": "Модерация",
+ "idle_online_group": "Аккаунты, простаивающие в сети",
+ "idle_online_desc": "Показывает аккаунты, которые подключены и отображаются в сети уже несколько часов, ничего не публикуя, не заходя в голосовой канал и не меняя статус. Обычный клиент переходит в режим простоя сам, поэтому аккаунт, который так долго остаётся зелёным и молчит, часто оказывается скриптом, оставленным следить за сервером, а не человеком. Это просто повод присмотреться, а не автоматическое действие.",
+ "idle_online_threshold": "Отмечать после (часов)",
+ "idle_online_check": "Проверить сейчас",
+ "idle_online_empty": "Нет аккаунтов, простаивающих в сети {{hours}} ч или дольше.",
+ "idle_online_unknown": "(неизвестно)",
+ "idle_online_admin": "(админ)",
+ "idle_online_status": "в сети {{online}}, молчит {{silent}}",
+ "media_cache_one": "В кэше: {{count}} изображение, {{size}} МБ",
+ "media_cache_other": "В кэше: изображений {{count}}, {{size}} МБ",
+ "media_cache_clear": "Очистить",
+ "automod_no_domains": "Домены пока не настроены.",
+ "automod_block_badge": "БЛОК",
+ "automod_allow_badge": "РАЗРЕШЕНО",
+ "automod_subdomains": "+ поддомены",
+ "automod_top_domains": "Чаще всего блокируемые домены за неделю (нажмите, чтобы разрешить):",
+ "automod_allow_host": "Разрешить {{host}}",
+ "automod_nothing_blocked": "Пока ничего не заблокировано.",
+ "automod_in_channel": "в #{{name}}",
+ "security_title": "Безопасность",
+ "referrer_policy_group": "Настройка реферера",
+ "referrer_policy_label": "Политика реферера",
+ "referrer_policy_desc": "Задаёт заголовок Referrer-Policy, который Haven отправляет браузерам и который определяет, какая часть адреса текущей страницы передаётся при загрузке ресурсов или переходе по ссылкам на другие сайты. Рекомендуемые варианты подходят почти для любого сервера; продвинутые политики это стандартные значения браузера, оставленные на ваше усмотрение. Политики, которые отправляли бы другим сайтам полный адрес страницы, не предлагаются, потому что ссылки-приглашения Haven находятся в этом адресе.",
+ "referrer_policy_opt_default": "Strict-Origin-When-Cross-Origin: в пределах этого сервера передаёт полный адрес; другим сайтам передаёт только источник. Это было значением Haven по умолчанию до 3.41.0. Выберите, чтобы вернуть прежнее поведение.",
+ "referrer_policy_opt_same": "Same-Origin (по умолчанию): в пределах этого сервера передаёт полный адрес; другим сайтам не передаёт ничего.",
+ "referrer_policy_opt_none": "No-Referrer: не передаёт ничего нигде, даже в пределах этого сервера.",
+ "referrer_policy_note": "Same-Origin и No-Referrer ничего не отправляют другим сайтам, поэтому любой из них исправляет вложения, CDN которых отклоняет кросс-доменный реферер, например видео Twitter/X. Если после этого изменения изображение или вложение в другом месте перестаёт загружаться, этому хосту нужен реферер: переключитесь на Strict-Origin-When-Cross-Origin, чтобы вернуть поведение до 3.41.0.",
+ "fcm_privacy_group": "Приватность FCM",
+ "fcm_desc": "FCM (Firebase Cloud Messaging) это система Google для доставки push-уведомлений на телефоны Android. Именно она будит ваш телефон, когда приходит новое сообщение, а Haven закрыт. Это значит, что все уведомления (включая ваше имя пользователя Haven, название канала и текст сообщения), отправляемые на ваш Android-телефон, должны пройти через серверы Google.{user} для имени пользователя. Оставьте пустым, чтобы отключить.",
+ "custom_themes_title": "Свои темы",
+ "custom_themes_hint": "Поместите файлы .theme.css в папку themes/, затем отметьте те, которые должны появиться в выборе тем у всех пользователей.",
"members_title": "Участники",
"show_members": "Отображение списка участников",
"members_online_only": "Только в сети",
"members_all": "Все участники",
"members_hidden": "Скрыть список",
+ "view_invite_btn": "Пригласить пользователей",
"view_bans_btn": "Список заблокированных",
"view_deleted_btn": "Удалённые пользователи",
+ "bulk_cleanup_btn": "Очистка",
"view_all_members_btn": "Просмотр всех участников",
"update_banner_label": "Баннер обновления (только для администраторов)",
"whitelist_title": "Кто может зарегистрироваться",
"whitelist_enabled": "📋 Белый список",
"whitelist_username_placeholder": "Имя пользователя...",
"whitelist_add_btn": "Добавить",
+ "registration_token_required": "🔑 Требовать токен приглашения",
+ "registration_token_hint": "Если включено, каждый, кто регистрируется, должен ввести токен ниже. Работает вместе с белым списком (должны пройти обе проверки) или отдельно.",
+ "registration_token_invite_bypass": "Разрешить ссылкам-приглашениям обходить требование токена",
+ "registration_token_copy": "Копировать токен",
+ "registration_token_generate": "Создать / сменить",
+ "captcha_required": "🛡️ Требовать CAPTCHA при регистрации",
+ "captcha_hint": "Добавляет проверку Cloudflare Turnstile в форму регистрации, чтобы блокировать автоматическую массовую регистрацию. Это бесплатно: создайте виджет в панели Cloudflare Turnstile и вставьте оба ключа ниже. Оставьте выключенным, если это не нужно.",
+ "captcha_site_key": "Ключ сайта Turnstile",
+ "captcha_secret_key": "Секретный ключ Turnstile",
+ "captcha_secret_placeholder": "Хранится на сервере в тайне",
+ "registration_rate_limit": "⏱️ Ограничить число регистраций в час",
+ "registration_rate_limit_hint": "Ограничивает, сколько новых аккаунтов можно создать на всём сервере за час, чтобы замедлить поток ботов, даже если они приходят с множества разных адресов. Тем, кто регистрируется сверх лимита, предложат повторить позже, поэтому задайте значение с запасом выше обычной нагрузки.",
+ "registration_rate_limit_max": "Макс. новых аккаунтов в час",
"settings_saved": "Настройки сохранены",
"no_changes": "Нет изменений для сохранения",
"select_image_first": "Сначала выберите изображение",
"server_icon_updated": "Иконка сервера успешно обновлена",
"server_icon_removed": "Иконка сервера удалена",
+ "server_banner_updated": "Баннер сервера обновлён",
+ "server_banner_removed": "Баннер сервера удалён",
+ "no_banner": "Нет баннера",
+ "no_themes": "Темы не найдены. Добавьте файлы .theme.css в папку themes/ и обновите страницу.",
+ "custom_themes": "Свои",
+ "banner_mode_full": "Полная шапка (непрозрачная)",
+ "banner_mode_shaded": "Затенённая шапка",
+ "banner_mode_minimal": "Минимальная шапка",
+ "banner_mode_transparent": "Прозрачная шапка",
+ "header_mode_updated": "Режим шапки обновлён",
+ "vanity_invalid": "Код должен содержать от 3 до 32 символов (буквы, цифры, дефисы и подчёркивания)",
+ "vanity_saved": "Красивая ссылка-приглашение сохранена",
+ "vanity_cleared": "Красивая ссылка-приглашение удалена",
+ "vanity_title": "Красивая ссылка-приглашение",
+ "vanity_hint": "Свой адрес приглашения (3-32 символа: буквы, цифры, дефисы, подчёркивания). Люди смогут зайти по ссылке /invite/your-slug",
+ "default_join_title": "📋 Каналы по умолчанию для приглашённых",
+ "default_join_hint": "Выберите, в какие публичные каналы попадают люди, пришедшие по коду приглашения или красивой ссылке. В приватные каналы никогда не добавляют автоматически, что бы вы ни выбрали. Оставьте все галочки, чтобы дать доступ ко всем публичным каналам.",
+ "loading_channels": "Загрузка каналов...",
+ "invite_links_title": "🔗 Ссылки-приглашения",
+ "invite_links_hint": "Ссылки, которые сразу добавляют людей в выбранные вами каналы, без ввода кода. Каждую ссылку можно отключить, ограничить числом людей или задать срок действия.",
+ "invite_links_manage": "Управление ссылками-приглашениями",
+ "invite_links_modal_hint": "Ссылки, которые сразу добавляют людей в выбранные вами каналы. Делитесь ссылкой https://your-server/?invite=CODE или /invite/CODE. Приватные каналы по ссылке никогда не выдаются.",
+ "invite_links_loading": "Загрузка ссылок-приглашений…",
+ "invite_links_create_title": "➕ Создать новую ссылку-приглашение",
+ "invite_links_label": "Название",
+ "invite_links_label_hint": "Для вашего удобства, например «Реклама на Reddit»",
+ "invite_links_label_placeholder": "Необязательное название",
+ "invite_links_max_uses": "Макс. использований",
+ "invite_links_max_uses_hint": "0 = без ограничений. Считаются разные люди.",
+ "invite_links_custom_code": "Свой код",
+ "invite_links_custom_code_hint": "Необязательно. 3-32 символа. Пусто = случайный.",
+ "invite_links_create": "Создать ссылку-приглашение",
+ "guests_title": "👤 Вход как гость",
+ "guests_hint": "Показывает кнопку «Войти как гость» на странице входа. Гость выбирает имя, получает временный аккаунт без пароля и видит только каналы из списка ниже. Гости не могут писать в ЛС, а их аккаунт удаляется при отключении (имя освобождается).",
+ "guests_allow": "Разрешить гостей",
+ "guests_allow_voice": "Гости могут входить в голосовые и видеочаты",
+ "guests_allow_voice_hint": "Если выключено, гости могут читать и писать в каналах ниже, но не могут входить в звонок, показывать экран или включать камеру.",
+ "guests_channels_title": "📋 Каналы, доступные гостям",
+ "guests_channels_hint": "Выберите, какие каналы гости могут видеть и в каких могут писать. Если не выбрать ни одного, кнопка гостя будет почти бесполезна. ЛС гостям недоступны никогда.",
+ "invite_links_no_permission": "У вас нет прав на управление ссылками-приглашениями",
+ "import_network_error": "Ошибка сети",
+ "import_connection_failed": "Не удалось подключиться",
+ "import_upload_failed": "Ошибка загрузки",
+ "import_upload_failed_status": "Ошибка загрузки (статус {{status}})",
+ "import_rename_channel": "Переименовать канал",
+ "import_messages_short": "сообщ.: {{count}}",
+ "import_load_channels_failed": "Не удалось загрузить каналы",
+ "import_thread": "ветка",
+ "import_in_channel": "в #{{name}}",
+ "import_fetching": "Получение…",
+ "import_fetch_failed": "Не удалось получить",
+ "import_fetch_progress": "Прочитано сообщений: {{messages}} (каналов обработано: {{done}} из {{total}})...",
+ "import_bad_response": "Haven получил неожиданный ответ (HTTP {{status}}). Возможно, прокси или туннель перед сервером оборвал запрос. Попробуйте ещё раз, а если ошибка повторяется, загляните в лог сервера.",
+ "registration": {
+ "clear_confirm": "Удалить токен регистрации? Люди больше не смогут регистрироваться с ним.",
+ "copied": "Токен скопирован",
+ "copy_failed": "Не удалось скопировать токен. Выделите его и нажмите Ctrl+C."
+ },
+ "default_join": {
+ "all": "Приглашённые попадут во все публичные каналы",
+ "one": "Приглашённые попадут в {{count}} канал",
+ "other": "Приглашённые попадут в каналы: {{count}}"
+ },
+ "guest_access": {
+ "private": "приватный",
+ "voice": "голосовой",
+ "enabled": "Гостевой вход включён",
+ "disabled": "Гостевой вход отключён",
+ "voice_on": "Гости снова могут входить в голосовые каналы",
+ "voice_off": "Гостям доступен только текст",
+ "zero": "У гостей теперь нет доступа ни к одному каналу",
+ "one": "Гости теперь имеют доступ к {{count}} каналу",
+ "other": "Гости теперь имеют доступ к каналам: {{count}}"
+ },
+ "invite_links": {
+ "no_public_channels": "Публичных каналов пока нет.",
+ "no_channels": "Каналов пока нет.",
+ "count": "(активных: {{active}} / всего: {{total}})",
+ "none": "Ссылок-приглашений пока нет. Создайте первую ниже.",
+ "local_address_hint": "Эти ссылки используют адрес самого компьютера, поэтому работают только на нём. Укажите PUBLIC_URL в файле .env Haven как ваш публичный адрес (или включите туннель), и ссылки будут использовать его.",
+ "disabled": "Отключена",
+ "used": "Использована",
+ "expired": "Истекла",
+ "active": "Активна",
+ "channel_one": "{{count}} канал",
+ "channel_other": "Каналов: {{count}}",
+ "never": "Никогда",
+ "no_label": "(без названия)",
+ "copy_link": "Копировать ссылку",
+ "grants": "Даёт доступ:",
+ "uses": "Использований:",
+ "expires": "Истекает:",
+ "disable": "Отключить",
+ "enable": "Включить",
+ "channels_granted": "Каналы, которые открывает ссылка",
+ "select_all": "Выбрать все",
+ "select_none": "Снять выбор",
+ "max_uses": "Макс. использований (0 = без ограничений)",
+ "reset_expiry": "Сбросить срок действия",
+ "keep_current": "Оставить текущий",
+ "after_hour": "Через 1 час",
+ "after_day": "Через 1 день",
+ "after_7_days": "Через 7 дней",
+ "after_30_days": "Через 30 дней",
+ "save_changes": "Сохранить изменения",
+ "copied": "Ссылка-приглашение скопирована",
+ "copy_manually": "Нажмите Ctrl+C, чтобы скопировать выделенную ссылку",
+ "delete_confirm": "Удалить ссылку-приглашение «{{code}}»? Те, у кого осталась старая ссылка, не смогут ей воспользоваться.",
+ "copy_email_card": "Копировать карточку приглашения для электронной почты",
+ "email_card_copied": "Карточка приглашения скопирована!",
+ "email_card_copy_failed": "Не удалось скопировать карточку!",
+ "card_invited": "Вас приглашают присоединиться к {{server}}!",
+ "card_register": "Нажмите кнопку ниже, чтобы зарегистрироваться!",
+ "card_join": "Присоединиться к {{server}}",
+ "card_copy_link": "Или скопируйте эту ссылку:",
+ "card_expires": "Это приглашение действительно до {{date}}."
+ },
"upload_failed": "Ошибка загрузки",
"no_whitelisted_users": "В белом списке нет пользователей",
"invite_title": "Инвайт-код сервера",
@@ -893,10 +2574,15 @@
"cleanup_enabled": "Включена",
"cleanup_max_age": "Максимальный возраст (дней)",
"cleanup_max_size": "Макс. размер базы данных (МБ)",
+ "cleanup_max_uploads": "Макс. размер загрузок (МБ)",
"cleanup_run_btn": "Запустить очистку сейчас",
+ "deleted_retention": "Хранить удалённые файлы (дней)",
+ "keep_self_destructed": "Сохранять вложения самоуничтожающихся сообщений",
"uploads_title": "Загрузки и лимиты",
"max_upload": "Макс. размер загрузки файла (МБ)",
+ "max_attachments": "Макс. вложений в сообщении",
"max_sound": "Макс. размер звука панели (КБ)",
+ "max_avatar": "Макс. размер аватара (МБ)",
"max_emoji": "Макс. размер файла эмодзи (КБ)",
"max_poll_options": "Макс. вариантов в опросе",
"max_message_chars": "Максимальная длина текста (символов)",
@@ -904,16 +2590,34 @@
"manage_sounds_btn": "Управление звуками",
"emojis_title": "Пользовательские эмодзи",
"manage_emojis_btn": "Управление эмодзи",
+ "emoji_auto_update_group": "Обновление встроенных эмодзи",
+ "emoji_auto_update_desc": "Разрешить Haven проверять на Unicode.org новые стандарты эмодзи. Проверка выполняется только при запуске сервера и только если текущий файл стандарта на диске был создан больше месяца назад. Если доступен новый стандарт, Haven автоматически скачает набор эмодзи и заново создаст все ваши встроенные эмодзи по новому стандарту. На ваши собственные эмодзи это никак не влияет.",
+ "emoji_auto_update_disk": "Если эта настройка выключена, Haven будет использовать последний доступный стандарт на диске. Если стандарт ещё ни разу не скачивался, Haven использует стандарт Unicode 16.0, который входит в комплект сервера.",
+ "emoji_auto_update_label": "Включить автоматическое обновление с Unicode.org",
+ "emoji_auto_update_ps": "P.S. Эта функция не связана со стилем эмодзи. Он полностью зависит от вашей ОС, и отображение будет отличаться на разных устройствах. Функция лишь гарантирует, что в вашем сервере Haven встроены самые свежие из доступных эмодзи.",
"stickers_title": "Стикеры",
"stickers_hint": "Просмотр, загрузка и группировка стикеров в наборы (стикерпаки)",
"manage_stickers_btn": "Управление стикерами",
"roles_title": "Управление ролями",
"manage_roles_btn": "Управление ролями",
"reset_roles_btn": "Сбросить до стандартных",
+ "reset_roles_title": "Сбросить все роли к настройкам по умолчанию",
+ "role_icon_visibility": "Показ значков ролей",
+ "role_icon_sidebar": "Показывать значки ролей в боковой панели",
+ "role_icon_chat": "Показывать значки ролей в чате",
+ "role_icon_after_name": "Показывать значки ролей после имени",
+ "role_icon_hint": "Определяет, где появляются значки ролей. Вариант «после имени» переносит значки справа от имени вместо левой стороны.",
"tunnel_title": "Туннелирование",
"tunnel_provider": "Провайдер туннеля",
"tunnel_start_btn": "Запустить туннель",
"tunnel_inactive": "Неактивен",
+ "tunnel_stop_btn": "Остановить туннель",
+ "tunnel_starting": "Запуск…",
+ "tunnel_stopping": "Остановка…",
+ "tunnel_sync_failed": "Ошибка синхронизации",
+ "tunnel_error": "Ошибка туннеля",
+ "tunnel_status_error": "Ошибка проверки статуса",
+ "tunnel_active_title": "Туннель активен. Нажмите, чтобы скопировать",
"bots_title": "Вебхуки / Боты",
"manage_bots_btn": "Управление ботами",
"no_bots": "Боты не настроены",
@@ -932,29 +2636,232 @@
"default_locale": "Язык по умолчанию",
"no_locale": "Автоопределение (через браузер)",
"default_locale_hint": "При первом посещении Haven новым пользователям будет применен этот язык интерфейса. При желании они смогут изменить его.",
+ "member_defaults": {
+ "title": "Настройки по умолчанию для новых участников",
+ "hint": "Поделитесь своим оформлением и настройками. Новые участники получат их один раз при первом входе, а потом смогут изменить что угодно. Отметьте, чем делиться; в правом столбце ваше текущее значение. Эти кнопки действуют сразу, сохранять не нужно.",
+ "capture": "Использовать мои текущие настройки по умолчанию",
+ "clear": "Сбросить настройки по умолчанию",
+ "clear_confirm": "Сбросить настройки по умолчанию для новых участников? Текущие настройки ни у кого не изменятся.",
+ "push": "Применить один раз ко всем сейчас",
+ "push_confirm_title": "Применить настройки по умолчанию ко всем?",
+ "push_confirm": "Каждый участник один раз получит сохранённые настройки: сразу, если он онлайн, или при следующей загрузке. Настройки, которые он изменил сам, не затрагиваются.",
+ "push_hint": "Все ещё раз получат сохранённые настройки, сразу или при следующей загрузке, но только те, которые они никогда не меняли: остались на значении Haven по умолчанию или на прежнем общем значении.",
+ "none_saved": "Настройки по умолчанию не сохранены. Новые участники начнут с собственных настроек Haven.",
+ "saved_label": "Сохранённые настройки ({{count}}):",
+ "not_shareable": "Свои цвета остаются на вашем устройстве",
+ "pick_one": "Отметьте хотя бы одну настройку.",
+ "on": "Вкл.",
+ "off": "Выкл."
+ },
"update_banner_hint": "Если включено, уведомление о наличии новой версии сервера будет показываться исключительно администраторам.",
+ "allow_self_purge_label": "Участники могут удалить все свои сообщения",
+ "allow_self_purge_hint": "Добавляет всем в Настройки кнопку «Удалить все мои сообщения» рядом с «Удалить аккаунт», для тех, кто хочет не оставить следов. Работает независимо от того, может ли их роль удалять сообщения по одному; сообщения, защищённые модератором, сохраняются.",
+ "hide_disabled_badges_label": "Скрыть перечёркнутые значки в списке каналов",
+ "category_layout_label": "Показывать категории вкладками",
+ "category_layout_hint": "Размещает заголовки категорий сеткой вкладок над их каналами, перенося на новые строки, если их много. Нажмите на категорию правой кнопкой мыши, чтобы задать короткое название или эмодзи, которые будут видны, пока она свёрнута.",
+ "hide_disabled_badges_hint": "У каналов с отключённой демонстрацией экрана или музыкой рядом с названием показываются маленькие перечёркнутые значки. Включите, чтобы скрыть их для всех.",
"whitelist_hint": "Если вайтлист включён, зарегистрироваться на вашем сервере смогут только предварительно одобренные имена пользователей.",
"invite_hint": "Единый мастер-код для добавления пользователей сразу во все открытые каналы и подканалы сервера.",
"copy_code_title": "Копировать код",
"cleanup_age_hint": "Автоматически удалять сообщения старше N дней (0 = функция выключена)",
"cleanup_size_hint": "Автоматически стирать старые сообщения, как только размер БД превысит N МБ (0 = выключено)",
+ "cleanup_uploads_hint": "Когда папка загрузок превысит N МБ, удаляются самые старые сообщения с файлами, пока размер не станет меньше (0 = выключено). Аватары, эмодзи и стикеры учитываются, но никогда не удаляются.",
+ "deleted_retention_hint": "Вложения удалённых сообщений и каналов хранятся столько времени, затем удаляются окончательно. Это работает независимо от того, включена ли автоочистка (по умолчанию 7).",
+ "keep_self_destructed_hint": "Вкл.: когда самоуничтожающееся сообщение истекает, его файлы хранятся так же долго, как и другие удалённые файлы (задаётся выше), чтобы модератор мог восстановить что-то оскорбительное. Выкл.: они удаляются окончательно. Для публичных сообществ лучше оставить включённым; маленьким серверам, где все доверяют друг другу, может подойти выключенное.",
"max_upload_hint": "Лимит на размер отправляемого пользователями файла в МБ (по умолчанию 25). Не ограничивается жёстко кодом — зависит от свободного места на сервере.",
+ "max_attachments_hint": "Сколько файлов можно добавить к одному сообщению перетаскиванием, вставкой или выбором (от 1 до 50, по умолчанию 10). Каждый файл по-прежнему должен укладываться в лимит размера выше.",
+ "media_group_layout": "Картинки, отправленные вместе",
+ "media_group_layout_grid": "Сетка",
+ "media_group_layout_stacked": "Полный размер, одна под другой",
+ "media_group_layout_hint": "Как для всех выглядят несколько картинок в одном сообщении. Сетка собирает их в один блок и обрезает каждую по размеру плитки. Полный размер показывает каждую картинку целиком, одну под другой, в размере, который каждый участник выбрал в разделе «Отображение изображений»; это удобно для артов. Участники могут выбрать иначе для себя в Настройки, Отображение изображений.",
+ "max_tags_per_attachment": "Макс. тегов на вложение",
+ "max_tags_per_attachment_hint": "Сколько тегов загрузки пользователь может добавить к одному вложению (от 1 до 20, по умолчанию 3).",
+ "max_tag_len": "Макс. длина тега (символов)",
+ "max_tag_len_hint": "Максимальное число символов в названии тега загрузки (от 1 до 50, по умолчанию 20).",
+ "tags_title": "Теги",
+ "tags_hint": "Управление списком тегов загрузки. Переименование или удаление тега применяется ко всем вложениям, где он используется, и необратимо. Тег можно ограничить ролью: только участникам с этой ролью он будет предлагаться и они смогут добавлять его к своим загрузкам, а видят его все на картинках, где он уже есть.",
+ "tags_add_placeholder": "Название нового тега",
+ "tags_add_btn": "Добавить тег",
+ "tags_loading": "Загрузка…",
+ "tags_none": "Тегов пока нет.",
+ "tags_uses": "Используется: {{n}}",
+ "tags_rename_btn": "Переименовать",
+ "tags_delete_btn": "Удалить",
+ "tags_save_btn": "Сохранить",
+ "tags_added": "Тег «{{name}}» добавлен",
+ "tags_renamed": "Тег переименован",
+ "tags_deleted": "Тег удалён",
+ "tags_exists": "Такой тег уже существует",
+ "tags_invalid": "Такое название тега недопустимо",
+ "tags_error": "Что-то пошло не так. Попробуйте ещё раз.",
+ "tags_rename_title": "Переименовать этот тег?",
+ "tags_rename_body": "Переименование «{{from}}» в «{{to}}» изменит его на всех вложениях, где он используется. Это необратимо.",
+ "tags_rename_confirm": "Переименовать",
+ "tags_delete_title": "Удалить этот тег?",
+ "tags_delete_body": "Удаление «{{name}}» уберёт его со всех вложений, где он используется ({{n}}). Это необратимо.",
+ "tags_delete_confirm": "Удалить",
+ "tags_role_label": "Кто может использовать «{{name}}»",
+ "tags_role_anyone": "Все",
+ "tags_role_only": "Только {{role}}",
+ "tags_role_missing": "Только удалённая роль (только администраторы)",
+ "tags_role_set": "Теперь «{{name}}» может использовать только {{role}}",
+ "tags_role_cleared": "Теперь «{{name}}» может использовать любой",
"max_sound_hint": "Максимальный размер загружаемого аудиофайла для панели звуков (256–10240 КБ, по умолчанию 1024 / 1 МБ)",
+ "max_avatar_hint": "Максимальный размер аватара, рамки или картинки персоны, которые можно загрузить (от 1 до 10 МБ, по умолчанию 2). Анимированные GIF часто весят больше 2 МБ, но картинка каждого автора загружается рядом с каждым его сообщением, поэтому держите лимит как можно ниже.",
"max_emoji_hint": "Максимальный размер загружаемого кастомного эмодзи (64–1024 КБ, по умолчанию 256)",
"max_poll_hint": "Максимальное допустимое количество вариантов ответа в одном опросе (2–25, по умолчанию 10)",
"max_message_chars_hint": "Максимально допустимое количество символов в одном текстовом сообщении, посте или ЛС (200–100000, по умолчанию 2000)",
"max_invite_uses": "Максимальное количество использований ссылки-приглашения",
"max_invite_uses_hint": "Максимальное количество использований, которое можно установить для ссылки-приглашения. Администраторы и пользователи с правом управления сервером игнорируют это ограничение. (0 = без ограничений)",
+ "large_server": {
+ "title": "Настройка большого сервера",
+ "hint": "Всё, что нужно большому сообществу, в одном месте. Серверу для друзей и семьи эту страницу можно пропустить.",
+ "relay_title": "Голосовой ретранслятор",
+ "relay_hint": "Обычно каждый участник звонка отправляет голос и видео напрямую всем остальным. Для небольшой компании это работает, но примерно после десяти человек исходящего канала у каждого не хватает. С ретранслятором каждый отправляет данные один раз, на этот сервер, а сервер передаёт их дальше, так что в звонке может быть гораздо больше людей. Используется интернет-канал этого сервера, а не их. Есть одно отличие: прямые звонки идут от человека к человеку, а через ретранслятор проходят через этот сервер, поэтому тот, кто им управляет, в принципе мог бы подслушивать, как и на любом голосовом сервере.",
+ "mode_off": "Выкл.",
+ "mode_off_hint": "Прямые соединения, как всегда. Лучше всего для небольших групп.",
+ "mode_builtin": "Встроенный ретранслятор",
+ "mode_builtin_hint": "Работает внутри Haven. Ничего больше устанавливать не нужно: откройте один порт и включите. Рекомендуется.",
+ "mode_livekit": "LiveKit",
+ "mode_livekit_hint": "Используйте собственный сервер LiveKit для большего контроля. Появится в одном из следующих обновлений.",
+ "port": "Порт",
+ "port_hint": "Откройте порт {{ports}} на роутере или файрволе для UDP и TCP, направив его на этот компьютер.",
+ "docker_hint": "Этот сервер запущен в Docker, поэтому также пробросьте порт {{ports}} для UDP и TCP в docker-compose.yml: нужные строки там есть, они закомментированы.",
+ "address": "Публичный адрес",
+ "address_placeholder": "Определяется автоматически",
+ "address_hint": "Адрес, по которому люди подключаются к ретранслятору: публичный IP-адрес или доменное имя этого сервера. Оставьте пустым, и Haven определит его при запуске ретранслятора. Все участники звонка через ретранслятор видят этот адрес (и, чтобы люди в вашей сети подключались напрямую, локальный адрес сервера), как и на любом голосовом сервере; сервер, скрытый за прокси, от них не скрыт.",
+ "detect": "Определить",
+ "detecting": "Определение...",
+ "detect_failed": "Не удалось определить. Введите вручную.",
+ "workers": "Ядра CPU",
+ "workers_hint": "Одно ядро тянет много звонков. Добавляйте ядра, когда звонки становятся очень большими или многочисленными; каждое дополнительное ядро использует следующий по порядку порт.",
+ "install_hint": "Ретранслятор на этом сервере ещё не установлен. Установка скачивает около 10 МБ, один раз; обновления Haven его сохраняют. Работает на Windows, Linux (включая Raspberry Pi и Docker) и Mac на Apple Silicon.",
+ "install_btn": "Установить ретранслятор",
+ "installing": "Установка...",
+ "installed": "Ретранслятор установлен. Проверьте настройки ниже и нажмите «Сохранить».",
+ "install_failed": "Установка не завершилась: {{error}}",
+ "save": "Сохранить настройки ретранслятора",
+ "save_note": "Применяется сразу. Текущие звонки переподключатся сами.",
+ "saved": "Настройки ретранслятора сохранены",
+ "status_running": "Работает по адресу {{address}}, порт {{ports}}. Сейчас: звонков через ретранслятор: {{calls}}, людей: {{people}}.",
+ "status_starting": "Запуск...",
+ "status_error": "Не работает: {{error}}",
+ "status_off": "Выключен. Звонки используют прямые соединения.",
+ "status_unsaved_on": "Ещё не включён. Нажмите «Сохранить», чтобы запустить.",
+ "status_unsaved_off": "Продолжает работать, пока вы не сохраните.",
+ "more_title": "Что ещё стоит настроить для большого сервера",
+ "open": "Открыть",
+ "item_members": "Список участников",
+ "item_members_hint": "Показывать только участников онлайн, чтобы сервер с тысячами аккаунтов не выводил каждого из них.",
+ "item_signups": "Регистрация",
+ "item_signups_hint": "Капча и лимит новых аккаунтов в час останавливают потоки спам-аккаунтов.",
+ "item_automod": "Автомодерация",
+ "item_automod_hint": "Блокируйте ссылки от совсем новых аккаунтов и автоматически переходите к банам, когда модераторы не могут уследить за всеми каналами.",
+ "item_guests": "Гостевой доступ",
+ "item_guests_hint": "Решите, могут ли люди заходить без аккаунта и можно ли гостям пользоваться голосом.",
+ "item_limits": "Лимиты",
+ "item_limits_hint": "Длина сообщения, размер загрузки и число вложений в сообщении держат хранилище и трафик под контролем.",
+ "item_backup": "Резервные копии и очистка",
+ "item_backup_hint": "Автоматические резервные копии и удаление старых файлов, чтобы диск не заполнился.",
+ "item_turn": "TURN-сервер",
+ "item_turn_hint": "Позволяет людям в очень строгих сетях (некоторые офисы, школы, мобильные операторы) вообще подключаться к голосу."
+ },
+ "connectivity_title": "Голос и подключение",
+ "connectivity_hint": "STUN/TURN-серверы позволяют голосу и демонстрации экрана соединять пользователей в разных сетях. Оставьте пустым, чтобы использовать встроенный пул STUN Haven. Если пользователи вне вашей локальной сети зависают на «ICE: Connecting...», укажите здесь свои серверы.",
+ "ice_disabled": "Отключить STUN/TURN (только прямые соединения)",
+ "ice_disabled_hint": "Используйте для серверов только в локальной сети. Голос и демонстрация экрана будут работать по прямым соединениям в локальной сети; пользователи в разных сетях могут не подключиться.",
+ "stun_urls": "STUN-серверы",
+ "stun_urls_hint": "Один URI stun: на строку (или через запятую). Пусто = встроенные значения по умолчанию.",
+ "turn_url": "TURN-сервер (необязательно)",
+ "turn_username": "Имя пользователя TURN",
+ "turn_password": "Пароль TURN",
+ "test_connectivity_btn": "Проверить голосовое подключение",
+ "test_connectivity_hint": "Проверяет серверы выше так же, как это делает звонок, и простым языком сообщает, что работает, а что нет. Сначала сохраните изменения.",
+ "test_connectivity_running": "Проверка, это займёт несколько секунд...",
+ "test_connectivity_failed": "Не удалось выполнить проверку: {{error}}",
+ "test_server_list_failed": "не удалось прочитать список серверов",
+ "unknown_error": "неизвестная ошибка",
+ "test_none_configured": "STUN- и TURN-серверы не настроены, поэтому Haven использует встроенные.",
+ "test_ok_relay": "Голос должен работать у всех. Люди в разных сетях могут подключаться, а ваш ретранслятор выручит тех, кто не может подключиться напрямую.",
+ "test_ok_stun": "Голос должен работать у большинства людей в разных сетях.",
+ "test_fail_nothing": "Голос будет работать только между людьми в одной локальной сети. Здесь нет ничего, что подсказало бы двум людям в разных сетях, как найти друг друга.",
+ "test_stun_ok": "{{server}} ответил.",
+ "test_stun_dead": "{{server}} не ответил.",
+ "test_turn_ok": "{{server}} успешно выполнил ретрансляцию.",
+ "test_turn_dead": "{{server}} ничего не ретранслировал.",
+ "test_tip_turn": "Ретранслятор, который не отвечает, обычно означает неверный порт, непроброшенный UDP или несовпадающие имя пользователя и пароль.",
+ "test_tip_no_turn": "Ретранслятор не задан. Большинству людей этого хватит, но тем, кто за строгим роутером или в некоторых мобильных сетях, без него подключиться не удастся.",
+ "test_tip_partial": "Работающие серверы подстраховывают нерабочие, поэтому звонки всё равно соединяются, но нерабочие записи стоит удалить или исправить.",
+ "test_caveat": "Проверка выполнена из вашего браузера в вашей сети. Сервер, который отвечает только в вашей локальной сети, пройдёт проверку здесь, но у всех остальных всё равно не заработает.",
+ "turn_hint": "TURN-сервер ретранслирует трафик для пользователей за строгим NAT, к которым одним STUN не подключиться. Нужен, только если после настройки STUN у некоторых пользователей всё ещё не получается подключиться. Имя пользователя и пароль применяются к TURN-серверам со статическими учётными данными.",
+ "env_in_use": "Используется из окружения этого сервера ({{var}}): {{value}}. Если сохранить здесь значение, оно его заменит.",
+ "env_in_use_secret": "Используется из окружения этого сервера ({{var}}). Если сохранить здесь значение, оно его заменит.",
+ "env_overridden": "Это сохранённое значение используется и имеет приоритет над {{var}} в окружении. Очистите поле, чтобы вернуться к переменной окружения.",
+ "env_turn_secret": "{{var}} задана в окружении этого сервера. Она действует, только пока здесь не настроен TURN-сервер.",
"sounds_hint": "Загрузка аудиофайлов для кастомных звуков уведомлений на сервере",
"emojis_hint": "Просмотр, удаление и добавление кастомных графических эмодзи для сервера",
"emojis_upload_hint": "Загрузите изображения для пользовательских эмодзи на сервер (макс. 256 КБ, формат PNG/GIF/WebP). Название должно состоять только из строчных латинских букв и символов подчёркивания (пробелы недопустимы).",
"roles_hint": "Создание и детальная настройка прав ролей. Роли распределяются пользователям через контекстное меню списка участников справа.",
+ "perm_matrix": {
+ "title": "Права",
+ "lead_roles": "Задайте, что может каждая роль. Все, у кого есть роль, получают то, что отмечено в её столбце. Уровень, цвет и значок находятся в разделе «Дополнительные параметры».",
+ "lead_users": "Выдайте человеку роль кнопками вверху. Флажки показывают, что он может делать. Изменение флажка создаёт исключение только для него: оно важнее его ролей и не меняет саму роль.",
+ "level": "Ур. {{level}}",
+ "level_hint": "Ранг роли. Люди могут действовать только с участниками рангом ниже своего, а автомодерация пропускает всех, чей ранг равен порогу исключения или выше него.",
+ "exception_added": "только им",
+ "exception_removed": "отнято у них",
+ "exception_hint": "Отличается от того, что дают его роли. Задано только для этого человека.",
+ "reset_to_roles": "Сбросить до ролей",
+ "channel_role": "Роль в канале",
+ "channel_role_hint": "Выдаётся людям в канале. Отмеченное действует только в тех каналах, где у них есть эта роль.",
+ "save": "Сохранить изменения",
+ "save_count": "Сохранить изменения ({{count}})",
+ "discard": "Отменить",
+ "saved": "Права сохранены",
+ "unsaved_title": "Отменить несохранённые изменения?",
+ "unsaved_body": "Выделенные изменения не сохранены.",
+ "reset_confirm": "Удалить все исключения для {{name}}? Роли останутся, а права будут ровно такими, какие дают эти роли.",
+ "reset_done": "У {{name}} теперь ровно те права, которые дают его роли",
+ "view_roles": "Роли",
+ "view_users": "Пользователи",
+ "permission": "Право",
+ "auto_assign": "Автовыдача",
+ "host": "Хост",
+ "admin": "Админ",
+ "add_role": "Добавить роль",
+ "add_role_hint": "Задайте название роли. Сначала у неё те же возможности, что у роли «Участник».",
+ "remove_role": "Удалить роль",
+ "remove_role_confirm": "Удалить {{name}}? Все, у кого она была, потеряют эти возможности.",
+ "keep_one": "Оставьте хотя бы одну роль, кроме Админа.",
+ "classic": "Дополнительные параметры (уровни, цвета, значки)",
+ "search_users": "Поиск участников…",
+ "no_users": "Подходящих участников нет.",
+ "pick_user": "Выберите участника.",
+ "no_role": "Без роли",
+ "user_is_host": "Это хост. У него уже есть все права.",
+ "user_is_you": "Свои права из этого списка менять нельзя.",
+ "user_hint": "Флажки с пометкой «только им» или «отнято у них» это исключения только для этого человека.",
+ "group_talk": "Общение",
+ "group_moderate": "Модерация",
+ "group_channels": "Каналы",
+ "group_people": "Люди",
+ "group_media": "Медиа",
+ "group_server": "Сервер"
+ },
+ "channel_creator_role_group": "Роль создателя канала",
+ "channel_creator_role_label": "Роль, выдаваемая создателю канала",
+ "channel_creator_role_default": "По умолчанию (высшая роль канала)",
+ "channel_creator_role_none": "Нет",
+ "channel_creator_role_hint": "Когда не-админ, которому разрешено создавать каналы, создаёт канал, он получает эту роль внутри этого канала, чтобы им управлять. На админов это никогда не влияет.",
"bots_hint": "Настройка интеграций и webhook-ботов, способных автоматически слать сообщения в текстовые каналы.",
"import_hint": "Прямой импорт дерева каналов и истории сообщений из бэкап-файлов экспорта Discord",
"modmode_hint": "Позволяет свободно менять порядок разделов боковой панели, закреплять панели сервера, чата и статуса",
"no_banned_users": "Список заблокированных пуст",
"no_reason": "Причина не указана",
"unban_btn": "Разблокировать",
+ "ban_appeal_label": "Апелляция",
+ "dismiss_appeal_btn": "Отклонить апелляцию",
+ "dismiss_appeal_title": "Убрать эту апелляцию без разбана",
"delete_user_title": "Удалить пользователя",
"confirm_delete_user": "⚠️ Вы уверены, что хотите навсегда удалить пользователя {{name}}? Это действие абсолютно необратимо.",
"no_deleted_users": "Нет удалённых пользователей",
@@ -971,11 +2878,18 @@
"joined_date": "Присоединился: {{date}}",
"channel_count_one": "{{count}} канал",
"channel_count_other": "{{count}} каналов",
+ "storage_public": "{{size}} в каналах",
+ "storage_private": "{{size}} в ЛС",
+ "storage_profile": "{{size}} в аватарах",
+ "storage_tooltip": "Загрузки, оставшиеся на сервере: файлов {{files}} ({{breakdown}}). Вложения в ЛС зашифрованы, поэтому известен только их размер.",
+ "storage_summary": "Загрузок на диске: {{total}}, файлов: {{files}}.",
+ "storage_summary_unattributed": "{{size}} из этого появилось до учёта по участникам и не имеет записанного владельца.",
"already_in_all_channels": "{{name}} уже состоит во всех каналах сервера",
"not_in_any_channels": "{{name}} не добавлен ни в один канал",
"picker_add_title": "Добавить {{name}} в каналы",
"picker_remove_title": "Исключить {{name}} из каналов",
"select_all": "Выбрать все",
+ "filter_channels": "Фильтр каналов…",
"picker_confirm_add": "Добавить",
"picker_confirm_remove": "Удалить",
"select_channel_warning": "Выберите хотя бы один канал из списка",
@@ -1008,16 +2922,8 @@
"import_skipped": "Пропущено {{count}} обнаруженных дубликатов.",
"import_reused": "Обновлена история для {{count}} уже существовавших каналов.",
"import_failed_alert": "Критическая ошибка импорта: {{error}}",
- "invite_links": {
- "copy_email_card": "Копировать карточку приглашения для электронной почты",
- "email_card_copied": "Карточка приглашения скопирована!",
- "email_card_copy_failed": "Не удалось скопировать карточку!",
- "card_invited": "Вас приглашают присоединиться к {{server}}!",
- "card_register": "Нажмите кнопку ниже, чтобы зарегистрироваться!",
- "card_join": "Присоединиться к {{server}}",
- "card_copy_link": "Или скопируйте эту ссылку:",
- "card_expires": "Это приглашение действительно до {{date}}."
- },
+ "import_write_progress": "Запись сообщений: {{done}} из {{total}}",
+ "import_write_partial": "Записано сообщений до остановки: {{count}}. Запустите импорт ещё раз, чтобы завершить его; сообщения, которые уже есть в Haven, пропускаются.",
"roles_no_custom": "На сервере пока нет кастомных ролей",
"roles_level_invalid": "Уровень иерархии роли должен находиться в диапазоне от 0 до 99",
"roles_create_title": "Создание новой роли",
@@ -1043,6 +2949,7 @@
"roles_no_channels": "Доступные каналы не найдены",
"roles_grant": "Разрешить",
"roles_revoke": "Запретить",
+ "roles_no_members_found": "Участники не найдены",
"roles_no_members": "В данном канале нет участников",
"roles_no_roles": "Роли отсутствуют",
"roles_no_assigned": "Пользователю не назначено ни одной роли",
@@ -1075,6 +2982,12 @@
"roles_pending_edit": "Отредактировано",
"roles_undo": "Отменить",
"roles_remove": "Удалить",
+ "roles_assign": "Назначить",
+ "roles_owner_only": "Только владелец",
+ "roles_permission_unavailable": "У вас нет этого права",
+ "roles_add_user_channel": "+ Добавить пользователя в канал…",
+ "roles_user_every_channel": "Пользователь состоит во всех каналах",
+ "roles_cannot_grant_level": "Нельзя выдать роль вашего уровня или выше",
"roles_discard": "Сбросить изменения",
"roles_collapse": "Свернуть",
"roles_configure": "Настроить",
@@ -1083,13 +2996,28 @@
"roles_no_addable": "Больше нет доступных для добавления ролей",
"roles_none": "Матрица ролей сервера пока пуста.",
"roles_multi_hint": "Пользователи могут одновременно обладать несколькими ролями в рамках одной области видимости. Итоговые разрешения представляют собой математическое объединение (union) всех имеющихся у них прав; цвет отображения никнейма определяется наивысшей по уровню иерархии ролью.",
+ "roles_copy_name": "{{name}} (копия)",
+ "roles_duplicate_title": "Дублировать роль",
+ "roles_duplicate_prompt": "Название для копии роли:",
+ "roles_duplicated_as": "Создана копия «{{name}}»",
+ "roles_scope_channel": "Канал",
+ "roles_scope_server": "Сервер",
"role_form": {
"name": "Название роли",
"level": "Уровень (0–99)",
"color": "Цвет отображения",
+ "gradient": "Градиент",
+ "gradient_end": "Конечный цвет",
+ "shimmer": "Мерцание",
+ "gradient_hint": "Градиент окрашивает имена от цвета выше до конечного цвета. Мерцание медленно перемещает цвета вдоль имени (у тех, кто включил уменьшение движения, оно остаётся неподвижным).",
+ "style_preview": "Предпросмотр",
+ "style_preview_name": "Название роли",
+ "transparent": "Прозрачная",
+ "transparent_hint": "Если включено, эта роль никогда не окрашивает имена тех, у кого она есть. Цвет им задаст следующая по порядку роль, которая не прозрачна, а если такой нет, имя останется без цвета.",
"auto_assign": "Автоматически выдавать новым участникам",
"auto_assign_hint": "Все регистрирующиеся или впервые заходящие на сервер пользователи будут автоматически получать данную роль.",
"channel_access": "Доступы к каналам",
+ "channel_access_hint": "Какие каналы открывает роль, задаётся в самом канале: правый клик по нему, Функции канала, Необходимые роли. Наличие ролей означает членство: человек попадает в канал, получив роль, и выходит из него, потеряв её.",
"link_channel_access": "Связать видимость каналов напрямую с этой ролью",
"link_channel_access_hint": "Если включено, выдача или отзыв этой роли у пользователя будут автоматически добавлять или удалять его из участников соответствующих каналов.",
"reapply_access": "Синхронизировать доступы для всех текущих обладателей",
@@ -1097,38 +3025,84 @@
"permissions": "Специфические права",
"admin_only_note": "Выделенные права доступны только администраторам — только владелец сервера может их предоставлять.",
"level_0_role_note": "Роли уровня 0 называются «Группами». Группы не предоставляют никаких прав. Пользователи могут свободно вступать в эти группы без повышенных прав. Возможные варианты использования: назначение каналов, группировка и ролевая игра.",
- "delete": "Удалить роль"
+ "readonly_note": "Эта роль вашего уровня или выше ({{level}}). Вы можете её просматривать, но изменять её может только тот, чей ранг выше.",
+ "icon": "Значок роли",
+ "icon_none": "Нет",
+ "icon_hint": "Значок рядом с названием роли (автоматически уменьшается до 16×16). Макс. 512 КБ.",
+ "icon_too_large": "Значок должен быть меньше 512 КБ",
+ "icon_uploaded_role": "Значок загружен. Сохраните роль, чтобы применить",
+ "icon_removed_role": "Значок удалён. Сохраните роль, чтобы применить",
+ "permissions_held_only": "Можно менять только те права, которые есть у вас",
+ "members": "Участники",
+ "duplicate": "Дублировать",
+ "delete": "Удалить роль",
+ "upload_cap": "Лимит загрузки (МБ)",
+ "upload_cap_placeholder": "По умолчанию на сервере ({{mb}} МБ)",
+ "upload_cap_hint": "Увеличьте размер загрузки для людей с этой ролью. Пусто оставляет общий лимит сервера; из ролей пользователя действует наибольший лимит."
+ },
+ "ferry_title": "Ferry (мост с Discord)",
+ "ferry_hint": "Пересылает сообщения между каналами Haven и каналами Discord. Нужен ваш собственный бот Discord, его создание занимает около двух минут.",
+ "manage_ferry_btn": "Настроить Ferry",
+ "ferry_not_configured": "Не настроено",
+ "role_templates": {
+ "hint": "Выберите заготовку. Её можно переименовать и изменить любое право потом.",
+ "member": "Участник",
+ "member_desc": "Чат, загрузки, голос и история. Обычная роль для всех.",
+ "blank": "Пустая",
+ "blank_desc": "Ни одно право не отмечено. Соберите роль сами.",
+ "moderator": "Модератор",
+ "moderator_desc": "Удаление, закрепление, заглушение, исключение и бан, управление каналами и повышение участников.",
+ "helper": "Помощник",
+ "helper_desc": "Наводит порядок в чате: удаляет сообщения низших, закрепляет, заглушает, задаёт темы, ведёт временные каналы.",
+ "trusted": "Доверенный участник",
+ "trusted_desc": "Всё, что умеет участник, плюс приглашения, временные каналы и очередь музыки.",
+ "event_host": "Ведущий событий",
+ "event_host_desc": "Упоминание всех, временные каналы, темы, музыка и панель звуков.",
+ "media_poster": "Публикатор медиа",
+ "media_poster_desc": "Участник с лимитом загрузки 100 МБ.",
+ "group": "Группа",
+ "group_desc": "Уровень 0, без прав: метка, которую люди могут взять сами из меню ролей.",
+ "perm_count": "Прав: {{count}}",
+ "no_perms": "нет прав"
+ },
+ "role_menu": {
+ "post": "Опубликовать меню ролей",
+ "hint": "Публикует сообщение со списком ролей, у каждой своё эмодзи. Реакция этим эмодзи или нажатие кнопки под ним выдаёт читателю роль; отмена забирает её обратно.",
+ "channel": "Канал",
+ "title_label": "Заголовок",
+ "title_placeholder": "Выберите свои роли",
+ "emoji": "Эмодзи для реакции",
+ "pick_one": "Отметьте хотя бы одну роль",
+ "posted": "Меню ролей опубликовано",
+ "edit": "Изменить меню ролей",
+ "content_label": "Текст сообщения",
+ "content_hint": "Измените текст сообщения как хотите. Список ниже это то, что люди могут выбрать: снимите галочку с роли, чтобы убрать её из меню вместе с её кнопкой.",
+ "updated": "Меню ролей обновлено",
+ "gone": "Это меню ролей удалено",
+ "max_picks_label": "Сколько ролей может выбрать каждый",
+ "max_picks_hint": "0 позволяет брать любое количество. При значении 1 выбор другой роли заменяет прежнюю."
}
},
- "extension_updates": {
- "operation_failed": "Не удалось выполнить операцию с расширением.",
- "checking": "Проверка выпусков и списка блокировки безопасности…",
- "check_complete": "Проверка завершена. Обновления применяются ко всем пользователям этого экземпляра.",
- "no_sources": "Ни одно установленное расширение не указывает репозиторий обновлений.",
- "rollback_title": "Откатить расширение",
- "rollback_notes": "Восстановить предыдущую версию, сохранённую на этом сервере.",
- "update_title": "Обновить расширение",
- "plugin_warning": "Плагины выполняют JavaScript внутри Haven и могут получать доступ к сообщениям или действовать от вашего имени. Устанавливайте только доверенный код. Файл будет заменён для всех пользователей этого экземпляра.",
- "theme_warning": "Темы могут изменять или скрывать элементы управления и загружать внешние ресурсы. Устанавливайте только доверенные темы. Файл будет заменён для всех пользователей этого экземпляра.",
- "no_notes": "Примечания к выпуску отсутствуют.",
- "rollback": "Откатить",
- "update": "Я понимаю, обновить",
- "no_updates": "Более новый совместимый, незаблокированный и неизменяемый выпуск не найден.",
- "installing": "Проверка и установка…",
- "updated": "Расширение обновлено. Перезагрузите страницу, чтобы применить изменение. Ваш выбор не изменился.",
- "installed_flagged": "Установленная версия отмечена: {{reason}}",
- "blocked_update": "Заблокированное обновление: {{reason}}",
- "review_rollback": "Проверить откат до {{version}}",
- "review_update": "Проверить обновление до {{version}}",
- "title": "Обновления расширений",
- "summary": "Проверьте наличие новых выпусков поддерживаемых плагинов и тем в указанных ими репозиториях GitHub.",
- "check": "Проверить обновления",
- "release_link": "Посмотреть выпуск на GitHub",
- "reload_notice": "Расширения изменились. Перезагрузите страницу, чтобы применить их; ваш выбор не изменился.",
- "reload": "Перезагрузить"
- }
+ "nsfw": {
+ "hide": "Скрывать NSFW-каналы",
+ "hide_hint": "Каналы, помеченные админом 🔞, пропадают из вашей боковой панели, а темы форума с 🔞 пропадают из форума, пока вы не отключите эту настройку. Удобно на телефоне в общественном месте.",
+ "blur": "Размывать NSFW-темы и сообщения до нажатия",
+ "blur_hint": "Темы и сообщения с пометкой 🔞 скрыты размытием, как спойлер. Отключите, чтобы видеть их сразу."
+ },
+ "search_placeholder": "Поиск по настройкам (Ctrl+F)"
},
"modals": {
+ "timezone": {
+ "title": "Время и часовой пояс",
+ "desc": "Задайте здесь предпочтительный часовой пояс и формат. Эти настройки сохраняются в вашем аккаунте и используются на всех ваших устройствах. Ваш часовой пояс никому из пользователей не раскрывается.",
+ "zone_label": "Часовой пояс",
+ "format_label": "Формат времени",
+ "format_12": "12-часовой",
+ "format_24": "24-часовой",
+ "preview_label": "Так будет выглядеть время",
+ "erase": "Сбросить",
+ "confirm": "Подтвердить"
+ },
"common": {
"cancel": "Отмена",
"save": "Сохранить",
@@ -1137,8 +3111,63 @@
"back": "← Назад",
"loading": "Загрузка данных...",
"confirm": "Подтвердить",
+ "warning": "Предупреждение",
"dismiss": "Отклонить",
- "ok": "ОК"
+ "ok": "ОК",
+ "copy": "Копировать",
+ "copied": "Скопировано",
+ "copy_failed": "Не удалось скопировать",
+ "got_it": "Понятно"
+ },
+ "admin_reset_pw": {
+ "title": "Сброс пароля",
+ "confirm_prompt": "Создать одноразовый временный пароль для {username}?",
+ "dm_warning_title": "История зашифрованных ЛС будет потеряна",
+ "dm_warning_body": "Ключ-обёртка E2E пользователя выводится из его пароля. Как только он завершит обязательную смену пароля на новый, его зашифрованная история ЛС станет для него навсегда нечитаемой. Пользователь может этого избежать, войдя со своим прежним паролем (мы храним его как запасной вариант) вместо временного: это незаметно отменит сброс.",
+ "mfa_required_title": "Требуется двухфакторная аутентификация",
+ "mfa_required_body": "Прежде чем админ сможет сбросить пароль, у этого пользователя должна быть включена 2FA. Иначе одного временного пароля хватило бы, чтобы завладеть аккаунтом. Если 2FA не включена, действие завершится понятной ошибкой.",
+ "mfa_blocked_prompt": "Это не ошибка. Чтобы сбросить пароль пользователя {username}, ему сначала нужно включить двухфакторную аутентификацию (2FA) в своём аккаунте: Настройки → Аккаунт.",
+ "mfa_blocked_why_title": "Почему это необходимо",
+ "mfa_blocked_why_body": "При сбросе админом выдаётся временный пароль. Без 2FA одного этого пароля хватило бы любому, кто его увидит (включая недобросовестного админа), чтобы завладеть аккаунтом. Требование 2FA делает временный пароль бесполезным без устройства с приложением аутентификации.",
+ "mfa_blocked_action": "Попросите {username} включить 2FA и затем повторите сброс.",
+ "transmit_hint": "Временный пароль будет показан один раз. Передайте его пользователю другим способом (лично, по телефону и т. д.). Повторно он показан не будет.",
+ "confirm_btn": "Создать временный пароль",
+ "working": "Выполняется...",
+ "reveal_title": "Временный пароль создан",
+ "reveal_prompt": "Одноразовый временный пароль для {username}:",
+ "reveal_warning_title": "Сохраните это сейчас",
+ "reveal_warning_body": "Этот пароль больше не будет показан. Передайте его пользователю другим способом. При следующем входе его заставят сменить пароль (или он может войти с прежним паролем, чтобы отменить сброс и сохранить историю ЛС).",
+ "errors": {
+ "generic": "Не удалось сбросить пароль"
+ }
+ },
+ "bulk_cleanup": {
+ "title": "Массовая очистка аккаунтов",
+ "intro": "Отфильтруйте недавно созданные или неактивные аккаунты и удалите всю группу сразу. Админы, вы сами и все, у кого есть назначенная роль, всегда исключаются. Сначала выполните предпросмотр, чтобы точно увидеть, кто подходит.",
+ "joined_within": "Зарегистрировались за последние",
+ "hours": "ч.",
+ "zero_messages": "Только аккаунты, не отправлявшие ни одного сообщения",
+ "new_only": "Только аккаунты с пометкой «Новый» (зарегистрированы за последние 7 дней)",
+ "scrub_messages": "Также удалить все опубликованные ими сообщения",
+ "ban_ip": "Также заблокировать их недавние IP-адреса",
+ "ban_ip_hint": "Может затронуть общие адреса и CGNAT; используйте осторожно.",
+ "preview_btn": "Предпросмотр",
+ "remove_btn": "Бан + удаление",
+ "remove_n_btn": "Бан + удаление: {n}",
+ "need_filter": "Сначала выберите хотя бы один фильтр.",
+ "no_match": "Нет аккаунтов, подходящих под эти фильтры.",
+ "match_count": "Подходящих аккаунтов: {n}.",
+ "capped": "показаны первые 2000",
+ "and_more": "...и другие",
+ "msgs": "сообщ.: {n}",
+ "has_activity": "Этот аккаунт публиковал сообщения, скорее всего это настоящий пользователь",
+ "select_all": "Все",
+ "select_none": "Никто",
+ "vet_hint": "Все отмеченные аккаунты будут удалены. Снимите галочки с тех, кого хотите оставить; флажок отмечает аккаунты, публиковавшие сообщения.",
+ "confirm": "Навсегда заблокировать и удалить аккаунтов: {n}? Это нельзя отменить.",
+ "working": "Выполняется...",
+ "failed": "Не удалось выполнить очистку.",
+ "done": "Удалено аккаунтов: {n}."
},
"recovery_notice": {
"title": "Резервные коды восстановления доступа",
@@ -1164,6 +3193,7 @@
"channel_name_label": "Название канала:",
"channel_name_placeholder": "Например: общий, флудилка, игры",
"channel_name_hint": "Вы сможете создавать новые каналы и категории в любое время прямо из панели сайдбара.",
+ "channel_created": "Канал создан!",
"invite_code": "Инвайт-код канала:",
"copy_btn": "Копировать",
"share_hint": "Отправьте этот код друзьям, чтобы они смогли беспрепятственно зайти в этот канал.",
@@ -1179,6 +3209,8 @@
"check_port_skipped": "Проверка сетевого порта пропущена пользователем",
"how_friends_join": "Инструкция по подключению для друзей:",
"step_browser": "Они открывают в браузере ваш адрес: {{url}}",
+ "step_browser_prefix": "Они открывают",
+ "step_browser_suffix": "в своём браузере",
"step_cert": "Игнорируют предупреждение безопасности самоподписанного сертификата, нажав «Дополнительно» → «Перейти»",
"step_register": "Проходят быструю регистрацию, придумав логин и надежный пароль",
"step_code": "Вводят инвайт-код канала, которым вы с ними поделились",
@@ -1235,7 +3267,9 @@
"icon_label": "Прямой URL-адрес иконки",
"icon_optional": "(необязательный параметр)",
"auto_icon": "Автоматически подтянуть аватарку со стороннего сервера",
- "add_btn": "Подключить сервер"
+ "add_btn": "Подключить сервер",
+ "address_placeholder": "напр. https://192.168.1.5:3000",
+ "icon_placeholder": "https://... или оставьте пустым"
},
"edit_profile": {
"title": "Редактировать профиль",
@@ -1243,20 +3277,71 @@
"upload_btn": "Загрузить",
"clear_btn": "Удалить",
"avatar_hint": "Поддерживаются форматы JPG, PNG, анимированный GIF, WebP. Вес до 2 МБ.",
+ "avatar_edit_animated": "Анимированные изображения нельзя редактировать.",
+ "border_title": "Рамка",
+ "border_hint": "JPG, PNG, GIF (анимированный!), WebP · Вес до 2 МБ",
+ "crop_btn": "Обрезать",
+ "edit_btn": "Изменить",
+ "animate_title": "Анимированный профиль",
+ "animate_trigger": "По наведению",
+ "animate_disabled": "Отключено",
+ "animate_learn_more": "Подробнее",
+ "animate_note_intro": "Определяет, как анимации в вашем профиле будут выглядеть для всех пользователей Haven. Относится и к аватару, и к рамке, если вы загрузили анимированное изображение, например GIF или APNG.",
+ "animate_note_trigger": "По наведению: анимации в вашем профиле воспроизводятся по кругу, когда пользователь наводит курсор на ваше сообщение или открывает вашу карточку профиля.",
+ "animate_note_disabled": "Отключено: анимации в вашем профиле полностью отключены. Уже загруженные в профиль анимированные изображения остаются нетронутыми, но в профиле показывается только первый кадр изображения.",
"shape_title": "Форма обрезки",
+ "shape_circle": "Круг",
+ "shape_rounded": "Скруглённый",
+ "shape_squircle": "Сквиркл",
+ "shape_hexagon": "Шестиугольник",
+ "shape_diamond": "Ромб",
"display_name_desc": "Разрешены буквы, цифры, пробелы и символы подчёркивания (длина 2–20 знаков)",
"display_name_label": "Отображаемое имя (Никнейм)",
"display_name_placeholder": "Введите новое имя...",
"bio_label": "О себе (Биография)",
"bio_max": "(максимум 190 символов)",
"bio_placeholder": "Расскажите участникам что-нибудь о себе…",
+ "birthday_label": "День рождения",
+ "birthday_hint": "День рождения можно указать только один раз, поэтому проверьте его.",
+ "birthday_set_note": "Ваш день рождения указан и не может быть изменён.",
+ "birthday_hide": "Скрыть мой день рождения",
+ "birthday_hide_year": "Скрыть год рождения",
"groups_title": "Группы",
"manage_groups_btn": "Управление группами",
"save_groups_btn": "Сохранить группы",
"groups_hint": "Группы отображаются как роли в вашей карточке профиля. Они не предоставляют прав, но могут предоставлять доступ к каналам!",
"no_groups": "Вы ещё не состоите ни в одной группе. Нажмите «Управление группами», чтобы присоединиться к группе.",
"groups_saved": "Группы сохранены!",
- "group_channels_granted": "Предоставленный доступ к каналам"
+ "group_channels_granted": "Предоставленный доступ к каналам",
+ "personas_title": "👥 Персоны",
+ "add_persona": "+ Добавить персону",
+ "personas_hint": "Введите в чате ::Имя ваше сообщение, чтобы отправить его от имени этой персоны (или выберите из подсказки, которая появляется, когда сообщение начинается с ::). Ваш настоящий аккаунт остаётся связанным для модерации."
+ },
+ "border_crop": {
+ "title": "Редактирование",
+ "mode_crop": "Обрезка",
+ "mode_move": "Перемещение",
+ "mode_distort": "Искажение",
+ "mode_resize": "Масштаб",
+ "mode_rotate": "Поворот",
+ "mode_opacity": "Прозрачность",
+ "history_title": "Правки",
+ "autocrop": "Обрезать невидимые пиксели",
+ "lock_sides": "Связать стороны",
+ "lock_sides_hint": "Обрезать со всех сторон поровну",
+ "crop_top": "Обрезка сверху",
+ "crop_right": "Обрезка справа",
+ "crop_bottom": "Обрезка снизу",
+ "crop_left": "Обрезка слева",
+ "distort_corner": "Искажение угла",
+ "anchor_label": "Точка масштабирования",
+ "anchor_center": "Центр",
+ "anchor_corner": "Угол",
+ "exceeds_frame": "Рамка выходит за пределы аватара, изменения отменены",
+ "no_edits": "Правок пока нет",
+ "undo": "Отменить эту и последующие правки",
+ "discard": "Отменить",
+ "reset": "Сбросить"
},
"admin_action": {
"title": "Модерация пользователя",
@@ -1275,10 +3360,17 @@
"desc_kick": "Пользователь будет принудительно удалён из участников выбранного канала.",
"desc_ban": "Пользователь получит вечный бан на сервере и не сможет зайти, пока его не разблокируют вручную.",
"desc_mute": "Пользователю будет заблокирована возможность отправки сообщений на указанный промежуток времени.",
- "desc_delete_user": "Аккаунт пользователя будет стёрт из базы навсегда, а его имя пользователя (логин) мгновенно освободится для регистрации."
+ "desc_delete_user": "Аккаунт пользователя будет стёрт из базы навсегда, а его имя пользователя (логин) мгновенно освободится для регистрации.",
+ "purge_label": "Заменить сообщения заглушкой",
+ "purge_message_label": "Текст замены (необязательно)",
+ "purge_message_placeholder": "Пользователь заблокирован.",
+ "purge_hint": "Заменяет сообщения пользователя текстом-заглушкой вместо удаления. По умолчанию: «Пользователь заблокирован.»",
+ "ban_ip_label": "Также заблокировать недавние IP-адреса",
+ "ban_ip_hint": "Блокирует до 5 последних IP-адресов этого пользователя. Внимание: блокировка по IP может затронуть других пользователей в той же сети (CGNAT, VPN, школа или работа). Требуется право «ban_ip»."
},
"organize": {
"title": "Упорядочивание элементов",
+ "server_default": "По умолчанию на сервере",
"back_btn": "← Назад",
"back_title": "Вернуться к основному списку каналов",
"sort_label": "Принцип сортировки:",
@@ -1319,6 +3411,39 @@
"title": "Переименовать канал",
"prompt": "Переименование канала #{{name}}:\nВведите новое название:"
},
+ "role_gate_notice": {
+ "title": "Доступ к каналам теперь работает иначе",
+ "p1": "У ролей больше нет списка каналов, которые они выдают или отбирают. Теперь каждый канал сам определяет, какие роли его открывают: правый клик по каналу, Функции канала, Необходимые роли. Все, у кого есть эти роли, попадают в канал в момент получения роли и выходят из него в момент её потери.",
+ "p2": "Ничего из настроенного вами не потеряно. Каналы, которые роль раньше выдавала, преобразованы в «Необходимые роли» этих каналов, так что те же люди по-прежнему имеют доступ. Люди, которых вы добавили в канал вручную, остаются на месте.",
+ "p3": "Это видят только админы и только один раз.",
+ "ok": "Понятно"
+ },
+ "schedule": {
+ "title": "Отправить позже",
+ "hint": "Сообщение ждёт на сервере и уходит в выбранное время, независимо от того, в сети вы или нет. Недоступно в личных сообщениях.",
+ "message_label": "Сообщение",
+ "when_label": "Отправить в",
+ "schedule_btn": "Запланировать",
+ "pending": "Ожидает отправки",
+ "none": "Ничего не ожидает.",
+ "cancel_send": "Отмена",
+ "in_past": "Выберите время минимум через минуту",
+ "not_here": "Отложенная отправка недоступна в личных сообщениях",
+ "scheduled": "Запланировано на {{when}}",
+ "updated": "Обновлено, отправка в {{when}}",
+ "sent": "Ваше отложенное сообщение отправлено в #{{channel}}"
+ },
+ "self_destruct": {
+ "title": "Самоуничтожающееся сообщение",
+ "hint": "Это сообщение и все его вложения будут автоматически удалены в указанное ниже время. Как и любое удалённое сообщение, его вложения ещё недолго может восстановить админ.",
+ "amount_label": "Через какое время удалить",
+ "unit_label": "Единица",
+ "minutes": "Минуты",
+ "hours": "Часы",
+ "preview": "Удалится через {{time}}",
+ "invalid": "Введите время от 30 секунд до 24 часов.",
+ "send": "Отправить"
+ },
"poll": {
"title": "Создать опрос",
"question_label": "Суть опроса / Вопрос",
@@ -1328,7 +3453,30 @@
"multi_vote": "Разрешить выбор нескольких вариантов (множественный выбор)",
"anonymous": "Анонимное голосование (скрыть имена проголосовавших)",
"create_btn": "Запустить опрос",
- "remove_option": "Удалить"
+ "remove_option": "Удалить",
+ "option_placeholder": "Вариант {{number}}",
+ "add_image": "Добавить картинку к этому варианту",
+ "remove_image": "Убрать картинку",
+ "columns": "Столбцы",
+ "columns_auto": "По одному в строке",
+ "option_1": "Вариант 1",
+ "option_2": "Вариант 2"
+ },
+ "time": {
+ "date_label": "Дата",
+ "time_label": "Время",
+ "year": "Год",
+ "month": "Месяц",
+ "day": "День",
+ "hour": "Час",
+ "minute": "Минута",
+ "second": "Секунда",
+ "calendar": "Открыть календарь",
+ "clock_mode": "Формат часов",
+ "hour_24": "24 ч",
+ "am": "AM",
+ "pm": "PM",
+ "insert_btn": "Вставить"
},
"sub_panel": {
"title": "Подписки на подканалы",
@@ -1343,7 +3491,9 @@
"temporary_label": "Сделать временным",
"temporary_hint": "(подканал автоматически удалится, как только из него выйдут все люди)",
"hours": "часов",
+ "hours_placeholder": "Часы",
"admin_note": "Обратите внимание: администрация сервера имеет беспрепятственный доступ абсолютно ко всем каналам, включая строго приватные.",
+ "tag_label": "Тег (необязательно)",
"create_btn": "Создать подканал"
},
"webhook": {
@@ -1369,9 +3519,12 @@
"title": "Активности"
},
"game_overlay": {
+ "game": "Игра",
"volume_label": "Громкость звука в игре",
"popout_btn": "В отдельное окно",
- "close_btn": "✕ Закрыть"
+ "popout_title": "Открыть в новом окне",
+ "close_btn": "✕ Закрыть",
+ "close_title": "Закрыть игру"
},
"push_error": {
"title": "Push-уведомления недоступны в этой системе",
@@ -1468,9 +3621,14 @@
"group_builtin": "Встроенные (системные)",
"group_custom": "Пользовательские (кастомные)",
"preview_btn": "Прослушать",
+ "volume_label": "Громкость для {{name}}",
+ "volume_hint": "Насколько громко этот звук играет на панели звуков для всех в звонке.",
+ "volume_failed": "Не удалось сохранить громкость",
"builtin_locked_title": "Это системный встроенный звук — его нельзя переименовать или удалить",
"rename_btn": "Переименовать",
- "delete_btn": "Удалить"
+ "delete_btn": "Удалить",
+ "show_hidden": "Показать скрытые",
+ "list_view": "Вид списком"
},
"emoji_mgmt": {
"title": "Управление эмодзи сервера",
@@ -1478,7 +3636,10 @@
"upload_btn": "Загрузить эмодзи",
"no_emojis": "На сервер еще не загружали кастомные эмодзи",
"crop_applied": "Кадрирование успешно применено — файл готов к отправке на сервер",
- "adjust_btn": "Настроить обрезку"
+ "adjust_btn": "Настроить обрезку",
+ "bulk_title": "Выберите несколько изображений (названия создаются автоматически из имён файлов)",
+ "bulk_upload": "Массовая загрузка",
+ "recrop_title": "Открыть обрезку снова"
},
"sticker_mgmt": {
"title": "Управление стикерами сервера",
@@ -1486,12 +3647,26 @@
"name_placeholder": "имя_стикера (необязательно)",
"pack_placeholder": "Название набора (необязательно)",
"upload_btn": "Загрузить стикер",
- "no_stickers": "На сервере пока нет загруженных стикеров"
+ "no_stickers": "На сервере пока нет загруженных стикеров",
+ "bulk_title": "Выберите несколько изображений (названия создаются автоматически из имён файлов; необязательный набор применяется ко всем)"
},
"emoji_crop": {
"title": "Кадрирование эмодзи",
"hint": "Перетаскивайте картинку мышью для позиционирования • Ползунок внизу меняет масштаб",
- "confirm_btn": "Использовать этот вариант обрезки"
+ "confirm_btn": "Использовать этот вариант обрезки",
+ "zoom_out": "Уменьшить",
+ "zoom_in": "Увеличить"
+ },
+ "external_link": {
+ "title": "Внешняя ссылка",
+ "about_to_visit": "Вы собираетесь перейти на:",
+ "trust_warning": "Убедитесь, что вы доверяете этой ссылке, прежде чем продолжить.",
+ "open": "Открыть ссылку"
+ },
+ "risky_download": {
+ "title": "Потенциально опасный файл",
+ "warning_html": "Файлы .{{ext}} могут быть опасны и навредить вашему устройству, если они получены из ненадёжного источника. Скачивайте его, только если доверяете отправителю.",
+ "download_anyway": "Всё равно скачать"
},
"bans": {
"title": "Заблокированные пользователи"
@@ -1507,13 +3682,16 @@
"filter_online": "В сети",
"filter_offline": "Не в сети",
"filter_new": "Новые (за 7 дней)",
- "filter_banned": "В бане"
+ "filter_banned": "В бане",
+ "filter_storage": "Больше всего места занято"
},
"role_management": {
"title": "Менеджер ролей",
"new_role_btn": "+ Создать роль",
"select_to_edit": "Выберите роль из списка для редактирования",
- "groups_label": "Группы"
+ "groups_label": "Группы",
+ "members_scope_hint": "Только назначение на всём сервере. Для ролей в отдельных каналах используйте меню назначения ролей в управлении участниками.",
+ "search_members": "Поиск участников…"
},
"assign_role": {
"title": "Выдать роль",
@@ -1521,8 +3699,10 @@
"select_role": "-- Выберите роль --",
"scope_label": "Область действия роли",
"scope_hint": "Глобальная роль («На весь сервер») активна во всех комнатах. Локальная роль («Для конкретного канала») работает исключительно внутри него.",
+ "role_hint_multi": "У пользователя может быть несколько ролей. Его итоговые права это объединение прав всех его ролей, а цвет отображаемого значка берётся от высшей роли.",
"server_wide": "🌐 На весь сервер",
- "assign_btn": "Назначить роль участнику"
+ "assign_btn": "Назначить роль участнику",
+ "assignable_roles": "Доступные для назначения роли"
},
"role_assign_center": {
"title": "Центр распределения ролей",
@@ -1543,9 +3723,13 @@
"note": "Вы больше не сможете самостоятельно отменить это решение или вернуть права назад без согласия нового владельца.",
"password_label": "Введите ваш текущий пароль для подтверждения легитимности операции",
"password_placeholder": "Ваш текущий пароль от аккаунта",
+ "totp_label": "Введите код из приложения аутентификации для подтверждения",
+ "totp_placeholder": "6-значный код",
"confirm_btn": "Я полностью осознаю риски, передать права администратора",
"error_required": "Ввод пароля является строго обязательным.",
- "transferring": "Перезапись владельца в базе данных…"
+ "error_totp_required": "Требуется код из приложения аутентификации.",
+ "transferring": "Перезапись владельца в базе данных…",
+ "success": "Права админа переданы"
},
"bot_mgmt": {
"title": "Управление ботами и интеграциями",
@@ -1595,6 +3779,22 @@
"drop_text": "Перетащите архив сюда или ",
"browse_link": "выберите его на диске",
"connect_hint": " Haven может подключиться к Discord напрямую через ваш токен и выкачать переписку — без использования стороннего софта.",
+ "ferry_title": "🛶 Использовать вашего бота Ferry (рекомендуется)",
+ "ferry_desc": "Ваш бот Ferry сам прочитает историю. Ничего вставлять не нужно, и это в рамках правил Discord. Он может импортировать все каналы, которые видит в Discord.",
+ "ferry_btn": "Использовать моего бота Ferry",
+ "ferry_missing": "Ferry на этом сервере ещё не настроен. Это занимает около двух минут, и делается один раз.",
+ "ferry_setup_link": "Настроить Ferry",
+ "personal_summary": "Или войти личным аккаунтом Discord (не рекомендуется)",
+ "skipped_channels": "Пропущено, потому что Discord не позволил их прочитать: {{names}}",
+ "skipped_channels_ferry": "Пропущено, потому что Ferry их не видит: {{names}}. В Discord добавьте роль бота в эти каналы с правами «Просмотр канала» и «Читать историю сообщений».",
+ "channel_hidden": "Ferry не видит этот канал. В Discord добавьте в него роль бота.",
+ "channels_hidden_one": "{{count}} канал затемнён, потому что Ferry его не видит. В Discord добавьте в него роль бота с правами «Просмотр канала» и «Читать историю сообщений», затем выберите сервер снова.",
+ "channels_hidden_other": "Каналов затемнено: {{count}}, потому что Ferry их не видит. В Discord добавьте в каждый из них роль бота с правами «Просмотр канала» и «Читать историю сообщений», затем выберите сервер снова.",
+ "risk_title": "⚠️ Сначала прочитайте это",
+ "risk_rules": "Здесь используется токен вашего личного входа в Discord. Правила Discord не разрешают приложениям так использовать личный аккаунт, поэтому Discord может заблокировать или забанить используемый вами аккаунт.",
+ "risk_takeover": "Любой, кто получит ваш токен, сможет завладеть вашим аккаунтом Discord. Вставляйте его только на сервер Haven, который вы запускаете сами, и никогда по чьей-либо просьбе.",
+ "risk_safer": "Ваш бот Ferry, описанный выше, делает тот же импорт в рамках правил Discord.",
+ "risk_ack": "Я понимаю риски, и это мой собственный сервер Haven",
"token_help_summary": "Как узнать свой персональный токен Discord?",
"token_step_1": "Откройте веб-версию Discord в браузере Chrome/Edge по адресу discord.com/app (или разверните десктопное приложение)",
"token_step_2": "Нажмите клавишу F12 (или Ctrl+Shift+I), чтобы открыть Панель разработчика (DevTools)",
@@ -1613,11 +3813,169 @@
"title": "Пакетный перенос сообщений",
"desc": "Укажите целевой канал для переноса",
"move_one": "Переместить {{n}} выделенное сообщение в:",
- "move_many": "Переместить {{n}} выделенных сообщений в:"
+ "move_many": "Переместить {{n}} выделенных сообщений в:",
+ "delete_btn": "Удалить",
+ "delete_confirm_one": "Удалить {{n}} выбранное сообщение?",
+ "delete_confirm_many": "Удалить выбранные сообщения: {{n}}?",
+ "delete_confirm_warn": "Они будут безвозвратно удалены у всех. Это нельзя отменить.",
+ "deleted_one": "Удалено {{n}} сообщение",
+ "deleted_many": "Удалено сообщений: {{n}}",
+ "deleted_partial": "Удалено: {{n}}, пропущено: {{skipped}} (их вы удалить не можете)",
+ "max_messages": "За один раз можно переместить не более {{max}} сообщений",
+ "no_channels": "Других каналов нет",
+ "moved_one": "{{n}} сообщение перемещено в #{{name}}",
+ "moved_many": "Перемещено сообщений в #{{name}}: {{n}}",
+ "open_thread_moved": "Открытая вами ветка была перемещена в другой канал",
+ "here_as_thread": "Переместить сюда как ветку",
+ "here_as_thread_title": "Поместить выбранные сообщения в ветку под этим сообщением",
+ "thread_confirm_one": "Переместить {{n}} сообщение в ветку под сообщением пользователя {{name}}?",
+ "thread_confirm_many": "Переместить сообщения ({{n}}) в ветку под сообщением пользователя {{name}}?",
+ "thread_confirm_hint": "Авторы, время, реакции и закрепления сохраняются, а сообщения идут в ветке в порядке написания. Ответы под выбранным сообщением переносятся вместе с ним.",
+ "thread_confirm_btn": "Переместить",
+ "threaded_one": "{{n}} сообщение перемещено в ветку",
+ "threaded_many": "Перемещено сообщений в ветку: {{n}}",
+ "thread_base_selected": "Это сообщение выбрано. Выберите другое.",
+ "thread_failed": "Не удалось переместить сообщения",
+ "pick_in_channel": "В ветку...",
+ "pick_in_channel_title": "Перейти в #{{name}} и выбрать сообщение, под которое их поместить",
+ "pick_base": "Выбрано: {{n}}. Выберите в #{{name}} сообщение, под которое их поместить",
+ "select": "Выбрать",
+ "deselect": "Снять выбор"
},
"hidden_channels": {
"title": "Hidden Channels",
"desc": "Hidden channels are removed from your sidebar but you still have full access to them. Unhide one to bring it back."
+ },
+ "audit_log": {
+ "title": "Журнал аудита",
+ "desc": "Запись действий админов и модераторов на этом сервере.",
+ "filter_action": "Действие:",
+ "filter_actor": "Исполнитель:",
+ "all_actions": "Все действия",
+ "refresh": "Обновить",
+ "export": "Экспорт JSON",
+ "loading": "Загрузка...",
+ "load_more": "Загрузить ещё 50",
+ "empty": "Нет записей журнала аудита, подходящих под текущие фильтры.",
+ "system": "система",
+ "load_failed": "Не удалось загрузить журнал аудита",
+ "actions": {
+ "server_setting_update": "изменена настройка сервера",
+ "channel_create": "создал канал",
+ "channel_delete": "удалил канал",
+ "channel_rename": "переименовал канал",
+ "role_create": "создал роль",
+ "role_update": "обновил роль",
+ "role_delete": "удалил роль",
+ "role_assign": "назначил роль пользователю",
+ "role_revoke": "отозвал роль у пользователя",
+ "user_perms_update": "изменил права пользователя",
+ "user_kick": "исключил пользователя",
+ "user_ban": "заблокировал пользователя",
+ "user_unban": "разблокировал пользователя",
+ "user_mute": "заглушил пользователя",
+ "user_unmute": "снял заглушение с пользователя",
+ "user_rename": "переименовал пользователя",
+ "badge_create": "создал значок",
+ "badge_update": "обновил значок",
+ "badge_delete": "удалил значок",
+ "badge_grant": "выдал значок пользователю",
+ "badge_revoke": "забрал значок у пользователя",
+ "messages_move": "переместил сообщения в",
+ "messages_move_to_thread": "переместил сообщения в ветку в",
+ "message_nsfw_on": "отметил сообщение как NSFW в",
+ "message_nsfw_off": "снял отметку NSFW с сообщения в"
+ }
+ },
+ "ip_bans": {
+ "title": "Заблокированные IP",
+ "ip_placeholder": "IP-адрес",
+ "reason_placeholder": "Причина (необязательно)",
+ "add_btn": "Заблокировать IP"
+ },
+ "ferry": {
+ "title": "Ferry (мост с Discord)",
+ "refresh": "Переподключить",
+ "direction_both": "В обе стороны",
+ "direction_to_discord": "Только Haven → Discord",
+ "direction_to_haven": "Только Discord → Haven",
+ "mode_command": "По команде, только сообщения с префиксом",
+ "mode_all": "Зеркалировать всё, каждое сообщение в канале",
+ "other": "Другое",
+ "no_category": "Без категории",
+ "pick_one": "Выберите...",
+ "the_bot": "бот",
+ "connected_toast": "Подключено как {{bot}}. Теперь пригласите его на свой сервер Discord.",
+ "dropdown_loading": "Загрузка адресатов Discord...",
+ "no_destinations": "Нет адресатов Discord",
+ "pair_hint": "администратор связывает каналы в Настройки → Ferry",
+ "dms_disabled": "Личные сообщения Discord отключены на этом сервере",
+ "type_name": "Продолжайте вводить имя в Discord для поиска",
+ "searching": "Поиск в Discord...",
+ "no_members": "Участники Discord по запросу «{{query}}» не найдены",
+ "dm_on_discord": "ЛС в Discord",
+ "mirrored": "зеркалируется",
+ "direct_message": "Личное сообщение",
+ "direct_message_hint": "отправить одному пользователю Discord",
+ "no_destination": "Адресаты по запросу «{{query}}» не найдены",
+ "not_configured": "Не настроено",
+ "configured_off": "Настроено, сейчас выключено",
+ "summary_connected": "Подключено · серверов Discord: {{guilds}} · связок: {{pairings}}",
+ "connecting": "Подключение к Discord...",
+ "no_token": "Токен пока не сохранён.",
+ "connected_status": "Подключено как {{bot}}, серверов Discord: {{guilds}}.",
+ "on": "Вкл.",
+ "remove": "Удалить",
+ "invite_ready_hint": "Откройте эту ссылку, выберите свой сервер и оставьте права как есть.",
+ "invite_existing": "Бот уже находится на серверах: {{guilds}}. Чтобы добавить его на другой, нажмите «Переподключить» ниже, чтобы создать новую ссылку-приглашение.",
+ "invite_pending": "Ссылка-приглашение появится здесь после сохранения токена.",
+ "haven_channel": "Канал Haven",
+ "discord_server": "Сервер Discord",
+ "discord_channel": "Канал Discord",
+ "pick_server_first": "Сначала выберите сервер...",
+ "direction": "Направление",
+ "outgoing_messages": "Исходящие сообщения",
+ "outgoing": "Исходящие",
+ "add_pairing": "Добавить связку",
+ "connect_first": "Сначала подключите бота.",
+ "no_pairings": "Связок пока нет.",
+ "no_roles": "Ролей пока нет.",
+ "public_url_warning": "PUBLIC_URL не задан в вашем .env, поэтому аватары Haven не будут отображаться на стороне Discord, а файлы, слишком большие для Discord, не получат ссылок. Имена, картинки и файлы поменьше передаются как обычно.",
+ "step_connect": "Подключите своего бота Discord",
+ "step_connect_hint": "На discord.com/developers/applications: New Application, затем вкладка Bot. Включите Message Content Intent, нажмите Reset Token и вставьте токен сюда.",
+ "token_placeholder": "Вставьте токен бота",
+ "replace": "Заменить",
+ "save": "Сохранить",
+ "step_invite": "Пригласите бота на свой сервер Discord",
+ "step_enable": "Включите Ferry",
+ "enabled": "Ferry включён",
+ "enabled_hint": "Главный переключатель. Пока он выключен, ничего не передаётся ни в одну сторону.",
+ "step_pair": "Свяжите каналы",
+ "step_pair_hint": "Участники могут писать только в те каналы Discord, которые связаны с каналом Haven, где они находятся, и только если у их роли есть право Send to Discord.",
+ "step_roles": "Выберите, кто может отправлять",
+ "step_roles_hint": "Ferry ничего не делает для участника, пока здесь не включена одна из его ролей. Администраторы могут отправлять всегда. Это то же право Send to Discord, которое есть в разделе «Роли».",
+ "options": "Параметры",
+ "allow_personas": "Разрешить имена-персоны",
+ "allow_personas_hint": "Если выключено, пересылаемое сообщение всегда показывает настоящее имя отправителя в Haven.",
+ "allow_dms": "Разрешить ЛС Discord",
+ "allow_dms_hint": "Позволяет участникам отправлять односторонние личные сообщения пользователю Discord. Ответы остаются в Discord. Требуется Server Members Intent.",
+ "allow_mentions": "Разрешить упоминания",
+ "allow_mentions_hint": "Если выключено, пересылаемые сообщения никого не упоминают в Discord. Если включено, @имя упоминает человека в Discord, а упоминание @Роли работает в обе стороны, когда роль в Discord разрешает упоминать её всем.",
+ "relay_bots": "Пересылать других ботов",
+ "relay_bots_hint": "Если выключено, сообщения от ботов Discord игнорируются. Если включено, канал Haven может оказаться завален сообщениями.",
+ "token_required": "Сначала вставьте токен бота",
+ "remove_token_confirm": "Удалить токен бота Discord? Ferry сразу остановится. Связки сохранятся.",
+ "remove_pairing_confirm": "Удалить эту связку? Сообщения перестанут передаваться между этими двумя каналами.",
+ "pairing_required": "Выберите канал Haven, сервер Discord и канал Discord",
+ "kind_forum": "форум",
+ "kind_rule_hint": "Форум Haven связывается только с форумом или медиаканалом Discord. Любой другой канал Haven связывается с текстовым каналом или каналом объявлений Discord.",
+ "forum_pair_hint": "Связка форумов: каждый новый пост становится темой на другой стороне, с заголовком и всеми тегами, общими для обоих форумов, а ответы следуют за ней. Передаются только посты, созданные после связывания.",
+ "forum_mirrors": "Каждый пост и ответ",
+ "no_matching_forum": "Бот не видит ни одного форума на этом сервере",
+ "no_matching_chat": "Бот не видит ни одного текстового канала на этом сервере",
+ "hidden_mark": "(Ferry его не видит)",
+ "hidden_warning": "Ferry не видит этот канал Discord, поэтому сообщения не будут передаваться. В Discord добавьте роль бота в этот канал с правами View Channel и Read Message History.",
+ "hidden_confirm": "Ferry не видит этот канал Discord, поэтому сообщения не будут передаваться, пока вы не добавите роль бота в канал в Discord. Всё равно связать?"
}
},
"context_menu": {
@@ -1637,13 +3995,18 @@
"roles": "Настройка локальных ролей",
"webhooks": "Управление вебхуками",
"delete": "Безвозвратно удалить канал",
- "hide": "Hide Channel"
+ "hide": "Hide Channel",
+ "mark_read": "Отметить как прочитанное",
+ "mark_all_read": "Отметить всё как прочитанное",
+ "mark_all_read_done": "Всё отмечено как прочитанное",
+ "mark_all_read_failed": "Не удалось отметить всё как прочитанное"
},
"dm": {
"mute": "Заглушить уведомления ЛС",
"unmute": "Включить уведомления ЛС",
"copy_link": "Копировать ссылку на диалог",
- "delete": "Удалить диалог навсегда"
+ "delete": "Удалить диалог навсегда",
+ "mark_read": "Отметить как прочитанное"
}
},
"channel_functions": {
@@ -1657,6 +4020,11 @@
"music_hint": "Разрешает запускать совместное прослушивание музыки (функция требует активного тумблера «Голосовая связь»)",
"media": "Медиафайлы",
"media_hint": "Разрешает прикреплять к сообщениям изображения, видеоролики и сторонние файлы в этом канале",
+ "soundboard": "Панель звуков",
+ "soundboard_hint": "Разрешить панель звуков в голосовом чате этого канала",
+ "reactions": "Реакции",
+ "reactions_hint": "Разрешить эмодзи-реакции на сообщения в этом канале",
+ "reactions_disabled": "Реакции отключены в этом канале",
"slow_mode": "Медленный режим (Слоумод)",
"slow_mode_hint": "Устанавливает обязательный кулдаун (тайм-аут ожидания) между отправкой сообщений от одного лица (0 = выключен)",
"cleanup_guard": "Иммунитет к очистке",
@@ -1679,12 +4047,52 @@
"self_destruct_placeholder": "1–720 часов (0 = выкл)",
"afk_sub": "AFK-подканал",
"afk_sub_hint": "Назначает выбранный подканал в качестве комнаты ожидания AFK — туда будут автоматически перемещаться пользователи, не проявляющие активности",
+ "afk_leave": "Отключить от голосового чата",
+ "afk_leave_short": "Отключить",
"afk_timeout": "Тайм-аут AFK",
- "afk_timeout_hint": "Количество минут отсутствия активности в голосовом чате перед принудительным переносом пользователя в AFK-комнату (0 = отключено)"
+ "afk_timeout_hint": "Количество минут отсутствия активности в голосовом чате перед принудительным переносом пользователя в AFK-комнату (0 = отключено)",
+ "read_only": "Только чтение",
+ "read_only_hint": "Отправлять сообщения могут только участники с правом на это",
+ "forum": "Форум",
+ "forum_hint": "Каждое сообщение становится темой. Ответы идут в её ветку и поднимают тему в самый конец канала, к новым сообщениям",
+ "private": "Приватный",
+ "private_hint": "Канал видят только участники. При включении все, кто уже в канале, остаются; при выключении канал открывается для всего сервера, включая историю",
+ "default_role": "Роль по умолчанию",
+ "default_role_hint": "Роль, автоматически назначаемая участникам канала",
+ "none": "Нет",
+ "none_disabled": "Нет (отключено)",
+ "afk_timeout_placeholder": "1-1440 (0 = выкл.)",
+ "self_destruct_mode_delete": "Удалить канал",
+ "self_destruct_mode_clear": "Очистить сообщения",
+ "role_gate": "Необходимые роли",
+ "role_gate_hint": "Вход в этот канал даёт наличие выбранных ролей: любой из них или всех сразу. Люди добавляются, как только получают роли, и удаляются, когда теряют их. Добавленные вручную остаются участниками, но видят канал, только пока у них есть эти роли.",
+ "role_gate_any": "Любая из этих ролей",
+ "role_gate_all": "Все эти роли",
+ "role_gate_clear_hint": "Снимите отметки со всех ролей, чтобы убрать ограничение.",
+ "role_gate_saved": "Необходимые роли сохранены",
+ "role_gate_badge_any": "любая из {{count}}",
+ "role_gate_badge_all": "все {{count}}",
+ "save_template": "Сохранить как шаблон",
+ "save_template_hint": "Сохранить настройки этого канала как шаблон в окне создания канала",
+ "save_template_prompt": "Название шаблона",
+ "save_template_done": "Шаблон «{{name}}» сохранён. Теперь он есть в окне создания канала.",
+ "forum_tags": "Теги форума",
+ "forum_tags_hint": "Теги, которые могут быть у тем этого форума, по одному в строке",
+ "forum_votes": "Голоса за посты",
+ "forum_votes_hint": "Позволить участникам ставить лайки (и, по желанию, дизлайки) каждому посту этого форума",
+ "forum_blog": "Режим блога",
+ "forum_blog_hint": "Каждый пост принадлежит автору: дополнять сам пост может только автор, а ответы остальных попадают в комментарии",
+ "forum_blog_pics_only": "Комментарии только к картинкам",
+ "forum_blog_pics_only_hint": "Общего раздела комментариев под постами блога нет: люди комментируют каждую картинку отдельно",
+ "nsfw": "NSFW",
+ "nsfw_hint": "Пометить этот канал как NSFW. Участники могут скрыть каналы NSFW из боковой панели в настройках"
},
"confirm": {
"delete_channel": "Вы уверены, что хотите полностью удалить этот канал?\nАбсолютно вся история текстовых сообщений будет безвозвратно стёрта.",
"delete_channel_sure": "Вы АБСОЛЮТНО уверены в своем решении?\nЭто действие имеет перманентный характер и не подлежит откату!",
+ "delete_channel_subs_title": "Вложенные каналы тоже будут удалены",
+ "delete_channel_subs": "Удаление этого канала также удалит всё внутри него: {{names}}.\nХотите что-то сохранить? Отмените, затем переместите их в другой канал или поднимите на верхний уровень, а потом удалите этот.",
+ "delete_channel_subs_btn": "Удалить всё",
"leave_channel": "Покинуть канал «{{name}}»?\nДля повторного входа вам обязательно потребуется актуальный инвайт-код канала.",
"promote_channel": "Повысить подканал «{{name}}» до полноценного статуса канала верхнего уровня?",
"delete_message": "Удалить это сообщение безвозвратно?",
@@ -1694,7 +4102,150 @@
"delete_account": "Вы АБСОЛЮТНО уверены в удалении своего профиля? Ваши данные будут уничтожены навсегда.",
"clear_invite_code": "Аннулировать текущий инвайт-код сервера? Абсолютно все люди, имеющие на руках старый код, больше не смогут им воспользоваться.",
"rotate_channel_code": "Сбросить и обновить инвайт-код канала прямо сейчас? Старый буквенно-цифровой код мгновенно перестанет работать.",
- "remove_server": "Удалить сервер «{{name}}» из вашего списка подключений?"
+ "remove_server": "Удалить сервер «{{name}}» из вашего списка подключений?",
+ "backup_heavy": "Эта резервная копия включает сообщения и/или загруженные файлы. Это может занять много времени и привести к большой загрузке. Продолжить?",
+ "backup_restore": "Восстановить эту резервную копию? Она ПЕРЕЗАПИШЕТ текущие данные сервера и перезапустит сервер. Это нельзя отменить (кроме как через копию haven.db.pre-restore на машине-хосте)."
+ },
+ "media_gallery": {
+ "title": "Файлы и медиа",
+ "photos": "Фото",
+ "videos": "Видео",
+ "audio": "Аудио",
+ "files": "Файлы",
+ "links": "Ссылки",
+ "sort_by": "Сортировать",
+ "sort_newest": "Сначала новые",
+ "sort_oldest": "Сначала старые",
+ "sort_largest": "Сначала большие",
+ "sort_smallest": "Сначала маленькие",
+ "sort_name_az": "Имя А→Я",
+ "sort_name_za": "Имя Я→А",
+ "tile_size": "Размер",
+ "select": "Выбрать",
+ "cancel_select": "Отмена",
+ "selected": "Выбрано: {{count}}",
+ "select_all": "Выбрать все",
+ "delete_selected": "Удалить выбранное",
+ "previous_image": "Предыдущее изображение",
+ "next_image": "Следующее изображение",
+ "zoom_controls": "Масштаб",
+ "zoom_in": "Увеличить (+)",
+ "zoom_out": "Уменьшить (-)",
+ "zoom_reset": "По размеру экрана (0)",
+ "loading": "Загрузка…",
+ "confirm_delete": "Удалить выбранные элементы ({{count}})? Соответствующие сообщения будут удалены для всех. Это нельзя отменить.",
+ "delete_failed": "Не удалось удалить",
+ "deleted": "Удалено: {{count}}",
+ "deleted_with_skipped": "Удалено: {{deleted}} (пропущено: {{skipped}})",
+ "empty_photos": "В этом канале пока нет фото",
+ "empty_videos": "В этом канале пока нет видео",
+ "empty_audio": "В этом канале пока нет аудиофайлов",
+ "empty_files": "В этом канале пока нет файлов",
+ "empty_links": "В этом канале пока нет ссылок",
+ "empty": "Здесь пока ничего нет",
+ "filter_tags": "Теги",
+ "filter_by_tag": "Фильтр по тегу",
+ "filter_clear": "Сбросить фильтр",
+ "filter_no_match": "Нет элементов с выбранными тегами",
+ "manage_tags": "Управление тегами",
+ "append_tags": "Добавить теги",
+ "replace_tags": "Заменить все теги",
+ "tag_apply_append": "Добавить теги к элементам: {{count}}",
+ "tag_apply_replace": "Заменить теги у элементов: {{count}}",
+ "tag_apply_confirm": "Подтвердить",
+ "tags_updated": "Теги обновлены у элементов: {{count}}",
+ "tags_update_failed": "Не удалось обновить теги",
+ "confirm_clear_title": "Удалить все теги?",
+ "confirm_clear_body": "Все теги будут удалены у выбранных элементов ({{count}}). Это нельзя отменить.",
+ "confirm_clear_ok": "Удалить все теги"
+ },
+ "platform": {
+ "welcome": {
+ "position": "{{current}} из {{total}}",
+ "skip_all": "Пропустить всё",
+ "next": "Далее"
+ },
+ "desktop": {
+ "desktop": "Рабочий стол",
+ "windows_installer": "Установщик для Windows",
+ "linux_installer": "Установщик для Linux",
+ "macos_installer": "Установщик для macOS",
+ "color_updated": "Цветовой профиль обновлён. Перезапустите Haven Desktop, чтобы применить.",
+ "vsync_updated": "Настройка вертикальной синхронизации GPU обновлена. Перезапустите Haven Desktop, чтобы применить.",
+ "frame_cap_updated": "Ограничение частоты кадров обновлено. Перезапустите Haven Desktop, чтобы применить.",
+ "vaapi_updated": "Настройка VA-API обновлена. Перезапустите Haven Desktop, чтобы применить.",
+ "x11_updated": "Режим X11 обновлён. Перезапустите Haven Desktop, чтобы применить."
+ },
+ "shortcuts": {
+ "record": "Записать",
+ "press_key": "Нажмите клавишу…",
+ "native_hook_error": "Не удалось активировать «{{shortcut}}». Для этой комбинации нужен нативный перехват ввода (uiohook), который не загружен на этом компьютере. Запустите Haven из терминала, чтобы увидеть инструкцию по установке, или выберите обычную комбинацию клавиш (например, Ctrl+Shift+P).",
+ "conflict": "Не удалось зарегистрировать «{{shortcut}}». Эта комбинация уже занята Windows или другим приложением. Попробуйте другую.",
+ "register_failed": "Не удалось зарегистрировать сочетание клавиш. Возможно, оно уже занято, или версия приложения для компьютера пока не поддерживает этот тип привязки.",
+ "ptt_save_failed": "Не удалось сохранить режим PTT. Возможно, нужно обновить приложение для компьютера."
+ },
+ "e2e": {
+ "keys_regenerated": "🔄 Ключи шифрования были созданы заново ({{date}}). Прежние зашифрованные сообщения могут больше не расшифровываться.",
+ "keys_synced_device": "Ключи шифрования синхронизированы с другого устройства",
+ "keys_changed": "Ключи шифрования изменены на другом устройстве. Введите пароль ещё раз для синхронизации",
+ "partner_keys_changed": "🔄 Ключи шифрования пользователя {{name}} изменились ({{date}}). Прежние зашифрованные сообщения могут больше не расшифровываться.",
+ "keys_synced": "Ключи шифрования синхронизированы",
+ "module_unavailable": "Модуль E2E недоступен",
+ "recovering": "Восстановление ключей шифрования из резервной копии...",
+ "keys_recovered_notice": "🔄 Ключи шифрования восстановлены из резервной копии ({{date}}).",
+ "keys_recovered": "Ключи шифрования успешно восстановлены",
+ "unlock": "Разблокировать",
+ "passphrase_required": "Нужна парольная фраза",
+ "passphrase_desc": "Введите парольную фразу шифрования, которую вы задали при первом входе, чтобы разблокировать личные сообщения на этом устройстве.",
+ "passphrase_desc_own": "Введите парольную фразу шифрования, чтобы разблокировать зашифрованные сообщения на этом устройстве.",
+ "passphrase_placeholder": "Введите парольную фразу шифрования",
+ "too_many_attempts": "Слишком много попыток. Повторите через {{seconds}} с.",
+ "enter_password": "Введите пароль.",
+ "enter_passphrase": "Введите парольную фразу шифрования.",
+ "verifying": "Проверка…",
+ "incorrect_one": "Неверный пароль. Осталась {{count}} попытка.",
+ "incorrect_other": "Неверный пароль. Осталось попыток: {{count}}.",
+ "locked_out": "Неверный пароль. Блокировка на 60 с.",
+ "unlocking": "Разблокировка…",
+ "unlocked": "Шифрование разблокировано",
+ "init_failed": "Не удалось инициализировать шифрование. Попробуйте ещё раз.",
+ "unexpected_error": "Произошла ошибка. Попробуйте ещё раз.",
+ "no_partner_key": "Ключ собеседника недоступен. Возможно, у другого пользователя ещё не настроено E2E",
+ "partner": "Собеседник",
+ "verification_failed": "Не удалось создать код проверки",
+ "reset_failed": "Не удалось сбросить ключи",
+ "keys_reset_notice": "🔄 Ключи шифрования были сброшены ({{date}}). Прежние зашифрованные сообщения в этой переписке больше нельзя расшифровать.",
+ "keys_reset": "Ключи шифрования успешно сброшены",
+ "reset_failed_detail": "Не удалось сбросить ключи: {{error}}",
+ "waiting_for_key": "[Зашифровано: ожидание ключа...]",
+ "unable_to_decrypt": "[Зашифровано: не удалось расшифровать]",
+ "download_file": "Скачать {{name}}",
+ "downloaded": "Скачано: {{name}}",
+ "invalid_image_url": "[Недопустимый адрес зашифрованного изображения]",
+ "image_decrypt_failed": "[Зашифрованное изображение: не удалось расшифровать]",
+ "plain_title": "Отправить без шифрования?",
+ "plain_locked": "Шифрование в этом сеансе не разблокировано, поэтому сообщение попадёт на сервер незашифрованным, и тот, кто управляет сервером, сможет его прочитать.",
+ "plain_no_key": "{{name}} ещё не настроил(а) шифрование, поэтому сообщение попадёт на сервер незашифрованным, и тот, кто управляет сервером, сможет его прочитать.",
+ "plain_unsupported": "Это соединение не поддерживает шифрование сообщений (сервер не использует HTTPS), поэтому сообщение попадёт на сервер незашифрованным, и тот, кто управляет сервером, сможет его прочитать.",
+ "plain_send": "Отправить без шифрования",
+ "plain_unlock": "Разблокировать шифрование",
+ "key_changed_title": "Ключ шифрования пользователя {{name}} изменился",
+ "key_changed_body": "Так бывает, когда пользователь сбрасывает ключи шифрования, но это также может означать, что кто-то пытается читать ваши сообщения. Прежде чем отправлять что-то личное, убедитесь с {{name}} другим способом (лично или по звонку), что ваши коды проверки совпадают.",
+ "key_changed_verify": "Показать код проверки",
+ "key_changed_trust": "Доверять новому ключу",
+ "status_on": "Сообщения здесь защищены сквозным шифрованием",
+ "status_off_locked": "Не зашифровано: шифрование в этом сеансе не разблокировано",
+ "status_off_no_key": "Не зашифровано: {{name}} ещё не настроил(а) шифрование",
+ "status_off_unsupported": "Не зашифровано: это соединение не поддерживает шифрование сообщений",
+ "status_changed": "Ключ шифрования пользователя {{name}} изменился. Сравните коды проверки, прежде чем отправлять что-то личное.",
+ "errors": {
+ "no_backup": "Для этого аккаунта на сервере ещё нет зашифрованной резервной копии ключей. Если аккаунт совсем новый, отправьте ЛС, чтобы создать её. НЕ сбрасывайте, если не уверены. Сброс уничтожает все существующие зашифрованные ЛС.",
+ "bad_password": "Не удалось расшифровать резервную копию. Резервная копия на сервере была зашифрована другим паролем, не тем, что используется сейчас. НЕ сбрасывайте: это уничтожит все существующие ЛС. Попробуйте выйти и войти снова с исходным паролем аккаунта или обратитесь в поддержку.",
+ "network": "Не удалось связаться с сервером, чтобы получить зашифрованную резервную копию. Проверьте подключение и попробуйте ещё раз.",
+ "no_password": "Для расшифровки нет доступного пароля. Введите пароль ещё раз и повторите попытку.",
+ "recovery_failed": "Не удалось восстановить из-за непредвиденной ошибки. Подробности смотрите в консоли. НЕ сбрасывайте, если у вас есть зашифрованные ЛС, которые нужно сохранить."
+ }
+ }
},
"servers": {
"online": "Доступен",
@@ -1703,12 +4254,19 @@
"no_servers": "Список подключённых серверов пока пуст",
"open_tab": "Открыть в новой вкладке браузера",
"edit": "Редактировать параметры сервера",
- "remove": "Удалить из списка"
+ "remove": "Удалить из списка",
+ "sync_success": "Список серверов синхронизирован",
+ "sync_up_to_date": "Список серверов актуален",
+ "sync_updated": "Список серверов обновлён: добавлено {{added}}, удалено {{removed}}, переименовано {{renamed}}",
+ "sync_failed": "Не удалось синхронизировать",
+ "same_server_as": "Тот же сервер, что и {{name}}",
+ "desktop_not_changed": "Haven Desktop не внёс это изменение"
},
"common": {
"copy": "Копировать",
"copied": "Скопировано в буфер!",
- "uploading": "Идет загрузка файла..."
+ "uploading": "Идет загрузка файла...",
+ "cancel_upload": "Отменить загрузку"
},
"reactions": {
"search_placeholder": "Поиск эмодзи по названию..."
@@ -1743,10 +4301,13 @@
"travel": "Путешествия и транспорт",
"objects": "Предметы и вещи",
"symbols": "Знаки и символы",
+ "flags": "Флаги",
"custom": "Кастомные эмодзи сервера"
}
},
"gifs": {
+ "powered_by": "Работает на {{provider}}",
+ "load_failed": "Не удалось загрузить GIF",
"tab_search": "Поиск",
"tab_favorites": "★ Избранное",
"search_favorites": "Поиск по избранному…",
@@ -1759,6 +4320,11 @@
"search_failed": "Поисковый движок вернул ошибку",
"setup": {
"title": "Настройка поиска GIF",
+ "provider": "Источник GIF",
+ "tenor_powered_by": "Tenor больше не поддерживается для новой настройки. Используйте API-ключ GIPHY.",
+ "tenor_step_1": "Перейдите на console.cloud.google.com и создайте проект (или выберите существующий)",
+ "tenor_step_2": "Включите Tenor API, затем откройте Credentials → Create credentials → API key",
+ "tenor_step_3": "Скопируйте API-ключ и вставьте его ниже",
"powered_by": "Поиск анимаций работает на базе платформы GIPHY и требует ввода бесплатного токена API.",
"step_1": "Перейдите на официальный портал для разработчиков: developers.giphy.com",
"step_2": "Зарегистрируйте новый аккаунт (или авторизуйтесь под существующим)",
@@ -1772,5 +4338,429 @@
"unavailable_title": "Поиск GIF-анимаций временно недоступен",
"unavailable_desc": "Администрации сервера необходимо предварительно настроить API-интеграцию с GIPHY, чтобы пользователи смогли искать и отправлять анимации."
}
+ },
+ "games": {
+ "page_title": "{{title}} | Haven",
+ "back_to_haven": "Назад в Haven",
+ "loading": "Загрузка…",
+ "flash": {
+ "page_title": "Flash-игра | Haven",
+ "default_title": "Flash-игра",
+ "loading": "Загрузка…",
+ "volume": "Громкость",
+ "loading_emulator": "Загрузка эмулятора Flash Ruffle…",
+ "swf_failed": "Не удалось загрузить SWF: {{error}}",
+ "swf_hint": "Убедитесь, что файл .swf существует в /games/roms/",
+ "timeout": "Ruffle слишком долго запускался. Попробуйте обновить страницу.",
+ "init_error": "Ошибка инициализации Ruffle: {{error}}",
+ "no_file": "Файл SWF не указан",
+ "emulator_failed": "Не удалось загрузить эмулятор Flash Ruffle.",
+ "check_connection": "Проверьте подключение к интернету.",
+ "not_installed": "Возможно, на сервере его нет. Тот, кто управляет сервером, может добавить его командой npm install в папке Haven."
+ },
+ "io": {
+ "page_title": "Игры .io | Haven",
+ "title": "Игры .io",
+ "search": "Поиск игр…",
+ "no_matches": "Нет игр по вашему запросу",
+ "genre": {
+ "classic": "Классика",
+ "shooter": "Шутер",
+ "fps": "FPS",
+ "battle_royale": "Королевская битва",
+ "territory": "Захват территорий",
+ "casual": "Казуальные",
+ "party": "Вечеринка",
+ "survival": "Выживание",
+ "strategy": "Стратегия",
+ "sandbox": "Песочница"
+ },
+ "description": {
+ "agar": "Поглощайте клетки и растите",
+ "slither": "Королевская битва змей",
+ "diep": "Танковый шутер с улучшениями",
+ "krunker": "Динамичный FPS",
+ "surviv": "2D королевская битва",
+ "shell": "Шутер про яйца",
+ "zombs": "2D королевская битва",
+ "paper": "Захватывайте территорию",
+ "hole": "Поглощайте всё",
+ "skribbl": "Рисуйте и угадывайте слова",
+ "mope": "Игра про эволюцию животных",
+ "defly": "Вертолётные территории",
+ "florr": "Выживание цветов",
+ "ev": "3D аренный шутер",
+ "gulper": "Мультиплеер вроде змейки",
+ "taming": "Приручайте питомцев, стройте базы",
+ "territorial": "Завоюйте карту",
+ "yohoho": "Пиратская королевская битва",
+ "narrow": "Средневековая стрельба из лука",
+ "bloxd": "Блочный мультиплеер",
+ "venge": "3D командный шутер",
+ "bonk": "Мультиплеер с физикой",
+ "stabfish": "Подводные бои",
+ "wormax": "Арена для червей"
+ }
+ },
+ "flappy": {
+ "page_title": "Shippy Container | Haven",
+ "leaderboard": "Таблица лидеров",
+ "score": "Счёт:",
+ "best": "Рекорд:",
+ "instructions": "Нажмите, коснитесь или нажмите Space / ↑, чтобы прыгнуть",
+ "plot": "Груз Дрю застрял. Помогите ему найти свою повседневную одежду из Олбани.",
+ "no_scores": "Результатов пока нет",
+ "start": "Нажмите или нажмите Space, чтобы начать",
+ "score_value": "Счёт: {{score}}",
+ "retry": "Нажмите или нажмите Space, чтобы попробовать снова",
+ "new_best": "⭐ Новый рекорд! ⭐"
+ }
+ },
+ "poll": {
+ "multiple_votes": "Несколько голосов",
+ "anonymous": "Анонимно",
+ "votes_one": "{{count}} голос",
+ "votes_other": "Голосов: {{count}}"
+ },
+ "voice_message": {
+ "recording_hint": "Идёт запись. Нажмите на микрофон или «Отправить», чтобы опубликовать, или Escape, чтобы удалить.",
+ "send": "Отправить",
+ "unsupported": "Этот браузер не поддерживает запись звука.",
+ "mic_denied": "Для голосового сообщения Haven нужен доступ к микрофону. Разрешите его и попробуйте снова.",
+ "too_short": "Слишком короткое сообщение для отправки."
+ },
+ "format_picker": {
+ "tab_formatting": "Форматирование",
+ "tab_commands": "Команды",
+ "sample_text": "текст",
+ "bold": "Жирный",
+ "italic": "Курсив",
+ "underline": "Подчёркнутый",
+ "strike": "Зачёркнутый",
+ "highlight": "Выделение",
+ "spoiler": "Спойлер",
+ "code": "Код в строке",
+ "codeblock": "Блок кода",
+ "quote": "Цитата",
+ "heading": "Заголовок",
+ "list": "Маркированный список",
+ "numbered": "Нумерованный список",
+ "link": "Ссылка",
+ "colour": "Цветной текст",
+ "rule": "Разделительная линия",
+ "table": "Таблица",
+ "mention": "Упомянуть пользователя",
+ "channel": "Ссылка на канал",
+ "emoji": "Эмодзи по названию",
+ "commands_hint": "Введите / в поле сообщения, чтобы видеть эти команды при наборе.",
+ "no_commands": "В этом канале нет команд."
+ },
+ "thread_runtime": {
+ "title": "Ветка",
+ "reply_one": "{{count}} ответ",
+ "reply_to_topic": "Ответить в этой теме",
+ "reply_other": "Ответов: {{count}}",
+ "just_now": "только что",
+ "minutes_ago": "{{count}} мин. назад",
+ "hours_ago": "{{count}} ч назад",
+ "days_ago": "{{count}} дн. назад",
+ "starter": "Автор ветки",
+ "replying_to": "Ответ пользователю {{author}}: {{preview}}",
+ "wrote": "> @{{author}} написал(а):",
+ "mention_one": "1 упоминание в ветке (нажмите, чтобы открыть)",
+ "mention_other": "Упоминаний в ветках: {{count}} (нажмите, чтобы открыть последнее)",
+ "dock_panel": "Закрепить панель ветки",
+ "pop_out": "Открепить ветку (PiP)",
+ "cancel_reply": "Отменить ответ в ветке",
+ "reply_placeholder": "Ответить в ветке...",
+ "forum_full": "На всю ширину",
+ "forum_side": "Боковая панель",
+ "forum_full_title": "Открывать темы на всю область чата",
+ "forum_side_title": "Открывать темы в панели рядом с форумом",
+ "read_only_no_replies": "Этот канал доступен только для чтения. Отвечать или начинать ветку могут только участники, которым разрешено писать здесь.",
+ "new_one": "{{count}} новый",
+ "new_other": "Новых: {{count}}",
+ "threads_new_one": "{{count}} ветка с новыми ответами",
+ "threads_new_other": "Веток с новыми ответами: {{count}}",
+ "sidebar_unread": "Новые ответы в ветке, в которой вы участвуете",
+ "new_replies_one": "{{count}} новый ответ",
+ "new_replies_other": "Новых ответов: {{count}}",
+ "jump_latest": "Перейти к последнему ответу"
+ },
+ "dm_runtime": {
+ "title": "ЛС",
+ "emoji": "Эмодзи",
+ "reply_placeholder": "Ответить…",
+ "send": "Отправить",
+ "self_title": "{{name}} (вы)",
+ "offline_away": "Не в сети / Отошёл",
+ "no_messages": "Сообщений пока нет.",
+ "safety_notice": "Haven не может подтвердить ничью личность. Имена не уникальны, поэтому убедитесь, что вы действительно знаете, с кем общаетесь, прежде чем чем-либо делиться.",
+ "safety_dismiss": "Понятно, больше не показывать",
+ "blocked_link_tooltip": "Ссылки на {{host}} не разрешены на этом сервере, поэтому она не стала кликабельной.",
+ "blocked_link_badge": "заблокированная ссылка",
+ "blocked_image": "⚠ Изображение с заблокированного домена. Нажмите, чтобы всё равно загрузить"
+ },
+ "thread_list": {
+ "title": "Ветки",
+ "search_placeholder": "Поиск по веткам…",
+ "loading": "Загрузка…",
+ "empty": "В этом канале пока нет веток",
+ "no_matches": "Нет веток по этому запросу",
+ "reply_one": "1 ответ",
+ "reply_other": "Ответов: {{count}}",
+ "unavailable_in_dm": "Ветки недоступны в ЛС"
+ },
+ "role_menu": {
+ "pick_one_only": "Выберите одну",
+ "pick_up_to": "Выберите до {{count}}",
+ "join": "Получить роль {{name}}",
+ "leave": "Отказаться от роли {{name}}"
+ },
+ "forum": {
+ "new_post": "Новый пост",
+ "post": "Опубликовать",
+ "title": "Заголовок",
+ "title_placeholder": "О чём эта тема?",
+ "body": "Текст",
+ "body_placeholder": "Необязательно. Текст, картинки или ссылка; достаточно одного заголовка.",
+ "tags": "Теги",
+ "tags_hint": "(до 5)",
+ "nsfw": "NSFW",
+ "nsfw_reveal": "NSFW, нажмите, чтобы показать",
+ "mark_nsfw": "NSFW: размыть картинку и превью до нажатия и скрыть тему от тех, кто скрывает каналы NSFW",
+ "mark_nsfw_menu": "Отметить как NSFW",
+ "unmark_nsfw": "Снять отметку NSFW",
+ "attach_hint": "Чтобы прикрепить изображение или файл, вставьте или перетащите его в поле сообщения под темами.",
+ "attach_file": "Добавить картинку или файл",
+ "attach_hint_inline": "или вставьте либо перетащите в текст. Он появится там, где стоит курсор.",
+ "thumb_badge": "Миниатюра",
+ "thumb_none": "Картинки пока нет: первая добавленная картинка станет миниатюрой темы.",
+ "wait_upload": "Ещё загружается, подождите немного",
+ "delete_topic": "Удалить тему",
+ "sort": "Сортировка",
+ "sort_active": "По активности",
+ "sort_created": "По дате публикации",
+ "sort_top": "Самые популярные",
+ "votes_like": "Нравится",
+ "votes_dislike": "Не нравится",
+ "votes_failed": "Не удалось сохранить ваш голос",
+ "votes_title": "Голоса за посты",
+ "votes_hint": "Участники могут ставить лайки постам этого форума, а также дизлайки, если вы это выберете. Если выключить голосование, оно скроется; счётчики вернутся, когда вы включите его снова.",
+ "votes_off": "Выкл.",
+ "votes_likes": "Лайки",
+ "votes_both": "Лайки и дизлайки",
+ "votes_saved": "Настройка голосования сохранена",
+ "votes_badge_likes": "Лайки",
+ "votes_badge_both": "Лайки и дизлайки",
+ "blog_comment_one": "{{count}} комментарий",
+ "blog_comment_other": "Комментариев: {{count}}",
+ "blog_comment_cta": "Комментировать",
+ "blog_comments": "Комментарии",
+ "blog_piece_comment": "Комментировать",
+ "blog_piece_comments": "Комментарии ({{count}})",
+ "blog_comments_count": "Комментарии ({{count}})",
+ "blog_no_comments": "Комментариев пока нет.",
+ "blog_add_to_post": "Дополнить пост...",
+ "blog_write_comment": "Написать комментарий...",
+ "view_list": "Список",
+ "view_gallery": "Галерея",
+ "view_feed": "Лента",
+ "tile_size": "Размер плитки",
+ "shape": "Форма",
+ "shape_square": "Квадрат",
+ "shape_square_fit": "Квадрат (по размеру)",
+ "shape_wide": "{{ratio}}, широкая",
+ "shape_tall": "{{ratio}}, высокая",
+ "mark_all_read": "Отметить всё прочитанным",
+ "mark_all_read_title": "Убрать точки непрочитанного у всех тем этого форума",
+ "set_default": "Сделать по умолчанию",
+ "set_default_title": "Сделать текущий вид и размер плитки раскладкой, в которой все открывают этот форум. Те, кто выберет свою раскладку позже, сохранят её.",
+ "default_saved": "Раскладка форума задана для всех",
+ "lock_layout_title": "Зафиксировать раскладку: менять вид или форму плитки смогут только те, кто может менять настройки этого канала. Ползунок размера остаётся доступным всем.",
+ "unlock_layout_title": "Разблокировать раскладку, чтобы любой мог менять вид или форму плитки",
+ "layout_locked": "Раскладка зафиксирована для всех",
+ "layout_unlocked": "Раскладка разблокирована",
+ "unread": "Новое с вашего последнего визита",
+ "tag_matching": "Совпадение тегов",
+ "match_some": "Любой из тегов",
+ "match_all": "Все теги",
+ "clear_tags": "Сбросить",
+ "pinned": "Закреплено",
+ "replies": "Ответов: {{count}}",
+ "edit_topic": "Изменить заголовок и теги",
+ "edit_post": "Изменить пост",
+ "open_topic": "Открыть тему",
+ "mute_topic": "Отключить уведомления темы",
+ "unmute_topic": "Включить уведомления темы",
+ "topic_muted_title": "Уведомления отключены: новые ответы здесь не подсвечивают форум в боковой панели",
+ "sidebar_unread": "Новая активность в этом форуме",
+ "close_topic": "Закрыть тему",
+ "reopen_topic": "Открыть тему снова",
+ "closed": "Закрыто",
+ "closed_no_replies": "Тема закрыта. Отвечать могут только модераторы.",
+ "closed_you_can_reply": "Тема закрыта. Участники больше не могут отвечать, а модераторы по-прежнему могут.",
+ "mark_closed": "Закрыто: затемнить и держать ниже открытых тем",
+ "image_topic": "Изображение",
+ "load_more": "Загрузить ещё темы",
+ "no_topics_for_tags": "Нет тем с такими тегами.",
+ "just_now": "только что",
+ "minutes_ago": "{{n}} мин. назад",
+ "hours_ago": "{{n}} ч назад",
+ "days_ago": "{{n}} дн. назад",
+ "tags_editor_title": "Теги форума",
+ "tags_editor_hint": "Один тег в строке. Поставьте эмодзи в начале, если хотите, например «🎨 Арт». До 20."
+ },
+ "mod_cases": {
+ "warn": "Предупредить",
+ "history": "История модерации",
+ "my_history": "Моя история модерации",
+ "history_title": "История модерации: {{name}}",
+ "warn_title": "Предупредить пользователя {{name}}",
+ "warn_desc": "Причину он увидит в уведомлении, которое видит только он. Она сохранится в его истории модерации.",
+ "reason_placeholder": "Причина (обязательно)",
+ "reason_required": "Для предупреждения нужна причина",
+ "severity": "Баллы",
+ "severity_hint": "Баллы суммируются в истории и сгорают через 90 дней. 1 означает лёгкое предупреждение, 10 серьёзное.",
+ "warned": "{{name}} получил предупреждение. Баллов сейчас: {{points}}",
+ "failed": "Не получилось, попробуйте ещё раз",
+ "loading": "Загрузка...",
+ "points": "Баллов за последние {{days}} дн.: {{points}}",
+ "points_short": "{{points}} б.",
+ "minutes": "{{minutes}} мин.",
+ "by": "от {{name}}",
+ "none": "Записей нет.",
+ "none_self": "В вашей истории ничего нет.",
+ "note_placeholder": "Добавить заметку, видимую только модераторам",
+ "add_note": "Добавить заметку",
+ "revoke": "Отозвать",
+ "revoke_confirm": "Отозвать эту запись? Она останется в истории, зачёркнутой.",
+ "revoked": "отозвано",
+ "revoked_by": "отозвано пользователем {{name}}",
+ "warning_title": "Вы получили предупреждение",
+ "warning_intro": "Модератор этого сервера предупредил вас:",
+ "understood": "Понятно",
+ "type_warn": "Предупреждение",
+ "type_note": "Заметка",
+ "type_kick": "Исключение",
+ "type_mute": "Заглушение",
+ "type_unmute": "Снятие заглушения",
+ "type_ban": "Блокировка",
+ "type_unban": "Разблокировка"
+ },
+ "mute": {
+ "mode_off": "Выкл.",
+ "mode_all": "Заглушить всё",
+ "mode_mentions": "Заглушить, кроме @упоминаний",
+ "mute_server": "Заглушить сервер",
+ "mute_except_mentions": "Заглушить, кроме @упоминаний",
+ "unmute_server": "Включить уведомления сервера",
+ "edit_server": "Изменить сервер",
+ "server_muted_all": "Заглушён",
+ "server_muted_mentions": "Заглушён, кроме @упоминаний",
+ "mute_member": "Заглушить для меня",
+ "unmute_member": "Включить для меня",
+ "muted_member": "{{name}} заглушён для вас",
+ "unmuted_member": "{{name}} больше не заглушён для вас"
+ },
+ "badges": {
+ "profile_label": "Значки",
+ "hide_on_profile": "Скрыть в моём профиле",
+ "show_on_profile": "Показать в моём профиле",
+ "hidden_note": "Скрыт: видите только вы.",
+ "save_failed": "Не удалось сохранить",
+ "given": "Значок выдан",
+ "taken_back": "Значок отозван",
+ "take_back": "Забрать",
+ "menu": "Значки",
+ "span": {
+ "days_one": "1 день",
+ "days": "{{n}} дн.",
+ "months_one": "1 месяц",
+ "months": "{{n}} мес.",
+ "years_one": "1 год",
+ "years": "{{n}} г."
+ },
+ "how": {
+ "account_age": "Выдаётся за участие на сервере: {{span}}",
+ "messages": "Выдаётся за {{count}} опубликованных сообщений",
+ "forum_likes": "Выдаётся за {{count}} лайков под постами форума",
+ "role": "Идёт вместе с ролью {{role}}",
+ "role_missing": "Идёт вместе с ролью, которой больше нет",
+ "manual": "Выдан вручную"
+ },
+ "kind": {
+ "account_age": "Время на сервере",
+ "messages": "Опубликованные сообщения",
+ "forum_likes": "Полученные лайки на форуме",
+ "role": "Идёт вместе с ролью",
+ "manual": "Выдан вручную"
+ },
+ "kind_hint": {
+ "account_age": "Его показывают все, чьему аккаунту не меньше этого срока.",
+ "messages": "Считаются сообщения в каналах сервера. ЛС, боты и удалённые сообщения не учитываются.",
+ "forum_likes": "Считаются лайки от других людей под темами и картинками форума.",
+ "role": "Его показывают все, у кого есть эта роль, и теряют вместе с ролью.",
+ "manual": "Выдайте его из контекстного меню участника, в разделе «Значки»."
+ },
+ "admin": {
+ "title": "Значки",
+ "hint": "Маленькие иконки в карточках профиля, которые показывают чью-то историю здесь. Заработанные появляются сами, значки ролей идут вместе с ролью, а выданные вручную выдаются из контекстного меню участника. Участники могут скрывать свои.",
+ "new": "Новый значок",
+ "loading": "Загрузка...",
+ "load_failed": "Не удалось загрузить значки",
+ "none": "Значков пока нет.",
+ "group_earned": "Заработанные",
+ "group_role": "От ролей",
+ "group_manual": "Выданные вручную",
+ "enabled": "Показывать этот значок",
+ "on": "Вкл.",
+ "off": "Выкл.",
+ "edit": "Изменить",
+ "delete": "Удалить",
+ "holders": "У кого есть ({{n}})",
+ "no_holders": "Этого значка пока ни у кого нет.",
+ "given_by": "выдал {{name}}",
+ "role_above_you": "Этот значок идёт вместе с ролью, равной вашей или выше",
+ "delete_title": "Удалить «{{name}}»?",
+ "delete_body": "Он исчезнет из всех профилей, и все, кому он был выдан, потеряют его. Это нельзя отменить.",
+ "deleted": "Значок удалён",
+ "saved": "Значок сохранён"
+ },
+ "editor": {
+ "new_title": "Новый значок",
+ "edit_title": "Изменить значок",
+ "name": "Название",
+ "description": "Описание",
+ "description_placeholder": "Что он означает, в нескольких словах",
+ "icon": "Иконка",
+ "icon_builtin": "Встроенные",
+ "icon_emoji": "Эмодзи",
+ "icon_image": "Изображение",
+ "icon_used": "Используется: {{name}}",
+ "icon_in_use": "Эту иконку уже использует другой значок ({{name}}). Выберите другую.",
+ "emoji_hint": "Введите или вставьте один эмодзи.",
+ "upload": "Загрузить изображение",
+ "upload_hint": "PNG, GIF, WebP или JPG. Будет уменьшено до 64 на 64.",
+ "upload_failed": "Не удалось загрузить",
+ "bad_type": "Только изображения PNG, GIF, WebP или JPG",
+ "too_large": "Изображение слишком большое (не более 256 КБ)",
+ "kind": "Как участники его получают",
+ "after": "Через",
+ "unit_days": "дней",
+ "unit_months": "месяцев",
+ "unit_years": "лет",
+ "count": "Сколько",
+ "role": "Роль",
+ "no_roles": "Нет доступных вам ролей",
+ "enabled": "Показывать этот значок",
+ "save": "Сохранить"
+ },
+ "member": {
+ "title": "Значки пользователя {{name}}",
+ "intro": "Отметьте значок, чтобы выдать его, снимите отметку, чтобы забрать.",
+ "none": "Значков для ручной выдачи пока нет. Создайте его в Настройки, Админ, Значки.",
+ "switched_off": "выключен"
+ }
}
}