feat(web): вход с 2FA сразу, панель пользователя, модальные настройки, markdown

По правкам пользователя:

- вход: поле «Код 2FA или резервный код» видно сразу, принимает 14-символьные
  резервные коды (раньше влезало 6 цифр), пустое значение не ломает вход;
- нижняя панель: одна подложка, слева аватар и имя с мини-профилем и выбором
  статуса, справа микрофон, камера, наушники (переключатели, стрелка с выбором
  устройства и громкости, переход в «Аудио-видео») и шестерёнка;
- кнопка «Покинуть сервер» из сайдбара убрана (выход — в «Опасной зоне»);
- настройки открываются модальным окном со списком пунктов; «Профиль» имеет
  вкладки «Основной» и «Сервер» (список серверов, ник и «Применить ко всем
  серверам»), аватар загружается и удаляется, есть часовой пояс (МСК по
  умолчанию);
- markdown: добавлены ==выделение==, __жирный__, ***оба***, ||спойлер||, #канал;
- двойной клик по сообщению ставит ответ (не срабатывает на ссылках, кнопках и
  при выделенном тексте);
- 219 тестов Vitest (было 176), check/lint/test/build зелёные.
This commit is contained in:
2026-09-20 01:32:11 +03:00
parent f26728113d
commit 20eed227ca
31 changed files with 2731 additions and 478 deletions
+98 -9
View File
@@ -100,15 +100,16 @@
"email": "Почта",
"emailPlaceholder": "you@example.com",
"password": "Пароль",
"totp": "Код 2FA",
"totpHint": "Шесть цифр из приложения-аутентификатора.",
"totp": "Код 2FA или резервный код",
"totpHint": "Если 2FA включена; можно ввести резервный код вида xxxx-xxxx-xxxx.",
"submit": "Войти",
"submitting": "Входим…",
"noAccount": "Ещё нет аккаунта?",
"registerLink": "Зарегистрироваться",
"forgot": "Пароль забыт? Обратитесь к администратору инстанса.",
"instanceStatus": "Состояние инстанса",
"registrationDisabled": "Регистрация на этом инстансе выключена администратором."
"registrationDisabled": "Регистрация на этом инстансе выключена администратором.",
"totpRequired": "Введите код 2FA или резервный код — без него вход невозможен."
},
"register": {
"title": "Регистрация",
@@ -219,7 +220,8 @@
},
"selectUnread": "Открыть комнату {{name}}, непрочитанных: {{count}}",
"selectMentions": "Открыть комнату {{name}}, упоминаний: {{count}}",
"slowmode": "медленный режим {{seconds}} с"
"slowmode": "медленный режим {{seconds}} с",
"leaveHint": "Выйти из сервера можно в настройках сервера → «Опасная зона»."
},
"chat": {
"log": "Лента сообщений комнаты {{name}}",
@@ -309,7 +311,11 @@
"empty": "Ничего не найдено."
},
"unread": "Непрочитанных сообщений: {{count}}",
"mentions": "Упоминаний: {{count}}"
"mentions": "Упоминаний: {{count}}",
"spoiler": {
"show": "Показать спойлер",
"hide": "Скрыть спойлер"
}
},
"user": {
"panelLabel": "Панель пользователя",
@@ -319,7 +325,8 @@
"open": "Открыть меню пользователя",
"account": "Настройки аккаунта",
"guilds": "Настройки серверов",
"status": "Статус"
"status": "Статус",
"noBio": "О себе пока не заполнено."
},
"logout": "Выйти",
"loggingOut": "Выходим…",
@@ -331,6 +338,29 @@
"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": {
@@ -357,6 +387,9 @@
"profile": "Профиль",
"security": "Безопасность",
"appearance": "Внешний вид",
"notifications": "Уведомления",
"voice": "Аудио-видео",
"language": "Язык и регион",
"instance": "Инстанс"
},
"profile": {
@@ -375,7 +408,31 @@
"username": "Имя пользователя",
"userId": "ID пользователя",
"badges": "Значки",
"noBadges": "нет"
"noBadges": "нет",
"tabsLabel": "Вкладки профиля",
"tabs": {
"main": "Основной",
"server": "Сервер"
},
"timezone": "Часовой пояс",
"timezoneHint": "По нему показывается время сообщений.",
"timezoneDefault": "по умолчанию (МСК)",
"avatar": {
"title": "Аватар",
"hint": "Картинку видят все участники.",
"preview": "Предпросмотр аватара",
"choose": "Выбрать файл аватара",
"upload": "Загрузить аватар",
"remove": "Удалить аватар",
"limit": "До {{limit}}; PNG, JPEG, WebP или GIF.",
"tooLarge": "Файл больше {{limit}} — выберите картинку поменьше."
},
"decorations": {
"title": "Украшения",
"hint": "Бейджи и рамки профиля.",
"empty": "Украшений пока нет.",
"stub": "Бейджи, рамки и эффекты профиля появятся позже."
}
},
"security": {
"title": "Безопасность",
@@ -467,7 +524,13 @@
"placeholder": "Оставьте пустым, чтобы сбросить ник",
"current": "Текущий никнейм:",
"none": "не задан",
"saved": "Никнейм сохранён."
"saved": "Никнейм сохранён.",
"applyAll": "Применить ко всем серверам",
"applyAllHint": "Один ник для всех серверов, где вы состоите.",
"applyAllPending": "Применяем…",
"applyAllProgress": "Обновлено серверов: {{done}} из {{total}}",
"applyAllDone": "Никнейм применён на всех серверах ({{total}}).",
"applyAllFailed": "Не удалось обновить серверов: {{failed}}."
},
"members": {
"title": "Участники",
@@ -497,7 +560,33 @@
"deleteConfirmTitle": "Удалить сервер?",
"deleteConfirmBody": "Сервер «{{name}}» будет удалён без возможности восстановления.",
"deleteConfirm": "Удалить"
}
},
"selectLabel": "Выбрать сервер"
},
"navLabel": "Пункты настроек",
"notifications": {
"title": "Уведомления",
"description": "Звуки, упоминания и веб-пуш.",
"stub": "Настройки уведомлений появятся позже."
},
"voice": {
"title": "Аудио-видео",
"description": "Устройства ввода и вывода и громкость.",
"input": "Микрофон",
"camera": "Камера",
"output": "Звук",
"micVolume": "Громкость микрофона",
"outputVolume": "Громкость звука",
"stub": "Голосовые комнаты появятся в следующей фазе — пока настройки только сохраняются."
},
"language": {
"title": "Язык и регион",
"description": "Часовой пояс и язык интерфейса.",
"timezone": "Часовой пояс",
"timezoneHint": "Используется для времени сообщений.",
"locale": "Язык интерфейса",
"localeHint": "Переключается сразу.",
"saved": "Настройки региона сохранены."
}
}
}