Files
lobehub__lobehub/locales/ru-RU/messenger.json
Rdmclin2 c4314f0252 🐛 fix(messenger): stop losing oversize images to a silent download link (#18608)
* 🐛 fix(messenger): stop losing oversize images to a silent download link

- WeChat: the two CDN legs that move the media bytes shared the 15s budget
  sized for a small JSON call. A server far from the CDN is aborted mid-upload,
  the attachment counts as failed, and the picture goes out as a download link
  with nothing pointing at a timeout. They now get 60s — the same distinction
  Telegram's sender already draws between JSON calls and byte transfers.
- Every failure in the attachment chain (download, re-encode, upload) collapsed
  into the same silent `undefined` behind a `debug()` call, so a deployed
  server could degrade every image in a push without recording which step gave
  up. Downloads, compression and WeChat uploads now report the step and the
  reason, so "it sent a link again" stops being the only evidence.
- An oversize image is a real choice — a recompressed JPEG that shows inline,
  or the untouched original behind a download link — so the sender makes it
  instead of the server. `link` skips the download and re-encode entirely, and
  the choice rides the WeChat replay queue so a queued push replays with the
  same decision rather than the default.
- Push modal: the file and every decision about it now share one region, with
  the size and the limit read as the file's own metadata; an oversize file and
  an oversize image no longer use two different shapes for one fact.

* 🌐 chore(i18n): translate the oversize-attachment strings

Also carries the translation backlog `bun run i18n` picked up from earlier
merges (chat / models / setting / tool / verify / selfLearning), which the
daily workflow had not run yet.

* 🔒 fix(messenger): keep presigned URL query strings out of the logs

Addresses the Codex review on #18608.

P1 — the attachment download failure paths wrote the complete `fetchUrl` at
warn level. A presigned storage URL carries `X-Amz-Credential` and
`X-Amz-Signature` in its query string, logs outlive the signature they would
leak, and this loader is reachable from `botMessage`, whose schema accepts a
caller-supplied URL.

`redactUrlForLog` reduces a URL to origin + path — enough to say which object
failed, nothing after it. Applied to every site in this chain that logs a URL,
not only the two the review pointed at: the two `console.warn` calls, the
`content-length` and byte-cap `debug()` lines in the same loader, and
`resolveSafeUrl` / `fetchPublicUrl`'s own traces, which take the raw
caller-supplied string.

* ✅ fix(test): make the publicUrlFetch mocks partial

`redactUrlForLog` joined `publicUrlFetch`, and ten suites mock that module with
a factory naming only `fetchPublicUrl`. A `vi.mock` factory REPLACES the module,
so every unnamed export becomes undefined — five tests across `attachmentBudget`
and `telegram/sendAttachments` died on "No redactUrlForLog export is defined on
the mock" the moment they walked a download-failure path.

Each factory now spreads `vi.importActual` first, which is what vitest's own
error message recommends and what keeps the next export added to
`publicUrlFetch` from breaking suites that never cared about it.

* ♻️ refactor(messenger): carry the degradation reason in the result, not in prints

The previous commit reached for `console.warn` / `console.error` in the helpers
to make a silent degradation visible. Wrong lever:

- level inflation — an image sharp cannot decode is routine input, and it was
  landing in the error stream;
- unbounded volume — up to two lines per attachment, so one push of ten and a
  few retries buries the log (and Vercel bills and samples it);
- prose, not signal — no push, user or operation to join the lines to;
- the tests that came with it asserted on spied console output, i.e. on log
  wording.

The reason is data now. `prepareAttachmentsForBudget` returns `degradations`
(`compression-failed` / `not-compressible` / `source-unavailable` /
`strategy-link` / `unverifiable-size`), and `sendWechatAttachments` returns
`{ failures, undelivered }` where `failures.detail` carries the iLink `errmsg` —
the part that actually diagnoses a refused upload. Every per-attachment event is
back on `debug()`, matching the rest of the server.

Exactly one line is printed, at the delivery boundary that knows whose push it
is, and only when something degraded against the sender's wishes — a deliberate
`link` choice is not a failure:

  [messenger:wechat] 2 attachment(s) sent as a download link —
    hi.png: source-unavailable; a.png: upload-failed (invalid media size)

Volume drops from O(attachments) to O(pushes) and the error level is left for
actual faults. Tests assert the returned reasons; `redactUrlForLog` gets its own
unit tests instead of being checked through a console spy.

* 🐛 fix(messenger): stop offering a compression the server will refuse

Addresses the Codex review on #18608.

P2 — an image past `MAX_COMPRESSION_SOURCE_BYTES` (100MB) is never recompressed:
`prepareAttachmentsForBudget` refuses to buffer a source that large and sends a
download link instead, whatever the sender picked. The modal still offered
"compress it" for such a file and spelled out a re-encode underneath it, so the
option behaved exactly like "send a link" while promising otherwise.

The cap moves to `@lobechat/const` beside the budget table, for the same reason
that table is there: the modal and the sender have to read one number or they
tell the sender different stories. The decision itself is now
`resolveOversizePlan`, a pure function next to `resolveAttachmentType` — an
oversize image only earns a choice when the server will actually attempt the
re-encode, and everything else states the fallback it really gets.

* 🔒 fix(messenger): sanitize logged names, and stop claiming a link was delivered

Addresses the Codex review on #18608.

P2 — `summarizeDegradations` copied a user-controlled filename verbatim into a
persistent log line. A newline in it forges a whole additional entry that a
reader cannot tell from a real one; other control characters corrupt whatever
consumes the stream. `sanitizeForLog` flattens controls and the Unicode line
separators, collapses whitespace and caps the length. The reason string gets the
same treatment — it carries platform error text, which is no more trusted. The
name is sanitized rather than dropped: without it the line cannot say WHICH
attachment degraded, which is the only reason it is written.

P2 — the same line announced attachments "sent as a download link", but it runs
before the link legs, either of which can throw, and `source-unavailable` /
`over-budget-no-link` have no `fetchUrl` to build a link from at all — those are
requeued. It now says they could not be sent as files, which is the part
actually settled at that point. It still runs before the sends on purpose, so a
push that dies mid-delivery leaves its reasons behind.
2026-08-23 15:05:03 +08:00

211 lines
28 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"messenger.activeAgent": "Активный агент",
"messenger.activeAgentPlaceholder": "Выберите агента",
"messenger.detail.addServer": "Добавить сервер",
"messenger.detail.addWorkspace": "Добавить рабочее пространство",
"messenger.detail.commands.agents": "Перечислите ваших агентов и переключитесь на активного",
"messenger.detail.commands.feedback": "Отправьте отзыв команде LobeHub (без ответа ИИ), например, /feedback ваше сообщение",
"messenger.detail.commands.help": "Показать все команды в боте",
"messenger.detail.commands.hint": "Отправьте эти команды боту в личном сообщении.",
"messenger.detail.commands.new": "Начать новый разговор",
"messenger.detail.commands.start": "Привяжите свою учетную запись к LobeHub",
"messenger.detail.commands.stop": "Остановить текущее выполнение",
"messenger.detail.commands.switch": "Переключайтесь между вашей личной областью и рабочими пространствами",
"messenger.detail.commands.title": "Команды",
"messenger.detail.connections.connected": "Подключено",
"messenger.detail.connections.empty": "Откройте бота и отправьте /start, чтобы связать ваш аккаунт.",
"messenger.detail.connections.linkHint": "Рабочее пространство установлено. Откройте Slack и отправьте сообщение боту, чтобы завершить привязку вашего личного аккаунта.",
"messenger.detail.connections.pending": "Ожидание",
"messenger.detail.connections.serverLabel": "сервер",
"messenger.detail.connections.title": "Подключения",
"messenger.detail.connections.userLabel": "пользователь",
"messenger.detail.connections.workspaceLabel": "рабочее пространство",
"messenger.detail.disconnect": "Отключить",
"messenger.discord.connectModal.description": "Добавьте бота LobeHub на сервер Discord, которым вы управляете.",
"messenger.discord.connectModal.inviteButton": "Добавить на сервер Discord",
"messenger.discord.connectModal.notConfigured": "Discord сейчас недоступен. Пожалуйста, попробуйте позже.",
"messenger.discord.connectModal.title": "Добавить бота на ваш сервер",
"messenger.discord.connections.disconnectConfirm": "Удалить этот сервер из вашего списка аудита? Бот останется на сервере, пока администратор сервера его не удалит.",
"messenger.discord.connections.disconnectFailed": "Не удалось удалить сервер.",
"messenger.discord.connections.disconnectSuccess": "Сервер удален.",
"messenger.discord.connections.disconnectTitle": "Удалить сервер",
"messenger.discord.installBlocked.dismiss": "Понял",
"messenger.discord.installBlocked.suggestion": "Напишите в личные сообщения боту LobeHub в Discord, чтобы связать ваш личный аккаунт — вам не нужно добавлять бота снова. Или попросите первоначального установщика удалить этот сервер в настройках LobeHub → Messenger перед повторным добавлением.",
"messenger.discord.installBlocked.title": "Сервер уже подключен",
"messenger.discord.installBlocked.withName": "\"{{workspace}}\" уже подключен к LobeHub другим пользователем.",
"messenger.discord.installBlocked.withoutName": "Этот сервер Discord уже подключен к LobeHub другим пользователем.",
"messenger.discord.installResult.failed": "Не удалось установить Discord ({{reason}}). Пожалуйста, попробуйте снова или обратитесь в службу поддержки.",
"messenger.discord.installResult.reasons.accessDenied": "авторизация была отменена",
"messenger.discord.installResult.reasons.exchangeFailed": "не удалось авторизоваться в Discord",
"messenger.discord.installResult.reasons.generic": "произошла неизвестная ошибка",
"messenger.discord.installResult.reasons.invalidState": "сессия установки истекла",
"messenger.discord.installResult.reasons.missingAppId": "Discord вернул неполную информацию о приложении",
"messenger.discord.installResult.reasons.missingCodeOrState": "Discord вернул неполные параметры установки",
"messenger.discord.installResult.reasons.missingTenant": "Discord не вернул идентификатор сервера",
"messenger.discord.installResult.reasons.missingToken": "Discord не вернул токен доступа",
"messenger.discord.installResult.reasons.persistFailed": "не удалось сохранить подключение к серверу",
"messenger.discord.installResult.success": "Сервер Discord подключен.",
"messenger.discord.userPending.cta": "Открыть в Discord",
"messenger.discord.userPending.hint": "Откройте бота в Discord и отправьте любое сообщение, чтобы завершить привязку вашего аккаунта.",
"messenger.discord.userPending.name": "Еще не привязан",
"messenger.error.agentNotFound": "Агент не найден.",
"messenger.error.disconnectNotAllowed": "Вы можете отключить только те установки, которые начали сами.",
"messenger.error.installationNotFound": "Установка не найдена.",
"messenger.error.linkRequired": "Откройте бота и отправьте /start перед изменением этого подключения.",
"messenger.error.pickDefaultAgent": "Выберите агента по умолчанию перед подтверждением.",
"messenger.error.platformNotConfigured": "Эта платформа мессенджера сейчас недоступна. Пожалуйста, попробуйте позже.",
"messenger.linkCta": "Подключить",
"messenger.linkModal.continueIn": "Продолжить настройку в {{platform}}",
"messenger.linkModal.instructions": "Откройте бота, отправьте /start, затем нажмите \"Привязать аккаунт\", чтобы подключить ваш аккаунт LobeHub.",
"messenger.linkModal.notConfigured": "Это подключение сейчас недоступно. Пожалуйста, попробуйте позже.",
"messenger.linkModal.openCta": "Открыть в {{platform}}",
"messenger.linkModal.scanHint": "Или отсканируйте с помощью телефона, чтобы открыть {{platform}}.",
"messenger.list.discord.description": "Общайтесь с агентами LobeHub из любого сервера Discord через личные сообщения с ботом LobeHub.",
"messenger.list.slack.description": "Общайтесь с агентами LobeHub из любого рабочего пространства Slack через личные сообщения или @LobeHub.",
"messenger.list.telegram.description": "Общайтесь с агентами LobeHub в Telegram и выбирайте, кто будет отвечать, из любого места.",
"messenger.list.wechat.description": "Сканируйте с помощью WeChat, чтобы приватно общаться с вашими агентами LobeHub и переключаться между агентами с помощью /agents.",
"messenger.noPlatformsConfigured": "Платформы пока недоступны. Проверьте позже.",
"messenger.paidBadge": "Профессионал",
"messenger.push.alwaysAvailable": "Готово к отправке",
"messenger.push.alwaysAvailableHint": "Сообщения отправляются на ваш связанный аккаунт {{platform}} как личные сообщения.",
"messenger.push.alwaysDescription": "Бот может проактивно отправлять личные сообщения на ваш связанный аккаунт {{platform}} в любое время.",
"messenger.push.expiresIn": "истекает через {{value}}",
"messenger.push.loadFailed": "Не удалось загрузить статус проактивного сообщения.",
"messenger.push.placeholder": "Напишите сообщение для отправки в {{platform}}…",
"messenger.push.queued": "{{count}} сообщение(й) в очереди будет доставлено после того, как вы отправите сообщение боту в {{platform}}.",
"messenger.push.queuedBusyToast": "Другое сообщение все еще доставляется — ваше поставлено в очередь за ним. Напишите боту в {{platform}}, чтобы получить его.",
"messenger.push.queuedQuotaToast": "Нет отправок в этом окне — ваше сообщение поставлено в очередь. Напишите боту в {{platform}}, чтобы сбросить окно и получить сообщение.",
"messenger.push.queuedRetryToast": "Часть вашего сообщения не была доставлена — остальное поставлено в очередь и будет повторно отправлено после того, как вы напишете боту в {{platform}}.",
"messenger.push.queuedToast": "Окно отправки закрыто — ваше сообщение добавлено в очередь. Отправьте сообщение боту в {{platform}}, чтобы получить его.",
"messenger.push.resource.description": "Файл будет отправлен в виде вложения на ваш связанный аккаунт {{platform}}.",
"messenger.push.resource.oversizeFileConsequence": "Отправлено в виде ссылки для скачивания.",
"messenger.push.resource.oversizeImageCompress": "Сжать",
"messenger.push.resource.oversizeImageCompressHint": "Перекодировано в JPEG с размером менее {{limit}}, чтобы отображаться в чате. Качество немного ухудшится, анимация не может быть сжата — она будет отправлена в виде ссылки.",
"messenger.push.resource.oversizeImageLink": "Отправить ссылку",
"messenger.push.resource.oversizeImageLinkHint": "Оригинальный файл отправляется в виде ссылки для скачивания — в полном качестве, но не отображается в чате.",
"messenger.push.resource.oversizeMeta": "превышает лимит {{limit}} для {{platform}}",
"messenger.push.resource.placeholder": "Добавьте сообщение (необязательно)…",
"messenger.push.retry": "Попробовать снова",
"messenger.push.sectionTitle": "Отправка сообщений",
"messenger.push.send": "Отправить в {{platform}}",
"messenger.push.sentToast": "Отправлено в {{platform}}.",
"messenger.push.sentWindowedToast": "Отправлено в {{platform}} (осталось {{remaining}} отправок в этом окне).",
"messenger.push.target": "Целевая рабочая область",
"messenger.push.title": "Проактивная отправка",
"messenger.push.unavailableToast": "Отправка временно недоступна. Пожалуйста, попробуйте позже.",
"messenger.push.unlinkedToast": "Ваше соединение с {{platform}} недоступно. Подключите его снова и попробуйте еще раз.",
"messenger.push.windowClosed": "Окно отправки закрыто",
"messenger.push.windowClosedHint": "Отправьте любое сообщение боту в {{platform}}, чтобы открыть его.",
"messenger.push.windowOpen": "Окно отправки открыто",
"messenger.push.windowedDescription": "{{platform}} позволяет боту отправлять вам сообщения только в рамках окна отправки — ответьте что-нибудь, чтобы сбросить его до {{max}} отправок / 24 часа.",
"messenger.scope": "Рабочая область",
"messenger.scopePersonal": "Личное",
"messenger.scopePersonalTag": "личное",
"messenger.setActiveFailed": "Не удалось установить как активного.",
"messenger.setActiveSuccess": "Активный агент обновлен.",
"messenger.slack.connectModal.continueButton": "Продолжить в Slack",
"messenger.slack.connectModal.description": "Вы будете перенаправлены в Slack для авторизации установки рабочего пространства LobeHub.",
"messenger.slack.connectModal.notConfigured": "Slack сейчас недоступен. Пожалуйста, попробуйте позже.",
"messenger.slack.connectModal.title": "Продолжить настройку в Slack",
"messenger.slack.connections.disconnectConfirm": "Отключить бота LobeHub от этого рабочего пространства Slack? Существующие привязки пользователей будут приостановлены, пока вы не установите снова.",
"messenger.slack.connections.disconnectFailed": "Не удалось отключить.",
"messenger.slack.connections.disconnectSuccess": "Рабочее пространство отключено.",
"messenger.slack.connections.disconnectTitle": "Отключить рабочее пространство",
"messenger.slack.installBlocked.dismiss": "Понятно",
"messenger.slack.installBlocked.suggestion": "Отправьте личное сообщение @LobeHub в Slack, чтобы привязать ваш личный аккаунт — вам не нужно устанавливать снова. Или попросите первоначального установщика сначала отключить это рабочее пространство, если вы хотите взять на себя управление.",
"messenger.slack.installBlocked.title": "Рабочее пространство уже подключено",
"messenger.slack.installBlocked.withName": "\"{{workspace}}\" уже подключено к LobeHub другим пользователем.",
"messenger.slack.installBlocked.withoutName": "Это рабочее пространство Slack уже подключено к LobeHub другим пользователем.",
"messenger.slack.installResult.failed": "Не удалось установить Slack ({{reason}}). Пожалуйста, попробуйте снова или обратитесь в поддержку.",
"messenger.slack.installResult.reasons.accessDenied": "авторизация была отменена",
"messenger.slack.installResult.reasons.exchangeFailed": "Не удалось авторизовать Slack",
"messenger.slack.installResult.reasons.generic": "произошла неизвестная ошибка",
"messenger.slack.installResult.reasons.invalidState": "сессия установки истекла",
"messenger.slack.installResult.reasons.missingAppId": "Slack вернул неполную информацию о приложении",
"messenger.slack.installResult.reasons.missingCodeOrState": "Slack вернул неполные параметры установки",
"messenger.slack.installResult.reasons.missingTenant": "Slack не вернул идентификатор рабочего пространства",
"messenger.slack.installResult.reasons.missingToken": "Slack не вернул токен бота",
"messenger.slack.installResult.reasons.persistFailed": "не удалось сохранить подключение рабочего пространства",
"messenger.slack.installResult.success": "Рабочее пространство Slack подключено.",
"messenger.subtitle": "Подключите ваш аккаунт к официальному боту LobeHub один раз. Выберите, какой агент будет получать сообщения, переключайтесь в любое время отсюда или через бота.",
"messenger.title": "Мессенджер",
"messenger.unlinkConfirm": "Отключить ваш аккаунт {{platform}} от LobeHub? Входящие сообщения прекратятся, пока вы снова не отправите /start.",
"messenger.unlinkConfirmWechat": "Отключить вашу учетную запись WeChat от LobeHub? Входящие сообщения прекратятся, пока вы не отсканируете QR-код для повторного подключения.",
"messenger.unlinkCta": "Отключить",
"messenger.unlinkFailed": "Не удалось отключить.",
"messenger.unlinkSuccess": "Отключено.",
"messenger.unlinkTitle": "Отключить аккаунт",
"messenger.wechat.accountLabel": "Аккаунт WeChat",
"messenger.wechat.cancelRescan": "Отменить повторное сканирование",
"messenger.wechat.connectCta": "Создать QR-код",
"messenger.wechat.connected": "WeChat подключен.",
"messenger.wechat.defaultAgent": "Агент по умолчанию",
"messenger.wechat.defaultAgentHint": "Новые сообщения WeChat будут направлены этому агенту. Вы можете переключиться позже с помощью /agents.",
"messenger.wechat.error.alreadyLinkedToOther": "Этот аккаунт WeChat уже подключен к другому аккаунту LobeHub.",
"messenger.wechat.error.connectionFailed": "WeChat был проверен, но отправка сообщений не началась. Пожалуйста, попробуйте снова.",
"messenger.wechat.error.incompleteConfirmation": "WeChat вернул неполную информацию об аккаунте. Создайте новый QR-код и попробуйте снова.",
"messenger.wechat.error.pollFailed": "Не удалось проверить статус QR-кода. Пожалуйста, создайте новый код и попробуйте снова.",
"messenger.wechat.error.qrUnavailable": "Не удалось создать QR-код WeChat. Пожалуйста, попробуйте снова.",
"messenger.wechat.error.unlinkBeforeRelink": "Отключите текущий аккаунт WeChat перед подключением другого.",
"messenger.wechat.paidDescription": "Системный бот WeChat доступен в платных персональных планах. Обновите план, чтобы подключить и использовать его.",
"messenger.wechat.paidTitle": "Обновите план для подключения WeChat",
"messenger.wechat.push.description": "WeChat позволяет боту отправлять сообщения только внутри окна отправки — ответьте что-нибудь боту в WeChat, чтобы сбросить его до {{max}} отправок / 24 часа.",
"messenger.wechat.push.expiresIn": "истекает через {{value}}",
"messenger.wechat.push.loadFailed": "Не удалось загрузить статус окна отправки.",
"messenger.wechat.push.placeholder": "Напишите сообщение для отправки в WeChat…",
"messenger.wechat.push.queued": "{{count}} сообщение(я) в очереди будет автоматически доставлено после того, как вы отправите сообщение боту в WeChat.",
"messenger.wechat.push.queuedToast": "Окно отправки закрыто — ваше сообщение поставлено в очередь. Скажите что-нибудь боту в WeChat, чтобы получить его.",
"messenger.wechat.push.sectionTitle": "Отправка сообщений",
"messenger.wechat.push.send": "Отправить в WeChat",
"messenger.wechat.push.sentToast": "Отправлено в WeChat ({{remaining}} отправок осталось в этом окне).",
"messenger.wechat.push.title": "Проактивная отправка",
"messenger.wechat.push.unavailableToast": "Отправка временно недоступна. Пожалуйста, попробуйте позже.",
"messenger.wechat.push.unlinkedToast": "Связь с вашим WeChat недоступна — отсканируйте QR-код заново, чтобы восстановить соединение.",
"messenger.wechat.push.windowClosed": "Окно отправки закрыто",
"messenger.wechat.push.windowClosedHint": "Отправьте любое сообщение боту в WeChat, чтобы открыть его.",
"messenger.wechat.push.windowOpen": "Окно отправки открыто",
"messenger.wechat.qr.expired": "Этот QR-код истек. Создайте новый, чтобы продолжить.",
"messenger.wechat.qr.scanned": "Сканировано. Подтвердите подключение в WeChat.",
"messenger.wechat.qr.tip": "Откройте WeChat на своем телефоне, отсканируйте этот код и подтвердите. Этот код одноразовый и истекает через 5 минут.",
"messenger.wechat.qr.waiting": "Ожидание сканирования WeChat…",
"messenger.wechat.rescan": "Повторное сканирование",
"messenger.wechat.retry": "Попробовать снова",
"messenger.wechat.runtime.failedDescription": "Подключение WeChat отключено. Повторите сканирование, чтобы обновить учетные данные.",
"messenger.wechat.runtime.failedTitle": "Подключение WeChat требует внимания",
"messenger.wechat.runtime.sessionExpiredDescription": "WeChat завершил эту сессию входа. Повторите сканирование, чтобы переподключиться без изменения активного агента.",
"messenger.wechat.runtime.sessionExpiredTitle": "Сессия WeChat истекла",
"messenger.wechat.selectAgentHint": "WeChat подключен. Выберите агента для получения новых сообщений.",
"messenger.wechat.setupTitle": "Подключить WeChat",
"messenger.wechat.upgradeCta": "Просмотреть планы",
"verify.confirm.conflict.description": "Этот аккаунт {{platform}} уже привязан к аккаунту LobeHub {{email}}. Войдите в этот аккаунт, чтобы управлять привязкой, или сначала отключите там, прежде чем повторить попытку.",
"verify.confirm.conflict.switchAccount": "Войти с другим аккаунтом",
"verify.confirm.conflict.title": "Этот аккаунт уже привязан",
"verify.confirm.cta": "Подтвердить привязку",
"verify.confirm.defaultAgent": "Агент по умолчанию",
"verify.confirm.defaultAgentHint": "Ваши сообщения будут сначала направляться сюда. Вы можете переключиться в любое время через /agents в боте или в Настройки → Мессенджер.",
"verify.confirm.defaultAgentPlaceholder": "Выберите агента",
"verify.confirm.fields.lobeHubAccount": "Аккаунт LobeHub",
"verify.confirm.fields.platformAccount": "Аккаунт {{platform}}",
"verify.confirm.fields.workspace": "Рабочее пространство",
"verify.confirm.noAgents": "У вас пока нет агентов. Создайте одного в LobeHub, затем вернитесь, чтобы завершить привязку.",
"verify.confirm.relink.description": "Этот аккаунт LobeHub уже связан с аккаунтом Telegram {{account}}. Чтобы связать другой аккаунт Telegram, сначала отключите текущий в Настройки → Мессенджер.",
"verify.confirm.relink.manage": "Открыть настройки мессенджера",
"verify.confirm.relink.title": "Другой аккаунт Telegram уже связан",
"verify.confirm.title": "Подтвердить привязку",
"verify.confirm.workspace": "Рабочее пространство: {{workspace}}",
"verify.error.alreadyConsumed": "Эта ссылка уже была использована для подключения аккаунта. Войдите в этот аккаунт LobeHub, чтобы управлять подключением, или вернитесь к боту и отправьте /start снова, чтобы получить новую ссылку.",
"verify.error.alreadyConsumedTitle": "Эта ссылка уже использована",
"verify.error.alreadyLinkedToOther": "Этот аккаунт уже привязан к другому аккаунту LobeHub. Сначала войдите в этот аккаунт.",
"verify.error.expired": "Эта привязка истекла. Пожалуйста, вернитесь к боту и отправьте /start снова.",
"verify.error.generic": "Что-то пошло не так. Пожалуйста, попробуйте снова.",
"verify.error.missingToken": "Недействительная привязка. Откройте эту страницу через бота.",
"verify.error.title": "Не удалось подтвердить привязку",
"verify.error.unlinkBeforeRelink": "Этот аккаунт LobeHub уже связан с другим аккаунтом Telegram. Отключите его в Настройки → Мессенджер перед привязкой нового.",
"verify.signInCta": "Войдите, чтобы продолжить",
"verify.signInRequired": "Пожалуйста, войдите в LobeHub, чтобы подтвердить привязку.",
"verify.success.backToLobeHub": "Вернуться в LobeHub",
"verify.success.description": "Ваш аккаунт теперь подключен к {{platform}}. Откройте {{platform}} и отправьте ваше первое сообщение.",
"verify.success.openBot": "Открыть в {{platform}}",
"verify.success.title": "Успешно привязано!"
}