Files
hermes-web/packages/client/src/i18n/locales/ru.ts
T
toor 1e9ea89d86
Build / build (push) Canceled after 0s
NPM Lockfile Check / npm ci --ignore-scripts (push) Canceled after 0s
Playwright / e2e (push) Canceled after 0s
chore: bootstrap hermes-ui skeleton from 0.6.29 snapshot
Import the client, server, skills, tests, and build scripts as the starting
point for the rebuild, then trim the surfaces this project does not ship:
Electron desktop packaging, the marketing website, and the ESP32 firmware
tree. CI keeps the web build, e2e, lockfile, release, and Docker workflows.

Rename the package and CLI entry points to hermes-ui, drop the prepare hook so
npm ci no longer triggers a build, and drop the removed tsconfig and nodemon
references. Rewrite AGENTS.md, ARCHITECTURE.md, DEVELOPMENT.md, and the READMEs
so the documented package map and hard rules match this repository.

reference_code/ is ignored: it is a read-only snapshot, not an input to the build.
2026-10-16 10:34:35 +08:00

2218 lines
134 KiB
TypeScript
Raw 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.
export default {
login: {
title: 'Hermes Studio',
description: 'Введите имя пользователя и пароль для продолжения.',
placeholder: 'Токен доступа',
submit: 'Войти',
tokenRequired: 'Введите токен доступа',
invalidToken: 'Недействительный токен',
connectionFailed: 'Не удалось подключиться к серверу',
passwordLogin: 'Вход по паролю',
tokenLogin: 'Вход по токену',
usernamePlaceholder: 'Имя пользователя',
passwordPlaceholder: 'Пароль',
defaultCredentialsHint: 'Логин по умолчанию: admin, пароль по умолчанию: 123456',
credentialsRequired: 'Введите имя пользователя и пароль',
invalidCredentials: 'Неверное имя пользователя или пароль',
tooManyAttempts: 'Слишком много неудачных попыток входа, повторите попытку позже',
desktopLockResetHint: 'Too many failed login attempts. Open the system tray menu and choose Reset Login to reset the password.',
sessionExpired: 'Сеанс истёк, войдите снова',
accessDenied: 'У вас нет прав доступа к этому ресурсу',
passwordMismatch: 'Пароли не совпадают',
passwordTooShort: 'Длина пароля должна быть не менее 6 символов',
setupSuccess: 'Настройка входа по паролю выполнена успешно',
passwordChanged: 'Пароль успешно изменён',
passwordRemoved: 'Вход по паролю удалён',
setupPassword: 'Настроить вход по паролю',
changePassword: 'Изменить пароль',
changeUsername: 'Изменить имя пользователя',
removePasswordLogin: 'Удалить',
username: 'Имя пользователя',
currentPassword: 'Текущий пароль',
newPassword: 'Новый пароль',
confirmPassword: 'Подтвердите пароль',
newUsername: 'Новое имя пользователя',
usernameChanged: 'Имя пользователя успешно изменено',
usernameTooShort: 'Имя пользователя должно содержать не менее 2 символов',
setupDescription: 'Управление именем пользователя и паролем для входа.',
removeConfirm: 'Учётная запись пользователя должна сохранять вход по паролю.',
passwordLoginNotConfigured: 'Вход по паролю не настроен',
passwordLoginConfigured: 'Текущая учётная запись: {username}',
defaultCredentialTitle: 'Измените учётные данные по умолчанию',
defaultCredentialMessage: 'Текущая учётная запись всё ещё использует имя пользователя или пароль по умолчанию. Во избежание несанкционированного доступа, как можно скорее измените имя пользователя и пароль для этой учётной записи.',
defaultCredentialAction: 'Изменить',
defaultCredentialLater: 'Напомнить позже',
},
users: {
title: 'Управление учётными записями',
description: 'Создавайте пользователей, назначайте роли и управляйте доступом к конфигурациям для обычных администраторов.',
create: 'Создать пользователя',
edit: 'Редактировать пользователя',
username: 'Имя пользователя',
role: 'Роль',
statusLabel: 'Статус',
profiles: 'Доступные конфигурации',
profilesPlaceholder: 'Выберите доступные конфигурации',
allProfiles: 'Все конфигурации',
noProfiles: 'Нет связанных конфигураций',
lastLogin: 'Последний вход',
newPasswordOptional: 'Новый пароль (оставьте пустым, чтобы не менять)',
loadFailed: 'Не удалось загрузить список пользователей',
deleteConfirm: 'Подтвердите удаление этого пользователя?',
enable: 'Включить',
disable: 'Отключить',
roles: {
superAdmin: 'Суперадминистратор',
admin: 'Администратор',
},
status: {
active: 'Включён',
disabled: 'Отключён',
},
},
common: {
loading: 'Загрузка...',
cancel: 'Отмена',
delete: 'Удалить',
retry: 'Повторить',
reset: 'Сбросить',
edit: 'Редактировать',
save: 'Сохранить',
saved: 'Сохранено',
saveFailed: 'Ошибка сохранения',
deleteFailed: 'Ошибка удаления',
ok: 'ОК',
copied: 'Скопировано',
copy: 'Копировать',
update: 'Обновить',
create: 'Создать',
noData: 'Нет данных',
expired: 'Истёк',
fetch: 'Получить',
add: 'Добавить',
enable: 'Включить',
disable: 'Отключить',
configured: 'Настроено',
notConfigured: 'Не настроено',
confirm: 'Подтвердить',
expand: 'Развернуть',
collapse: 'Свернуть',
start: 'Запустить',
stop: 'Остановить',
},
sidebar: {
chat: 'Чат',
backToChat: 'Назад',
search: 'Поиск',
apiRelay: 'Ретранслятор API',
history: 'История',
jobs: 'Задачи',
kanban: 'Канбан',
workflow: 'Рабочий процесс',
models: 'Модели',
profiles: 'Пользователи',
plugins: 'Плагины',
petdex: 'Pets',
skills: 'Навыки',
memory: 'Память',
logs: 'Логи',
usage: 'Использование',
performance: 'Мониторинг производительности',
journey: 'Путь обучения',
skillsUsage: 'Использование навыков',
channels: 'Каналы',
gateways: 'Шлюзы',
terminal: 'Терминал',
singleChat: 'Чат',
globalAgent: 'Global Agent',
groupChat: 'Групповой чат',
files: 'Файлы',
devices: 'Устройства',
groupConversation: 'Диалог',
groupConversationShort: 'Диалог',
groupPlatform: 'Платформа',
groupAgent: 'Агент',
groupAgentShort: 'Агент',
groupSystem: 'Система',
groupSystemShort: 'Система',
groupMonitoring: 'Мониторинг',
groupMonitoringShort: 'Мониторинг',
groupTools: 'Инструменты',
settings: 'Настройки',
connected: 'Подключено',
disconnected: 'Отключено',
collapse: 'Свернуть меню',
expand: 'Развернуть меню',
updateTip: 'Для обновления выполните в терминале "hermes-web-ui update"',
updateVersion: 'Обновить до версии v{version}',
reloadClientVersion: 'Обновить клиент до v{version}',
updating: 'Обновление...',
updateSuccess: 'Обновление успешно. Обновите страницу. Если долго не запускается, запустите вручную.',
updateFailed: 'Ошибка обновления',
logout: 'Выйти',
nodeVersionWarning: 'Обнаружена Node.js v{version}. Пожалуйста, обновитесь до версии 23 или выше.',
changelog: 'Список изменений',
noChangelog: 'Нет списка изменений',
versionManagement: 'Управление версиями',
updateAvailableLabel: '(Новая версия)',
dockerUpdateTitle: 'Обновление Docker',
dockerUpdateGuide: 'В среде Docker, пожалуйста, загрузите последний образ и пересоздайте контейнер:',
dockerUpdateNote: 'Ваши данные сохранятся после пересоздания контейнера.',
},
runtimeVersions: {
title: 'Управление версиями',
runtimeTitle: 'Hermes Runtime',
webUiTitle: 'Web UI',
platform: 'Платформа',
currentWebUi: 'Текущий Web UI',
activeVersion: 'Активная версия',
active: 'Активна',
installed: 'Установлена',
download: 'Скачать',
downloadGithub: 'Скачать с GitHub',
downloadCf: 'Скачать с Cloudflare',
github: 'GitHub',
cf: 'Cloudflare',
useVersion: 'Использовать при следующем запуске',
deleteVersion: 'Удалить',
deleteRuntimeConfirm: 'Удалить Hermes Runtime {version}?',
deleteWebUiConfirm: 'Удалить Web UI {version}?',
deleteRuntimeSuccess: 'Runtime удален',
deleteWebUiSuccess: 'Web UI удален',
refresh: 'Обновить',
noVersions: 'Нет доступных версий',
remoteLoadFailed: 'Не удалось загрузить удаленные версии',
downloadTasks: 'Задачи загрузки',
downloadStarted: 'Загрузка начата',
activateSuccess: 'Выбор версии сохранен. Перезапустите Hermes Studio, чтобы применить его.',
jobStatus: {
queued: 'В очереди',
running: 'Выполняется',
completed: 'Завершено',
failed: 'Ошибка',
},
jobStageStatus: {
queued: 'В очереди',
resolve: 'Определение',
download: 'Загрузка',
verify: 'Проверка',
extract: 'Распаковка',
install: 'Установка',
completed: 'Завершено',
failed: 'Ошибка',
},
jobStage: {
queued: 'В очереди',
download: 'Загрузка',
resolveRuntime: 'Определение пакета Runtime',
verifyRuntime: 'Проверка архива Runtime',
extractRuntime: 'Распаковка архива Runtime',
installRuntime: 'Установка Runtime',
resolveWebUi: 'Определение пакета Web UI',
verifyWebUi: 'Проверка архива Web UI',
extractWebUi: 'Распаковка архива Web UI',
installWebUi: 'Установка Web UI',
completed: 'Завершено',
failed: 'Ошибка',
},
},
codingAgents: {
installFailedHermesHint: 'Installation failed. Ask Hermes to install it for you.',
installFailureReason: 'Reason',
},
mcuDevices: {
title: 'Little Box',
subtitle: 'View device link status',
name: 'Name',
nameOptional: 'Name is optional',
deviceCode: 'Device code',
deviceCodePlaceholder: 'Enter device code',
deviceCodeRequired: 'Enter device code',
channel: 'Channel',
official: 'Official',
unofficial: 'Unofficial',
createdAt: 'Added at',
lanStatus: 'LAN',
remoteStatus: 'Удаленно',
connected: 'Подключено',
disconnected: 'Не подключено',
remoteConnect: 'Удаленное подключение',
remoteConnected: 'Удаленно подключено',
remoteConnectFailed: 'Не удалось подключиться удаленно',
remoteDisconnect: 'Отключить',
remoteDisconnected: 'Удаленно отключено',
remoteDisconnectFailed: 'Не удалось отключить удаленно',
actions: 'Actions',
add: 'Add',
addTitle: 'Add MCU device',
added: 'MCU device added',
addFailed: 'Failed to add MCU device',
purchase: 'Buy',
edit: 'Edit',
editNameTitle: 'Edit name',
nameUpdated: 'Name updated',
nameUpdateFailed: 'Failed to update name',
delete: 'Delete',
deleteTitle: 'Delete MCU device',
deleteConfirm: 'Delete "{name}"?',
deleted: 'MCU device deleted',
deleteFailed: 'Failed to delete MCU device',
loadFailed: 'Failed to load MCU devices',
close: 'Close',
},
devices: {
title: 'Устройства',
count: 'Устройств: {count}',
lastScanned: 'Последнее сканирование: {time}',
refresh: 'Обновить',
empty: 'Устройства не найдены',
computer: 'Компьютер',
endpointLabel: 'Точка доступа',
statusLabel: 'Статус',
online: 'Online',
offline: 'Offline',
address: 'Адрес',
os: 'ОС',
agentVersion: 'Agent',
webUiVersion: 'Web UI',
responseMs: 'Задержка',
lastSeen: 'Последний раз обнаружено',
open: 'Открыть',
never: 'Никогда',
unknown: 'Неизвестно',
loadFailed: 'Не удалось загрузить устройства',
scanFailed: 'Не удалось просканировать устройства',
updateFailed: 'Не удалось обновить устройство',
duplicateRequest: 'Уже есть ожидающий запрос на сопряжение',
manualPairing: 'Pair by URL',
copyPairingLink: 'Copy pairing link',
manualUrlPlaceholder: 'https://device.example.com',
manualUrlRequired: 'Enter a device URL',
manualRequestSent: 'Pairing request sent',
manualRequestFailed: 'Failed to request remote pairing',
pairingLinkCopied: 'Pairing link copied',
pairingLinkCopyFailed: 'Failed to copy pairing link',
pairingCodeTitle: 'Enter pairing code',
pairingCodePlaceholder: 'Pairing code',
pairingCodeRequired: 'Enter the pairing code',
submitPairingRequest: 'Submit request',
processed: 'Обработано',
unprocessed: 'Не обработано',
deleteHistory: 'Удалить запись',
deleteHistoryConfirm: 'Удалить эту запись запроса и отозвать доступ подключения для этого устройства?',
requests: 'Запросы',
requestsWithCount: 'Запросы ({count})',
noRequests: 'Запросов нет',
requestPairing: 'Запросить сопряжение',
paired: 'Сопряжено',
approve: 'Одобрить',
reject: 'Отклонить',
block: 'Заблокировать',
unblock: 'Разблокировать',
inboundStatus: {
none: 'Запрос разрешен',
pending: 'Ожидает',
approved: 'Одобрено',
rejected: 'Отклонено',
blocked: 'Заблокировано',
},
outboundStatus: {
none: 'Не сопряжено',
pending: 'Запрошено',
approved: 'Сопряжено',
rejected: 'Отклонено',
blocked: 'Заблокировано',
},
endpoint: {
web: 'Web',
desktop: 'Настольное приложение',
custom: 'Пользовательский',
},
},
performance: {
title: 'Мониторинг производительности',
subtitle: 'Просмотр системных ресурсов, Bridge Broker, воркеров и активных сеансов',
refresh: 'Обновить',
autoRefreshOn: 'Автообновление',
autoRefreshOff: 'Ручное обновление',
loadFailed: 'Ошибка загрузки данных производительности',
systemCpu: 'ЦП системы',
systemMemory: 'Память системы',
activeSessions: 'Активные сеансы',
runningSessions: 'Запущено {count}',
workers: 'Воркеры',
totalWorkerMemory: 'Общая память воркеров',
processes: 'Процессы',
uptime: 'Время работы',
running: 'Запущен',
stopped: 'Остановлен',
workerMemory: 'Память воркера',
lastUpdated: 'Время обновления',
profile: 'Профиль',
memory: 'Память',
sessions: 'Сеансы',
runningActiveSessions: 'Запущено / Активно',
lastUsed: 'Последнее использование',
status: 'Статус',
noWorkers: 'Нет воркеров',
sessionsByProfile: 'Сеансы по профилям',
noActiveSessions: 'Нет активных сеансов',
},
journey: {
title: 'Путь обучения',
play: 'Воспроизвести путь',
pause: 'Приостановить путь',
refresh: 'Обновить',
loadFailed: 'Не удалось загрузить путь обучения',
nodes: 'Узлы',
edges: 'Связи',
skills: 'Навыки',
memories: 'Воспоминания',
clusters: 'Кластеры',
profile: 'Профиль',
source: 'Источник',
learnedSkills: 'Изученные навыки',
memorySkillEdges: 'Связи памяти',
allKinds: 'Все типы',
allCategories: 'Все категории',
searchPlaceholder: 'Поиск узлов',
noClusters: 'Кластеров нет',
noNodes: 'Узлов пути нет',
noCategory: 'Без категории',
category: 'Категория',
useCount: 'Использований',
createdBy: 'Создано',
timestamp: 'Время',
pinned: 'Закреплено',
},
drawer: {
terminal: 'Терминал',
files: 'Рабочая область',
},
chat: {
contextRemaining: 'Осталось',
contextClickToEdit: 'Нажмите, чтобы изменить размер контекста',
contextEditTitle: 'Изменить размер контекста',
contextEditDesc: 'Установите лимит размера контекста для текущей модели (в токенах)',
contextEditPlaceholder: 'Введите размер контекста',
contextEditHint: 'Типовые значения: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)',
contextEditSave: 'Сохранить',
contextEditCancel: 'Отмена',
contextEditInvalid: 'Введите корректный размер контекста',
contextEditSuccess: 'Размер контекста обновлён',
contextEditFailed: 'Ошибка обновления',
emptyState: 'Начните диалог с Hermes Agent',
viewOlderInHistory: 'Посмотреть более ранние сообщения в истории',
scrollToBottom: 'Прокрутить вниз',
cliEmptyState: 'Начните CLI-диалог',
outlineTitle: 'План беседы',
outlineEmpty: 'Нет содержимого беседы',
outlineUserQuestion: 'Вопрос пользователя',
inputPlaceholder: 'Введите сообщение... (Enter — отправить, Shift+Enter — новая строка)',
inputHeightResizeHint: 'Перетащите, чтобы изменить высоту поля ввода, и дважды щелкните для сброса.',
slashCommandArgs: {
message: '<сообщение>',
title: '<заголовок>',
text: '<текст>',
},
slashCommands: {
usage: 'Рассчитать использование текущего сеанса',
status: 'Показать статус сеанса и очередь',
abort: 'Остановить текущий запуск Bridge',
queue: 'Добавить сообщение в очередь после текущего запуска',
learn: 'Создать переиспользуемый навык из описанных источников',
clear: 'Очистить текущее отображение',
clearHistory: 'Удалить сохранённую историю сообщений текущего сеанса',
title: 'Переименовать текущий сеанс',
compress: 'Запустить сжатие контекста в простое',
steer: 'Отправить направляющий текст текущему запуску Bridge',
destroy: 'Освободить Bridge Agent текущего сеанса',
reloadMcp: 'Перезагрузить серверы MCP',
reloadSkills: 'Перезагрузить команды skills',
},
attachFiles: 'Прикрепить файлы',
reasoningEffort: {
tooltip: 'Глубина рассуждений',
defaultLabel: 'По умолчанию',
options: {
default: 'По умолчанию (config.yaml)',
none: 'Нет',
minimal: 'Минимум',
low: 'Низкая',
medium: 'Средняя',
high: 'Высокая',
xhigh: 'Очень высокая',
},
},
autoPlaySpeech: 'Автовоспроизведение речи',
voiceInput: {
startCapture: 'Начать голосовой ввод',
stopCaptureAndInsert: 'Остановить голосовой ввод и вставить текст в поле ввода',
cancelCapture: 'Отменить голосовой ввод',
statusLabel: 'Статус: {status}',
transcriptLabel: 'Транскрипт: {text}',
errorLabel: 'Ошибка: {error}',
recentEvents: 'Последние события',
status: {
idle: 'Ожидание',
capturing: 'Слушаю',
transcribing: 'Расшифровка',
sending: 'Вставка в поле ввода',
error: 'Ошибка',
},
browserSpeechUnsupported: 'Распознавание речи браузером не поддерживается в этом браузере.',
browserSpeechFailed: 'Распознавание речи браузером не удалось.',
browserSpeechFailedWithReason: 'Распознавание речи браузером не удалось: {error}.',
microphoneUnsupported: 'Запись с микрофона не поддерживается в этом браузере.',
microphoneRecordingFailed: 'Запись с микрофона не удалась.',
},
showToolCalls: 'Показать вызовы инструментов',
hideToolCalls: 'Скрыть вызовы инструментов',
messageQueue: 'Очередь сообщений',
removeQueuedMessage: 'Удалить сообщение из очереди',
stop: 'Остановить',
start: 'Запустить',
stopGateway: 'Остановить шлюз',
send: 'Отправить',
contextUsed: 'Контекст использован:',
sessions: 'Сеансы',
webUiSessions: 'Сеансы',
allProfiles: 'Все профили',
profileMissingModelsTip: 'У профиля «{profile}», к которому относится этот сеанс, нет доступных провайдеров или моделей',
sessionScopeHint: 'Здесь отображаются только текущие сеансы; сеансы CLI, Telegram, Discord, Cron и других каналов доступны в истории только для чтения.',
openHistory: 'Открыть историю',
hermesHistory: 'История Hermes',
historyScopeHint: 'Здесь для чтения отображаются исторические сеансы Hermes текущего профиля с разбивкой по источникам.',
noSessions: 'Нет сеансов',
searchTitle: 'Поиск сеансов',
searchSubtitle: 'Поиск по заголовку или содержимому сообщений',
searchScope: 'Область поиска: только локальная библиотека сеансов Web UI; сеансы истории Hermes только для чтения не включаются.',
searchHint: 'Cmd/Ctrl+K',
searchPlaceholder: 'Поиск сеансов...',
searchEmpty: 'Недавние сеансы',
searchRecent: 'Недавние сеансы',
searchNoResults: 'Нет подходящих сеансов',
searchNoSnippet: 'Нет отображаемого фрагмента',
searchEnterHint: 'Enter — открыть · Esc — закрыть',
searchFailed: 'Ошибка поиска сеансов',
newChat: 'Новый диалог',
agent: 'Agent',
approvalKicker: 'Авторизация в терминале',
approvalTitle: 'Подтвердите команду перед выполнением',
approvalAgree: 'Согласиться',
approvalAllowOnce: 'Разрешить однократно',
approvalAllowSession: 'Разрешить для этого сеанса',
approvalAlways: 'Разрешить всегда',
approvalDeny: 'Отказать',
newCliChat: 'Новый CLI',
deleteSession: 'Удалить этот сеанс?',
sessionDeleted: 'Сеанс удалён',
toggleBatchMode: 'Пакетный выбор',
selectAll: 'Выбрать всё',
confirmBatchDelete: 'Удалить выбранные сеансы ({count})?',
batchDeleteSuccess: 'Удалено сеансов: {count}',
batchDeletePartial: 'Не удалось удалить сеансов: {failed}',
batchDeleteFailed: 'Ошибка пакетного удаления',
rename: 'Переименовать',
archiveSession: 'Архивировать',
unarchiveSession: 'Вернуть из архива',
pin: 'Закрепить',
unpin: 'Открепить',
pinned: 'Закреплено',
chatMode: 'Чат',
liveMode: 'В реальном времени',
liveSessions: 'Сеансы в реальном времени',
recentBadge: 'Недавние',
linkedSessions: 'Связано сеансов: {count}',
noVisibleMessages: 'Нет видимых человеку сообщений.',
monitorRoleUser: 'Пользователь',
monitorRoleAssistant: 'Ассистент',
copySessionLink: 'Копировать ссылку на сеанс',
copySessionId: 'Копировать ID сеанса',
export: 'Экспорт',
editConfig: 'Редактировать конфигурацию',
exportFull: 'Полный экспорт (JSON)',
exportCompressed: 'Сжатый экспорт (TXT)',
exportCompressing: 'Сжатие контекста, подождите...',
exportSuccess: 'Сеанс экспортирован',
exportFailed: 'Ошибка экспорта',
renamed: 'Переименовано',
renameFailed: 'Ошибка переименования',
sessionArchived: 'Сеанс архивирован',
archiveSessionFailed: 'Не удалось архивировать сеанс',
sessionUnarchived: 'Сеанс возвращён из архива',
unarchiveSessionFailed: 'Не удалось вернуть сеанс из архива',
renameSession: 'Переименовать сеанс',
sessionNotFound: 'Сеанс не найден',
enterNewTitle: 'Введите новый заголовок',
workspace: 'Рабочая область',
setWorkspace: 'Установить рабочую область',
setWorkspaceTitle: 'Установить рабочую область сеанса',
workspacePlaceholder: 'Введите путь к проекту, например /home/user/project',
folderPickerEmpty: '(Пусто)',
folderPickerNoFolders: 'Нет папок рабочей области',
folderPickerSelected: 'Выбрано:',
workspaceDefault: 'По умолчанию',
workspaceDefaultTooltip: 'Эта рабочая область задана по умолчанию и будет автоматически подставляться в новых чатах',
workspacePin: 'Сделать рабочей областью по умолчанию',
workspaceUnpin: 'Убрать рабочую область по умолчанию',
workspaceRecent: 'Недавние',
defaultWorkspace: 'Рабочая область по умолчанию',
more: 'Ещё',
workspaceSet: 'Рабочая область установлена',
workspaceSetFailed: 'Ошибка установки рабочей области',
setModel: 'Установить модель',
setModelTitle: 'Установить модель сеанса',
modelSet: 'Модель установлена',
modelSetFailed: 'Ошибка установки модели',
other: 'Другое',
runFailed: 'Ошибка выполнения',
error: 'Ошибка',
tool: 'Инструмент',
arguments: 'Аргументы',
result: 'Результат',
workspaceChanges: 'Изменения workspace',
changedFiles: 'Изменено файлов: {files}',
diffUnavailable: 'Diff недоступен',
binaryFileDiffUnavailable: 'Diff для бинарного файла недоступен',
truncated: '... (обрезано)',
unchangedLines: '{count} строк без изменений',
executionDuration: 'Длительность выполнения',
thinkingLabel: 'Процесс размышления',
thinkingInProgress: 'Размышление',
thinkingShow: 'Развернуть процесс размышления',
thinkingHide: 'Свернуть процесс размышления',
thinkingDuration: 'Наблюдается {duration}',
thinkingChars: '{count} зн.',
copyBubble: 'Копировать сообщение',
copiedBubble: 'Скопировано',
copyFailed: 'Ошибка копирования',
playSpeech: 'Воспроизвести речь',
pauseSpeech: 'Пауза',
resumeSpeech: 'Продолжить',
stopSpeech: 'Остановить',
speechNotSupported: 'Этот браузер не поддерживает воспроизведение речи',
},
workflow: {
title: 'Рабочий процесс',
profile: 'Профиль',
namePlaceholder: 'Название рабочего процесса',
workspace: {
title: 'Выбрать рабочую область',
select: 'Выбрать рабочую область',
clear: 'Очистить рабочую область',
},
actions: {
newWorkflow: 'Новый workflow',
addNode: 'Добавить узел',
createWorkflowFirst: 'Сначала создайте workflow',
reset: 'Сбросить',
startExecution: 'Запустить выполнение',
executionPending: 'Выполнение workflow пока не подключено',
executionStarted: 'Выполнение workflow началось',
executionCompleted: 'Выполнение workflow завершено',
executionFailed: 'Выполнение workflow не удалось',
rerunDownstreamKeepNode: 'Сохранить этот узел и запустить ниже',
rerunDownstreamClearNode: 'Очистить этот узел и запустить ниже',
rerunDownstreamStarted: 'Повторный запуск нижних узлов начат',
rerunFromNodeStarted: 'Повторный запуск с этого узла начат',
rerunFailed: 'Не удалось повторно запустить workflow',
deleteNode: 'Удалить узел',
deleteEdge: 'Удалить соединение',
},
batch: {
toggle: 'Массовый выбор',
selectAll: 'Выбрать все',
confirmDelete: 'Удалить выбранные workflow: {count}?',
deleteSuccess: 'Удалено workflow: {count}',
deletePartial: 'Не удалось удалить workflow: {failed}',
deleteFailed: 'Массовое удаление не удалось',
},
validation: {
nodesRequired: 'Add at least one node',
nodeNameRequired: 'Node {node} needs a name',
providerRequired: 'Node {node} needs a provider',
modelRequired: 'Node {node} needs a model',
apiModeRequired: 'Node {node} needs an API mode',
inputRequired: 'Node {node} needs input',
invalidEdge: 'A connection references a missing node',
invalidConnectionDirection: 'Connections must go from the right output to the left input',
orphanNode: 'Node {node} is not connected to the workflow',
disconnectedFlow: 'The workflow cannot be split into multiple disconnected flows',
cycle: 'The workflow contains a cycle. Adjust the connections before saving.',
},
node: {
title: 'Название узла',
agent: 'Agent',
model: 'Модель',
apiMode: 'Режим API',
input: 'Ввод',
approvalRequired: 'Одобрение после узла',
promptPlaceholder: 'Опишите, что должен сделать этот Agent...',
skillsPlaceholder: 'Skills, Enter для добавления',
uploadImages: 'Загрузить изображения',
},
status: {
idle: 'Бездействует',
queued: 'В очереди',
running: 'Выполняется',
pending_approval: 'Ожидает одобрения',
completed: 'Завершено',
failed: 'Ошибка',
approval_rejected: 'Одобрение отклонено',
canceled: 'Отменено',
},
runs: {
title: 'Run Records',
refresh: 'Refresh',
empty: 'No run records',
startNodes: '{count} start nodes',
show: 'Show run records',
hide: 'Hide run records',
nodeSessionTitle: 'Node Session - {node}',
noNodeSession: 'This node has no session record yet',
loadNodeSessionFailed: 'Failed to load node session',
stop: 'Stop run',
stopRequested: 'Stop requested',
stopFailed: 'Failed to stop run',
delete: 'Delete record',
deleteSuccess: 'Run record deleted',
},
inspector: {
selected: 'Выбранный узел',
none: 'Узел не выбран',
},
stats: {
nodes: 'Узлы',
edges: 'Связи',
},
agents: {
planner: 'Planner',
researcher: 'Researcher',
builder: 'Builder',
reviewer: 'Reviewer',
},
models: {
default: 'Модель по умолчанию',
fast: 'Быстрая модель',
reasoning: 'Модель рассуждений',
},
initialNodes: {
node1: 'Node 1',
node2: 'Node 2',
node3: 'Node 3',
plan: 'Plan',
execute: 'Execute',
review: 'Review',
},
initialPrompts: {
node1: 'Введите данные для этого узла.',
node2: 'Введите данные для этого узла.',
node3: 'Введите данные для этого узла.',
plan: 'Разбейте запрос на выполнимые шаги.',
execute: 'Выполните шаги реализации и создайте артефакты.',
review: 'Проверьте качество результата и определите дальнейшую работу.',
},
newNodeTitle: 'Node {count}',
},
kanban: {
title: 'Канбан',
createTask: 'Создать задачу',
noTasks: 'Нет задач',
allStatuses: 'Все статусы',
allAssignees: 'Все ответственные',
board: {
create: 'Создать канбан',
archive: 'Архивировать канбан',
slugPlaceholder: 'Идентификатор канбана, например project-a',
namePlaceholder: 'Отображаемое имя (необязательно)',
slugRequired: 'Идентификатор канбана не может быть пустым',
created: 'Канбан создан',
archived: 'Канбан архивирован',
archiveConfirm: 'Архивировать текущий канбан?',
},
columns: {
triage: 'На сортировку',
todo: 'К выполнению',
scheduled: 'Запланировано',
ready: 'Готово',
running: 'В работе',
blocked: 'Заблокировано',
review: 'Проверка',
done: 'Выполнено',
archived: 'В архиве',
},
form: {
title: 'Заголовок',
titlePlaceholder: 'Заголовок задачи',
titleRequired: 'Заголовок не может быть пустым',
body: 'Описание',
bodyPlaceholder: 'Описание задачи (необязательно)',
assignee: 'Ответственный',
selectAssignee: 'Выберите ответственного...',
priority: 'Приоритет',
selectPriority: 'Выберите приоритет...',
tenant: 'Арендатор',
tenantPlaceholder: 'Арендатор (необязательно)',
workspace: 'Рабочая область',
workspaceScratch: 'Временная рабочая область',
workspaceDir: 'Использовать каталог',
workspaceWorktree: 'Использовать worktree',
workspacePath: 'Путь рабочей области',
workspacePathPlaceholder: 'Абсолютный путь (необязательно)',
branch: 'Ветка',
branchPlaceholder: 'Ветка worktree',
skills: 'Навыки',
skillsPlaceholder: 'Выберите навыки...',
triage: 'Создать в сортировке',
goalMode: 'Режим цели',
maxRuntime: 'Макс. время выполнения',
maxRuntimePlaceholder: 'например 30m, 2h',
maxRetries: 'Макс. повторов',
maxRetriesPlaceholder: 'Количество повторов',
goalMaxTurns: 'Макс. ходов цели',
goalMaxTurnsPlaceholder: 'Максимум ходов',
},
card: {
assigneeTooltip: 'Ответственный',
priority: {
low: 'Низкий',
medium: 'Средний',
high: 'Высокий',
},
timeAgo: {
justNow: 'Только что',
minutes: '{count} мин. назад',
hours: '{count} ч. назад',
days: '{count} дн. назад',
},
},
detail: {
status: 'Статус',
assignee: 'Ответственный',
priority: 'Приоритет',
tenant: 'Арендатор',
createdAt: 'Дата создания',
startedAt: 'Дата начала',
completedAt: 'Дата завершения',
comments: 'Комментарии',
events: 'События',
runs: 'Записи выполнения',
result: 'Результат выполнения',
sessions: 'Связанные сеансы',
sessionMessages: 'Журнал сеанса',
noSessions: 'Связанные сеансы не найдены.',
artifacts: 'Выходные файлы',
sources: 'Источники данных',
highlights: 'Ключевая информация',
noLog: 'Журнал для этой задачи не найден.',
addComment: 'Добавить комментарий',
commentPlaceholder: 'Напишите комментарий к задаче...',
operations: 'Операции',
},
action: {
title: 'Действие',
complete: 'Завершить',
completeSummary: 'Краткое описание завершения (необязательно)',
block: 'Заблокировать',
blockReason: 'Причина блокировки',
unblock: 'Разблокировать',
assign: 'Назначить',
assignTo: 'Назначить...',
dispatch: 'Запустить диспетчер',
recoveryReason: 'Причина восстановления (необязательно)',
reclaim: 'Вернуть',
reassign: 'Переназначить',
specify: 'Уточнить',
loadLog: 'Загрузить журнал',
loadDiagnostics: 'Загрузить диагностику',
},
message: {
taskCreated: 'Задача создана',
taskCompleted: 'Задача завершена',
taskBlocked: 'Задача заблокирована',
taskUnblocked: 'Задача разблокирована',
taskAssigned: 'Задача назначена',
dispatchNudged: 'Диспетчер запущен',
commentAdded: 'Комментарий добавлен',
taskReclaimed: 'Задача возвращена',
taskReassigned: 'Задача переназначена',
taskSpecified: 'Задача уточнена',
loadFailed: 'Ошибка загрузки задач',
},
stats: {
total: 'Всего',
tasks: 'задач',
},
},
jobs: {
title: 'Периодические задачи',
createJob: 'Создать задачу',
editJob: 'Редактировать задачу',
noJobs: 'Нет периодических задач. Создайте первую.',
sortBy: 'Сортировка',
sortByName: 'По имени',
sortByTime: 'По дате',
sortByNameHint: 'Сортировать по имени',
sortByTimeHint: 'Сортировать по дате',
sortAsc: 'По возрастанию',
sortDesc: 'По убыванию',
name: 'Название',
namePlaceholder: 'Название задачи',
schedule: 'Выражение расписания (Cron)',
schedulePlaceholder: 'Например, 0 9 * * *',
quickPresets: 'Быстрые предустановки',
selectPreset: 'Выберите предустановку...',
presetEveryMinute: 'Каждую минуту',
presetEvery5Min: 'Каждые 5 минут',
presetEveryHour: 'Каждый час',
presetEveryDay: 'Каждый день в 00:00',
presetEveryDay9: 'Каждый день в 09:00',
presetEveryMonday: 'Каждый понедельник в 09:00',
presetEveryMonth: '1-го числа каждого месяца в 09:00',
prompt: 'Подсказка (промпт)',
promptPlaceholder: 'Содержимое для выполнения',
skills: 'Навыки',
skillsPlaceholder: 'Выберите навыки...',
provider: 'Provider',
model: 'Model',
defaultProvider: 'Default provider',
defaultModel: 'Default model',
deliverTarget: 'Цель доставки',
origin: 'Источник',
local: 'Локально',
repeatCount: 'Количество повторений (необязательно)',
modelPlaceholder: 'Модель по умолчанию',
repeatPlaceholder: 'Оставьте пустым для бесконечного повторения',
jobCreated: 'Задача создана',
jobUpdated: 'Задача обновлена',
nameRequired: 'Название обязательно для заполнения',
scheduleRequired: 'Выражение расписания обязательно для заполнения',
loadFailed: 'Ошибка загрузки задач',
jobPaused: 'Задача приостановлена',
jobResumed: 'Задача возобновлена',
jobTriggered: 'Задача запущена',
modelUpdated: 'Модель обновлена',
jobDeleted: 'Задача удалена',
status: {
running: 'Выполняется',
paused: 'Приостановлена',
disabled: 'Отключена',
scheduled: 'Запланирована',
},
info: {
model: 'Модель',
provider: 'Provider',
schedule: 'Расписание',
lastRun: 'Последний запуск',
nextRun: 'Следующий запуск',
deliver: 'Доставка',
repeat: 'Повторение',
},
action: {
pause: 'Приостановить',
pauseJob: 'Приостановить задачу',
resume: 'Возобновить',
resumeJob: 'Возобновить задачу',
runNow: 'Выполнить сейчас',
triggerImmediately: 'Запустить немедленно',
},
runHistory: {
title: 'История выполнения',
runs: 'запусков',
noRuns: 'Нет истории выполнения.',
},
},
skills: {
title: 'Навыки',
targetFilter: 'Среда',
targets: {
hermes: 'Hermes',
claude: 'Claude',
codex: 'Codex',
},
searchPlaceholder: 'Поиск навыков...',
noMatch: 'Нет подходящих навыков',
noSkills: 'Нет навыков',
backTo: 'Назад',
attachedFiles: 'Прикреплённые файлы',
loadFailed: 'Ошибка загрузки навыков',
fileLoadFailed: 'Ошибка загрузки файла',
modified: 'Пользователь изменил',
archived: 'В архиве',
pinned: 'Закреплено',
pin: 'Закрепить навык',
unpin: 'Открепить',
pinFailed: 'Ошибка изменения статуса закрепления',
edit: 'Редактировать',
saving: 'Сохранение...',
editorLabel: 'Редактор skill',
saveSuccess: 'Skill сохранён',
saveFailed: 'Ошибка сохранения skill',
toggleFailed: 'Ошибка переключения статуса навыка',
source: {
builtin: 'Встроенный',
hub: 'Установленный из Hub',
local: 'Локально установленный',
},
writeApprovalButton: 'Ожидает {count}',
writeApprovalTitle: 'Ожидающие подтверждения записи',
writeApprovalDescription: 'Подтвердите или отклоните записи памяти и skills, подготовленные Hermes Agent.',
writeApprovalRefresh: 'Обновить',
writeApprovalEmpty: 'Нет ожидающих записей.',
writeApprovalUnsupported: 'Эта версия Hermes Agent не поддерживает подтверждение записей. Обновите Hermes Agent, чтобы использовать эту функцию.',
writeApprovalMemory: 'Память',
writeApprovalSkills: 'Skills',
writeApprovalViewDiff: 'Проверить',
writeApprovalHideDiff: 'Скрыть',
writeApprovalNoDiff: 'Нет доступных изменений.',
writeApprovalLoadFailed: 'Не удалось загрузить ожидающие записи',
writeApprovalDiffFailed: 'Не удалось загрузить детали записи',
writeApprovalActionFailed: 'Не удалось обработать ожидающую запись',
writeApprovalApproved: 'Запись подтверждена',
writeApprovalRejected: 'Запись отклонена',
writeApprovalApprove: 'Подтвердить',
writeApprovalReject: 'Отклонить',
writeApprovalPendingMemoryWrite: 'Ожидающая запись памяти',
writeApprovalCurrentFile: 'Текущий файл {file}',
writeApprovalProposedFile: 'Предлагаемый файл {file}',
writeApprovalDiffSection: 'Изменения',
writeApprovalPatchOldStringMissing: 'old_string патча не найден в текущем файле {file}; подтверждение не изменит файл.',
writeApprovalRequestedOldString: 'Запрошенный old_string',
writeApprovalCurrentReadFailed: 'Текущий файл {file} не удалось прочитать как текст UTF-8.',
writeApprovalDeleteSkill: 'Это подтверждение удалит skill {skill}.',
writeApprovalRemoveFile: 'Это подтверждение удалит {file} из skill {skill}.',
},
plugins: {
title: 'Плагины',
refresh: 'Обновить',
notice: 'Отображаются манифесты обнаруживаемых плагинов Hermes. Чтение метаданных не загружает код плагинов. Пользовательские standalone-плагины можно включать или отключать здесь; изменения вступают в силу в новых сеансах Hermes.',
loadFailed: 'Ошибка загрузки плагинов',
updateFailed: 'Не удалось обновить плагин',
enableSuccess: '{name} включён',
disableSuccess: '{name} отключён',
commandCopied: 'Команда скопирована',
searchPlaceholder: 'Поиск по ключу, имени, описанию, пути...',
source: 'Источник',
kind: 'Тип',
statusTitle: 'Статус',
configStatus: 'Конфигурация: {status}',
notAvailable: 'Нет',
copyCommand: 'Копировать команду',
managedElsewhere: 'Управляется из другого места',
noMatch: 'Нет плагинов, соответствующих текущим критериям фильтрации',
enabled: 'Включён',
disabled: 'Отключён',
summary: {
total: 'Всего',
active: 'Включено / Авто',
inactive: 'Не включено',
disabled: 'Отключено',
providerManaged: 'Управляется провайдером',
},
status: {
enabled: 'Включён',
'auto-active': 'Автовключение',
inactive: 'Не включён',
disabled: 'Отключён',
'provider-managed': 'Управляется провайдером',
},
statusLabel: {
enabled: 'Включён конфигурацией',
'auto-active': 'Автовключение',
inactive: 'Не включён',
disabled: 'Отключён',
'provider-managed': 'Управляется провайдером',
},
configStatuses: {
enabled: 'Включён',
disabled: 'Отключён',
'not-enabled': 'Не включён',
auto: 'Авто',
'provider-managed': 'Управляется провайдером',
},
table: {
plugin: 'Плагин',
status: 'Статус',
source: 'Источник',
kind: 'Тип',
capabilities: 'Возможности',
path: 'Путь / Точка входа',
manage: 'Управление',
},
capabilities: {
tools: '{count} инструментов',
hooks: '{count} хуков',
env: '{count} переменных окружения',
},
metadata: {
agentRoot: 'Корневая директория агента',
python: 'Python',
scanCwd: 'Сканировать cwd',
projectPlugins: 'Плагины проекта',
},
},
petdex: {
title: 'Petdex Pets',
subtitle: 'Browse the public petdex catalog used by Hermes desktop pets.',
refresh: 'Refresh',
adopt: 'Adopt',
active: 'Active',
adopted: 'Adopted {name}',
adoptFailed: 'Failed to adopt pet',
loadFailed: 'Failed to load petdex catalog',
searchPlaceholder: 'Search by name, slug, author, or kind',
kindFilter: 'Kind',
spritesheet: 'Spritesheet',
submittedBy: 'By {name}',
empty: 'No pets match the current filters.',
showMore: 'Show {count} more',
summary: {
total: 'Catalog total',
visible: 'Matching',
kinds: 'Kinds',
generatedAt: 'Generated at',
},
},
memory: {
title: 'Память',
refresh: 'Обновить',
loadFailed: 'Ошибка загрузки памяти',
myNotes: 'Мои заметки',
noNotes: 'Нет заметок.',
notesPlaceholder: 'Введите текст заметки...',
userProfile: 'Профиль пользователя',
noProfile: 'Нет профиля.',
profilePlaceholder: 'Введите профиль пользователя...',
soul: 'Душа',
noSoul: 'Нет конфигурации души.',
soulPlaceholder: 'Введите конфигурацию души...',
},
models: {
title: 'Модели',
searchPlaceholder: 'Поиск моделей...',
noResults: 'Нет результатов',
noModels: 'Нет моделей',
addProvider: 'Добавить провайдера',
refreshModelCache: 'Обновить кеш моделей',
refreshModelCacheLoading: 'Обновление кеша моделей...',
refreshModelCacheSuccess: 'Кеш моделей обновлен',
refreshModelCacheFailed: 'Не удалось обновить кеш моделей',
providerType: 'Тип провайдера',
preset: 'Предустановка',
custom: 'Пользовательский',
selectProvider: 'Выбрать провайдера',
chooseProvider: 'Выберите провайдера...',
getApiKey: 'Получить API-ключ',
name: 'Название',
autoGeneratedName: 'Генерируется автоматически на основе базового URL',
baseUrl: 'Базовый URL',
region: 'Регион',
regionIntl: 'Международный',
regionCn: 'Китай',
baseUrlPlaceholder: 'Например, https://api.example.com/v1',
apiKey: 'API-ключ',
apiKeyPlaceholder: 'sk-...',
defaultModel: 'Модель по умолчанию',
selectOrInput: 'Выберите или введите название модели...',
selectModel: 'Выберите модель...',
providerAdded: 'Провайдер добавлен',
providerDeleted: 'Провайдер удалён',
providerCredentialsCleared: 'Учётные данные провайдера очищены',
clearProviderCredentials: 'Очистить учётные данные',
clearCredentialsConfirm: 'Очистить сохранённые учётные данные для «{name}»? Этот встроенный провайдер останется в списке и снова заработает после настройки учётных данных.',
disableProvider: 'Отключить провайдера',
disableProviderConfirm: 'Отключить встроенного провайдера «{name}»? Он останется встроенным и его можно будет включить позже.',
providerDisabled: 'Провайдер отключён',
defaultProviderUpdated: 'Провайдер по умолчанию обновлён',
defaultProviderUpdateFailed: 'Не удалось обновить провайдера по умолчанию',
defaultModelUpdated: 'Модель по умолчанию обновлена',
defaultModelUpdateFailed: 'Не удалось обновить модель по умолчанию',
deleteProvider: 'Удалить провайдера',
deleteConfirm: 'Удалить "{name}"?',
codexLoginTitle: 'Вход в OpenAI Codex',
codexWaiting: 'Введите следующий код на странице авторизации:',
codexCopyCode: 'Код скопирован',
codexOpenLink: 'Открыть страницу авторизации',
codexApproved: 'Вход выполнен',
codexExpired: 'Авторизация истекла. Повторите попытку.',
nousLoginTitle: 'Вход в Nous Portal',
nousWaiting: 'Введите этот код на странице авторизации:',
nousCopyCode: 'Код скопирован',
nousOpenLink: 'Открыть страницу авторизации',
nousApproved: 'Вход выполнен',
nousDenied: 'Авторизация отклонена. Повторите попытку.',
nousExpired: 'Авторизация истекла. Повторите попытку.',
copilotLoginTitle: 'Вход в GitHub Copilot',
copilotWaiting: 'Перейдите на GitHub и введите код устройства для авторизации. Окно закроется автоматически после завершения.',
copilotCopyCode: 'Код скопирован',
copilotOpenLink: 'Открыть страницу авторизации GitHub',
copilotApproved: 'Вход выполнен!',
copilotDenied: 'Авторизация отклонена.',
copilotExpired: 'Срок действия ссылки истёк. Повторите попытку.',
copilotAddDetectedTitle: 'Обнаружен GitHub Copilot',
copilotAddDetected: 'На этом компьютере найдены учётные данные OAuth GitHub Copilot. Нажмите «Добавить», чтобы включить Copilot в Hermes.',
copilotAddSourceEnv: 'Источник: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)',
copilotAddSourceGhCli: 'Источник: gh CLI (gh auth token)',
copilotAddSourceAppsJson: 'Источник: плагин Copilot для VS Code (apps.json)',
copilotDeleteHintEnv: 'Это действие удалит COPILOT_GITHUB_TOKEN из ~/.hermes/.env, не затрагивая другие инструменты.',
copilotDeleteHintGhCli: 'Copilot будет удалён из списка Hermes. Это не повлияет на gh CLI — `gh auth status` по-прежнему будет показывать вход.',
copilotDeleteHintAppsJson: 'Copilot будет удалён из списка Hermes. Это не повлияет на вход в плагин Copilot для VS Code.',
xaiLoginTitle: 'Вход через OAuth xAI Grok',
xaiWaiting: 'Авторизуйтесь на открывшейся странице xAI. Окно закроется автоматически.',
xaiOpenLink: 'Открыть страницу авторизации xAI',
xaiCopyLink: 'Копировать ссылку авторизации',
xaiApproved: 'Вход выполнен!',
xaiExpired: 'Срок действия ссылки истёк. Повторите попытку.',
anthropicLoginTitle: 'Вход Claude OAuth',
anthropicWaiting: 'Завершите авторизацию на странице Claude и вставьте полученный код здесь.',
anthropicOpenLink: 'Открыть страницу авторизации Claude',
anthropicCopyLink: 'Копировать ссылку авторизации',
anthropicCodePlaceholder: 'Вставьте код авторизации...',
anthropicSubmitCode: 'Отправить код',
anthropicApproved: 'Вход выполнен!',
anthropicExpired: 'Авторизация истекла. Повторите попытку.',
geminiLoginTitle: 'Вход Google Gemini OAuth',
geminiWaiting: 'Завершите авторизацию на открытой странице Google. Окно закроется автоматически.',
geminiOpenLink: 'Открыть страницу авторизации Google',
geminiCopyLink: 'Копировать ссылку авторизации',
geminiApproved: 'Вход выполнен!',
geminiExpired: 'Срок действия ссылки истёк. Повторите попытку.',
customBadge: 'Пользовательская',
previewBadge: 'Предварительная',
disabledBadge: 'Недоступна',
disabledTooltip: 'Эта модель недоступна для текущей учётной записи',
customModelPlaceholder: 'ID модели, отсутствующей в списке',
customModelHint: 'Используйте, если провайдер поддерживает модель, но она не возвращена. Не переименование. Нажмите Enter для загрузки.',
removeCustomModel: 'Удалить эту модель из списка',
refresh: 'Обновить список моделей (перезагрузить config.yaml)',
noProviders: 'Нет провайдеров. Добавьте первого.',
models: 'Список моделей',
count: 'моделей',
more: 'ещё',
aliasEdit: 'Переименовать',
aliasTitle: 'Отображаемое имя модели',
aliasTitleFor: 'Отображаемое имя для {model}',
aliasPlaceholder: 'Оставьте пустым для использования исходного ID модели',
aliasHint: 'Изменяет только отображаемое имя в Web UI. В Hermes отправляется исходный ID модели.',
aliasCanonical: 'Исходный ID: {model}',
aliasUseOriginal: 'Восстановить исходный ID',
aliasManage: 'Отображаемые имена',
aliasManageFor: 'Отображаемые имена для {provider}',
aliasSaveFailed: 'Не удалось сохранить отображаемое имя',
manageVisibleModels: 'Управлять видимыми моделями',
manageVisibleModelsFor: 'Управление видимыми моделями для {name}',
visibilityHint: 'Влияет только на отображение в выборе моделей Web UI и на странице моделей. Не изменяет конфигурацию provider/model в Hermes CLI. Вызовы используют исходный ID модели.',
visibilitySelectOne: 'Оставьте хотя бы одну видимую модель',
visibilitySaved: 'Видимые модели сохранены',
visibilitySaveFailed: 'Не удалось сохранить видимые модели',
showAllModels: 'Показать все модели',
clearVisibleModels: 'Снять все',
generalTitle: 'Основные модели',
combinationTitle: 'Ансамбли моделей',
combinationSubtitle: 'Настройте пресеты MoA: reference-модели сначала дают варианты, затем одна aggregator-модель формирует финальный ответ и вызовы инструментов.',
combinationPreset: 'Пресет',
combinationName: 'Название',
combinationAddModel: 'Добавить ансамбль моделей',
combinationEditModel: 'Изменить ансамбль моделей',
combinationNewPreset: 'Новый пресет',
combinationPresetPlaceholder: 'например review',
combinationAddPreset: 'Добавить пресет',
combinationSetDefault: 'Сделать стандартным',
combinationEnabled: 'Включить reference-модели',
combinationReferenceModels: 'Reference-модели',
combinationReferenceModel: 'Reference-модель',
combinationAddReference: 'Добавить reference-модель',
combinationAggregator: 'Aggregator-модель',
combinationReferenceTemperature: 'Температура reference',
combinationAggregatorTemperature: 'Температура aggregator',
combinationMaxTokens: 'Макс. токенов',
combinationNotSet: 'Не задано',
combinationSaved: 'Ансамбль моделей сохранен',
combinationLoadFailed: 'Не удалось загрузить ансамбль моделей',
combinationSaveFailed: 'Не удалось сохранить ансамбль моделей',
combinationPresetExists: 'Пресет уже существует',
combinationNameRequired: 'Введите название ансамбля моделей',
combinationNameInvalid: 'Название может содержать только буквы, цифры, подчеркивания, дефисы и точки',
combinationReferenceRequired: 'Добавьте хотя бы одну reference-модель',
combinationAggregatorRequired: 'Выберите aggregator-модель',
auxiliaryTitle: 'Вспомогательные модели',
auxiliarySubtitle: 'Переопределения моделей для фоновых задач: сжатия, зрения, подтверждений, MCP и обслуживания.',
auxiliaryRefresh: 'Обновить',
auxiliaryTask: 'Задача',
auxiliaryTimeout: 'Тайм-аут',
auxiliaryDownloadTimeout: 'Тайм-аут загрузки',
auxiliaryActions: 'Действия',
auxiliaryDefault: 'По умолчанию',
auxiliaryCustomEndpoint: 'Пользовательский endpoint',
auxiliaryProviderAuto: 'Авто',
auxiliaryProviderMain: 'Основная модель',
auxiliaryProviderPlaceholder: 'auto, main или ключ провайдера',
auxiliaryDownloadShort: 'загрузка',
auxiliaryExtraBody: 'JSON дополнительного тела',
auxiliaryClear: 'Сбросить',
auxiliarySaved: 'Вспомогательные модели сохранены',
auxiliaryLoadFailed: 'Не удалось загрузить вспомогательные модели',
auxiliarySaveFailed: 'Не удалось сохранить вспомогательные модели',
auxiliaryInvalidExtraBody: 'Дополнительное тело должно быть JSON-объектом',
auxiliaryTaskCompression: 'Сжатие',
auxiliaryTaskVision: 'Зрение',
auxiliaryTaskWebExtract: 'Извлечение из веб-страниц',
auxiliaryTaskSkillsHub: 'Центр навыков',
auxiliaryTaskApproval: 'Подтверждение',
auxiliaryTaskMcp: 'MCP',
auxiliaryTaskTitleGeneration: 'Генерация заголовков',
auxiliaryTaskTriageSpecifier: 'Уточнение triage',
auxiliaryTaskKanbanDecomposer: 'Разбиение Kanban',
auxiliaryTaskProfileDescriber: 'Описание профиля',
auxiliaryTaskCurator: 'Куратор',
auxiliaryTaskSessionSearch: 'Поиск сессий',
auxiliaryTaskFlushMemories: 'Запись воспоминаний',
currentDefault: 'Текущая по умолчанию',
defaultShort: 'По умолч.',
setDefaultProvider: 'Сделать провайдером по умолчанию',
setDefault: 'Сделать по умолчанию',
builtIn: 'Встроенный',
customType: 'Пользовательский',
provider: 'Провайдер',
contextLength: 'Длина контекста',
contextLengthPlaceholder: 'Например, 200000 (необязательно)',
apiMode: 'Режим API',
local: 'Локальный ({host})',
selectProviderRequired: 'Выберите провайдера',
baseUrlRequired: 'Базовый URL обязателен',
apiKeyRequired: 'API-ключ обязателен',
modelRequired: 'Модель по умолчанию обязательна',
enterBaseUrl: 'Сначала введите базовый URL',
unexpectedFormat: 'Неожиданный формат ответа',
foundModels: 'Найдено моделей: {count}',
fetchFailed: 'Не удалось получить модели',
},
profiles: {
title: 'Профили',
create: 'Создать профиль',
import: 'Импорт',
export: 'Экспорт',
rename: 'Переименовать',
delete: 'Удалить',
switchTo: 'Переключить профиль Hermes',
switchConfirm: 'Будет выполнено `hermes profile use {name}` и активный профиль Hermes CLI переключится. Продолжить?',
switchSuccess: 'Активный профиль Hermes переключён на "{name}"',
switchFailed: 'Не удалось переключить профиль Hermes. Возможно, требуется ручной перезапуск шлюза.',
createSuccess: 'Профиль "{name}" создан',
createFailed: 'Ошибка создания профиля',
renameSuccess: 'Профиль переименован',
renameFailed: 'Ошибка переименования профиля',
deleteConfirm: 'Удалить профиль "{name}"?',
deleteSuccess: 'Профиль удалён',
deleteFailed: 'Ошибка удаления профиля',
exportSuccess: 'Профиль экспортирован',
exportFailed: 'Ошибка экспорта профиля',
importSuccess: 'Профиль импортирован',
importFailed: 'Ошибка импорта профиля',
importSelectFile: 'Выберите архивный файл',
importInvalidFile: 'Выберите корректный архивный файл (.tar.gz, .tgz, .gz, .zip)',
name: 'Название профиля',
namePlaceholder: 'Только строчные буквы, цифры, дефисы',
nameValidation: 'Название профиля может содержать только строчные буквы, цифры, символы подчёркивания и дефисы',
newName: 'Новое название',
newNamePlaceholder: 'Строчные буквы, цифры, дефис',
cloneFromCurrent: 'Клонировать из текущего профиля',
cloneCleanupNotice: 'При клонировании автоматически пропускаются эксклюзивные учётные данные платформ (Weixin / Telegram / Slack и др.), чтобы избежать конфликта с исходным профилем',
cloneStrippedCredentials: 'Очищено {count} эксклюзивных учётных данных: {list}',
cloneDisabledPlatforms: 'Отключено платформ: {count} — {list}',
cloneStrippedConfigCredentials: 'Очищено встроенных учётных данных в config.yaml: {count} — {list}',
archivePath: 'Путь к архиву',
archivePathPlaceholder: 'Путь к архивному файлу на сервере',
importName: 'Название профиля (необязательно)',
importNamePlaceholder: 'Оставьте пустым для использования имени архива',
active: 'Активен',
model: 'Модель',
gateway: 'Шлюз',
alias: 'Псевдоним',
provider: 'Провайдер',
path: 'Путь',
skills: 'Навыки',
hasEnv: 'Есть .env',
hasSoulMd: 'Есть soul.md',
noProfiles: 'Нет профилей. Создайте первый.',
avatar: {
title: 'Пользовательский аватар',
customize: 'Аватар',
upload: 'Загрузить изображение',
random: 'Случайный',
reset: 'Сбросить на стандартный',
hint: 'Поддерживаются PNG, JPEG, WebP, максимум 1 МБ',
invalidType: 'Выберите изображение в формате PNG, JPEG или WebP',
tooLarge: 'Аватар не может превышать 1 МБ',
saveSuccess: 'Аватар сохранён',
saveFailed: 'Ошибка сохранения аватара',
resetSuccess: 'Стандартный аватар восстановлен',
resetFailed: 'Ошибка восстановления стандартного аватара',
},
runtime: {
activeProfile: 'Текущий: {name}',
bridgeWorker: 'Состояние моста',
gateway: 'Шлюз',
active: 'Активен',
activeTag: 'Текущий',
idle: 'Простой',
running: 'Работает',
stopped: 'Остановлен',
restartGateway: 'Перезапустить шлюз',
restartProfile: 'Перезапустить профиль',
switchProfile: 'Переключить профиль интерфейса',
gatewayRestarted: 'Шлюз перезапущен: {name}',
gatewayRestartFailed: 'Ошибка перезапуска шлюза',
profileRestarted: 'Профиль перезапущен: {name}',
profileRestartFailed: 'Ошибка перезапуска профиля',
},
},
logs: {
title: 'Логи',
all: 'Все',
searchPlaceholder: 'Поиск...',
refresh: 'Обновить',
noEntries: 'Нет записей',
},
settings: {
title: 'Настройки',
saved: 'Сохранено',
saveFailed: 'Ошибка сохранения',
tabs: {
display: 'Отображение',
account: 'Текущий аккаунт',
users: 'Управление аккаунтами',
agent: 'Агент',
proxy: 'Прокси',
memory: 'Память',
compression: 'Сжатие контекста',
session: 'Сеанс',
privacy: 'Конфиденциальность',
apiServer: 'API-сервер',
models: 'Модели',
voice: 'Голос',
},
models: {
apiKey: 'API-ключ',
apiKeyPlaceholder: 'Введите API-ключ',
save: 'Сохранить',
saved: 'Сохранено',
saveFailed: 'Ошибка сохранения',
noProviders: 'Нет настроенных моделей',
},
display: {
streaming: 'Потоковый ответ',
streamingHint: 'Отображать ответ AI по мере генерации',
compact: 'Компактный режим',
compactHint: 'Уменьшить отступы между сообщениями',
showReasoning: 'Показывать процесс рассуждения',
showReasoningHint: 'Отображать ход мыслей модели',
showCost: 'Показывать стоимость',
showCostHint: 'Отображать количество использованных токенов в ответе',
inlineDiffs: 'Встроенные различия',
inlineDiffsHint: 'Отображать изменения в коде внутри строки',
bellOnComplete: 'Звук завершения',
bellOnCompleteHint: 'Воспроизводить звук по окончании ответа AI',
notifyOnComplete: 'Уведомление о завершении',
notifyOnCompleteHint: 'Показывать системное уведомление по окончании ответа AI',
notifyOnCompleteMacHint: 'В macOS разрешите уведомления браузера в системных настройках.',
notifyOnCompleteDenied: 'Разрешение на уведомления отклонено',
notifyOnCompleteInsecure: 'Для уведомлений браузера требуется HTTPS или localhost',
notifyOnCompleteUnsupported: 'Этот браузер не поддерживает уведомления',
notifyOnCompleteTest: 'Уведомления включены.',
notifyOnCompleteTestButton: 'Тест',
notifyOnCompleteTesting: 'Отправка тестового уведомления...',
notifyOnCompleteTestSent: 'Тестовое уведомление отправлено',
notifyOnCompleteTestFailed: 'Не удалось отправить тестовое уведомление',
busyInputMode: 'Режим ввода во время занятости',
busyInputModeHint: 'Разрешить ввод, пока AI обрабатывает запрос',
theme: 'Тема',
themeHint: 'Выберите светлую, тёмную или системную тему',
themeLight: 'Светлая',
themeDark: 'Тёмная',
themeSystem: 'Системная',
chatInputHeight: 'Высота поля ввода чата',
chatInputHeightHint: 'Высота поля ввода чата на рабочем столе в пикселях. На мобильных остается авто.'
},
agent: {
maxTurns: 'Максимум ходов',
maxTurnsHint: 'Максимальное количество ходов в одном диалоге',
gatewayTimeout: 'Таймаут шлюза',
gatewayTimeoutHint: 'Таймаут одного запроса (секунды)',
restartDrainTimeout: 'Таймаут слива при перезапуске',
restartDrainTimeoutHint: 'Время ожидания завершения запросов перед перезапуском (секунды)',
toolEnforcement: 'Стратегия выполнения инструментов',
toolEnforcementHint: 'Управление режимом вызова инструментов',
auto: 'Автоматически',
always: 'Всегда',
never: 'Никогда',
},
gatewayAutoStart: {
title: 'Автозапуск gateway',
description: 'Управляет тем, какие локальные gateway профилей Hermes Web UI запускает при старте. Настройка хранится в конфигурации Web UI, а не в profile config.yaml.',
enabled: 'Автоматически запускать gateway',
enabledHint: 'Если выключено, при старте не будет автоматически запущен ни один gateway профиля.',
management: 'Единый gateway',
managementHint: 'Требуется Hermes Agent 0.17.0 или новее. Если включено, Web UI записывает multiplex_profiles, чтобы default gateway обслуживал все профили; другие профили не могут отдельно настраивать точки входа сообщений, такие как Feishu, Weixin или QQBot. При выключении эта настройка удаляется.',
managementAuto: 'Автоматически',
managementPerProfile: 'Один gateway на профиль',
managementUnified: 'Единый default gateway',
mode: 'Политика профилей',
modeHint: 'Запускать все найденные профили или только явный список включения.',
modeAll: 'Все найденные профили',
modeInclude: 'Только включенные профили',
include: 'Включенные профили',
includeHint: 'Имена профилей через запятую. В режиме включения пустой список не запускает ничего.',
exclude: 'Исключенные профили',
excludeHint: 'Имена профилей через запятую, которые нужно пропустить после применения политики.',
profileListPlaceholder: 'default, reviewer',
},
proxy: {
title: 'Прокси gateway',
description: 'Задаёт переменные окружения прокси для gateway выбранного профиля. После изменений gateway перезапускается, чтобы платформы сообщений использовали новые сетевые настройки.',
httpsProxy: 'HTTPS_PROXY',
httpsProxyHint: 'Прокси для HTTPS-запросов. Обычно это основной параметр.',
httpProxy: 'HTTP_PROXY',
httpProxyHint: 'Прокси для обычных HTTP-запросов.',
allProxy: 'ALL_PROXY',
allProxyHint: 'Резервный прокси, если прокси для конкретного протокола не задан.',
noProxy: 'NO_PROXY',
noProxyHint: 'Хосты или домены через запятую, которые должны обходить прокси.',
save: 'Сохранить настройки прокси',
},
memory: {
enabled: 'Включить память',
enabledHint: 'Разрешить AI запоминать контекст диалога',
userProfile: 'Профиль пользователя',
userProfileHint: 'Разрешить AI запоминать предпочтения пользователя',
charLimit: 'Лимит символов памяти',
charLimitHint: 'Максимальное количество символов в MEMORY.md',
userCharLimit: 'Лимит символов профиля пользователя',
userCharLimitHint: 'Максимальное количество символов в USER.md',
},
compression: {
enabled: 'Включить сжатие',
enabledHint: 'Автоматически сжимать историю перед достижением лимита контекста модели',
threshold: 'Порог сжатия',
thresholdHint: 'Начинать сжатие, когда ожидаемое количество токенов превышает указанную долю контекста',
targetRatio: 'Целевая доля',
targetRatioHint: 'После сжатия история должна занимать указанную долю контекста',
protectLastN: 'Защищать последние сообщения',
protectLastNHint: 'Сколько последних сообщений не участвуют в сжатии',
protectFirstN: 'Защищать первые сообщения',
protectFirstNHint: 'Сколько первых сообщений не участвуют в сжатии',
},
session: {
mode: 'Режим сброса',
modeHint: 'Условия для сброса сеанса',
modeBoth: 'По бездействию + по расписанию',
modeIdle: 'Только по бездействию',
modeDaily: 'Только по расписанию',
modeNone: 'Никогда (только вручную)',
idleMinutes: 'Таймаут бездействия',
idleMinutesHint: 'Время бездействия (минуты) перед автоматическим сбросом',
atHour: 'Время сброса по расписанию',
humanOnly: 'Показывать только сеансы с человеком',
humanOnlyHint: 'По умолчанию скрывать шум от подчинённых агентов и мониторинга сеансов',
liveMonitorHumanOnly: 'В мониторинге в реальном времени: только сеансы с человеком',
liveMonitorHumanOnlyHint: 'По умолчанию скрывать шум от подчинённых агентов и мониторинга сеансов в просмотре в реальном времени',
atHourHint: 'Сбрасывать сеанс каждый день в указанный час',
requireAuth: 'Авторизация сеанса',
requireAuthHint: 'Требовать авторизацию для операций сеанса',
memoryWriteApproval: 'Проверять записи памяти',
memoryWriteApprovalHint: 'Отправлять записи памяти Hermes Agent на подтверждение перед сохранением.',
skillsWriteApproval: 'Проверять записи skills',
skillsWriteApprovalHint: 'Отправлять изменения skills от Hermes Agent на подтверждение перед сохранением.',
writeApprovalTitle: 'Ожидающие подтверждения записи',
writeApprovalDescription: 'Подтвердите или отклоните записи памяти и skills, подготовленные Hermes Agent.',
writeApprovalRefresh: 'Обновить',
writeApprovalEmpty: 'Нет ожидающих записей.',
writeApprovalMemory: 'Память',
writeApprovalSkills: 'Skills',
writeApprovalViewDiff: 'Проверить',
writeApprovalHideDiff: 'Скрыть',
writeApprovalNoDiff: 'Нет доступных изменений.',
writeApprovalLoadFailed: 'Не удалось загрузить ожидающие записи',
writeApprovalDiffFailed: 'Не удалось загрузить детали записи',
writeApprovalActionFailed: 'Не удалось обработать ожидающую запись',
writeApprovalApproved: 'Запись подтверждена',
writeApprovalRejected: 'Запись отклонена',
writeApprovalApprove: 'Подтвердить',
writeApprovalReject: 'Отклонить',
writeApprovalPendingMemoryWrite: 'Ожидающая запись памяти',
writeApprovalCurrentFile: 'Текущий файл {file}',
writeApprovalProposedFile: 'Предлагаемый файл {file}',
writeApprovalDiffSection: 'Изменения',
writeApprovalPatchOldStringMissing: 'old_string патча не найден в текущем файле {file}; подтверждение не изменит файл.',
writeApprovalRequestedOldString: 'Запрошенный old_string',
writeApprovalCurrentReadFailed: 'Текущий файл {file} не удалось прочитать как текст UTF-8.',
writeApprovalDeleteSkill: 'Это подтверждение удалит skill {skill}.',
writeApprovalRemoveFile: 'Это подтверждение удалит {file} из skill {skill}.',
},
privacy: {
redactPii: 'Скрывать PII',
redactPiiHint: 'Автоматически обнаруживать и скрывать чувствительную информацию (пароли, ключи и т.д.)',
},
apiServer: {
enable: 'Включить',
enableHint: 'Включить API-сервер',
host: 'Хост',
hostHint: 'Адрес для прослушивания',
port: 'Порт',
portHint: 'Порт для прослушивания',
key: 'Ключ',
keyHint: 'Ключ доступа к API',
cors: 'Источник CORS',
corsHint: 'Разрешённые источники для кросс-доменных запросов',
},
lockedIps: {
title: 'Управление заблокированными IP',
count: 'Заблокировано IP: {count}',
empty: 'Нет заблокированных IP',
unlock: 'Разблокировать',
unlockAll: 'Разблокировать все',
unlockAllConfirm: 'Подтвердите разблокировку всех IP?',
unlocked: 'IP разблокирован',
allUnlocked: 'Разблокировано IP: {count}',
type: {
password: 'Password',
token: 'API token',
pairing: 'Device pairing',
},
},
userAvatar: {
title: 'Аватар пользователя',
upload: 'Загрузить изображение',
random: 'Сгенерировать случайный',
reset: 'Сбросить по умолчанию',
hint: 'Поддерживаются PNG, JPEG и WebP до 1 МБ; автоматически сжимается до менее 500 КБ.',
invalidType: 'Выберите изображение PNG, JPEG или WebP',
tooLarge: 'Изображение аватара должно быть не больше 1 МБ',
saveSuccess: 'Аватар сохранён',
saveFailed: 'Не удалось сохранить аватар',
resetSuccess: 'Аватар сброшен',
resetFailed: 'Не удалось сбросить аватар',
},
voice: {
activeTtsApi: 'Активная TTS API',
activeSttApi: 'Активная STT API',
ttsProvidersTitle: 'Провайдеры TTS',
ttsProvidersDescription: 'Управление интеграциями преобразования текста в речь для озвучивания ответов ассистента и предпросмотра голоса.',
sttProvidersTitle: 'Провайдеры STT',
sttProvidersDescription: 'Управление интеграциями распознавания речи, используемыми микрофоном и голосовым вводом.',
noneSelected: 'Ничего не выбрано',
keyStored: 'Сохранен',
keyMissing: 'Отсутствует',
customApi: 'API',
localBuiltin: 'Локальный встроенный',
ttsCardHint: 'Провайдер синтеза речи',
sttCardHint: 'Провайдер распознавания речи',
setActive: 'Сделать активным',
testAction: 'Тест',
connect: 'Подключить',
presetEdgeTtsLabel: 'Edge TTS',
presetEdgeTtsDescription: 'Бесплатные облачные голоса высокого качества от Microsoft Edge.',
presetOpenaiTtsLabel: 'OpenAI TTS',
presetMimoTtsLabel: 'MiMo TTS',
presetDoubaoTtsLabel: 'Volcengine Doubao TTS',
presetCustomTtsLabel: 'Пользовательский TTS',
presetBrowserSttLabel: 'STT браузера',
presetBrowserSttDescription: 'Нативная API распознавания речи браузера.',
presetOpenaiWhisperLabel: 'OpenAI Whisper',
presetGroqSttLabel: 'Groq STT',
presetDoubaoSttLabel: 'Volcengine Doubao STT',
presetCustomSttLabel: 'Пользовательский STT',
apiCompatibility: 'Совместимость API',
openaiCompatible: 'Совместимо с OpenAI',
manualCustomEndpoint: 'Ручной пользовательский endpoint',
connectionStep: 'Подключение',
discoveryManualHint: 'Выбран ручной пользовательский endpoint. Автообнаружение моделей недоступно; введите имя модели вручную.',
discoveryCredentialHint: 'Введите Base URL и API key, затем подключитесь, чтобы получить доступные модели.',
discoveryNoAutoProbeHint: 'При вводе запросы не отправляются. Нажмите Connect, когда данные готовы.',
apiKeyConnectPlaceholder: 'Вставьте API key для подключения; сохранённые ключи никогда не показываются',
connectFetchModels: 'Подключить и получить модели',
modelRecommendedSuffix: 'рекомендуется',
modelConnectManualHint: 'Подключитесь для автозаполнения или введите вручную.',
modelRequiredConnectManual: 'Модель обязательна. Подключитесь для автозаполнения или введите вручную.',
apiKeyRequired: 'API key обязателен.',
apiKeyRequiredForDiscovery: 'API key обязателен для получения моделей.',
baseUrlRequired: 'Base URL обязателен.',
baseUrlHttpsRequired: 'Используйте http:// или https://.',
baseUrlInvalid: 'Введите корректный Base URL, включая https://.',
discoveryFailedManualFallback: 'Не удалось получить модели. Вы всё ещё можете ввести имя модели вручную.',
completeRequiredProviderFields: 'Заполните обязательные поля provider перед сохранением.',
fetchingModels: 'Получение моделей...',
recommendedModel: 'Рекомендуется: {model}.',
useRecommendedModel: 'Использовать эту.',
modelsDiscovered: 'Найдено моделей: {count}. Если поле пустое, выбирается рекомендуемая модель.',
remove: 'Удалить',
testSuccess: 'Тест завершен',
testTextRequired: 'Введите текст перед тестом.',
keyMissingForTest: 'Добавьте API-ключ перед тестом этого провайдера.',
testing: 'Тестирование...',
transcribing: 'Распознавание...',
browserSttTestHint: 'STT браузера тестируется через микрофон чата.',
sttEmptyAudio: 'Аудио не было записано. Попробуйте еще раз.',
sttTestSuccess: 'Распознавание завершено',
sttRecordingHint: 'Запись... нажмите Остановить, чтобы распознать.',
keepStoredKeyPlaceholder: 'Оставьте пустым, чтобы сохранить текущий ключ',
apiKeyPlaceholder: 'Введите API-ключ',
lastTest: 'Последний тест',
notTested: '—',
recording: 'Запись',
testFailedShort: 'Ошибка',
testFailedSummary: 'Тест не удался. Проверьте настройки провайдера и повторите попытку.',
showDetails: 'Показать детали',
hideDetails: 'Скрыть детали',
moreActions: 'Еще',
moreActionsFor: 'Дополнительные действия для {provider}',
addTtsApi: 'Добавить TTS API',
addSttApi: 'Добавить STT API',
active: 'Активно',
builtin: 'Встроенный',
connected: 'Подключено',
disconnected: 'Отключено',
source: 'Источник',
model: 'Модель',
voice: 'Голос',
doubaoVoiceHint: 'Выберите голос Seed TTS 2.0; поле ресурса обновится автоматически.',
apiKey: 'API-ключ',
confirmDeleteSecret: 'Удалить сохраненный API-ключ для этой голосовой API?',
ttsTitle: 'Текст в речь',
ttsSaved: 'Настройки TTS сохранены на сервере',
ttsSaveFailed: 'Не удалось сохранить настройки TTS',
ttsTestSaved: 'Прослушивание успешно; настройки TTS сохранены на сервере',
ttsTestSaving: 'Сохранение настроек TTS перед прослушиванием...',
ttsMissingBaseUrl: 'Base URL требуется перед тестом. Введите endpoint провайдера и повторите тест.',
ttsMissingApiKey: 'API-ключ требуется перед тестом. Вставьте ключ или сначала сохраните серверный ключ.',
ttsCleared: 'Сохраненный TTS-ключ удален',
ttsClearFailed: 'Не удалось удалить сохраненный TTS-ключ',
storedBaseUrlsTitle: 'Сохранённые Base URLs',
storedBaseUrlsHint: 'Сохранённые endpoint голосовых providers. Поля выше только очищают текущее значение; сохранённые URL удаляются здесь.',
storedBaseUrlsEmpty: 'На сервере нет сохранённых пользовательских голосовых Base URL.',
storedBaseUrlDelete: 'Удалить URL',
storedApiKeysTitle: 'Сохранённые API keys',
storedApiKeysHint: 'Список голосовых API key, сохранённых на сервере. Показываются только назначение и источник; полный key не отображается.',
storedApiKeysEmpty: 'На сервере нет сохранённых голосовых API key.',
storedKeyKindTts: 'TTS',
storedKeyKindStt: 'STT',
storedApiKeyMasked: '[stored]',
storedApiKeyDelete: 'Удалить key',
baseUrlPresetClear: 'Очистить URL',
baseUrlPresetCleared: 'Base URL очищен в поле.',
baseUrlPresetDelete: 'Удалить URL',
baseUrlPresetDeleted: 'Base URL удалён из сохранённого списка.',
baseUrlPresetDeleteFailed: 'Не удалось удалить сохранённый Base URL.',
ttsPendingSecret: 'Новый ключ будет сохранен',
ttsStoredSecret: 'На сервере сохранен ключ: {value}',
ttsClearKey: 'Удалить сохраненный ключ',
sttTitle: 'Речь в текст',
sttProvider: 'Провайдер STT',
sttProviderHint: 'Выберите способ распознавания голосового ввода',
sttProviderBrowser: 'Браузер',
sttProviderOpenai: 'Совместимо с OpenAI',
sttProviderCustom: 'Пользовательский',
sttBrowserHint: 'Использовать встроенное распознавание речи браузера, если доступно.',
sttApiKey: 'API-ключ',
sttApiKeyHint: 'Сохраняется на сервере для STT-провайдеров, которым нужна аутентификация.',
sttStoredSecret: 'Сохраненный серверный ключ: {value}',
sttPendingSecret: 'Сохраненный серверный ключ: будет обновлен при сохранении',
sttClearKey: 'Удалить сохраненный ключ',
sttModel: 'Модель',
sttModelHint: 'Модель распознавания речи для использования.',
sttLanguage: 'Язык',
sttLanguageHint: 'Необязательная подсказка языка, например en или zh.',
sttPrompt: 'Промпт',
sttPromptHint: 'Необязательный промпт для распознавания.',
sttAudioTranscode: 'Перекодирование аудио',
sttAudioTranscodeNone: 'Отправлять исходное аудио',
sttAudioTranscodeFfmpeg: 'Конвертировать в WAV через ffmpeg',
sttBaseUrl: 'Base URL',
sttBaseUrlHint: 'Пользовательский OpenAI-совместимый endpoint распознавания речи.',
sttSave: 'Сохранить настройки STT',
sttSaved: 'Настройки STT сохранены на сервере.',
sttSaveFailed: 'Не удалось сохранить настройки STT.',
sttCleared: 'Сохраненный STT-секрет удален с сервера.',
sttClearFailed: 'Не удалось удалить сохраненный STT-секрет.',
sttActiveSaved: 'Активный STT-провайдер сохранен на сервере.',
sttSaveActive: 'Сохранить активный STT-провайдер',
sttEndpointHint: 'Итоговый endpoint распознавания: {endpoint}',
sttTestTitle: 'Тест речи в текст',
sttTestButton: 'Тестировать STT API',
sttTestStopButton: 'Остановить и распознать',
sttTestBackendOnly: 'Тест STT API доступен для OpenAI-совместимых и пользовательских провайдеров.',
sttTestRecording: 'Запись тестового образца... нажмите Остановить и распознать, когда закончите.',
sttTestTranscribing: 'Распознавание тестового образца...',
sttTestEmpty: 'Для STT-теста не было записано аудио.',
sttTestSucceeded: 'STT-тест успешен.',
sttTestFailed: 'STT-тест не удался: {error} — {hint}',
sttFailureHintMissingConfig: 'Перед тестом проверьте, что провайдер сохранен с Base URL/моделью и API-ключом.',
sttFailureHintAuth: 'Проверьте API-ключ. Если ключ уже был сохранен, вставьте текущий ключ снова и сохраните перед тестом.',
sttFailureHintForbidden: 'Ключ дошел до провайдера, но не имеет разрешения для этой STT-модели или аккаунта. Проверьте доступ/оплату у провайдера.',
sttFailureHintEndpointModel: 'Проверьте Base URL и модель. Для Groq используйте {endpoint} с whisper-large-v3-turbo или другой STT-моделью Groq.',
sttFailureHintModel: 'Проверьте, что выбранная STT-модель существует и включена для этого аккаунта.',
sttFailureHintQuota: 'Провайдер сообщает о проблемах с квотой, оплатой или лимитом запросов. Проверьте квоту/оплату или повторите позже.',
sttFailureHintNetworkCustom: 'Сервер не смог обратиться к пользовательскому STT endpoint. Проверьте, что {endpoint} доступен с сервера Web UI и совместим с OpenAI.',
sttFailureHintNetwork: 'Сервер Web UI не смог обратиться к STT-провайдеру. Проверьте сеть/прокси/фаервол и повторите.',
sttFailureHintAudio: 'Записанное аудио пустое или отклонено. Попробуйте короткий четкий образец, разрешите доступ к микрофону или повторите в Chrome.',
sttFailureHintGenericCustom: 'Проверьте API-ключ, Base URL, модель и итоговый endpoint {endpoint}.',
sttFailureHintGeneric: 'Проверьте API-ключ, модель и доступ аккаунта провайдера, затем повторите.',
sttTestRecordFailed: 'Не удалось начать запись микрофона: {error}',
sttTestTranscript: 'Текст: {text}',
ttsProvider: 'Провайдер TTS',
ttsProviderHint: 'Выберите движок для озвучивания сообщений',
providerWebSpeech: 'WebSpeech API (встроенный в браузер)',
providerOpenai: 'OpenAI TTS',
providerCustom: 'Пользовательская конечная точка (совместимая с OpenAI)',
providerEdge: 'Edge TTS (бесплатно, не требует API-ключа)',
providerMimo: 'MiMo TTS',
webspeechVoice: 'Тембр',
webspeechVoiceHint: 'Выберите голос из предложенных браузером или системой',
webspeechVoicePlaceholder: 'Автоматический (голос по умолчанию)',
openaiKey: 'API-ключ',
openaiKeyHint: 'API-ключ OpenAI с правами TTS',
openaiUrl: 'Базовый URL API',
openaiUrlHint: 'Например, https://api.openai.com/v1/audio/speech',
openaiModel: 'Модель',
openaiModelHint: 'tts-1 (быстрая) / tts-1-hd (высокое качество)',
openaiVoice: 'Тембр',
openaiVoiceHint: 'Тембр для синтеза речи',
customHint: 'Поддерживается любая служба TTS, совместимая с OpenAI, включая GPT-SoVITS, CosyVoice и т.п.',
customUrl: 'URL API',
customUrlHint: 'Полный базовый URL службы TTS',
customUrlPlaceholder: 'Адрес, указанный в локальном адаптере, например http://127.0.0.1:9880',
customApiKey: 'API-ключ (необязательно)',
customApiKeyHint: 'Некоторые саморазвёрнутые службы требуют аутентификации',
customApiKeyPlaceholder: 'Оставьте пустым, если не требуется',
edgeHint: 'Работает на движке Microsoft Edge TTS (node-edge-tts).',
edgeUrl: 'Адрес адаптера',
edgeUrlHint: 'Адрес адаптера Edge TTS, например http://127.0.0.1:9882',
edgeUrlPlaceholder: 'http://127.0.0.1:9882',
edgeVoice: 'Тембр',
edgeVoiceHint: 'Выберите тембр для синтеза речи',
edgeRate: 'Скорость речи',
edgeRateHint: 'Регулировка скорости речи (0.5–2.0)',
edgePitch: 'Высота тона',
edgePitchHint: 'Регулировка высоты тона (–20 … +20 Гц)',
testTitle: 'Тестовое прослушивание',
testText: 'Тестовый текст',
testTextPlaceholder: 'Введите тестовый текст...',
testTextDefault: 'Здравствуйте, это тест голоса.',
testButton: 'Прослушать',
testButtonPlaying: 'Воспроизведение...',
testFailed: 'Ошибка теста: {error}',
mimoHint: 'MiMo TTS от Xiaomi. Поддерживает три режима: предустановленные тембры, дизайн тембра и клонирование тембра.',
mimoApiKey: 'API-ключ',
mimoApiKeyHint: 'Получите его на platform.xiaomimimo.com',
mimoApiKeyPlaceholder: 'API-ключ MiMo',
mimoBaseUrl: 'Базовый URL',
mimoBaseUrlHint: 'Конечная точка API MiMo',
mimoModel: 'Модель',
mimoModelHint: 'Выберите модель синтеза речи',
mimoModelPreset: 'Предустановленный тембр',
mimoModelVoiceDesign: 'Дизайн тембра',
mimoModelVoiceClone: 'Клонирование тембра',
mimoVoice: 'Тембр',
mimoVoiceHint: 'Выберите предустановленный тембр',
mimoVoiceDesignPrompt: 'Описание тембра',
mimoVoiceDesignPromptHint: 'Опишите желаемые характеристики тембра',
mimoVoiceDesignPromptPlaceholder: 'Например: мягкий молодой женский голос, слегка замедленный, с хрипотцой',
mimoCloneAudio: 'Загрузить аудио',
mimoCloneAudioHint: 'Загрузите аудиообразец для клонирования тембра. Поддерживаются mp3/wav, максимум 10 МБ',
mimoCloneAudioUpload: 'Выбрать файл',
mimoCloneAudioClear: 'Очистить аудио',
mimoStylePrompt: 'Стилевая инструкция',
mimoStylePromptHint: 'Необязательно. Опишите желаемый стиль речи естественным языком',
mimoStylePromptPlaceholder: 'Например: используйте лёгкий, приподнятый тон, темп речи чуть выше среднего',
},
},
platform: {
requireMention: "Требуется упоминание {'@'}",
requireMentionGroup: "В группе требуется упоминание {'@'}бота для ответа",
requireMentionChannel: "В канале требуется упоминание {'@'}бота для ответа",
requireMentionRoom: "В комнате требуется упоминание {'@'}бота для ответа",
reactions: 'Реакции',
reactionsHint: 'Добавлять реакции на сообщения',
freeResponseChats: 'Чаты со свободным ответом',
freeResponseChatsHint: "ID чатов, в которых не требуется упоминание {'@'} (через запятую)",
freeResponseChannels: 'Каналы со свободным ответом',
freeResponseChannelsHint: "ID каналов, в которых не требуется упоминание {'@'} (через запятую)",
freeResponseRooms: 'Комнаты со свободным ответом',
freeResponseRoomsHint: "ID комнат, в которых не требуется упоминание {'@'} (через запятую)",
mentionPatterns: 'Пользовательские шаблоны упоминаний',
mentionPatternsHint: 'Дополнительные шаблоны для срабатывания',
autoThread: 'Автоматически создавать ветку',
autoThreadHint: "Автоматически создавать ветку для ответа после упоминания {'@'}",
autoThreadHintRoom: 'Автоматически создавать ветку для ответа в комнате',
dmMentionThreads: 'Ветки для упоминаний в ЛС',
dmMentionThreadsHint: 'Использовать ветки для ответов на упоминания в личных сообщениях',
allowBots: 'Разрешить сообщения ботов',
allowBotsHint: 'Отвечать на сообщения от других ботов',
allowedChannels: 'Разрешённые каналы',
allowedChannelsHint: 'Белый список ID каналов (через запятую)',
ignoredChannels: 'Игнорируемые каналы',
ignoredChannelsHint: 'Каналы, на которые не отвечать (через запятую)',
noThreadChannels: 'Каналы без веток',
noThreadChannelsHint: 'Каналы, в которых не создавать ветки (через запятую)',
exclusiveTokenWarning: 'Эта платформа использует эксклюзивную блокировку токенов. Каждый профиль должен использовать свой токен, иначе возникнут конфликты с другими профилями, и шлюз не запустится.',
botToken: 'Токен бота',
botTokenHint: 'Токен бота, полученный на портале разработчика',
proxyUrl: 'URL прокси',
proxyUrlHint: 'Необязательный прокси для платформы. Поддерживает http://, https:// и socks5://',
accessToken: 'Токен доступа',
accessTokenHint: 'Токен доступа Matrix',
homeserver: 'URL домашнего сервера',
homeserverHint: 'Адрес сервера Matrix',
matrixUserId: 'ID пользователя Matrix',
matrixUserIdHint: 'Обязателен для входа по паролю, необязателен с токеном',
matrixPassword: 'Пароль Matrix',
matrixPasswordHint: 'Альтернатива токену доступа',
appId: 'ID приложения',
appIdHint: 'ID приложения Feishu',
appSecret: 'Секрет приложения',
appSecretHint: 'Секрет приложения Feishu',
encryptKey: 'Ключ шифрования',
encryptKeyHint: 'Ключ шифрования Feishu',
verificationToken: 'Токен проверки',
verificationTokenHint: 'Токен проверки Feishu',
clientId: 'ID клиента',
clientIdHint: 'ID клиента DingTalk',
clientSecret: 'Секрет клиента',
clientSecretHint: 'Секрет клиента DingTalk',
cardTemplateId: 'ID шаблона AI-карточки',
cardTemplateIdHint: 'ID шаблона AI-карточки DingTalk; оставьте пустым, чтобы отключить AI-карточки',
allowedUsers: 'Разрешённые пользователи',
allowedUsersHint: 'Белый список ID пользователей или OpenID (через запятую)',
allowAllUsers: 'Разрешить всех пользователей',
allowAllUsersHint: 'Разрешить любым пользователям отправлять сообщения; при отключении используется белый список',
botId: 'ID бота',
botIdHint: 'ID бота WeCom',
wecomSecretHint: 'Секрет бота WeCom',
waEnabled: 'Включить WhatsApp',
waEnabledHint: 'Включить WhatsApp с помощью пары по QR-коду',
weixinToken: 'Токен Weixin',
weixinTokenHint: 'Получите с помощью CLI (hermes weixin) при входе по QR-коду',
accountId: 'ID учётной записи',
accountIdHint: 'ID учётной записи Weixin',
qrLogin: 'Вход по QR-коду',
qrRelogin: 'Войти снова',
qrFetching: 'Получение QR-кода...',
qrScanHint: 'Отсканируйте QR-код с помощью WeChat для входа',
qrScanedHint: 'QR-код отсканирован. Подтвердите на телефоне...',
qqAppId: 'ID приложения',
qqAppIdHint: 'ID приложения бота QQ Open Platform',
qqAppSecret: 'Секрет приложения',
qqAppSecretHint: 'Секрет приложения бота QQ Open Platform',
qqMarkdown: 'Поддержка Markdown',
qqMarkdownHint: 'Включить сообщения в формате Markdown (может не поддерживаться некоторыми клиентами)',
qqSandbox: 'Режим песочницы',
qqSandboxHint: 'Включить песочницу (для тестирования)',
qqQrScanHint: 'Отсканируйте QR-код с помощью QQ или откройте ссылку на телефоне, чтобы завершить привязку',
},
gateways: {
title: 'Шлюзы',
running: 'Работает',
stopped: 'Остановлен',
started: 'Запущен',
startFailed: 'Ошибка запуска',
stopFailed: 'Ошибка остановки',
},
language: {
label: 'Язык',
zh: 'Китайский',
en: 'Английский',
ru: 'Русский',
},
terminal: {
sessions: 'Сеансы',
newTab: 'Новая вкладка терминала',
closeSession: 'Завершить этот сеанс?',
sessionExited: 'Выход выполнен',
processExited: 'Процесс завершён с кодом {code}',
noSessions: 'Нет активных сеансов терминала',
connectionFailed: 'Не удалось подключиться к службе терминала',
connectionClosed: 'Соединение с терминалом закрыто',
connectionError: 'Ошибка соединения с терминалом',
},
groupChat: {
title: 'Групповой чат',
createRoom: 'Создать комнату',
joinByCode: 'Присоединиться по коду-приглашению',
roomName: 'Название комнаты',
roomNamePlaceholder: 'Введите название комнаты',
inviteCode: 'Код-приглашение',
autoGenerate: 'Сгенерировать автоматически',
noRooms: 'Нет комнат',
selectOrCreate: 'Выберите или создайте комнату, чтобы начать чат',
agents: 'Агенты',
addAgent: 'Добавить агента',
selectProfile: 'Выберите профиль',
agentAdded: 'Агент добавлен',
selectRoomFirst: 'Сначала выберите комнату',
agentAlreadyInRoom: 'Агент уже в комнате',
agentAddFailedCount: 'Не добавлено агентов: {count} — {details}',
noAgents: 'В комнате нет агентов',
members: 'Участники',
roomCreated: 'Комната создана',
roomDeleted: 'Комната удалена',
roomCloned: 'Комната клонирована',
cloneRoom: 'Клонировать комнату',
copyRoomLink: 'Копировать ссылку на комнату',
deleteRoomConfirm: 'Удалить эту комнату?',
clearContext: 'Очистить контекст',
clearContextConfirm: 'Очистить контекст текущей комнаты? Сообщения и сжатые снимки будут удалены, агенты и участники останутся.',
contextCleared: 'Контекст очищен',
you: 'Вы',
joined: 'Вы присоединились к комнате',
joinFailed: 'Не удалось присоединиться к комнате',
inputPlaceholder: 'Введите сообщение... (Enter — отправить)',
messageDisplayLimit: 'Групповой чат показывает не более 600 сообщений',
enterCode: 'Введите код-приглашение',
yourName: 'Ваше имя',
yourNamePlaceholder: 'Введите ваш ник в групповом чате',
yourDescription: 'Самоописание (необязательно)',
yourDescriptionPlaceholder: 'Расскажите о себе...',
agentName: 'Имя агента',
agentNamePlaceholder: 'Пользовательское имя (оставьте пустым для использования имени профиля)',
agentDesc: 'Описание агента',
agentDescPlaceholder: 'Опишите роль этого агента...',
agentReplying: 'Ответ агента...',
agentCompressing: 'Сжатие контекста...',
compressionSettings: 'Настройки сжатия',
triggerTokens: 'Количество токенов для запуска сжатия',
triggerTokensDesc: 'Сжатие контекста запускается, когда количество токенов в сообщениях превышает это значение',
maxHistoryTokens: 'Максимум токенов в истории',
maxHistoryTokensDesc: 'Максимальное количество токенов, отправляемое LLM после сжатия',
tailMessageCount: 'Количество последних сохраняемых сообщений',
tailMessageCountDesc: 'Количество последних исходных сообщений, сохраняемых после сжатия',
compressionConfig: 'Конфигурация сжатия',
compressionSaved: 'Конфигурация сжатия сохранена',
compressNow: 'Сжать сейчас',
compressingInProgress: 'Выполняется сжатие, пожалуйста, подождите',
},
usage: {
title: 'Статистика использования',
refresh: 'Обновить',
totalTokens: 'Всего токенов',
inputTokens: 'Входящие',
outputTokens: 'Исходящие',
totalSessions: 'Всего сеансов',
avgPerDay: 'В среднем за день ~{n}',
estimatedCost: 'Примерная стоимость',
cacheHitRate: 'Попадания в кэш',
modelBreakdown: 'Распределение по моделям',
agentBreakdown: 'Распределение по агентам',
agents: { hermes: 'Hermes Agent', claudeCode: 'Claude Code', codex: 'Codex', ekkoAgent: 'Ekko Agent', unknown: 'Неизвестно' },
dailyTrend: 'Ежедневная динамика',
date: 'Дата',
tokens: 'Токены',
cache: 'Кэш',
cacheRead: 'Чтение из кэша',
cacheWrite: 'Запись в кэш',
sessions: 'Сеансы',
cost: 'Стоимость',
noData: 'Нет данных об использовании',
},
skillsUsage: {
title: 'Использование навыков',
subtitle: 'Отслеживание загрузки и редактирования навыков в сеансах Hermes',
refresh: 'Обновить',
periodSelector: 'Период использования навыков',
periodLabel: '{days} дн.',
summary: 'Обзор',
totalActions: 'Действий',
loads: 'Загрузок',
edits: 'Правки',
distinctSkills: 'Навыков',
topSkills: 'Популярные',
dailyTrend: 'Динамика по дням',
periodSummary: 'За последние {days} дн.',
skill: 'Навык',
share: 'Доля',
lastUsed: 'Последний',
noData: 'Нет данных об использовании навыков',
loadFailed: 'Ошибка загрузки данных об использовании навыков',
otherSkills: 'Другие навыки',
},
files: {
title: 'Файлы',
fileTree: 'Древо файлов',
tree: 'Древо каталогов',
list: 'Список файлов',
breadcrumbRoot: 'Корневая директория',
newFile: 'Новый файл',
newFolder: 'Новая папка',
upload: 'Загрузить',
refresh: 'Обновить',
open: 'Открыть',
edit: 'Редактировать',
preview: 'Предпросмотр',
download: 'Скачать',
copyPath: 'Копировать путь',
rename: 'Переименовать',
delete: 'Удалить',
name: 'Имя',
size: 'Размер',
modified: 'Время изменения',
actions: 'Действия',
emptyDir: 'Папка пуста',
loading: 'Загрузка...',
confirmDelete: 'Удалить «{name}»?',
confirmDeleteDir: 'Удалить папку «{name}» со всем содержимым?',
deleteFailed: 'Ошибка удаления',
deleted: 'Удалено',
renameTo: 'Переименовать в',
newFileName: 'Имя файла',
newFolderName: 'Имя папки',
created: 'Создано',
createFailed: 'Ошибка создания',
renamed: 'Переименовано',
renameFailed: 'Ошибка переименования',
uploadSuccess: 'Загружено файлов: {count}',
uploadFailed: 'Ошибка загрузки',
saveFailed: 'Ошибка сохранения',
saved: 'Сохранено',
unsavedChanges: 'Есть несохранённые изменения. Отменить?',
pathCopied: 'Путь скопирован',
fileTooLarge: 'Файл слишком большой (максимум 10 МБ)',
permissionDenied: 'Невозможно изменить защищённый файл',
notFound: 'Файл или папка не найдены',
backendError: 'Ошибка файловой операции',
dragDropHint: 'Перетащите файлы сюда для загрузки',
closeEditor: 'Закрыть редактор',
closePreview: 'Закрыть',
saveFile: 'Сохранить',
},
download: {
downloading: 'Скачивание...',
downloadFailed: 'Ошибка скачивания',
fileNotFound: 'Файл не существует или был удалён',
fileTooLarge: 'Файл слишком большой (превышает лимит)',
backendError: 'Не удалось прочитать файл. Возможно, удалённое окружение недоступно',
backendTimeout: 'Таймаут чтения файла',
unsupportedBackend: 'Текущий терминальный бэкенд не поддерживает загрузку файлов',
invalidPath: 'Недействительный путь к файлу',
contentDisplay: 'Отображение содержимого',
download: 'Скачать',
downloadFile: 'Скачать файл',
},
changelog: {
new_0_6_29_1: 'В выпуск вошли все 14 PR после 0.6.28: единый интерфейс, звук MCU и оборудование v2, workspace diff, аналитика использования, обновления Docker и клонирование голоса MiMo',
new_0_6_29_2: 'Заголовки страниц, тёмные поверхности и скругления объединены в одну визуальную систему, а предпросмотр версий сортирует допустимые теги по semver (#2014, #2015)',
new_0_6_29_3: 'Страница продукта ESP32 получила адаптивный дизайн, а селектор версий сайта теперь включает Hermes Agent 0.18.2 (#2020, #2042)',
new_0_6_29_4: 'ESP32-C3 v1 использует IMA-ADPCM и примерно четверть прежней полосы, записывает до двух минут, а OLED возвращается к LAN IP после временных статусов (#2024, #2025)',
new_0_6_29_5: 'Workspace diff изначально свёрнуты и скрывают изменения с нулём строк; восстановлен стандартный тёмный фон поля чата (#2032)',
new_0_6_29_6: 'Экспорт сессий обрабатывает некорректные знаки процента в именах; обновление Docker показывает команды pull/recreate вместо изменения npm внутри контейнера (#2026, #2033)',
new_0_6_29_7: 'Результаты Bridge сохраняются полностью, но в контексте модели ограничены сводкой начала и конца на 5 500 символов (#2036)',
new_0_6_29_8: 'Аналитика объединяет вызовы Hermes Agent, Claude Code, Codex и Ekko Agent и добавляет распределение по агентам (#2039)',
new_0_6_29_9: 'Отдельная прошивка ESP32-C3 v2 добавляет новую распиновку без влияния на v1; v2 использует 80% громкости по умолчанию, усиление PCM 1,5x и мягкий лимитер (#2044, #2045)',
new_0_6_29_10: 'Клонирование голоса MiMo снова поддерживает загрузку WAV/MP3 и передаёт образец через audio.voice по требованиям текущего API (#2046)',
new_0_6_28_1: 'Этот релиз включает все PR после 0.6.27: управление MCU, workspace diff для Group Chat, исправления Coding Agent, approvals в Workflow, фильтрацию workspace diff, выбор модели для scheduled jobs и desktop-индикатор новой версии',
new_0_6_28_2: 'MCU получил управление устройствами, API-token авторизацию для global-agent events, обновленную прошивку ESP32-C3 и более стабильный remote relay login',
new_0_6_28_3: 'Изменения workspace в Group Chat сохраняются как workspace diff runs, чтобы активность agent в комнате можно было проверить после завершения сессии',
new_0_6_28_4: 'Coding Agents наследуют scoped external MCP servers, правильно направляют workflow agent aborts и best-effort экспортируют завершенные native sessions Codex и Claude Code',
new_0_6_28_5: 'Исправлен workspace file drawer, удалены сломанные starred-history embeds, а bridge sessions теперь записывают ended_at и end_reason metadata',
new_0_6_28_6: 'Workflow nodes поддерживают approval gates после завершения node, а состояния approval при повторном запуске workflow исправлены',
new_0_6_28_7: 'Workspace diff фильтрует SQLite WAL/SHM sidecars и продолжает scan после неизмененных файлов, чтобы новые обычные файлы оставались видимыми',
new_0_6_28_8: 'Scheduled jobs могут выбирать и сохранять provider/model, не передавая неподдерживаемые model flags в текущую Hermes cron CLI',
new_0_6_28_9: 'Desktop version management показывает локализованный индикатор новой версии на кнопке, а public version manifest включает 0.6.28',
new_0_6_27_1: 'Этот релиз включает все PR, объединенные после 0.6.26: fallback запуска desktop, исправления Windows runtime, remote MCU relay, workspace для группового чата, доработки workspace по умолчанию и фильтрацию пустых diff',
new_0_6_27_2: 'Запуск desktop теперь откатывается к встроенному Web UI, если каталог active Web UI отсутствует или неполный, при этом закрепленный runtime сохраняется',
new_0_6_27_3: 'Windows desktop runtime теперь использует переносимые wrappers hermes.cmd вместо хрупких .exe trampolines для вызовов Web UI server',
new_0_6_27_4: 'Remote MCU traffic теперь использует Socket.IO /global-agent relay, с более стабильными login и discovery для ESP32-C3, очередью voice playback, сохранением Wi-Fi credential и обновленным firmware',
new_0_6_27_5: 'Комнаты Group Chat теперь могут иметь проверенный workspace, который передается в group-agent runs; участники только для чтения не видят workspace, invite code и элементы управления',
new_0_6_27_6: 'Favorites для workspace по умолчанию теперь находятся в строке выбранного path в folder picker, а locale coverage для labels workspace picker завершено',
new_0_6_27_7: 'Workspace diff cards теперь пропускают изменения 0 byte без patch или line delta, чтобы не показывать бессмысленные карточки changed-file +0/-0',
new_0_6_26_1: 'Этот релиз включает PR, объединенные после 0.6.25, с фокусом на Ekko Agent, отображение context в Coding Agent, Journey, baseline для группового чата, исправления desktop и размер MCP payload',
new_0_6_26_2: 'Ekko Agent теперь доступен в чате с обработкой runtime context, browser tools, более стабильными tool events и восстановленной tool-result history для учета context usage',
new_0_6_26_3: 'Сессии Coding Agent теперь яснее показывают reasoning и настройки context, сохраняют API mode, избегают неверного Codex app-server mode и не допускают скачков context usage после follow-up turns',
new_0_6_26_4: 'В Journey добавлена view learning graph с более аккуратными graph interactions, а групповой чат получил baseline coverage для новой линейки функций',
new_0_6_26_5: 'Надежность desktop улучшена за счет исправлений login persistence и reset flow, fallback динамического порта Windows worker, обработки stdout/stderr EPIPE и отдельной упаковки firmware ESP32-C3 v1',
new_0_6_26_6: 'Hermes Studio MCP теперь по умолчанию возвращает компактный summary available-models, с фильтрами и явной option full-detail, чтобы не перегружать agent context данными моделей',
new_0_6_25_1: 'Исправлен сбой execute_code с Hermes Agent 0.18.0: Agent Bridge теперь передает новый параметр has_host_access через wrapper памяти подтверждений',
new_0_6_24_1: 'Этот релиз включает PR после 0.6.23 и улучшает ввод чата, видимость workspace, управление plugins, модели по умолчанию и просмотр workspace diff',
new_0_6_24_2: 'Поля ввода одиночного и группового чата получили встроенную панель, компактные элементы модели, сгруппированные настройки ввода, более понятное использование context, мобильную полировку и восстановленный ручной resize одиночного чата',
new_0_6_24_3: 'Изменения workspace run теперь показываются как устойчивые chat diff cards с правым drawer для просмотра diff и редактирования файлов, восстанавливаются после resume session и лучше работают на mobile',
new_0_6_24_4: 'Workspace folder picker надежнее обходит Windows drives и junctions и показывает dot-prefixed folders вроде .hermes, .config и .codex, сохраняя проверки WORKSPACE_BASE',
new_0_6_24_5: 'Страница Plugins позволяет включать и отключать управляемые user plugins и точнее показывает состояние из базовой конфигурации Hermes и текущего profile',
new_0_6_24_6: 'Страница Models получила действия default provider и default model; bridge terminal error detection дает меньше ложных ошибок, Hermes Agent runtime packaging обновлен до 0.18.0, а website version manifest освежен',
},
}