// 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;