154 lines
12 KiB
TypeScript
154 lines
12 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, 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;
|