feat(web): вход с 2FA сразу, панель пользователя, модальные настройки, markdown
По правкам пользователя: - вход: поле «Код 2FA или резервный код» видно сразу, принимает 14-символьные резервные коды (раньше влезало 6 цифр), пустое значение не ломает вход; - нижняя панель: одна подложка, слева аватар и имя с мини-профилем и выбором статуса, справа микрофон, камера, наушники (переключатели, стрелка с выбором устройства и громкости, переход в «Аудио-видео») и шестерёнка; - кнопка «Покинуть сервер» из сайдбара убрана (выход — в «Опасной зоне»); - настройки открываются модальным окном со списком пунктов; «Профиль» имеет вкладки «Основной» и «Сервер» (список серверов, ник и «Применить ко всем серверам»), аватар загружается и удаляется, есть часовой пояс (МСК по умолчанию); - markdown: добавлены ==выделение==, __жирный__, ***оба***, ||спойлер||, #канал; - двойной клик по сообщению ставит ответ (не срабатывает на ссылках, кнопках и при выделенном тексте); - 219 тестов Vitest (было 176), check/lint/test/build зелёные.
This commit is contained in:
@@ -100,15 +100,16 @@
|
||||
"email": "Email",
|
||||
"emailPlaceholder": "you@example.com",
|
||||
"password": "Password",
|
||||
"totp": "2FA code",
|
||||
"totpHint": "Six digits from your authenticator app.",
|
||||
"totp": "2FA or recovery code",
|
||||
"totpHint": "If 2FA is enabled; a recovery code like xxxx-xxxx-xxxx also works.",
|
||||
"submit": "Sign in",
|
||||
"submitting": "Signing in…",
|
||||
"noAccount": "No account yet?",
|
||||
"registerLink": "Create one",
|
||||
"forgot": "Forgot your password? Ask the instance admin.",
|
||||
"instanceStatus": "Instance status",
|
||||
"registrationDisabled": "Registration on this instance is disabled by the admin."
|
||||
"registrationDisabled": "Registration on this instance is disabled by the admin.",
|
||||
"totpRequired": "Enter the 2FA or recovery code — sign-in needs it."
|
||||
},
|
||||
"register": {
|
||||
"title": "Create account",
|
||||
@@ -219,7 +220,8 @@
|
||||
},
|
||||
"selectUnread": "Open channel {{name}}, {{count}} unread",
|
||||
"selectMentions": "Open channel {{name}}, {{count}} mentions",
|
||||
"slowmode": "slowmode {{seconds}}s"
|
||||
"slowmode": "slowmode {{seconds}}s",
|
||||
"leaveHint": "You can leave the server in server settings → “Danger zone”."
|
||||
},
|
||||
"chat": {
|
||||
"log": "Message log of {{name}}",
|
||||
@@ -309,7 +311,11 @@
|
||||
"empty": "Nothing found."
|
||||
},
|
||||
"unread": "Unread messages: {{count}}",
|
||||
"mentions": "Mentions: {{count}}"
|
||||
"mentions": "Mentions: {{count}}",
|
||||
"spoiler": {
|
||||
"show": "Reveal spoiler",
|
||||
"hide": "Hide spoiler"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"panelLabel": "User panel",
|
||||
@@ -319,7 +325,8 @@
|
||||
"open": "Open the user menu",
|
||||
"account": "Account settings",
|
||||
"guilds": "Server settings",
|
||||
"status": "Status"
|
||||
"status": "Status",
|
||||
"noBio": "No bio yet."
|
||||
},
|
||||
"logout": "Sign out",
|
||||
"loggingOut": "Signing out…",
|
||||
@@ -331,6 +338,29 @@
|
||||
"dnd": "Do not disturb",
|
||||
"invisible": "Invisible",
|
||||
"offline": "Offline"
|
||||
},
|
||||
"voice": {
|
||||
"input": "Input device",
|
||||
"output": "Output device",
|
||||
"camera": "Camera",
|
||||
"micVolume": "Microphone volume",
|
||||
"outputVolume": "Sound volume",
|
||||
"micOn": "Unmute microphone",
|
||||
"micOff": "Mute microphone",
|
||||
"cameraOn": "Turn camera on",
|
||||
"cameraOff": "Turn camera off",
|
||||
"soundOn": "Undeafen",
|
||||
"soundOff": "Deafen",
|
||||
"micSettings": "Microphone settings",
|
||||
"cameraSettings": "Camera settings",
|
||||
"soundSettings": "Sound settings",
|
||||
"audioSettings": "Audio & video settings"
|
||||
},
|
||||
"devices": {
|
||||
"default": "Default device",
|
||||
"unavailable": "Devices are unavailable",
|
||||
"empty": "No devices found",
|
||||
"unnamed": "Device {{index}}"
|
||||
}
|
||||
},
|
||||
"gateway": {
|
||||
@@ -357,6 +387,9 @@
|
||||
"profile": "Profile",
|
||||
"security": "Security",
|
||||
"appearance": "Appearance",
|
||||
"notifications": "Notifications",
|
||||
"voice": "Audio & video",
|
||||
"language": "Language & region",
|
||||
"instance": "Instance"
|
||||
},
|
||||
"profile": {
|
||||
@@ -375,7 +408,31 @@
|
||||
"username": "Username",
|
||||
"userId": "User ID",
|
||||
"badges": "Badges",
|
||||
"noBadges": "none"
|
||||
"noBadges": "none",
|
||||
"tabsLabel": "Profile tabs",
|
||||
"tabs": {
|
||||
"main": "General",
|
||||
"server": "Server"
|
||||
},
|
||||
"timezone": "Time zone",
|
||||
"timezoneHint": "Used to show message times.",
|
||||
"timezoneDefault": "default (MSK)",
|
||||
"avatar": {
|
||||
"title": "Avatar",
|
||||
"hint": "Everyone can see this picture.",
|
||||
"preview": "Avatar preview",
|
||||
"choose": "Choose an avatar file",
|
||||
"upload": "Upload avatar",
|
||||
"remove": "Remove avatar",
|
||||
"limit": "Up to {{limit}}; PNG, JPEG, WebP or GIF.",
|
||||
"tooLarge": "The file is larger than {{limit}} — pick a smaller image."
|
||||
},
|
||||
"decorations": {
|
||||
"title": "Decorations",
|
||||
"hint": "Profile badges and frames.",
|
||||
"empty": "No decorations yet.",
|
||||
"stub": "Badges, frames and profile effects are coming later."
|
||||
}
|
||||
},
|
||||
"security": {
|
||||
"title": "Security",
|
||||
@@ -467,7 +524,13 @@
|
||||
"placeholder": "Leave empty to reset the nickname",
|
||||
"current": "Current nickname:",
|
||||
"none": "not set",
|
||||
"saved": "Nickname saved."
|
||||
"saved": "Nickname saved.",
|
||||
"applyAll": "Apply to all servers",
|
||||
"applyAllHint": "One nickname for every server you are in.",
|
||||
"applyAllPending": "Applying…",
|
||||
"applyAllProgress": "Servers updated: {{done}} of {{total}}",
|
||||
"applyAllDone": "Nickname applied on all servers ({{total}}).",
|
||||
"applyAllFailed": "Failed to update servers: {{failed}}."
|
||||
},
|
||||
"members": {
|
||||
"title": "Members",
|
||||
@@ -497,7 +560,33 @@
|
||||
"deleteConfirmTitle": "Delete the server?",
|
||||
"deleteConfirmBody": "“{{name}}” will be deleted permanently.",
|
||||
"deleteConfirm": "Delete"
|
||||
}
|
||||
},
|
||||
"selectLabel": "Choose a server"
|
||||
},
|
||||
"navLabel": "Settings sections",
|
||||
"notifications": {
|
||||
"title": "Notifications",
|
||||
"description": "Sounds, mentions and web push.",
|
||||
"stub": "Notification settings are coming later."
|
||||
},
|
||||
"voice": {
|
||||
"title": "Audio & video",
|
||||
"description": "Input and output devices and volume.",
|
||||
"input": "Microphone",
|
||||
"camera": "Camera",
|
||||
"output": "Sound",
|
||||
"micVolume": "Microphone volume",
|
||||
"outputVolume": "Sound volume",
|
||||
"stub": "Voice channels arrive in the next phase — for now these settings are only stored."
|
||||
},
|
||||
"language": {
|
||||
"title": "Language & region",
|
||||
"description": "Time zone and interface language.",
|
||||
"timezone": "Time zone",
|
||||
"timezoneHint": "Used for message times.",
|
||||
"locale": "Interface language",
|
||||
"localeHint": "Applies immediately.",
|
||||
"saved": "Region settings saved."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": "Настройки региона сохранены."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user