Newer
Older
navi-1 / webclient / src / i18n / messages / ru.js
@Eugene Sukhodolskiy Eugene Sukhodolskiy 1 day ago 27 KB webclient: the sidebar in en, uk and ru
// Русский интерфейс Navi. Слаги те же, что в en.js, — словарь читается по ним,
// а не по порядку строк. Имена продуктов (Navi, Synapse, MCP, Ollama, GitHub…)
// не переводятся: они и есть название. Формы множественного числа выбираются
// по params.n, поэтому у числовых строк здесь четыре ключа вместо двух.
export default {
  // оболочка приложения — заголовки документа и прочее вне самого чата
  'app.titleSettings': 'Navi — Настройки',

  // панель артефактов — опубликованные файлы, ссылки, файлы сессии, фоновые
  'artifacts.panelLabel': 'Артефакты сессии',
  'artifacts.resize': 'Изменить ширину панели',
  'artifacts.close': 'Закрыть артефакты',
  'artifacts.closeDetails': 'Закрыть подробности',
  'artifacts.tabArtifacts': 'Артефакты',
  'artifacts.tabLinks': 'Ссылки',
  'artifacts.tabFiles': 'Файлы',
  'artifacts.tabBackgrounds': 'Фоновые',
  'artifacts.viewedImages': 'Просмотренные изображения',
  'artifacts.viewedImageAlt': 'Изображение, просмотренное Navi {n}',
  'artifacts.emptyArtifacts': 'Нет опубликованных файлов',
  'artifacts.emptyLinks': 'Ссылок пока не найдено',
  'artifacts.emptyFiles': 'В каталоге сессии нет файлов',
  'artifacts.emptyBackgrounds': 'Нет фоновых задач и терминалов',
  'artifacts.openPreview': 'Открыть просмотр',
  'artifacts.openRaw': 'Открыть исходный файл',
  'artifacts.openInline': 'Открыть в браузере',
  'artifacts.showPreview': 'Показать просмотр',
  'artifacts.showSource': 'Показать исходник',
  'artifacts.copyFileLink': 'Скопировать ссылку на файл',
  'artifacts.copyAllLinks': 'Скопировать все ссылки',
  'artifacts.openAllLinks': 'Открыть все ссылки',
  'artifacts.refreshFiles': 'Обновить файлы',
  'artifacts.linksInSession': {
    one: '{n} ссылка в сессии',
    few: '{n} ссылки в сессии',
    many: '{n} ссылок в сессии',
  },
  'artifacts.loadingSource': 'Загрузка исходника...',
  'artifacts.previewUnavailable': 'Просмотр недоступен',
  'artifacts.sourceFailed': 'Не удалось загрузить исходник: {error}',
  'artifacts.latestProgress': 'Ход выполнения',
  'artifacts.noOutput': 'Вывода пока нет — он придёт заметкой в следующем ходу.',
  'artifacts.terminal': 'Терминал',
  'artifacts.directory': 'Каталог',
  'artifacts.toolAndAge': '{tool} · {age} назад',
  'artifacts.statusRunning': 'Выполняется',
  'artifacts.statusDone': 'Готово',
  'artifacts.statusFailed': 'Сбой',
  'artifacts.statusStopped': 'Остановлен',
  'artifacts.statusBusy': 'Занят',
  'artifacts.statusIdle': 'Свободен',
  'artifacts.statusClosed': 'Закрыт',


  // общая лексика, повторяется везде, где смысл тот же

  // боковая панель — разговоры, полоса профилей, подпись внизу
  'sidebar.newChat': 'Новый чат',
  'sidebar.close': 'Закрыть',
  'sidebar.searchPlaceholder': 'Поиск по разговорам...',
  'sidebar.results': {
    one: '{n} результат',
    few: '{n} результата',
    many: '{n} результатов',
  },
  'sidebar.conversations': 'Разговоры',
  'sidebar.serviceSessions': 'Служебные сессии',
  'sidebar.pendingRecallsOnly': 'Только с запланированным возвратом',
  'sidebar.serviceSessionsLabel': 'Служебные сессии (Synapse)',
  'sidebar.search': 'Поиск',
  'sidebar.refresh': 'Обновить',
  'sidebar.loadingConversations': 'Загрузка разговоров...',
  'sidebar.noConversations': 'Разговоров пока нет',
  'sidebar.noMatch': 'Ни один разговор не подходит под фильтр',
  'sidebar.pinned': 'Закреплён',
  'sidebar.recallPending': 'Запланирован возврат к разговору',
  'sidebar.serviceSession': 'Служебная сессия (реакция Synapse)',
  'sidebar.cancelRecall': 'Отменить возврат',
  'sidebar.skipNext': 'Пропустить следующий',
  'sidebar.pin': 'Закрепить',
  'sidebar.unpin': 'Открепить',
  'sidebar.noAuthTitle': 'Авторизация отключена',
  'sidebar.localMode': 'Локальный режим',
  'sidebar.localAvatar': 'локальный',
  'sidebar.admin': 'Админ',
  'sidebar.openProfile': 'Открыть профиль в gnexus-auth',
  'sidebar.avatar': 'аватар',
  'sidebar.logout': 'Выйти',
  'sidebar.login': 'Войти',

  'common.error': 'Что-то пошло не так',
  'common.menu': 'Меню',
  'common.save': 'Сохранить',
  'common.cancel': 'Отмена',
  'common.create': 'Создать',
  'common.add': 'Добавить',
  'common.done': 'Готово',
  'common.never': 'Никогда',
  'common.always': 'Всегда',
  'common.you': 'Вы',
  'common.revoke': 'Отозвать',
  'common.copyToClipboard': 'Скопировать в буфер обмена',

  'common.download': 'Скачать',
  'common.yes': 'Да',
  'common.no': 'Нет',
  'common.notAvailable': 'Н/Д',
  'common.result': 'Результат',
  'common.liveOutput': 'Живой вывод',

  'common.delete': 'Удалить',
  'common.minutesAgo': {
    one: '{n} мин назад',
    few: '{n} мин назад',
    many: '{n} мин назад',
  },
  'common.pullToRefresh': 'Потяните, чтобы обновить',
  'common.releaseToRefresh': 'Отпустите, чтобы обновить',
  'common.refreshing': 'Обновление...',
  'common.justNow': 'только что',

  // колонки таблиц
  'col.name': 'Название',
  'col.key': 'Ключ',
  'col.created': 'Создан',
  'col.lastUsed': 'Последнее использование',

  'col.tool': 'Инструмент',
  'col.status': 'Статус',
  'col.started': 'Начат',
  'col.finished': 'Завершён',
  'col.subagentTokens': 'Токены под-агента',
  'col.pid': 'PID',
  'col.command': 'Команда',
  'col.cwd': 'Рабочий каталог',
  'col.uptime': 'Время работы',
  'col.background': 'Фоновый',
  'col.reason': 'Причина',

  // диалоги подтверждения
  'confirm.revokeKey': 'Отозвать API-ключ «{name}»? Это нельзя отменить.',
  'confirm.revokeTarget': 'Отозвать цель Synapse «{target}»? Это нельзя отменить.',
  'confirm.mcpResetAdmin': 'Сбросить ключ для «{server}» на общий по умолчанию?',

  'confirm.deleteSession': 'Удалить этот разговор?',
  'confirm.mcpReset':
    'Удалить ваш ключ для «{server}»? Сервер перестанет быть подключённым для вас.',

  // сам аккаунт
  'profile.languageAuto': 'Авто (из аккаунта)',
  // Язык всегда пишется на самом себе, поэтому эти три строки одинаковы во всех
  // словарях и переводу не подлежат.
  'profile.langEn': 'English',
  'profile.langUk': 'Українська',
  'profile.langRu': 'Русский',

  // всплывающие сообщения — заголовок, иногда строка текста под ним
  'toast.languageSaved': 'Язык сохранён',
  'toast.keyCreateFailed': 'Не удалось создать ключ',
  'toast.keyRevoked': 'API-ключ отозван',
  'toast.keyRevokeFailed': 'Не удалось отозвать ключ',
  'toast.notificationsDenied': 'Разрешение не выдано',
  'toast.notificationsAllowApp': 'Разрешите уведомления в системных настройках приложения.',
  'toast.notificationsAllowBrowser': 'Разрешите уведомления в настройках сайта в браузере.',
  'toast.notificationsUnavailable': 'Push недоступен',
  'toast.notificationsUnavailableText': 'Сервер сейчас не принимает подписки на push.',
  'toast.notificationsFailed': 'Ошибка push',
  'toast.mcpKeySaved': 'Ключ сохранён для {server}',
  'toast.mcpKeySaveFailed': 'Не удалось сохранить ключ',
  'toast.mcpKeyReset': 'Ключ сброшен для {server}',
  'toast.mcpKeyResetFailed': 'Не удалось сбросить ключ',
  'toast.synapseTargetAdded': 'Цель добавлена',
  'toast.synapseTargetAddFailed': 'Не удалось добавить цель',
  'toast.synapseTargetRevoked': 'Цель отозвана',
  'toast.synapseTargetRevokeFailed': 'Не удалось отозвать цель',
  'toast.reactionsLoadFailed': 'Не удалось загрузить настройки реакций',
  'toast.saveFailed': 'Не удалось сохранить',
  'toast.instructionsSaved': 'Инструкции сохранены',
  'toast.instructionsFailed': 'Не удалось сохранить инструкции',
  'toast.toolsReloaded': {
    one: 'Перезагружен {n} инструмент',
    few: 'Перезагружено {n} инструмента',
    many: 'Перезагружено {n} инструментов',
  },
  'toast.toolsReloadErrors': 'Перезагрузка завершилась ошибками — смотрите панель',
  'toast.toolsReloadFailed': 'Не удалось перезагрузить инструменты',

  // настройки — оболочка, дальше по блоку на вкладку
  'settings.title': 'Настройки',
  'settings.sectionsLabel': 'Разделы настроек',
  'settings.tabApp': 'Приложение',
  'settings.tabAccount': 'Аккаунт',
  'settings.tabNotifications': 'Уведомления',
  'settings.tabSynapse': 'Synapse',
  'settings.tabMcp': 'MCP',

  'settings.languageToolbar': 'Язык интерфейса',
  'settings.languageDescription':
    'По умолчанию Navi следует языку вашего аккаунта gnexus-auth; выбор здесь перекрывает его только для Navi. «Авто» возвращает язык аккаунта.',
  'settings.languageDescriptionOpen':
    'Вход в этот Navi отключён, поэтому язык сохраняется только в этом браузере.',

  // настройки — «Приложение»
  'settings.appTitle': 'Приложение',
  'settings.appDescription':
    'Navi — веб-приложение, но оно может жить на устройстве как обычное: либо установленное в этот браузер, либо как Android-приложение, которое оборачивает тот же интерфейс. Это не исключающие друг друга варианты: на телефоне стоит держать Android-приложение, а везде ещё — установленное веб-приложение.',
  'settings.appInstallTitle': 'Установка в этот браузер',
  'settings.appInstallText':
    'Установка помещает Navi в отдельное окно без адресной строки, добавляет значок в док или на домашний экран и кэширует интерфейс, поэтому приложение открывается мгновенно и показывает сессии даже без сети. Она же включает уведомления о готовых ответах — в том числе когда вкладка закрыта.',
  'settings.appAndroidAlert':
    'Вы читаете это внутри Android-приложения, и оно уже установлено. Чтобы обновить его, скачайте APK ниже и установите поверх старого.',
  'settings.appInstalledAlert':
    'Установлено — Navi работает в отдельном окне, а не во вкладке браузера.',
  'settings.appInstallAction': 'Установить',
  'settings.appInstallHint': 'Браузер попросит подтвердить.',
  'settings.appBrowserSafari': 'Safari:',
  'settings.appIosTap': 'нажмите',
  'settings.appIosShare': '«Поделиться», затем',
  'settings.appIosAddHome': 'На экран «Домой»',
  'settings.appIosNote':
    'Уведомления там требуют iOS 16.4 или новее и работают только в установленном приложении, а не во вкладке Safari.',
  'settings.appBrowserChrome': 'Chrome или Edge:',
  'settings.appChromeClick':
    'нажмите значок установки в правом конце адресной строки или откройте',
  'settings.appChromeMenu': 'меню и выберите',
  'settings.appChromeInstall': 'Установить Navi',
  'settings.appBrowserAndroid': 'Android:',
  'settings.appAndroidOpen': 'откройте',
  'settings.appAndroidMenu': 'меню и выберите',
  'settings.appAndroidInstall': 'Установить приложение',
  'settings.appAndroidAlso': '(иногда «На главный экран»)',
  'settings.appHttpsBefore':
    'Браузеры предлагают это только по HTTPS или на localhost — по обычному адресу',
  'settings.appHttpsAfter':
    'такая возможность не появляется, как и офлайн-режим с уведомлениями.',
  'settings.appAndroidTitle': 'Android-приложение',
  'settings.appAndroidText':
    'Тот же Navi в нативной оболочке. То, чего не даст вкладка браузера: уведомления при заблокированном телефоне — фоновая служба держит соединение открытым — плюс нативная камера и выбор фото, а ссылки открываются в обычном браузере. Сессии, профили и настройки живут на сервере, поэтому приложение и веб-клиент не расходятся.',
  'settings.appApkMissing': 'APK не опубликован на этом сервере — соберите его командой',
  'settings.appVersion': 'Версия',
  'settings.appSize': 'Размер',
  'settings.appBuilt': 'Сборка',
  'settings.appDownloadApk': 'Скачать APK',
  'settings.appAndroidStep1':
    'Откройте скачанный файл на телефоне. Android спросит, разрешить ли установку приложений из этого источника, — разрешите.',
  'settings.appAndroidStep2': 'При первом запуске приложение спросит адрес Navi. Введите',
  'settings.appAndroidStep2Tail':
    ', затем войдите через браузер, когда он откроется; приложение вернётся само.',
  'settings.appAndroidStep3':
    'Более новый APK устанавливается поверх старого и сохраняет настройки. Удалять прежнюю версию пришлось бы только при смене ключа подписи.',

  // настройки — API-ключи
  'settings.keysTitle': 'API-ключи',
  'settings.keysCreate': 'Новый ключ',
  'settings.keysDescription':
    'API-ключи позволяют безголовым клиентам (скриптам, голосовым помощникам, устройствам IoT) аутентифицироваться без OAuth в браузере.',
  'settings.keysNoAuthWarning':
    'Авторизация сейчас отключена. Любые созданные здесь ключи привязаны к локальному анонимному пользователю и дают полный доступ к этому экземпляру Navi.',
  'settings.keysLoading': 'Загрузка API-ключей',
  'settings.keysEmpty': 'API-ключей пока нет. Создайте первый, чтобы начать.',
  'settings.keyCreateTitle': 'Создание API-ключа',
  'settings.keyNamePlaceholder': 'например, Умные часы, Скрипт автоматизации',
  'settings.keyCreatedTitle': 'API-ключ создан',
  'settings.keyCopyNow': 'Скопируйте этот токен сейчас — он',
  'settings.keyCopyNowStrong': 'больше не будет показан',

  // настройки — уведомления
  'settings.notificationsTitle': 'Уведомления',
  'settings.notificationsBridgeText':
    'Приложение держит соединение открытым в фоне и показывает системное уведомление, когда ответ готов, а Navi свёрнут. Если закрыть само приложение, уведомления прекратятся.',
  'settings.notificationsWebText':
    'Push-уведомления позволяют Navi сообщить вам о готовом ответе — даже когда вкладка закрыта. На каждый готовый ответ приходит одно уведомление, но только если ни одно окно Navi не открыто на этой сессии.',
  'settings.notificationsUnsupported':
    'Этот браузер не поддерживает web push (нужны HTTPS, service worker и Push API). Попробуйте Chrome или свежий Firefox.',
  'settings.notificationsRowTitle': 'Push-уведомления',
  'settings.notificationsOnBackground':
    'Включены — фоновый режим держит соединение, пока приложение свёрнуто.',
  'settings.notificationsOn': 'Включены — это устройство подписано.',
  'settings.notificationsBlockedApp': 'Заблокированы в системных настройках приложения.',
  'settings.notificationsBlockedBrowser': 'Заблокированы в настройках сайта в браузере.',
  'settings.notificationsOff': 'Выключены.',

  // настройки — MCP-серверы
  'settings.mcpTitle': 'MCP-серверы',
  'settings.mcpDescriptionAdmin':
    'Всё, что подключено к вашим профилям. Сервер со слотом личного ключа работает под вашим ключом — не задавайте свой, и он продолжит использовать общий ключ, настроенный на этом Navi.',
  'settings.mcpDescription':
    'Всё, что подключено к вашим профилям. Серверу со слотом личного ключа нужен',
  'settings.mcpDescriptionStrong': 'ваш собственный ключ',
  'settings.mcpDescriptionTail':
    '— пока вы его не сохраните, для вас он не подключён вовсе. Серверы без слота общие и доступны всегда.',
  'settings.mcpLoading': 'Загрузка MCP-серверов',
  'settings.mcpEmpty': 'К этому Navi не подключено ни одного MCP-сервера ни в одном профиле.',
  'settings.mcpKeySet':
    'Личный ключ сохранён {date} — используется вместо общего ({location}).',
  'settings.mcpKeyAbsentAdmin':
    'Личного ключа нет — используется общий ключ из конфигурации ({location}).',
  'settings.mcpKeyAbsent': 'Личного ключа нет — этот сервер для вас не подключён.',
  'settings.mcpNoSlot': 'Слота личного ключа нет — работает на общей конфигурации.',
  'settings.mcpKeyPlaceholder': '••• сохранён — введите новый ключ, чтобы заменить',
  'settings.mcpKeyPlaceholderNew': 'Вставьте ваш ключ',
  'settings.mcpReset': 'Сбросить на общий',

  // настройки — доставки Synapse
  'settings.synapseTargetsTitle': 'Доставки Synapse',
  'settings.synapseTargetAdd': 'Добавить цель',
  'settings.synapseTargetsDescription':
    'Доставки из хаба уведомлений GNEXUS Synapse приходят на вебхук этого Navi и проверяются по личному секрету цели. Создайте цель в админ-панели Synapse, затем зарегистрируйте её здесь, чтобы Navi принимал её доставки.',
  'settings.synapseTargetsLoading': 'Загрузка целей',
  'settings.synapseTargetsEmpty':
    'Ни одной цели Synapse не зарегистрировано. Добавьте её, чтобы начать принимать доставки.',
  'settings.synapseTargetColRef': 'Идентификатор цели',
  'settings.synapseTargetAddTitle': 'Добавление цели Synapse',
  'settings.synapseTargetRefPlaceholder': 'например, navi-main (как в админ-панели Synapse)',
  'settings.synapseTargetSecret': 'Секрет доставки',
  'settings.synapseTargetSecretPlaceholder': 's2s-секрет цели Synapse',
  'settings.synapseTargetHintBefore': 'В админ-панели Synapse создайте цель, указывающую на',
  'settings.synapseTargetHintAfter':
    'этого Navi, и вставьте её секрет здесь. Navi использует его, чтобы убедиться, что доставки действительно пришли из Synapse.',

  // настройки — реакции Synapse
  'settings.reactionsTitle': 'Реакции Synapse',
  'settings.reactionsDescription':
    'Когда приходит событие GNEXUS Synapse, Navi может отреагировать сам: диспетчер выбирает профиль по вашим инструкциям, работа идёт в скрытой служебной сессии, а посмотреть её потом можно через переключатель «Служебные сессии» в боковой панели.',
  'settings.reactionsNotConfigured':
    'Интеграция с Synapse не настроена на этом Navi: варианты, отправляющие события в Synapse, отключены. Доставка только в приложение продолжает работать.',
  'settings.reactionsLoading': 'Загрузка настроек реакций',
  'settings.reactionsEnable': 'Включить реакции',
  'settings.reactionsOn': 'Пришедшие события запускают фоновый прогон реакции.',
  'settings.reactionsOff': 'События принимаются и пишутся в журнал, но Navi ничего не делает.',
  'settings.reactionsNotify': 'Сообщать о завершённых реакциях',
  'settings.reactionsOnlyFailures': 'Только сбои',
  'settings.reactionsPushAlways': 'Push после каждого завершённого прогона.',
  'settings.reactionsPushFailures': 'Push только когда прогон закончился ошибками.',
  'settings.reactionsPushNever': 'Не отправлять push о завершении.',
  'settings.reactionsTarget': 'Куда идут уведомления',
  'settings.reactionsTargetNote':
    'Относится к инструменту notify в Navi и к push о завершении реакций.',
  'settings.reactionsTargetApp': 'Только в приложение',
  'settings.reactionsTargetAppSynapse': 'Приложение + Synapse',
  'settings.reactionsTargetSynapse': 'Только Synapse',
  'settings.reactionsInstructions': 'Инструкции для реакций',
  'settings.reactionsInstructionsNote':
    'Указания, по которым диспетчер выбирает профиль и строит задачу. Их можете править и вы, и Navi; каждое изменение попадает в историю ниже.',
  'settings.reactionsInstructionsPlaceholder':
    'например, «События todo из gntodo идут в профиль developer; спам-письма — никуда».',
  'settings.reactionsInstructionsSave': 'Сохранить инструкции',
  'settings.reactionsHistory': 'История правок',

  // настройки — инструменты (только для админа)
  'settings.adminToolsTitle': 'Инструменты',
  'settings.adminToolsReloading': 'Перезагрузка…',
  'settings.adminToolsReload': 'Перезагрузить инструменты',
  'settings.adminToolsDescriptionBefore': 'Перечитывает инструменты из',
  'settings.adminToolsDescriptionAfter':
    ', провайдеры контекста и переподключает все MCP-серверы — без перезапуска и простоя. Новые инструменты можно вызывать со следующего сообщения в любой сессии. Только для админа: подменяет набор инструментов, с которым работают все профили.',
  'settings.adminToolsLoaded': {
    one: 'загружено {n} инструмент',
    few: 'загружено {n} инструмента',
    many: 'загружено {n} инструментов',
  },
  'settings.adminToolsRegistry': '({n} в реестре)',
  'settings.adminToolsMissing':
    'называет {names} — такого инструмента нет, он исключён из всех профилей.',
  'settings.adminToolsMcpFailed': 'Переподключение MCP не удалось: {error}',
  'settings.adminToolsMcpTools': {
    one: '{n} MCP-инструмент',
    few: '{n} MCP-инструмента',
    many: '{n} MCP-инструментов',
  },
  'settings.adminToolsProviders': {
    one: '{n} провайдер контекста',
    few: '{n} провайдера контекста',
    many: '{n} провайдеров контекста',
  },
}