129 lines
11 KiB
TypeScript
129 lines
11 KiB
TypeScript
// Russian primary copy. To add a string:
|
||
// 1. add the key + RU value here (this file is the canonical key list — `en.ts`
|
||
// and the `StringKey` type derive from it),
|
||
// 2. add the same key + EN value in `en.ts`,
|
||
// 3. consume via `t('key', { var: 'x' })` in components.
|
||
// Interpolation uses `{name}` placeholders resolved against the second arg.
|
||
//
|
||
// The widget no longer renders a hero (avatar/name/handle/description) —
|
||
// that block lives in the host's BotShellHero. Status is surfaced inline
|
||
// inside the relevant section.
|
||
|
||
export const RU = {
|
||
// --- Inline section status ---------------------------------------------
|
||
'status.unknown': 'Проверка статуса…',
|
||
'status.disconnected': 'Discord не привязан',
|
||
'status.connected': 'Discord привязан',
|
||
'status.connected-as': 'Discord привязан как {handle}',
|
||
'status.connection-dead': 'Соединение с Discord потеряно',
|
||
'status.token-stored': 'Сессия Discord не активна',
|
||
'status.qr-verifying': 'Проверяем вход…',
|
||
'status.logging-out': 'Завершение сеанса…',
|
||
'status.reconnecting': 'Переподключаюсь к Discord…',
|
||
// --- Section headers ---------------------------------------------------
|
||
'card.login-qr.name': 'Войти по QR-коду',
|
||
// Discord QR требует МОБИЛЬНОЕ приложение Discord (legacy remoteauth
|
||
// не работает с десктопным клиентом) — это важная подсказка, чтобы у
|
||
// пользователя без мобильного клиента не возникло тупика «попробовал
|
||
// и не работает».
|
||
'card.login-qr.desc': 'Отсканировать QR из мобильного приложения Discord',
|
||
'card.refresh.aria': 'Обновить статус',
|
||
'card.refresh.label': 'Обновить статус',
|
||
'card.refresh.name': 'Обновить статус',
|
||
'card.refresh.desc': 'Перепроверить, привязан ли Discord',
|
||
'card.refresh.in-flight': 'Проверяю…',
|
||
// --- About panel -------------------------------------------------------
|
||
'card.about.name': 'Как работает Discord-бот',
|
||
'card.about.desc': 'Вход, безопасность и исходный код',
|
||
'about.title': 'О боте Discord',
|
||
'about.body-1':
|
||
'Этот бот подключает Discord к Vojo. После входа личные чаты и серверы Discord появятся в списке чатов Vojo, а ответы из приложения Vojo будут отправляться собеседникам как обычные сообщения в Discord.',
|
||
'about.body-2':
|
||
'Для входа нужен мобильный клиент Discord — отсканируйте QR-код через «Настройки → Сканировать QR-код». Десктопный Discord или браузер для входа не подходят: используется механизм remoteauth, который доступен только в мобильном приложении.',
|
||
'about.body-3':
|
||
'Подключение работает через open-source мост mautrix-discord. Он создаёт Discord-сессию на сервере Vojo и использует её для связи Discord с вашим аккаунтом Vojo: получает сообщения из Discord и отправляет ваши ответы обратно.',
|
||
'about.github-label': 'Исходный код моста открыт на GitHub:',
|
||
'about.github-url': 'https://github.com/mautrix/discord',
|
||
'about.body-4':
|
||
'Отозвать доступ можно в любой момент — кнопкой «Выйти из Discord» здесь, либо в самом Discord через «Настройки → Устройства → Выйти из Vojo».',
|
||
'about.close': 'Закрыть',
|
||
'about.aria-close': 'Закрыть «О боте»',
|
||
// --- QR form -----------------------------------------------------------
|
||
// Discord QR не ротируется в отличие от Telegram MTProto — мост держит
|
||
// одну сессию remoteauth до успеха, ошибки или таймаута. Поэтому в
|
||
// тексте говорим про «отсканируйте этот QR-код», без указаний на
|
||
// обновление, и таймаут показываем «всего окна» одной строкой.
|
||
'auth-card.qr.title': 'Вход по QR-коду',
|
||
'auth-card.qr.hint': 'Откройте мобильный Discord и отсканируйте этот QR-код.',
|
||
'auth-card.qr.preparing': 'Готовим QR-код…',
|
||
'auth-card.qr.aria': 'QR-код для входа в Discord. Отсканируйте его телефоном.',
|
||
'auth-card.qr.countdown': 'На сканирование осталось {minutes}:{seconds}',
|
||
'auth-card.qr.expired': 'Окно входа истекло. Нажмите «Отмена» и попробуйте снова.',
|
||
'auth-card.qr.step-1': 'Откройте мобильное приложение Discord.',
|
||
'auth-card.qr.step-2': 'Откройте «Настройки → Сканировать QR-код».',
|
||
'auth-card.qr.step-3': 'Отсканируйте QR-код и подтвердите вход на телефоне.',
|
||
// --- hCaptcha challenge -----------------------------------------------
|
||
// Discord иногда требует решить hCaptcha перед завершением remoteauth —
|
||
// anti-abuse-сигнал, не зависящий от конкретного юзера. Vojo-патч
|
||
// отдаёт челлендж сюда в виджет; пользователь решает, токен уходит
|
||
// обратно на мост и логин завершается. Текст не упоминает «бан»: это
|
||
// обычный механизм Discord, а не санкция.
|
||
'auth-card.captcha.title': 'Подтвердите, что вы не робот',
|
||
'auth-card.captcha.hint':
|
||
'Discord попросил решить капчу. Решите её ниже — после этого вход продолжится автоматически.',
|
||
'auth-card.captcha.load-error':
|
||
'Не удалось загрузить капчу. Проверьте сеть и нажмите «Отмена», затем войдите снова.',
|
||
// --- Shared form chrome ------------------------------------------------
|
||
// Cancel в Discord-flow ЛОКАЛЬНЫЙ: legacy-мост не имеет команды отмены
|
||
// активного login-qr, поэтому кнопка просто возвращает виджет в
|
||
// disconnected, а серверная сторона сама истекает по таймауту remoteauth
|
||
// (~2 минуты по умолчанию). Это написано в about.body-2, и пользователь,
|
||
// увидев «Окно входа истекло», понимает, что стало с QR.
|
||
'auth-card.cancel': 'Отмена',
|
||
'auth-card.waiting-hint': 'Бот ещё думает… ответ может идти до 30 секунд.',
|
||
// --- Inline errors -----------------------------------------------------
|
||
'auth-error.captcha-required':
|
||
'Discord потребовал CAPTCHA — вход через QR временно недоступен. Попробуйте позже или войдите через токен в чате с ботом.',
|
||
'auth-error.captcha-send-failed':
|
||
'Не удалось отправить ответ на CAPTCHA. Проверьте сеть и попробуйте войти заново.',
|
||
'auth-error.captcha-expired':
|
||
'CAPTCHA устарела — нажмите «Войти по QR-коду» и решите её заново.',
|
||
'auth-error.login-failed': 'Не удалось войти: {reason}',
|
||
'auth-error.prepare-failed': 'Не удалось подготовить вход: {reason}',
|
||
'auth-error.websocket-failed': 'Не удалось подключиться к серверу входа: {reason}',
|
||
'auth-error.connect-after-login-failed':
|
||
'Вход прошёл, но соединиться с Discord не получилось: {reason}',
|
||
'auth-error.already-logged-in': 'Вы уже вошли в Discord — обновите статус.',
|
||
'auth-error.unknown-command': 'Бот не знает эту команду — проверьте префикс в config.json.',
|
||
'auth-error.disconnect-failed': 'Не удалось отключиться: {reason}',
|
||
// --- Logout / Reconnect ------------------------------------------------
|
||
// Reconnect-action нужен только в connection_dead / token_stored —
|
||
// здоровая сессия не показывает кнопку. Текст глагольный, без префиксов.
|
||
'card.reconnect.name': 'Переподключиться',
|
||
'card.reconnect.desc': 'Восстановить соединение с Discord без повторного входа',
|
||
'card.logout.name': 'Выйти из Discord',
|
||
'card.logout.desc': 'Завершить сеанс на этом аккаунте',
|
||
'card.logout.confirm-prompt': 'Точно выйти?',
|
||
'card.logout.confirm-yes': 'Выйти',
|
||
'card.logout.confirm-no': 'Отмена',
|
||
// --- Diagnostics in transcript ----------------------------------------
|
||
'diag.connecting': 'Соединение с Vojo… ожидаем capability handshake.',
|
||
'diag.ready': 'Готов отправлять команды.',
|
||
'diag.checking-status': 'Проверяю статус подключения…',
|
||
'diag.send-failed': 'ошибка отправки: {message}',
|
||
'diag.history-marker': '─── история ───',
|
||
'diag.history-unavailable': 'Не удалось прочитать историю — проверяю статус заново.',
|
||
// QR-сообщения никогда не выводятся целиком в transcript — body содержит
|
||
// токен `https://discord.com/ra/…`, который мост стирает после скана;
|
||
// сохранять его в DOM-логе виджета означало бы пережить эту защиту.
|
||
// Поэтому в логе только нейтральные диагностические строки.
|
||
'diag.qr-issued': 'QR-код выдан.',
|
||
'diag.qr-consumed': 'QR-код использован — мост подтверждает скан.',
|
||
'diag.captcha-issued': 'Discord прислал CAPTCHA — решите её на форме выше.',
|
||
// --- Bootstrap failure -------------------------------------------------
|
||
'bootstrap.failed': 'Widget не запустился',
|
||
'bootstrap.missing-params': 'Отсутствуют обязательные параметры URL: {names}.',
|
||
'bootstrap.embedded-only': 'Эта страница предназначена для встраивания Vojo по маршруту {route}.',
|
||
} as const;
|
||
|
||
export type StringKey = keyof typeof RU;
|