// 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, with active labels («Войдите в Telegram» // instead of passive «Не подключён»). Mid-flow states (awaiting_*) don't // have status labels because the open form is itself the indicator. export const RU = { // --- Inline section status --------------------------------------------- // Status pill mirrors the connected pill («Telegram привязан»). Earlier // copy used «Войдите в Telegram», which read as a duplicate of the login // card sitting directly below — the pill should describe state, the // card should carry the action. 'status.unknown': 'Проверка статуса…', 'status.disconnected': 'Telegram не привязан', 'status.connected': 'Telegram привязан', 'status.connected-as': 'Telegram привязан как {handle}', 'status.logging-out': 'Завершение сеанса…', // QR-вход: после успешного скана мост стирает QR и переходит к 2FA или // подтверждению логина. Это короткий промежуточный pill между скан-моментом // и реальным результатом — обычно секунды. 'status.qr-verifying': 'Проверяем вход…', // --- Section headers --------------------------------------------------- // Human-readable name; bridgev2's `!tg login` is sent under the hood, but // surfacing «/login» on the button makes the UI read like a CLI. 'card.login.name': 'Войти по номеру', // Card desc is descriptive (noun-style), not a third call-to-action — the // section status carries state, the card carries action + how-to. The // mention of «приложение или SMS» reflects Telegram's actual delivery: // for users already logged in on another device the OTP arrives as a // Telegram-app push first, only falling back to SMS if no other session. 'card.login.desc': 'Код придёт в Telegram или по SMS', 'card.login-qr.name': 'Войти по QR-коду', 'card.login-qr.desc': 'Отсканировать QR из приложения Telegram на телефоне', 'card.refresh.aria': 'Обновить статус', 'card.refresh.label': 'Обновить статус', // Refresh-as-card variant for the disconnected state where it sits in // the same `command-grid` as login. Same vocabulary as login card. 'card.refresh.name': 'Обновить статус', 'card.refresh.desc': 'Перепроверить, привязан ли Telegram', // Shown in the desc slot while a refresh request is in flight (button // also goes :disabled + spinning icon). Without this the click has no // visible acknowledgement until the bot replies. 'card.refresh.in-flight': 'Проверяю…', // --- About panel ------------------------------------------------------- 'card.about.name': 'Как работает Telegram-бот', 'card.about.desc': 'Вход, безопасность и исходный код', 'about.title': 'О боте Telegram', 'about.body-1': 'Этот бот подключает Telegram к Vojo. После входа личные чаты и группы из Telegram появятся в списке чатов Vojo, а ответы из приложения Vojo будут отправляться собеседникам как обычные сообщения в Telegram.', 'about.body-2': 'Для входа нужен номер телефона и код из Telegram — как при входе на новом устройстве. Если у вас включена двухэтапная проверка, Telegram дополнительно попросит облачный пароль.', 'about.body-3': 'Подключение работает через open-source мост mautrix-telegram. Он создаёт Telegram-сессию на сервере Vojo и использует её для связи Telegram с вашим аккаунтом Vojo: получает сообщения из Telegram и отправляет ваши ответы обратно.', 'about.github-label': 'Исходный код моста открыт на GitHub:', 'about.github-url': 'https://github.com/mautrix/telegram', 'about.body-4': 'Отозвать доступ можно в любой момент — кнопкой «Выйти из Telegram» здесь, либо в самом Telegram через «Настройки → Устройства».', 'about.close': 'Закрыть', 'about.aria-close': 'Закрыть «О боте»', // --- Phone form -------------------------------------------------------- 'auth-card.phone.title': 'Вход по номеру', 'auth-card.phone.label': 'Номер телефона', 'auth-card.phone.placeholder': '+79991234567', 'auth-card.phone.hint': 'SMS может идти до 30 секунд.', 'auth-card.phone.submit': 'Отправить код', 'auth-card.phone.cooldown': 'Повтор через {seconds} сек', // --- Code form --------------------------------------------------------- 'auth-card.code.title': 'Код подтверждения', 'auth-card.code.label': 'Код из SMS', 'auth-card.code.placeholder': '123456', 'auth-card.code.submit': 'Подтвердить', 'auth-card.code.privacy-hint': 'Telegram-код виден в истории комнаты — можно очистить вручную.', // --- 2FA password form ------------------------------------------------- 'auth-card.password.title': 'Облачный пароль Telegram', 'auth-card.password.hint': 'У вашего аккаунта включена двухэтапная проверка. Введите облачный пароль Telegram — это не пароль от Vojo.', 'auth-card.password.label': 'Пароль', 'auth-card.password.submit': 'Подтвердить', 'auth-card.password.show': 'Показать', 'auth-card.password.hide': 'Скрыть', // --- Shared form chrome ------------------------------------------------ 'auth-card.cancel': 'Отмена', 'auth-card.waiting-hint': 'Бот ещё думает… ответ может идти до 30 секунд.', 'auth-card.code.countdown': 'Код придёт через {seconds} сек', 'auth-card.code.countdown-done': 'Не пришло — нажмите «Отмена» и попробуйте снова.', // --- QR form ----------------------------------------------------------- // Заголовок и подсказка над самим QR. Шаги ниже расписывают, где открыть // сканер в приложении Telegram — без этого у пользователя без опыта // обычно теряется минута на поиски пункта меню. 'auth-card.qr.title': 'Вход по QR-коду', 'auth-card.qr.hint': 'Откройте Telegram на телефоне и отсканируйте этот QR-код.', 'auth-card.qr.preparing': 'Готовим QR-код…', 'auth-card.qr.aria': 'QR-код для входа в Telegram. Отсканируйте его телефоном.', // Обратный отсчёт до серверного таймаута моста (10 минут). Сам QR // ротируется ~раз в 30 секунд (Telegram-серверный пуш через MTProto), // и тут отображается всегда свежий — отсчёт показывает оставшееся // окно ВСЕГО ВХОДА, а не валидность конкретного отображаемого QR. // Формат «MM:SS» нагляднее «через N секунд» при минутном масштабе. 'auth-card.qr.countdown': 'На сканирование осталось {minutes}:{seconds}', 'auth-card.qr.expired': 'Окно входа истекло. Нажмите «Отмена» и попробуйте снова.', // Шаги для пользователя — соответствуют пути в актуальной версии Telegram // на момент M13. Если Telegram перенесёт пункт меню, это правится тут // одной строкой; код кнопок не зависит от текста шагов. 'auth-card.qr.step-1': 'Откройте «Настройки → Устройства» в Telegram.', 'auth-card.qr.step-2': 'Нажмите «Подключить устройство» и отсканируйте этот QR-код.', 'auth-card.qr.step-3': 'Если включён облачный пароль — введите его в следующем шаге.', // --- Inline errors ----------------------------------------------------- 'auth-error.invalid-code': 'Код неверный. Попробуйте снова.', 'auth-error.wrong-password': 'Пароль неверный. Попробуйте снова.', 'auth-error.invalid-value': 'Значение не принято: {reason}', 'auth-error.submit-failed': 'Telegram не принял ввод: {reason}', 'auth-error.login-in-progress': 'У бота уже идёт другой вход. Нажмите «Отмена» и попробуйте снова.', 'auth-error.max-logins': 'Достигнут лимит входов ({limit}). Сначала выйдите из существующего аккаунта.', 'auth-error.unknown-command': 'Бот не знает эту команду — проверьте префикс в config.json.', 'auth-error.start-failed': 'Не удалось начать вход: {reason}', 'auth-error.prepare-failed': 'Не удалось подготовить вход: {reason}', // --- Logout ------------------------------------------------------------ // Same readability rationale as `card.login.name` — the bridgev2 command // name belongs in the wire payload, not on the button. 'card.logout.name': 'Выйти из Telegram', 'card.logout.desc': 'Завершить сеанс на этом аккаунте', 'card.logout.confirm-prompt': 'Точно выйти?', 'card.logout.confirm-yes': 'Выйти', 'card.logout.confirm-no': 'Отмена', 'card.logout.gated': 'Идентификатор сессии ещё загружается — подождите секунду.', // --- 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 содержит // токен `tg://login?token=…`, который мост стирает после скана; сохранять // его в DOM-логе виджета означало бы пережить эту защиту. Поэтому в логе // только нейтральные диагностические строки. 'diag.qr-issued': 'QR-код обновлён.', 'diag.qr-consumed': 'QR-код использован — мост подтверждает скан.', // --- Bootstrap failure ------------------------------------------------- 'bootstrap.failed': 'Widget не запустился', 'bootstrap.missing-params': 'Отсутствуют обязательные параметры URL: {names}.', 'bootstrap.embedded-only': 'Эта страница предназначена для встраивания Vojo по маршруту {route}.', } as const; export type StringKey = keyof typeof RU;