Files
glchat/web/src/i18n/locales/ru.json
T
grendervill 0f0060e8a4 feat(channels): фон комнаты и статичные превью при reduced-motion
- миграция 00014: background_file_id у комнаты (AGENT.md 7.5, 7.7)
- API: POST/DELETE /channels/{id}/background под MANAGE_CHANNEL_BACKGROUND,
  фон отдаётся в списке комнат и рассылается событием CHANNEL_UPDATE
- клиент: фон рисуется за лентой с затемнением, блок «Фон комнаты» в настройках
  комнаты (загрузка, замена, удаление)
- AnimatedImage: при «уменьшить движение» показывает статичный первый кадр,
  нарисованный на canvas, вместо анимации
- тесты: Go (загрузка, права, снятие) и Vitest (лента, настройки, reduced-motion)
2026-09-21 18:08:21 +03:00

1120 lines
57 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"app": {
"name": "glchat",
"tagline": "Self-hosted общение: текст, голос, видео",
"skipToContent": "Перейти к содержимому"
},
"status": {
"title": "Фундамент развёрнут",
"description": "Сервер отвечает, база данных в режиме WAL, миграции применены. Функции общения появятся в следующих фазах.",
"connecting": "Проверяем состояние сервера…",
"instance": "Инстанс",
"version": "Версия",
"apiVersion": "Версия API",
"schemaReady": "База данных",
"schemaOk": "готова",
"maxUpload": "Максимальный размер загрузки",
"checks": "Проверки",
"retry": "Повторить",
"back": "Назад",
"users": "Пользователей",
"guilds": "Серверов",
"registration": "Регистрация"
},
"health": {
"online": "Сервер доступен",
"offline": "Сервер недоступен"
},
"errors": {
"network.unreachable": "Сервер не отвечает. Проверьте соединение и повторите попытку.",
"network.aborted": "Запрос отменён.",
"instance.not_ready": "Инстанс ещё запускается. Повторите через несколько секунд.",
"internal.error": "Внутренняя ошибка сервера.",
"not_found": "Запрашиваемый ресурс не найден.",
"unknown": "Неизвестная ошибка ({{code}}).",
"auth.2fa_required": "Введите код двухфакторной аутентификации из приложения.",
"auth.totp_invalid": "Неверный код двухфакторной аутентификации.",
"auth.invalid_credentials": "Неверная почта или пароль.",
"auth.step_up_required": "Подтвердите личность: введите пароль заново.",
"auth.guild_limit_reached": "Достигнут лимит серверов на этом инстансе.",
"auth.session_invalid": "Сессия истекла. Войдите снова.",
"auth.unauthorized": "Требуется вход в систему.",
"auth.registration_disabled": "Регистрация на этом инстансе выключена.",
"auth.username_taken": "Такое имя пользователя уже занято.",
"auth.email_taken": "Такая почта уже зарегистрирована.",
"auth.weak_password": "Пароль слишком простой. Используйте не менее 8 символов.",
"auth.too_many_attempts": "Слишком много попыток. Попробуйте позже.",
"permissions.denied": "Недостаточно прав для этого действия.",
"instance.admin_required": "Действие доступно только администратору инстанса.",
"guild.not_found": "Сервер не найден.",
"guild.member_limit_reached": "На сервере достигнут лимит участников.",
"channel.not_found": "Комната не найдена.",
"validation.failed": "Проверьте заполненные поля.",
"rate.limited": "Слишком много запросов. Подождите немного.",
"perm.denied": "Недостаточно прав для этого действия.",
"rate_limited": "Слишком много запросов. Подождите немного.",
"message.edit_window_expired": "Сообщение нельзя изменить: прошло больше 24 часов.",
"file.too_large": "Файл больше допустимого размера.",
"request.bad": "Некорректный запрос.",
"file.not_found": "Файл не найден.",
"invite.expired": "Срок действия приглашения истёк.",
"invite.exhausted": "У приглашения больше не осталось использований.",
"user.not_found": "Пользователь с таким логином не найден.",
"emoji": {
"name_taken": "Эмодзи с таким именем уже есть.",
"invalid_type": "Поддерживаются PNG, JPEG, WebP и GIF.",
"invalid_name": "Имя эмодзи: 2–32 символа, латиница, цифры и «_»."
},
"emojis": {
"limit_reached": "На сервере достигнут лимит эмодзи."
},
"voice.disabled": "Голос не настроен на инстансе.",
"voice.channel_full": "В комнате нет свободных мест.",
"voice.token_refresh_failed": "Не удалось продлить сессию голоса. Подключитесь заново.",
"sound": {
"invalid_type": "Поддерживаются MP3, OGG, WAV, WebM и M4A.",
"invalid_name": "Имя звука: 2–32 символа, латиница, цифры и «_».",
"name_taken": "Звук с таким именем уже есть."
},
"sounds": {
"limit_reached": "Достигнут лимит звуков этого вида.",
"event_required": "Для звука палитры выберите событие."
},
"voice.not_connected": "Сначала войдите в голосовую комнату."
},
"theme": {
"switchToLight": "Светлая тема",
"switchToDark": "Тёмная тема",
"label": "Тема",
"dark": "Тёмная",
"light": "Светлая"
},
"language": {
"label": "Язык",
"ru": "Русский",
"en": "English"
},
"common": {
"loading": "Загрузка…",
"retry": "Повторить",
"cancel": "Отмена",
"close": "Закрыть",
"save": "Сохранить",
"saving": "Сохраняем…",
"create": "Создать",
"creating": "Создаём…",
"join": "Присоединиться",
"leave": "Покинуть",
"back": "Назад",
"copy": "Скопировать",
"copied": "Скопировано",
"delete": "Удалить",
"yes": "Да",
"no": "Нет",
"optional": "необязательно",
"dismiss": "Скрыть"
},
"footer": {
"source": "Исходный код",
"license": "AGPL-3.0"
},
"auth": {
"login": {
"title": "Вход",
"subtitle": "Войдите, чтобы продолжить общение",
"email": "Почта",
"emailPlaceholder": "you@example.com",
"password": "Пароль",
"totp": "Код 2FA или резервный код",
"totpHint": "Если 2FA включена; можно ввести резервный код вида xxxx-xxxx-xxxx.",
"submit": "Войти",
"submitting": "Входим…",
"noAccount": "Ещё нет аккаунта?",
"registerLink": "Зарегистрироваться",
"forgot": "Пароль забыт? Обратитесь к администратору инстанса.",
"instanceStatus": "Состояние инстанса",
"registrationDisabled": "Регистрация на этом инстансе выключена администратором.",
"totpRequired": "Введите код 2FA или резервный код — без него вход невозможен."
},
"register": {
"title": "Регистрация",
"subtitle": "Создайте аккаунт на инстансе {{instance}}",
"username": "Имя пользователя",
"usernameHint": "3–32 символа: латиница, цифры, «_» и «-».",
"displayName": "Отображаемое имя",
"email": "Почта",
"password": "Пароль",
"passwordHint": "Не менее 8 символов.",
"requirements": "Требования к паролю: {{list}}",
"requirementLength": "не менее 8 символов",
"requirementLetter": "хотя бы одна буква",
"requirementDigit": "хотя бы одна цифра",
"submit": "Создать аккаунт",
"submitting": "Создаём аккаунт…",
"haveAccount": "Уже есть аккаунт?",
"loginLink": "Войти",
"disabledTitle": "Регистрация закрыта",
"disabledBody": "Администратор инстанса выключил самостоятельную регистрацию. Попросите приглашение или обратитесь к администратору."
},
"validation": {
"usernameFormat": "Имя пользователя: 3–32 символа, латиница, цифры, «_» или «-».",
"usernameRequired": "Укажите имя пользователя.",
"displayNameRequired": "Укажите отображаемое имя.",
"emailInvalid": "Укажите корректный адрес почты.",
"passwordShort": "Пароль должен быть не короче 8 символов.",
"passwordLetter": "Добавьте в пароль хотя бы одну букву.",
"passwordDigit": "Добавьте в пароль хотя бы одну цифру.",
"passwordMismatch": "Пароли не совпадают."
}
},
"onboarding": {
"title": "Добро пожаловать в glchat",
"greeting": "Привет, {{name}}!",
"subtitle": "Пара шагов — и можно общаться.",
"displayName": "Как вас показывать?",
"displayNameHint": "Это имя видят другие участники.",
"bio": "Расскажи о себе",
"bioPlaceholder": "Чем занимаетесь, что интересно…",
"language": "Язык интерфейса",
"theme": "Тема",
"start": "Начать",
"starting": "Готовим рабочее пространство…",
"skip": "Пропустить и начать",
"note": "Позже всё это можно изменить в настройках."
},
"guilds": {
"railLabel": "Серверы",
"listLabel": "Список серверов",
"add": "Создать сервер",
"addShort": "Создать сервер",
"create": {
"title": "Создать сервер",
"name": "Название сервера",
"namePlaceholder": "Например, «Друзья»",
"hint": "Название можно изменить позже в настройках сервера.",
"submit": "Создать",
"limit": "На инстансе можно создать не более {{count}} серверов.",
"limitReached": "Достигнут лимит серверов — создайте новый после удаления одного из текущих.",
"template": "Шаблон сервера",
"templateCounts": "{{text}} текст. · {{voice}} голос. · {{roles}} роли"
},
"empty": {
"title": "У вас пока нет серверов",
"body": "Создайте свой сервер или присоединитесь по приглашению.",
"create": "Создать свой сервер"
},
"leave": "Покинуть сервер",
"leaveConfirm": "Покинуть сервер «{{name}}»?",
"switchTo": "Открыть сервер {{name}}"
},
"channels": {
"title": "Комнаты",
"text": "Текстовые комнаты",
"voice": "Голосовые комнаты",
"category": "Категория",
"empty": "В этом сервере пока нет видимых комнат.",
"select": "Открыть комнату {{name}}",
"add": "Создать комнату",
"settings": "Настройки сервера",
"create": {
"title": "Новая комната",
"name": "Название комнаты",
"namePlaceholder": "например, общий-чат",
"type": "Тип комнаты",
"typeText": "Текстовая",
"typeVoice": "Голосовая",
"parent": "Категория",
"noParent": "Без категории",
"submit": "Создать"
},
"chatPlaceholder": {
"title": "Чат появится в Фазе 2",
"body": "Комната «{{name}}» уже доступна. Отправка сообщений и голосовые каналы появятся в следующей фазе."
},
"noSelection": {
"title": "Выберите комнату",
"body": "Слева — список серверов и комнат. Выберите комнату, чтобы открыть её."
},
"notInGuild": {
"title": "Сервер недоступен",
"body": "Похоже, вы не состоите в этом сервере."
},
"selectUnread": "Открыть комнату {{name}}, непрочитанных: {{count}}",
"selectMentions": "Открыть комнату {{name}}, упоминаний: {{count}}",
"slowmode": "медленный режим {{seconds}} с",
"leaveHint": "Выйти из сервера можно в настройках сервера → «Опасная зона».",
"invite": "Пригласить на сервер",
"inviteTitle": "Приглашение на сервер",
"inviteHint": "Ссылка действует ограниченное время. Отправьте её тому, кого хотите позвать.",
"inviteCreating": "Создаём ссылку…",
"inviteLink": "Ссылка приглашения",
"inviteCopy": "Скопировать",
"inviteCopied": "Скопировано",
"inviteNew": "Новая ссылка",
"settingsChannel": "Настройки комнаты"
},
"voice": {
"title": "Голосовая комната",
"join": "Подключиться",
"joining": "Подключение…",
"connected": "Подключено",
"reconnecting": "Переподключение…",
"refreshing": "Продлеваем сессию…",
"disconnect": "Отключиться",
"disabled": "Голос не настроен на инстансе",
"empty": "В комнате пока никого нет",
"you": "Вы",
"speaking": "Говорит",
"muted": "Микрофон выключен",
"soundOn": "Звук включён",
"deafened": "Звук выключен",
"cameraOn": "Камера включена",
"screenOn": "Демонстрация экрана",
"serverMuted": "Микрофон выключен модератором",
"serverDeafened": "Звук выключен модератором",
"speakingWhileMuted": "Вы говорите с выключенным микрофоном",
"volume": "Громкость участника",
"controls": "Управление голосом",
"channelParticipants": "Участники комнаты «{{name}}»",
"mic": {
"on": "Включить микрофон",
"off": "Выключить микрофон"
},
"sound": {
"on": "Включить звук",
"off": "Выключить звук"
},
"camera": {
"on": "Включить камеру",
"off": "Выключить камеру"
},
"screen": {
"on": "Начать демонстрацию экрана",
"off": "Остановить демонстрацию экрана",
"quality": "Качество демонстрации",
"presets": {
"1080p60": "1080p · 60 fps",
"1080p30": "1080p · 30 fps",
"720p30": "720p · 30 fps",
"480p30": "480p · 30 fps"
}
},
"quality": {
"excellent": "Отличное соединение",
"good": "Хорошее соединение",
"poor": "Плохое соединение",
"lost": "Соединение потеряно",
"unknown": "Соединение устанавливается"
},
"menu": {
"label": "Участник {{name}}",
"moderation": "Модерация",
"mute": "Выключить микрофон",
"unmute": "Включить микрофон",
"deafen": "Выключить звук",
"undeafen": "Включить звук",
"move": "Переместить",
"moveTo": "Переместить в «{{name}}»"
},
"channelMenu": {
"label": "Голосовая комната {{name}}"
},
"soundboard": {
"title": "Саундборд",
"open": "Открыть саундборд",
"searchLabel": "Поиск звука",
"searchPlaceholder": "Название звука",
"empty": "На сервере пока нет звуков саундборда.",
"noResults": "Ничего не найдено.",
"playLabel": "Проиграть звук {{name}}",
"rateLimited": "Слишком часто: повторите через {{seconds}} с.",
"notConnected": "Сначала войдите в голосовую комнату.",
"playedBy": "{{name}} включил звук «{{sound}}»"
},
"stats": {
"title": "Статистика",
"open": "Открыть статистику соединения",
"resolution": "Разрешение",
"frameRate": "Частота кадров",
"codec": "Кодек",
"bitrate": "Битрейт",
"kbps": "кбит/с",
"ms": "мс",
"rtt": "Задержка (RTT)",
"packetLoss": "Потери пакетов",
"jitter": "Джиттер"
},
"publishQuality": {
"label": "Качество видео",
"short": {
"low": "Низкое",
"medium": "Среднее",
"high": "Высокое"
},
"level": {
"low": "Низкое качество",
"medium": "Среднее качество",
"high": "Высокое качество"
}
},
"latency": "{{ms}} мс",
"latencyHint": "задержка до голосового сервера",
"latencyUnknown": "пинг неизвестен"
},
"friends": {
"rail": "Друзья",
"title": "Друзья",
"sidebarLabel": "Друзья и личные беседы",
"sidebarHint": "Личные беседы живут здесь — в рейке серверов их нет.",
"dmSection": "Личные беседы",
"dmEmpty": "Личных бесед пока нет.",
"friendsSection": "Друзья",
"friendsEmpty": "Список друзей пуст.",
"open": "Открыть беседу с {{name}}",
"empty": {
"title": "Добавь друзей для общения",
"body": "Найдите человека по логину и отправьте заявку в друзья — после принятия появится личная беседа.",
"search": "Найти друзей"
},
"search": {
"title": "Поиск друзей",
"close": "Закрыть поиск",
"label": "Поиск по логину",
"placeholder": "Введите логин",
"hint": "Введите минимум 2 символа.",
"empty": "Никого не найдено.",
"add": "Добавить в друзья",
"adding": "Отправляем…",
"requested": "Заявка отправлена",
"friend": "Уже в друзьях",
"message": "Написать",
"open": "Поиск друзей"
},
"requests": {
"incoming": "Входящие заявки",
"outgoing": "Исходящие заявки",
"accept": "Принять",
"decline": "Отклонить",
"cancel": "Отменить"
},
"list": {
"label": "Список друзей",
"message": "Написать",
"more": "Действия: {{name}}",
"menu": "Действия с {{name}}",
"remove": "Удалить из друзей",
"block": "Заблокировать",
"toggle": "Друзья ({{count}})"
},
"lastSeen": {
"label": "Последний вход",
"online": "Сейчас в сети",
"unknown": "Не в сети давно",
"at": "Был(а) в сети: {{time}}"
},
"dm": {
"unknown": "Собеседник",
"notFound": {
"title": "Беседа недоступна",
"body": "Личная беседа не найдена: возможно, она удалена или доступ к ней закрыт."
}
}
},
"invites": {
"title": "Присоединиться по приглашению",
"hint": "Вставьте код или ссылку вида https://<домен>/invite/<код>.",
"label": "Код или ссылка приглашения",
"placeholder": "например, ab12cd или https://дом/invite/ab12cd",
"invalid": "Не удалось распознать код приглашения.",
"join": "Присоединиться",
"joining": "Присоединяемся…",
"members": "Участников: {{count}}",
"alreadyMember": "Вы уже на этом сервере"
},
"chat": {
"log": "Лента сообщений комнаты {{name}}",
"loadMore": "Загрузить ещё",
"loadingMore": "Загружаем…",
"today": "Сегодня",
"yesterday": "Вчера",
"edited": "(изменено)",
"pending": "отправляется…",
"newMessages": "Новые сообщения",
"adminBadge": "админ",
"types": {
"whisper": "шёпот",
"scream": "громко",
"private": "лично",
"system": "Системное сообщение"
},
"unknownAuthor": "неизвестный",
"start": {
"title": "Это начало комнаты #{{name}}",
"body": "Здесь пока нет сообщений. Напишите первым — сообщение увидят все участники комнаты.",
"directTitle": "Это начало личной беседы с {{name}}",
"directBody": "Здесь пока нет сообщений. Напишите первым."
},
"message": {
"by": "Сообщение от {{name}} в комнате {{channel}}",
"sentAt": "Отправлено {{time}}"
},
"reply": {
"to": "ответ {{name}}",
"missing": "сообщение удалено",
"composer": "Ответ {{name}}",
"cancel": "Отменить ответ"
},
"actions": {
"menu": "Действия с сообщением",
"reply": "Ответить",
"react": "Реакция",
"pin": "Закрепить",
"unpin": "Открепить",
"edit": "Изменить",
"delete": "Удалить",
"deleteConfirm": "Удалить это сообщение?",
"copy": "Копировать текст"
},
"reactions": {
"title": "Реакции",
"add": "Поставить реакцию {{emoji}}",
"toggle": "Реакция {{emoji}}: {{count}}"
},
"emoji": {
"title": "Выбор эмодзи",
"quick": "Быстрые реакции",
"popular": "Популярные эмодзи",
"pick": "Поставить реакцию {{emoji}}",
"server": "Эмодзи сервера",
"search": "Поиск эмодзи сервера",
"searchPlaceholder": "Имя эмодзи",
"notFound": "Ничего не найдено.",
"pickServer": "Выбрать эмодзи {{name}}",
"animated": "анимированный"
},
"edit": {
"label": "Редактирование сообщения",
"hint": "Enter — сохранить, Escape — отменить",
"save": "Сохранить",
"cancel": "Отмена"
},
"composer": {
"label": "Сообщение в комнату {{name}}",
"placeholder": "Написать в #{{name}}",
"send": "Отправить",
"hint": "Enter — отправить, Shift+Enter — новая строка",
"attach": "Прикрепить файл",
"fileInput": "Выбрать файлы",
"uploading": "Загружаем вложения…",
"attachments": "Вложения к сообщению",
"removeAttachment": "Убрать вложение {{name}}",
"counter": "{{count}}/{{max}}",
"tooLarge": "Файл «{{name}}» больше допустимых {{limit}}",
"rateLimited": "Слишком часто. Отправить можно будет через {{seconds}} с.",
"denied": "Нет права отправлять сообщения в эту комнату.",
"readOnly": "В эту комнату нельзя писать.",
"directLabel": "Сообщение для {{name}}",
"directPlaceholder": "Написать {{name}}",
"autocomplete": {
"hint": "↑/↓ — выбор, Enter — вставить, Escape — закрыть",
"mentions": "Участники сервера",
"channels": "Комнаты сервера",
"emoji": "Эмодзи",
"commands": "Команды"
},
"commands": {
"me": "действие: имя и текст курсивом",
"whisper": "шёпот: приглушённое сообщение",
"scream": "громко: крупный акцентный текст",
"ls": "личное сообщение: /ls логин текст"
},
"emoji": "Эмодзи"
},
"typing_one": "{{names}} печатает…",
"typing_few": "{{names}} печатают…",
"typing_many": "{{names}} печатают…",
"typing_other": "{{names}} печатают…",
"pins": {
"open": "Закреплённые сообщения",
"title": "Закреплённые в #{{name}}",
"empty": "В этой комнате пока нет закреплённых сообщений.",
"jump": "Перейти"
},
"search": {
"open": "Поиск по комнате",
"title": "Поиск по сообщениям",
"label": "Строка поиска",
"placeholder": "Поиск по сообщениям",
"hint": "Введите не меньше двух символов.",
"empty": "Ничего не найдено."
},
"unread": "Непрочитанных сообщений: {{count}}",
"mentions": "Упоминаний: {{count}}",
"spoiler": {
"show": "Показать спойлер",
"hide": "Скрыть спойлер"
},
"logDirect": "Личная беседа с {{name}}",
"system": {
"member": "участник",
"memberJoin": "{{name}} присоединился к серверу",
"memberKick": "{{name}} покинул сервер (исключён)",
"channelCreated": "Комната #{{name}} создана",
"voiceChannelCreated": "Голосовая комната {{name}} создана",
"memberLeave": "{{name}} покинул сервер"
},
"webhookBadge": "вебхук",
"webhookAuthor": "вебхук"
},
"user": {
"panelLabel": "Панель пользователя",
"settings": "Настройки пользователя",
"menu": {
"label": "Меню пользователя",
"open": "Открыть меню пользователя",
"account": "Настройки аккаунта",
"guilds": "Настройки серверов",
"status": "Статус",
"noBio": "О себе пока не заполнено."
},
"logout": "Выйти",
"loggingOut": "Выходим…",
"statusLabel": "Статус: {{status}}",
"status": {
"online": "В сети",
"idle": "Неактивен",
"dnd": "Не беспокоить",
"invisible": "Невидимый",
"offline": "Не в сети"
},
"voice": {
"input": "Устройство ввода",
"output": "Устройство вывода",
"camera": "Камера",
"micVolume": "Громкость микрофона",
"outputVolume": "Громкость звука",
"micOn": "Включить микрофон",
"micOff": "Выключить микрофон",
"cameraOn": "Включить камеру",
"cameraOff": "Выключить камеру",
"soundOn": "Включить звук",
"soundOff": "Выключить звук",
"micSettings": "Настройки микрофона",
"cameraSettings": "Настройки камеры",
"soundSettings": "Настройки звука",
"audioSettings": "Аудио-видео настройки"
},
"devices": {
"default": "Устройство по умолчанию",
"unavailable": "Устройства недоступны",
"empty": "Устройства не найдены",
"unnamed": "Устройство {{index}}"
}
},
"gateway": {
"label": "Соединение",
"status": {
"idle": "Не подключено",
"connecting": "Подключаемся…",
"connected": "Подключено",
"reconnecting": "Переподключение…",
"disconnected": "Соединение потеряно"
},
"invalidated": "Сессия закрыта сервером. Войдите снова."
},
"settings": {
"title": "Настройки",
"back": "В приложение",
"switcher": {
"label": "Разделы настроек",
"account": "Настройки сервера",
"servers": "Мои серверы"
},
"tabs": {
"label": "Разделы настроек",
"profile": "Профиль",
"security": "Безопасность",
"appearance": "Внешний вид",
"notifications": "Уведомления",
"server": "Сервер",
"voice": "Аудио-видео",
"language": "Язык и регион",
"instance": "Инстанс",
"channel": "Комната"
},
"profile": {
"avatar.change": "Сменить аватар",
"avatar.uploading": "Загружаем…",
"title": "Профиль",
"description": "Как вас видят другие участники.",
"displayName": "Отображаемое имя",
"bio": "О себе",
"bioPlaceholder": "Пара слов о себе",
"customStatus": "Своё состояние",
"customStatusPlaceholder": "Например, «Пишу код»",
"customStatusEmoji": "Эмодзи состояния",
"customStatusEmojiPlaceholder": "🚀",
"saved": "Профиль сохранён.",
"username": "Имя пользователя",
"badges": "Значки",
"noBadges": "нет",
"tabsLabel": "Вкладки профиля",
"tabs": {
"main": "Основной",
"server": "Сервер"
},
"timezoneDefault": "по умолчанию (МСК)",
"avatar": {
"change": "Сменить аватар",
"choose": "Выбрать файл аватара",
"remove": "Удалить аватар",
"formats": "JPEG, PNG, WebP, GIF",
"limit": "{{formats}} до {{limit}}",
"tooLarge": "Файл больше {{limit}} — выберите картинку поменьше.",
"uploading": "Загружаем…"
},
"decorations": {
"title": "Украшения",
"hint": "Бейджи и рамки профиля.",
"empty": "Украшений пока нет.",
"stub": "Бейджи, рамки и эффекты профиля появятся позже."
},
"style": {
"title": "Оформление профиля",
"description": "Рамка, иконка, цвет и эффект ника. Выбирать можно только то, что выдали роли: на сервере приоритет у роли, затем у пер-серверного стиля, затем у стиля «для друзей».",
"scope": "Где применять",
"scopeGlobal": "Для друзей (DM и глобальные места)",
"preview": "предпросмотр",
"frame": "Рамка аватара",
"badge": "Иконка рядом с ником",
"color": "Цвет ника",
"colorDefault": "Как у роли",
"effect": "Эффект ника",
"none": "Без элемента",
"noFrames": "Роли пока не выдали ни одной рамки — их выдаёт администратор сервера.",
"noBadges": "Роли пока не выдали ни одной иконки.",
"reset": "Сбросить стиль",
"priorityHint": "Изменения применяются сразу.",
"effects": {
"none": "Без эффекта",
"gradient": "Градиент",
"glow": "Свечение",
"fire": "Огонь",
"shimmer": "Блик",
"glitch": "Глитч"
}
}
},
"security": {
"title": "Безопасность",
"description": "Пароль, активные сессии и двухфакторная аутентификация.",
"passwordTitle": "Смена пароля",
"currentPassword": "Текущий пароль",
"newPassword": "Новый пароль",
"confirmPassword": "Повторите новый пароль",
"submitPassword": "Сменить пароль",
"passwordChanged": "Пароль изменён.",
"stepUpTitle": "Подтвердите личность",
"stepUpBody": "Для этого действия сервер требует повторного ввода пароля{{totp}}.",
"stepUpTotp": " и кода 2FA",
"stepUpSubmit": "Подтвердить",
"stepUpSuccess": "Личность подтверждена.",
"stepUpExpired": "Подтверждение устарело, введите пароль заново.",
"stepUpPassword": "Ваш пароль",
"sessionsTitle": "Активные сессии",
"sessionsEmpty": "Активных сессий нет.",
"sessionCurrent": "текущая",
"sessionCreated": "Создана",
"sessionSeen": "Активность",
"sessionIp": "IP",
"sessionAgent": "Устройство",
"unknownAgent": "Неизвестное устройство",
"logoutAll": "Выйти на всех устройствах",
"logoutAllConfirm": "Завершить все сессии, включая текущую?",
"logoutAllDone": "Все сессии завершены.",
"twoFactorTitle": "Двухфакторная аутентификация",
"twoFactorEnabled": "2FA включена",
"twoFactorDisabled": "2FA выключена",
"twoFactorEnable": "Включить 2FA",
"twoFactorSetupHint": "Добавьте секрет в приложение-аутентификатор, затем введите шестизначный код.",
"twoFactorSecret": "Секрет",
"twoFactorUri": "Ссылка otpauth",
"twoFactorQrAlt": "QR-код для настройки 2FA",
"twoFactorQrUnavailable": "QR-код недоступен — добавьте секрет вручную.",
"twoFactorCode": "Код из приложения",
"twoFactorConfirm": "Включить",
"twoFactorEnabledDone": "2FA включена. Сохраните коды восстановления.",
"recoveryTitle": "Коды восстановления",
"recoveryHint": "Каждый код одноразовый. Они показываются только один раз.",
"recoveryCopyAll": "Скопировать все коды"
},
"appearance": {
"title": "Внешний вид",
"description": "Тема и язык интерфейса. Хранятся локально в браузере.",
"theme": "Тема",
"themeHint": "Тёмная тема включена по умолчанию.",
"language": "Язык",
"languageHint": "Русский — основной язык интерфейса."
},
"instance": {
"title": "Инстанс",
"description": "Только для администратора инстанса. Данные только для чтения.",
"notAdmin": "Раздел доступен только администратору инстанса.",
"settings": "Настройки инстанса",
"settingsEmpty": "Настройки не заданы.",
"guilds": "Серверы ({{count}})",
"guildsEmpty": "Серверов нет.",
"userId": "ID пользователя",
"users": "Пользователи ({{count}})",
"usersEmpty": "Пользователей нет.",
"audit": "Журнал аудита (последние {{count}})",
"auditEmpty": "Записей нет.",
"memberCount": "{{count}} участн.",
"adminBadge": "админ",
"mainBadge": "главный",
"usersIdHint": "ID пользователей видны только администратору инстанса.",
"dashboard": {
"title": "Дашборд сервера",
"refreshHint": "обновляется раз в секунду",
"cpu": "Процессор",
"cpuCaption_one": "{{count}} ядро",
"cpuCaption_few": "{{count}} ядра",
"cpuCaption_many": "{{count}} ядер",
"cpuCaption_other": "{{count}} ядра",
"memory": "Память",
"diskHint": "Диск: занято / всего. Свободно {{free}}",
"databaseHint": "База данных: файл и журнал WAL ({{wal}})",
"containerRow": "Контейнер инстанса",
"containerHint": "Лимиты профиля",
"hostRow": "Сервер целиком",
"hostHint": "Вся машина"
},
"health": {
"title": "Healthcheck инстанса",
"collecting": "Собираем данные…",
"unavailable": "Инстанс не отвечает на запросы дашборда.",
"ping": "Пинг",
"pingValue": "{{ms}} мс",
"pingUnavailable": "—",
"pingHint": "Время ответа инстанса на запрос дашборда (HTTP)",
"summary": {
"ok": "Всё в порядке",
"warn": "Есть предупреждения",
"failed": "Есть ошибки"
},
"status": {
"ok": "работает",
"warn": "внимание",
"failed": "ошибка",
"off": "выключено"
},
"checks": {
"app": "Приложение",
"database": "База данных",
"disk": "Диск",
"storage": "Запись данных",
"voice": "Голос (SFU)",
"gateway": "Gateway",
"metrics": "Метрики"
}
}
},
"servers": {
"pickerLabel": "Мои серверы",
"empty": "У вас пока нет серверов.",
"emptyTitle": "Пока нет ни одного сервера",
"emptyHint": "Присоединитесь к главному серверу инстанса или создайте свой — тогда здесь появятся его настройки.",
"select": "Открыть настройки сервера {{name}}",
"notFound": "Сервер не найден среди доступных вам.",
"readOnlyHint": "Редактирование доступно владельцу сервера и участникам с правами ADMINISTRATOR или MANAGE_GUILD.",
"general": {
"title": "Общее",
"description": "Название и описание сервера видят все участники.",
"name": "Название сервера",
"guildDescription": "Описание",
"descriptionPlaceholder": "О чём этот сервер",
"saved": "Настройки сервера сохранены."
},
"nickname": {
"title": "Мой профиль на сервере",
"description": "Никнейм виден только на этом сервере.",
"label": "Никнейм",
"placeholder": "Оставьте пустым, чтобы сбросить ник",
"current": "Текущий никнейм:",
"none": "не задан",
"saved": "Никнейм сохранён.",
"applyAll": "Применить ко всем серверам",
"applyAllHint": "Один ник для всех серверов, где вы состоите.",
"applyAllPending": "Применяем…",
"applyAllProgress": "Обновлено серверов: {{done}} из {{total}}",
"applyAllDone": "Никнейм применён на всех серверах ({{total}}).",
"applyAllFailed": "Не удалось обновить серверов: {{failed}}."
},
"members": {
"title": "Участники",
"description": "Первые {{limit}} участников сервера.",
"empty": "Участники не найдены.",
"roles": "Ролей: {{roles}}",
"more": "Полный список участников с ролями появится в следующих фазах.",
"moderate": "Модерировать {{name}}",
"timeout": "Тайм-аут",
"timeoutClear": "Снять тайм-аут",
"banReason": "Причина бана",
"banReasonPlaceholder": "необязательно",
"ban": "Забанить",
"kick": "Исключить"
},
"roles": {
"title": "Роли",
"description": "Цвет и позиция ролей. Управление ролями появится в следующих фазах.",
"empty": "На сервере пока нет ролей.",
"position": "Позиция {{position}}",
"default": "по умолчанию",
"frame": "Рамка",
"badge": "Иконка",
"nickColor": "Цвет ника",
"nickEffect": "Эффект ника",
"decorationSaved": "Оформление роли сохранено."
},
"danger": {
"title": "Опасная зона",
"description": "Эти действия необратимы.",
"leaveOwnerHint": "Владелец не может покинуть свой сервер: сначала передайте владение или удалите сервер.",
"leaveHint": "Выйти из сервера и потерять доступ к его комнатам.",
"leave": "Покинуть сервер",
"leaveConfirmTitle": "Покинуть сервер?",
"leaveConfirmBody": "Вы выйдете из сервера «{{name}}». Вернуться можно будет по приглашению.",
"leaveConfirm": "Покинуть",
"deleteHint": "Удалить сервер вместе с комнатами, ролями и участниками.",
"delete": "Удалить сервер",
"deleteConfirmTitle": "Удалить сервер?",
"deleteConfirmBody": "Сервер «{{name}}» будет удалён без возможности восстановления.",
"deleteConfirm": "Удалить"
},
"selectLabel": "Выбрать сервер",
"emojis": {
"title": "Эмодзи",
"description": "Кастомные эмодзи сервера: до {{limit}} штук, каждый до 512 КБ.",
"counter": "{{count}} из {{limit}}",
"empty": "На сервере пока нет эмодзи.",
"animated": "анимированный",
"rename": "Переименовать",
"renameLabel": "Переименовать эмодзи {{name}}",
"renameTitle": "Переименовать эмодзи",
"delete": "Удалить",
"deleteLabel": "Удалить эмодзи {{name}}",
"deleteConfirmTitle": "Удалить эмодзи?",
"deleteConfirmBody": "Эмодзи {{name}} будет удалён без возможности восстановления.",
"deleteConfirm": "Удалить",
"uploadTitle": "Загрузить эмодзи",
"uploadHint": "Перетащите файл в область ниже или выберите его: PNG, JPEG, WebP или GIF до {{limit}}.",
"name": "Имя эмодзи",
"namePlaceholder": "например, pepe_happy",
"nameHint": "2–32 символа: латиница, цифры и «_».",
"dropHint": "Перетащите файл сюда",
"chooseFile": "Выбрать файл",
"file": "Файл эмодзи",
"fileSelected": "{{name}} · {{size}}",
"upload": "Загрузить",
"uploading": "Загружаем…"
},
"sounds": {
"title": "Звуки",
"description": "Саундборд и звуковая палитра сервера: до {{limit}} звуков каждого вида, каждый до 512 КБ.",
"counter": "{{count}} из {{limit}}",
"empty": "Звуков этого вида пока нет.",
"uploadTitle": "Загрузить звук",
"uploadHint": "Перетащите файл в область ниже или выберите его: MP3, OGG, WAV, WebM или M4A до {{limit}}.",
"name": "Имя звука",
"namePlaceholder": "например, airhorn",
"nameHint": "2–32 символа: латиница, цифры и «_».",
"emoji": "Эмодзи",
"emojiPlaceholder": "например, 📣",
"emojiHint": "Необязательная иконка для сетки саундборда.",
"event": "Событие",
"dropHint": "Перетащите файл сюда",
"file": "Файл звука",
"chooseFile": "Выбрать файл",
"fileSelected": "{{name}} · {{size}}",
"upload": "Загрузить",
"uploading": "Загружаем…",
"rename": "Переименовать",
"renameLabel": "Переименовать звук {{name}}",
"renameTitle": "Переименовать звук",
"delete": "Удалить",
"deleteLabel": "Удалить звук {{name}}",
"deleteConfirmTitle": "Удалить звук?",
"deleteConfirmBody": "Звук {{name}} будет удалён без возможности восстановления.",
"deleteConfirm": "Удалить",
"kinds": {
"soundboard": "Саундборд",
"ui": "Звуковая палитра"
},
"events": {
"member_join": "Участник присоединился",
"member_leave": "Участник вышел",
"mention": "Упоминание",
"message": "Новое сообщение",
"message_send": "Отправка сообщения",
"voice_join": "Вход в голосовую комнату",
"voice_leave": "Выход из голосовой комнаты",
"mic_on": "Микрофон включён",
"mic_off": "Микрофон выключен",
"camera_on": "Камера включена",
"camera_off": "Камера выключена",
"screen_on": "Демонстрация начата",
"screen_off": "Демонстрация остановлена",
"kick": "Исключение участника",
"ban": "Бан участника",
"mute": "Мьют участника",
"role_grant": "Выдача роли",
"role_revoke": "Снятие роли"
}
},
"bans": {
"title": "Баны",
"description": "Забаненные не могут вернуться по приглашению, пока бан не снят.",
"empty": "Забаненных нет.",
"remove": "Снять бан",
"noReason": "без причины",
"bannedBy": "забанил {{name}}, {{date}}",
"unknownActor": "неизвестный",
"timeoutLabel": "Тайм-аут:",
"timeoutMinutes_one": "{{count}} минута",
"timeoutMinutes_few": "{{count}} минуты",
"timeoutMinutes_many": "{{count}} минут",
"timeoutMinutes_other": "{{count}} минуты",
"timeoutAction": "Тайм-аут {{minutes}} мин"
},
"audit": {
"title": "Журнал аудита",
"description": "Действия модераторов сервера. Фильтры уходят в запрос.",
"filterAction": "Действие",
"filterActor": "ID автора",
"filterTarget": "ID цели",
"apply": "Показать",
"reset": "Сбросить",
"empty": "Записей нет."
},
"appearance": {
"title": "Оформление",
"description": "Иконка, баннер, splash страницы приглашения и акцентный цвет сервера.",
"icon": "Иконка сервера",
"iconHint": "Квадратная картинка: показывается в списке серверов.",
"banner": "Баннер",
"bannerHint": "Широкая картинка для шапки сервера.",
"splash": "Splash приглашения",
"splashHint": "Фон страницы приглашения по ссылке.",
"accent": "Акцентный цвет",
"accentHint": "Цвет кнопок и выделений внутри сервера.",
"accentDefault": "Цвет темы",
"accentBlurple": "Синий",
"accentGreen": "Зелёный",
"accentOrange": "Оранжевый",
"accentRed": "Красный",
"accentPurple": "Фиолетовый",
"upload": "Загрузить",
"remove": "Удалить",
"empty": "нет",
"notImage": "Нужен файл изображения (PNG, JPEG, GIF, WebP).",
"tooLarge": "Файл больше 8 МБ."
},
"cosmetics": {
"title": "Галерея оформления",
"description": "Рамки аватара и иконки рядом с ником. Загруженные элементы выдаются ролям в разделе «Роли»; анимированные GIF и WebP сохраняют анимацию.",
"upload": "Загрузить",
"empty": "Пока ничего не загружено.",
"limit": "занято {{used}} из {{total}}",
"name": "Имя элемента",
"notImage": "Нужен файл изображения",
"tooLarge": "Файл больше 5 МБ",
"deleteConfirm": "Удалить элемент? Он исчезнет у всех ролей и в личных стилях.",
"kind": {
"frame": "Рамки",
"badge": "Иконки"
}
}
},
"navLabel": "Пункты настроек",
"notifications": {
"title": "Уведомления",
"description": "Звуки, упоминания и веб-пуш.",
"stub": "Настройки уведомлений появятся позже."
},
"voice": {
"title": "Аудио-видео",
"description": "Устройства ввода и вывода и громкость. Изменения применяются к текущей голосовой комнате сразу.",
"input": "Микрофон",
"camera": "Камера",
"output": "Звук",
"micVolume": "Громкость микрофона",
"outputVolume": "Громкость звука",
"stub": "Изменения применяются сразу и сохраняются на этом устройстве.",
"micMode": "Активация микрофона",
"micModes": {
"voice": "Голосовая активация",
"push_to_talk": "Push-to-talk"
},
"pttKey": "Клавиша",
"pttHint": "Удерживайте клавишу, чтобы говорить. Работает, когда окно в фокусе и курсор не в поле ввода.",
"pttKeys": {
"space": "Пробел",
"v": "V",
"b": "B",
"n": "N",
"alt": "Alt",
"ctrl": "Ctrl"
},
"sounds": "Звуки",
"eventSounds": "Звуки событий сервера",
"eventSoundsHint": "Проигрывать звуки палитры сервера: вход участника, упоминания и другие события.",
"soundboard": "Саундборд",
"soundboardHint": "Проигрывать звуки саундборда в голосовой комнате.",
"latency": "Пинг участников",
"latencySharing": "Показывать пинг в голосовой комнате",
"latencySharingHint": "Задержка участников до инстанса обновляется раз в секунду; свой пинг публикуется в комнате.",
"interfaceSounds": "Встроенные звуки интерфейса",
"interfaceSoundsHint": "Короткие сигналы сообщений, упоминаний и входов в голосовую, если на сервере не загружен свой звук."
},
"language": {
"title": "Язык и регион",
"description": "Часовой пояс и язык интерфейса.",
"timezone": "Часовой пояс",
"timezoneHint": "Используется для времени сообщений.",
"locale": "Язык интерфейса",
"localeHint": "Переключается сразу.",
"saved": "Настройки региона сохранены."
},
"channel": {
"noGuild": "Выберите сервер, чтобы настроить комнату.",
"noChannels": "В этом сервере нет текстовых комнат.",
"pick": "Комната",
"noPermission": "Управлять комнатой может владелец сервера и участники с правом MANAGE_WEBHOOKS.",
"webhooks": {
"title": "Вебхуки",
"description": "Вебхук отправляет сообщения в комнату без пользовательской сессии: запрос идёт на ссылку с токеном.",
"empty": "Вебхуков пока нет.",
"create": "Создать вебхук",
"name": "Имя вебхука",
"avatar": "Аватар",
"avatarHint": "PNG, JPEG, WebP или GIF до 2 МБ.",
"submit": "Создать",
"rename": "Переименовать",
"rotate": "Новая ссылка",
"url": "Ссылка вебхука",
"createdAt": "создан {{date}}",
"limit": "занято {{count}}",
"deleteConfirm": "Удалить вебхук? Ссылка перестанет работать, уже отправленные сообщения останутся.",
"stepUpBody": "Создание вебхука требует подтверждения личности: введите пароль{{totp}}."
},
"title": "Фон комнаты",
"description": "Картинка за лентой сообщений. Анимированные GIF и WebP сохраняют анимацию; при системной настройке «уменьшить движение» показывается первый кадр.",
"empty": "Фон не задан.",
"upload": "Загрузить фон",
"remove": "Убрать фон",
"notImage": "Нужен файл изображения",
"tooLarge": "Файл больше 5 МБ"
}
}
}