@goodandready/dsh-russian-lang 0.2.22 → 0.2.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -517,7 +517,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
517
517
 
518
518
 
519
519
  /** namespace -> { ключ: перевод } */
520
- const RU = {"approval":{"allowOnce":"Разрешить один раз","detail.aria":"Сведения о подтверждении","escalation":"Инструмент {toolName} запрашивает привилегированное выполнение","reject":"Отклонить","waiting":"Ожидание подтверждения"},"chat":{"chat.deepDiving":"Глубокий анализ…","chat.loadError":"Не удалось загрузить историю: {message} ({code})","chat.loadOlder":"Загрузить более ранние","chat.loadingHistory":"Загрузка истории…","chat.toBottom":"Вниз к началу","chat.turnNavigation.jump":"Перейти к шагу {turn}","chat.turnNavigation.jumpLoad":"Загрузить и перейти к шагу {turn}","chat.turnNavigation.label":"Навигация по шагам диалога","chat.turnNavigation.turn":"Шаг {turn}","clock.md":"{m}/{d}","clock.ymd":"{y}-{m}-{d}","command.done":"Завершено","command.failed":"Команда завершилась с ошибкой","command.running":"Выполняется…","command.title":"Команда","details.close":"Закрыть детали","details.empty":"Нет дополнительных сведений","details.input":"Входные данные","details.notInWindow":"Реплика за пределами текущего окна контекста","details.output":"Результат","details.running":"Выполняется…","details.title":"Детали выполнения","duration.compactMinutes":"{minutes}м {seconds}с","duration.compactSeconds":"{seconds}с","duration.hours":"{hours} ч {minutes} мин {seconds} с","duration.milliseconds":"{milliseconds}мс","duration.minutes":"{minutes}м {seconds}с","duration.seconds":"{seconds}с","fileOpen.folderTitle":"Открыть папку","fileOpen.folderUnknown":"Не удалось открыть эту папку","fileOpen.title":"Не удалось открыть файл","fileOpen.unknown":"Не удалось открыть этот файл","json.truncated":"… обрезано, всего {total} символов","message.branch":"Ответвить в новый диалог","message.branchUnavailable":"Доступно только для последнего сообщения завершённого шага","message.compaction":"Контекст сжат","message.compaction.commandTitle":"сжатие","message.compaction.completed":"Сжато {items} элементов истории (~{tokens} токенов)","message.compaction.expand":"Посмотреть сводку сжатия","message.compaction.running":"Сжатие контекста…","message.compaction.unavailable":"Сводка сжатия недоступна","message.context.catalog.more":"… ещё {count}","message.context.catalog.replaced":"Заменяющий каталог","message.context.instructions.added":"добавлено","message.context.instructions.loaded":"загружено","message.context.instructions.removed":"удалено","message.context.instructions.updated":"обновлено","message.context.recall.counts":"сохранено {retained} • пропущено {omitted}","message.context.recall.truncated":"обрезано","message.context.relay.from":"Из сессии {session}","message.context.snapshot.supersedes":"Заменяет более ранние снимки","message.contextInjection":"Внедрение контекста","message.contextRecall":"Вспоминание сессии","message.extraBlock":"Дополнительный блок содержимого","message.failure.auth":"Недействительный ключ API","message.maxTokens":"Достигнут лимит токенов вывода","message.maxTokens.hint":"Ответ был прерван; предыдущий вывод сохранён в диалоге. Отправьте «продолжить», чтобы модель возобновила генерацию.","message.ranFor":"Время работы: {duration}","message.referenceSeparator":", ","message.referenceSummary":"Упомянутая сессия • {labels}","message.retry.active":"Повторный запрос к модели","message.retry.cancelled":"Повтор запроса к модели отменён","message.retry.delay":"Задержка перед повтором: ","message.retry.failure":"Причина сбоя: ","message.retry.scheduled":"Ожидание повторного запроса к модели","message.retry.started":"Повторный запрос к модели выполнен","message.retry.status":"{label} ({retry}/{maximum}) • {seconds}с","message.stopped":"Остановлено","message.systemPrompt":"Системный промпт","message.systemPromptUpdate":"Обновление системного промпта","message.think":"Рассуждения","message.tokensPerSecond":"{tps} ток./с","message.turnError":"Этот шаг завершился с ошибкой","message.turnProcess.messages.one":"{count} сообщение","message.turnProcess.messages.other":"{count} сообщений","message.turnProcess.separator":" • ","message.turnProcess.subagents.one":"{count} субагент","message.turnProcess.subagents.other":"{count} субагентов","message.turnProcess.thoughtForAWhile":"Рассуждал некоторое время","message.turnProcess.toolCalls.one":"{count} вызов инструмента","message.turnProcess.toolCalls.other":"{count} вызовов инструментов","message.turnTime.duration":"Общее время выполнения","message.turnTime.speed":"Токенов в секунду (TPS)","message.turnTime.title":"Время и скорость шага","message.turnTime.ttft":"Время до первого токена (TTFT)","message.turnUsage.cacheHit":"Попадание в кэш","message.turnUsage.cacheRead":"Вход из кэша","message.turnUsage.cacheWrite":"Запись в кэш","message.turnUsage.consumed":"Использовано {total}","message.turnUsage.count":"{count} ток.","message.turnUsage.input":"Вход без кэша","message.turnUsage.model":"Провайдер / модель","message.turnUsage.output":"Вывод","message.turnUsage.reasoning":" ({tokens} рассуждения)","message.turnUsage.title":"Расход токенов на шаг","message.unknownBlock":"Неизвестный блок содержимого","message.unknownSurface":"Неизвестное событие интерфейса: {type}","number.groupSeparator":" ","row.failed":"Ошибка","row.running":"Выполняется","settings.transcript.compact":"Компактный","settings.transcript.description":"Управляет отображением процесса выполнения в завершённых шагах","settings.transcript.normal":"Обычный","settings.transcript.title":"Отображение диалога","stats.cacheHit":"Кэш {percent}%","stats.counts":"{turns} шагов • {steps} действий","stats.dialog.llmTime":"Время LLM","stats.dialog.speed":"Токенов в секунду (TPS)","stats.dialog.title":"Статистика сессии","stats.dialog.toolTime":"Время инструментов","stats.dialog.ttft":"Среднее время до первого токена (TTFT)","stats.dialog.usageTitle":"Использование токенов","stats.llm":"LLM {duration}","stats.tokens":"Вход {input} ток. • Выход {output} ток.","stats.tokensPerSecond":"{throughput} ток./с","stats.toolCall":"Инструмент {duration}","stats.ttftAverage":"TTFT ср. {duration}","view.chat":"Чат"},"command":{"cancelled":"Команда отменена","completed":"Команда завершена","description.compact":"Сжать раннюю историю диалога","description.export":"Скачать журнал сессии в формате ZIP-архива","description.feedback":"Оставить отзыв о текущей сессии","description.goal":"Установить или просмотреть цель для длительной задачи","description.permission":"Переключить пресет разрешений (режим песочницы и политики подтверждений)","description.plan":"Войти или выйти из режима планирования","executing":"Выполнение команды…","failed":"Сбой выполнения команды","label.compact":"Сжатие","label.export":"Экспорт","label.feedback":"Обратная связь","label.goal":"Цель","label.permission":"Режим доступа","label.plan":"План","listbox.aria":"Совпадения /{command}","notice.attachmentsUnsupported":"/{command} не принимает вложения; сначала удалите их","notice.imagesUnsupported":"/{command} не принимает изображения; сначала удалите их","overlay.aria":"Параметры /{command}","running":"Выполняется","search.aria":"Фильтр параметров","search.placeholder":"Поиск…","section.add":"Добавить","section.commands":"Команды","status.applying":"Применение…","status.empty":"Нет параметров","status.loading":"Загрузка параметров…","timeout":"Превышено время ожидания команды","token.compact":"сжатие","token.export":"экспорт","token.feedback":"отзыв","token.goal":"цель","token.permission":"доступ","token.plan":"план"},"common":{"back":"Назад","brand.localBuild":"Локальная сборка DSH","cancel":"Отмена","close":"Закрыть","collapse":"Свернуть","copied":"Скопировано","copy":"Копировать","copy.compactJson":"Копировать компактный JSON","copy.failed":"Не удалось скопировать","copy.json":"Копировать JSON","copy.optionsHint":"{action}; правый клик для вариантов копирования","copy.path":"Копировать путь к свойству","copy.prettyJson":"Копировать форматированный JSON","copy.value":"Копировать значение","delete":"Удалить","edit":"Изменить","expand":"Развернуть","json.collapseNode":"Свернуть узел JSON","json.expandNode":"Развернуть узел JSON","json.label":"JSON","load.failed":"Не удалось загрузить","loading":"Загрузка…","markdown.footnotes":"Сноски","markdown.truncatedCharacters":"… обрезано на {total} символах","more":"Ещё","next":"Дальше","none":"Нет","number.million":"{value}M","number.thousand":"{value}K","ok":"ОК","previous":"Назад","retry":"Повторить","save":"Сохранить","search":"Поиск","skip":"Пропустить","submit":"Отправить","submitting":"Отправка…","truncated":"Обрезано","unknown":"Неизвестно"},"conversation":{"access.confirm.acknowledge":"Я понимаю риски и хочу продолжить","access.confirm.cancel":"Отмена","access.confirm.description":"Полный доступ убирает часть подтверждений и позволяет агенту действовать напрямую, включая чувствительные операции, изменение файлов и внешние команды. Включайте, только если доверяете текущей задаче.","access.confirm.enable":"Включить полный доступ","access.confirm.title":"Включить полный доступ?","access.preset.fullAccess":"Полный доступ","access.preset.readOnly":"Только чтение","access.preset.workspaceWrite":"Запись в рабочую область","action.copy":"Копировать сообщение","action.delete":"Удалить сообщение","action.edit":"Редактировать сообщение","action.fork":"Ответвить диалог с этой реплики","action.quote":"Цитировать","action.retry":"Повторить генерацию","approval.allowOnce":"Разрешить один раз","approval.detail.aria":"Подробности запроса","approval.escalation":"Инструмент {toolName} просит повышенных прав","approval.reject":"Отклонить","approval.waiting":"Ожидание подтверждения","ask.answered":"{answered}/{total} отвечено","ask.cancelled":"отменено","ask.cancelledDetail":"Этот набор вопросов был отменён до отправки ответов.","ask.interrupted":"прервано","ask.interruptedDetail":"Этот набор вопросов был прерван до отправки ответов.","ask.rowTitle":"Вопрос","ask.skipped":"Без ответа","ask.waiting":"ожидание","attachment.dropBlocked":"В настоящий момент добавление файлов и изображений заблокировано","attachment.dropDesc":"Лимит изображений: до {count} шт., до {size} каждое","attachment.dropTitle":"Перетащите файлы или изображения сюда для добавления","attachment.pending":"Ожидающие вложения","attachment.scrollLeft":"Прокрутить вложения влево","attachment.scrollRight":"Прокрутить вложения вправо","bash.failed":"Ошибка","bash.running":"Выполняется","bash.stopped":"Остановлено","chat.loadError":"Не удалось загрузить историю: {message} ({code})","chat.loadOlder":"Загрузить раньше","chat.loadingHistory":"Загрузка истории…","chat.toBottom":"Вниз","clock.md":"{d}.{m}","clock.ymd":"{d}.{m}.{y}","command.attachmentsUnsupported":"/{command} не принимает вложения; сначала удалите их","command.done":"Готово","command.failed":"Команда не выполнена","command.imagesUnsupported":"/{command} не принимает вложения-изображения — сначала удалите их","command.running":"Выполняется…","command.title":"Команда","context.aria":"{percent} контекста занято","context.messages":"Сообщения","context.system":"Системный промпт","context.tools":"Инструменты","context.used":"контекста занято","contextWindow":"Окно контекста: {percent}%","costEstimate":"Оценочная стоимость: ${cost}","details.close":"Закрыть подробности","details.empty":"Выберите строку инструмента в переписке, чтобы увидеть подробности","details.input":"Вход","details.notInWindow":"Этот вызов вне текущего окна","details.output":"Выход","details.running":"Выполняется…","details.title":"Подробности","diff.collapseAria":"Свернуть diff","diff.expandAria":"Развернуть ещё {count} строк diff","diff.expandRest":"… ещё {count} строк","diff.files.one":"{count} файл","diff.files.other":"{count} файлов","duration.minutes":"{minutes} мин {seconds} с","duration.seconds":"{seconds} с","export.json":"Экспорт в JSON","export.markdown":"Экспорт в Markdown","export.title":"Экспорт диалога","file.attach":"Прикрепить файл","file.label":"Файл","file.notStaged":"Загрузка файла не завершена; прикрепите заново и повторите попытку","file.pending":"Ожидающие файлы","file.remove":"Удалить файл {name}","file.retry":"Повторить загрузку {name}","file.sessionUnavailable":"Сессия недоступна; загрузка файлов невозможна","file.stillUploading":"Файлы всё ещё загружаются; отправьте сообщение после завершения загрузки","file.uploadFailed":"Сбой загрузки; нажмите для повтора","file.uploading":"Загрузка…","fileOpen.folderTitle":"Не удалось открыть папку","fileOpen.folderUnknown":"Не удалось открыть эту папку","fileOpen.title":"Не удалось открыть файл","fileOpen.unknown":"Не удалось открыть этот файл","hero.chooseWorkspace":"Выбрать рабочую папку","hero.headline":"Навстречу неизвестному","hero.preview":"Предпросмотр","hint.goal":"опишите цель длительной задачи","hint.goal.active":"цель активна — изменить / пауза / продолжить / снять","image.closePreview":"Закрыть просмотр оригинала","image.dimensionTooLarge":"Стороны изображения не больше {size}px — уменьшите его и попробуйте снова","image.dropBlocked":"Сейчас картинки добавить нельзя","image.dropDesc":"До {count} изображений, каждое до {size}","image.dropTitle":"Перетащите изображения сюда","image.fileTooLarge":"Каждое изображение должно быть меньше {size}","image.label":"Изображение","image.loadFailed":"Изображение не загрузилось, нажмите для повтора","image.loading":"Загрузка изображения…","image.modelUnsupported":"Текущая модель не принимает изображения; выберите подходящую","image.openOriginal":"Открыть оригинал","image.openOriginalLabel":"{label}, нажмите, чтобы открыть оригинал","image.original":"Оригинал","image.pending":"Изображения к отправке","image.preview":"Просмотр оригинала","image.remove":"Убрать изображение {name}","image.scrollLeft":"Прокрутить изображения влево","image.scrollRight":"Прокрутить изображения вправо","image.sendFailed":"Не удалось отправить изображения ({reason}); добавьте заново и повторите","image.serviceUnavailable":"Служба загрузки изображений недоступна","image.subagentUnsupported":"Сессии субагентов пока не поддерживают изображения","image.tooMany":"В одно сообщение помещается до {count} изображений","image.tooManyPixels":"Слишком большое разрешение; сожмите изображение и повторите","image.totalTooLarge":"Изображения весят больше {size}; уберите часть и повторите","image.unsupportedType":"Поддерживаются только PNG, JPG, WebP и GIF","input.accessMode":"Режим доступа, сейчас: {name}","input.commands":"Команды","input.file":"Файл","input.send":"Отправить сообщение","input.send.queue":"Поставить в очередь","input.send.steer":"Направить сообщение","input.stop":"Остановить генерацию","json.truncated":"… обрезано, всего символов: {total}","message.branch":"Ответвить новый диалог","message.branchUnavailable":"Доступно только на последнем сообщении завершённого хода","message.compaction":"Контекст сжат","message.compaction.completed":"Сжато элементов истории: {items} (~{tokens} токенов)","message.compaction.expand":"Показать итог сжатия","message.compaction.running":"Сжатие контекста…","message.compaction.unavailable":"Итог сжатия недоступен","message.context.catalog.more":"… ещё {count}","message.context.catalog.replaced":"Каталог заменён","message.context.instructions.added":"добавлено","message.context.instructions.loaded":"загружено","message.context.instructions.removed":"удалено","message.context.instructions.updated":"обновлено","message.context.recall.counts":"{retained} оставлено · {omitted} пропущено","message.context.recall.truncated":"обрезано","message.context.relay.from":"Из сессии {session}","message.context.snapshot.supersedes":"Заменяет прежние снимки","message.contextInjection":"Инъекция контекста","message.contextRecall":"Напоминание из сессии","message.extraBlock":"Дополнительный блок","message.maxTokens":"Достигнут лимит выходных токенов","message.maxTokens.hint":"Ответ обрезан; написанное ранее сохранено в переписке. Отправьте «продолжай», чтобы модель дописала.","message.ranFor":"Заняло {duration}","message.referenceSeparator":", ","message.referenceSummary":"Упомянутая сессия · {labels}","message.retry.active":"Повтор запроса к модели","message.retry.cancelled":"Повтор запроса отменён","message.retry.delay":"Задержка перед повтором: ","message.retry.failure":"Причина сбоя: ","message.retry.scheduled":"Ожидание повтора запроса","message.retry.started":"Запрос к модели повторён","message.retry.status":"{label} ({retry}/{maximum}) · {seconds} с","message.stopped":"Остановлено","message.tokensPerSecond":"{tps} ток/с","message.ttft":"Первый токен {seconds} с","message.turnError":"Ход не удался","message.unknownBlock":"Неизвестный блок содержимого","message.unknownSurface":"Неизвестное событие: {type}","modelChanged":"Модель переключена на {model}","placeholder.default":"Напишите агенту","placeholder.hero":"Опишите, что хотите сделать","placeholder.parentOffline":"Родительская сессия офлайн: отправка недоступна, но остановить выполнение можно","placeholder.steerQueue":"Cmd/Ctrl+Enter направит все сообщения из очереди","placeholder.unavailable":"Сессия недоступна","placeholder.workspace":"Выберите рабочую папку, чтобы начать","presetApplied":"Применён пресет: {preset}","queue.cancelEdit":"Отменить правку","queue.count":"Сообщений в очереди: {n}","queue.edit":"Изменить сообщение в очереди","queue.edit.unsupported":"Содержит не только текст; правка пока не поддерживается","queue.editFailed":"Не удалось изменить: сообщение, возможно, уже отправляется.","queue.file":"Файл в очереди: {name}","queue.image":"Изображение сообщения в очереди","queue.remove":"Убрать из очереди","queue.removeFailed":"Не удалось убрать: сообщение, возможно, уже отправляется.","queue.save":"Сохранить сообщение","queue.sending":"Отправка…","queue.steer":"Направить сообщение","queue.steer.unavailable":"Направлять можно только пока агент работает","queue.steerFailed":"Не удалось направить. Попробуйте ещё раз.","read.collapseAria":"Свернуть содержимое","read.expandAria":"Развернуть ещё {count} строк","read.expandRest":"… ещё {count} строк","read.window":"Показано {shown} из {total} строк","row.failed":"Ошибка","row.input":"ВХОД","row.inspect":"Инспектировать","row.output":"ВЫХОД","row.running":"Выполняется","row.stopped":"Остановлено","sandboxActive":"Песочница: {mode}","search.collapseAria":"Свернуть результаты","search.expandAria":"Развернуть ещё {count} строк результатов","search.expandRest":"… ещё {count} строк","search.matches":"{shown} совпадений • {files} файлов","search.matches.truncated":"Показано {shown} из {total} совпадений • {files} файлов","search.noResults":"Нет результатов","search.paths":"{shown} путей","search.paths.truncated":"Показано {shown} из {total} путей","session.hierarchy":"Иерархия сессий","settings.enter.description":"Только когда агент занят; Cmd/Ctrl+Enter даёт другое поведение","settings.enter.queue":"В очередь","settings.enter.steer":"Направить","settings.enter.title":"Enter, когда агент занят","stats.cacheHit":"Попаданий в кэш {percent}%","stats.counts":"ходов: {turns} · шагов: {steps}","stats.llm":"Модель {duration}","stats.tokens":"Вход {input} ток · выход {output} ток","stats.tokensPerSecond":"{throughput} ток/с","stats.toolCall":"Инструменты {duration}","stats.ttftAverage":"Первый токен в среднем {duration}","status.generating":"Генерация ответа…","status.interrupted":"Генерация прервана пользователем","status.thinking":"Рассуждение…","status.toolRunning":"Вызов инструмента: {name}","terminal.collapseAria":"Свернуть вывод","terminal.done":"Готово","terminal.exitCode":"код возврата {code}","terminal.expandAria":"Показать оставшиеся строки вывода: {n}","terminal.expandRest":"… ещё строк: {n}","terminal.failed":"Ошибка","terminal.noOutput":"Вывода нет","terminal.running":"Выполняется","terminal.sendInput":"(отправить ввод)","terminal.session":"Терминал {sessionId}","terminal.signal":"сигнал {signal}","timeElapsed":"Затрачено времени: {time}","todo.completed":"{done}/{total} выполнено","todo.progress.active":"{active} в работе","todo.progress.done":"{done} выполнено","todo.progress.pending":"{pending} в очереди","todo.rowTitle":"Обновить список задач","todo.title":"Задачи","tokenUsage":"Токены: {used} / {limit}","tool.autoReviewNotExecuted":"Инструмент не был выполнен. Причина: {reason}","tool.autoReviewReasonFallback":"Автопроверка не разрешила это действие","tool.autoReviewRejected":"Отклонено автопроверкой","tool.title.bash":"Bash","tool.title.code":"Код","tool.title.edit":"Правка","tool.title.generic":"Вызов инструмента","tool.title.glob":"Поиск по маске (Glob)","tool.title.grep":"Поиск текста (Grep)","tool.title.inspect":"Инспектировать","tool.title.pwsh":"Pwsh","tool.title.read":"Чтение","tool.title.readImage":"Просмотр изображения","tool.title.removeCordis":"Удалить плагин Cordis","tool.title.runCordis":"Запустить плагин Cordis","tool.title.search":"Поиск","tool.title.stopCordis":"Остановить плагин Cordis","tool.title.webFetch":"Загрузка страницы","tool.title.webSearch":"Поиск в вебе","tool.title.write":"Запись","turn.details":"Сведения о реплике","turn.number":"Реплика #{n}","view.chat":"Чат","web.contentTruncated":"Содержимое обрезано","web.http":"HTTP","web.noResults":"Ничего не найдено","web.sourcesTruncated":"Список источников обрезан"},"cordis":{"a11y.defining":"Определение плагина","a11y.failed":"Определить не удалось","a11y.stopped":"Определение прервано","action.approve":"Разрешить","action.approveOnce":"Разрешить только эту версию","action.approvePlugin":"Разрешить будущие версии этого плагина","action.decline":"Отклонить","action.inspect":"Инспектировать","action.remove":"Удалить","action.retry":"Повторить","action.rollback":"Откатить","action.run":"Запустить","action.stop":"Остановить","body.clientCode":"Клиент","body.copied":"Скопировано","body.copy":"Копировать","body.hostCode":"Хост","body.output":"Результат","body.source":"Исходник плагина","panel.approvals.aria":"Подтверждения Cordis","panel.current":"Текущая: {packageId}","panel.empty":"Плагинов пока нет","panel.group.current":"Эта сессия","panel.group.others":"Другие сессии","panel.hint":"Управление запуском — в панели Cordis над настройками","panel.loading":"Чтение…","panel.next":"Следующая: {packageId}","panel.plugins.aria":"Плагины Cordis","panel.readFailed":"Не удалось прочитать список плагинов: {message}","panel.runningCount":"работает: {count}","panel.title":"Плагины Cordis","panel.trigger":"Плагин Cordis","panel.version":"Версия","purpose.missing":"(назначение не указано)","render.failedAbdicated":"Отрисовка в {slot} не удалась, вернули стандартный интерфейс:","render.failedHeld":"Отрисовка в {slot} не удалась:","row.defineTitle":"Зарегистрировать плагин Cordis","row.removeTitle":"Удалить плагин Cordis","row.runTitle":"Запустить плагин Cordis","row.stopTitle":"Остановить плагин Cordis","row.updateTitle":"Обновить плагин Cordis","run.removed":"Этого пакета больше нет","run.superseded":"Ниже есть более свежая карточка запуска","status.awaitingApproval":"Ждёт подтверждения","status.clientPending":"Клиент готов к активации","status.failed":"Запуск не удался","status.idle":"Готов","status.removed":"Удалён","status.running":"Работает","status.superseded":"Есть более свежий запуск"},"deliverables":{"presented.action":"Открыть","presented.all":"Все {count} файлов","presented.collapse":"Свернуть","presented.collapseAria":"Свернуть файлы результатов","presented.defaultApp":"Открыть в приложении по умолчанию","presented.directory":"Открыть папку с файлом","presented.directoryError":"Не удалось открыть папку с файлом. Попробуйте снова.","presented.directoryOpened":"Запрошено открытие папки с файлом","presented.directoryOpening":"Открытие папки с файлом…","presented.error":"Не удалось открыть. Нажмите для повтора.","presented.expandAria":"Показать все {count} файлов результатов","presented.explorer":"Показать в Проводнике","presented.file":"Файл","presented.finder":"Показать в Finder","presented.hostError":"Не удалось прочитать сведения о рабочем столе хоста","presented.more":"Другие действия с файлом {name}","presented.nativeUnavailable":"Для этого файла нет доступного пути на хосте. Просмотрите его на боковой панели.","presented.open":"Открыть {name} в приложении по умолчанию","presented.opened":"Открыто в приложении по умолчанию","presented.opening":"Открытие…","presented.preview":"Предпросмотр на боковой панели","presented.previewButton":"Открыть {name} на боковой панели","presented.previewCard":"Предпросмотр {name} на боковой панели","presented.retry":"Повторить","presented.revealError":"Не удалось показать в файловом менеджере. Попробуйте снова.","presented.revealed":"Запрошен показ в файловом менеджере","presented.revealing":"Отображение в файловом менеджере…","presented.unavailable":"На этом хосте нет доступного рабочего стола для открытия файлов или папок","produced.label":"Создано","produced.more":"+ {count} файлов","produced.moreOne":"+ 1 файл","produced.open":"Открыть {name}","produced.showInFolder":"Показать в папке","row.error":"Сбой создания результатов","row.inspect":"Инспектировать вызов","row.ok":"Результаты подготовлены","row.running":"Подготовка результатов","row.stopped":"Прервано","row.title":"Предоставление файлов"},"directory-browser":{"browser.cancel":"Отмена","browser.create":"Создать","browser.createIn":"Новая папка в «{name}»","browser.editPath":"Изменить путь","browser.folderName":"Имя папки","browser.home":"Домашняя папка","browser.loading":"Загрузка…","browser.newFolder":"Новая папка","browser.open":"Открыть","browser.showHidden":"Показывать скрытые файлы","browser.title":"Выбор рабочей папки","browser.truncated":"Слишком много папок; показано только начало.","browser.untitledFolder":"Без имени"},"documentHtml":{"failed":"Не удалось отобразить предпросмотр этого HTML-документа.","frame":"Предпросмотр HTML-документа","loading":"Подготовка предпросмотра HTML…","title":"HTML"},"documentMarkdown":{"code.copied":"Скопировано","code.copy":"Копировать","footnotes":"Сноски","viewer.label":"Markdown"},"feedback":{"action.dislike":"Плохой ответ","action.dislikeActive":"Убрать оценку","action.like":"Хороший ответ","action.likeActive":"Убрать оценку","category.instruction-following":"Понимание и следование инструкциям","category.other":"Другое","category.product-interaction":"Возможности продукта и взаимодействие","category.resource-cost":"Использование ресурсов и стоимость","category.security-privacy-permission":"Безопасность, конфиденциальность и разрешения","category.service-stability":"Стабильность работы сервиса","category.task-result":"Результат выполнения задачи","dialog.categories":"Категория отзыва","dialog.detail":"Подробности отзыва","dialog.hint":"Добавьте детали, чтобы помочь нам стать лучше. Ваше сообщение будет включать журнал текущей беседы.","dialog.title":"Отправить отзыв","error.conflict":"Эту оценку изменили в другом месте; показано актуальное состояние","error.generic":"Не удалось сохранить оценку","error.load":"Не удалось загрузить оценку","error.noteTooLarge":"Описание слишком длинное; сократите его и отправьте снова","note.aria":"Комментарий к оценке","note.cancel":"Отмена","note.dialog":"Отзыв","note.open":"Добавить комментарий","note.placeholder":"Что получилось хорошо, а что нет? (необязательно)","note.save":"Сохранить","toast.recorded":"Спасибо за ваш отзыв"},"goal":{"action.cancel":"Отменить правку","action.clear":"Снять цель","action.edit":"Изменить цель","action.pause":"Приостановить цель","action.resume":"Продолжить цель","action.save":"Сохранить цель","commandInput.aria":"Ввод команды","objective.aria":"Формулировка цели","phase.active":"Цель в работе","phase.active.disarmed":"Неактивная цель","phase.blocked":"Цель заблокирована","phase.paused":"Цель на паузе","title":"Цели диалога"},"job":{"count.idle.few":"{count} фоновые задачи","count.idle.many":"{count} фоновых задач","count.idle.one":"{count} фоновая задача","count.idle.other":"{count} фоновых задач","count.live.few":"{count} фоновые задачи выполняется","count.live.many":"{count} фоновых задач выполняется","count.live.one":"{count} фоновая задача выполняется","count.live.other":"{count} фоновых задач выполняется","duration.hours":"{hours} ч {minutes} мин","duration.minutes":"{minutes} мин {seconds} с","duration.seconds":"{seconds} с","duration.title.done":"Заняло {duration}","duration.title.live":"Выполняется {duration}","list.aria":"Фоновые задачи","status.completed":"завершена","status.failed":"ошибка","status.killed":"отменена","status.running":"выполняется","status.stopping":"останавливается"},"model":{"action.reload":"Обновить","blocked.composer":"Эта модель недоступна — выберите другую, чтобы продолжить","command.description":"Выбрать модель для этого диалога","command.label":"Модель","effort.providerDefault":"По умолчанию","empty.efforts":"У этой модели нет уровней рассуждения.","empty.models":"Доступных моделей нет.","error.action":"Операция с моделью не удалась: {message}","menu.aria":"Модель и уровень рассуждения","menu.effort":"Уровень рассуждений","menu.model":"Модель","option.deepseekV4Flash.description":"Быстрая, эффективная и экономичная; подходит для типовых, повседневных или параллельных задач.","option.deepseekV4Pro.description":"Улучшенное агентное написание кода, глубокие знания и сложное мышление; подходит для комплексных задач с высокими требованиями к качеству при более высокой стоимости.","option.loadError":"Каталог не загрузился: {message}","status.loading":"Обновление списка моделей…","trigger.aria":"Выбор модели, сейчас {model}","trigger.ariaEffort":"Выбор модели, сейчас {model}, уровень рассуждения {effort}","trigger.fallback":"Выбрать модель","trigger.loading":"Загрузка моделей…","trigger.selectAria":"Выбрать модель","warning.groupLoad":"{name} не загрузился: {message}"},"open-in-app":{"app.explorer":"Проводник Windows","app.filemanager":"Файлы","app.finder":"Finder","app.terminal":"Терминал","cursor":"Открыть в Cursor","custom":"Открыть в {app}","default":"Открыть в системном приложении","failed":"Не удалось открыть файл в {app}: {error}","menu.aria":"Открыть в","menu.toggle":"Выберите приложение для открытия","open.error":"Не удалось открыть","open.title":"Открыть рабочую область в {app}","open.tooltip":"Открыть локально","sublime":"Открыть в Sublime Text","title":"Открыть в приложении","vsc":"Открыть в VSCode","vscInsiders":"Открыть в VSCode Insiders","windsurf":"Открыть в Windsurf"},"permission.access":{"auto.badge":"ЭКСП","auto.confirm.acknowledge":"Я понимаю эти риски и хочу продолжить","auto.confirm.description":"Автопроверка работает без песочницы. Перед каждым вызовом нативного инструмента и внутренним вызовом PTC та же модель, что и текущий агент, проверяет, разрешить ли его. Эта функция экспериментальная, может ошибочно разрешать или блокировать действия и расходует дополнительные токены.","auto.confirm.enable":"Включить автопроверку","auto.confirm.title":"Включить автопроверку (экспериментально)?","auto.description":"Запуск без песочницы с экспериментальной проверкой каждого вызова инструментов и внутренних вызовов PTC той же моделью.","auto.label":"Автопроверка","close":"Закрыть","confirm.acknowledge":"Я понимаю риски и хочу продолжить","confirm.cancel":"Отмена","confirm.description":"Полный доступ убирает часть подтверждений и позволяет агенту действовать напрямую, включая чувствительные операции, изменение файлов и внешние команды. Включайте, только если доверяете текущей задаче.","confirm.enable":"Включить полный доступ","confirm.title":"Включить полный доступ?","mode":"Режим доступа, текущий: {name}","preset.fullAccess":"Полный доступ","preset.readOnly":"Только чтение","preset.workspaceWrite":"Запись в рабочую область"},"plan":{"chip.exitFailed":"Не удалось выйти из режима планирования","chip.label":"План","chip.off.aria":"Режим плана выключен, нажмите, чтобы включить","chip.off.title":"Режим плана выключен — нажмите, чтобы включить (/plan)","chip.on.aria":"Режим плана включён, нажмите, чтобы выключить","chip.on.title":"Режим плана включён — нажмите, чтобы выключить (/plan off)"},"question":{"action.next":"Дальше","action.skip":"Пропустить вопрос","custom.placeholder":"Впишите свой ответ","error.incomplete":"Сначала ответьте на этот вопрос.","error.unanswered":"Выберите вариант или впишите свой ответ.","nav.cancel":"Закрыть все вопросы","nav.maximize":"Развернуть карточку вопроса","nav.minimize":"Свернуть карточку вопроса","nav.next":"Следующий вопрос","nav.prev":"Предыдущий вопрос","option.recommended":"Рекомендуем","plan.approve":"Утвердить","plan.decline":"Отклонить","plan.discuss":"Обсудить","plan.header":"Проверка плана"},"reference":{"candidate.file":"Файл","candidate.folder":"Папка","candidate.noCwd":"(нет cwd)","candidate.session":"Сессия","crumb.root":"Рабочая область","section.files":"Файлы и папки","section.sessions":"Диалоги сессий","time.days":"{n} дн.","time.hours":"{n} ч","time.minutes":"{n} мин","time.months":"{n} мес.","time.now":"сейчас","time.years":"{n} г."},"schedule.catalog":{"frequency.every":"Каждые {value} {unit}","frequency.once":"Однократно","list.aria":"Активные напоминания","relative.future":"через {value} {unit}","relative.now":"Срок наступил","relative.overdue":"просрочено на {value} {unit}","status.overdue":"Просрочено","status.scheduled":"Запланировано","trigger.one":"{count} напоминание","trigger.other":"{count} напоминаний","unit.day.one":"день","unit.day.other":"дней","unit.hour.one":"час","unit.hour.other":"часов","unit.minute.one":"минуту","unit.minute.other":"минут","unit.second.one":"секунду","unit.second.other":"секунд"},"session-log-download":{"dialog.close":"Закрыть","dialog.commandFailed":"Не удалось запустить экспорт сессии.","dialog.errorTitle":"Экспорт сессии не удался","dialog.preparingDescription":"Готовится ZIP с этой сессией, её подсессиями и вложениями.","dialog.preparingTitle":"Экспорт сессии","dialog.successDescription":"Браузер загружает ZIP с сессией.","dialog.successTitle":"Загрузка сессии началась","header.action":"Журнал сессии","header.more":"Другие действия","menu.download":"Скачать журнал сессии"},"settings":{"close":"Закрыть","connection.connected":"Подключено","connection.connecting":"Подключение","connection.error":"Отключено","connection.reconnect":"Отключено, переподключиться сейчас","connection.restart":"Подключение, перезапустить сейчас","connection.retry":"Переподключиться сейчас","general.nav":"Общие","openDocument":"Открыть файл настроек","openDocument.error":"Не удалось открыть файл настроек","title":"Настройки","trigger":"Настройки"},"settings.agentPreset":{"brokenBadge":"Не загрузился","brokenNoCopy":"Пресет, который не загрузился, скопировать нельзя","builtIn":"Встроенный","builtInGroup":"Встроенные","cancel":"Отмена","close":"Закрыть","composition":"Композиция (agent.cordis.yml)","copyIntro":"Пресет копируется целиком на этой машине. Идентификатор станет именем каталога и позже не меняется; всё остальное правится в файлах самого пресета.","copyOf":"Скопирован с","copyTitle":"Скопировать пресет","create":"Создать","creating":"Создание…","creatorDraft":"Набросать свой пресет в режиме «Конструктор»","customGroup":"Свои","delete":"Удалить","deleteConfirm":"Удалить","deleteDescription":"Каталог пресета будет удалён. Уже запущенные на нём сессии продолжат работать, но выбрать его для новых нельзя.","deleteTitle":"Удалить этот пресет?","deleting":"Удаление…","description":"Действует на сессии, запущенные с этого момента. Работающие сессии остаются на своём пресете.","displayName":"Название","displayNamePlaceholder":"Показывается в списке; по умолчанию — идентификатор","duplicate":"Скопировать","duplicateUnavailable":"В этой установке нет каталога пресетов с правом записи","enablePickerToCreate":"Включите выбор режимов агента, чтобы запустить режим Creator","enablePickerToSetDefault":"Включите выбор режимов агента, чтобы задать режим по умолчанию","error":"Не удалось загрузить пресеты агента.","headerHint":"Пресет агента, на котором идёт сессия; зафиксирован при запуске","idInvalid":"Строчные буквы, цифры и дефисы, начиная с буквы или цифры.","idRequired":"Задайте пресету идентификатор.","idTaken":"Пресет с таким идентификатором уже есть.","inUse":"Используется","loading":"Загрузка пресетов…","nav":"Пресеты агента","noDescription":"Без описания.","openLocation":"Открыть папку","presetCodeDescription":"Всё, что умеет обычный режим, но инструменты отдаются через Code Mode SDK: модель собирает многошаговые операции в одну программу на TypeScript.","presetCodeName":"Режим кода","presetCordisDescription":"Для создания своих пресетов: всё из обычного режима плюс инспекция рантайма, опыты с плагинами и подсказки по авторству пресетов.","presetCordisName":"Конструктор","presetId":"Идентификатор","presetIdPlaceholder":"my-agent","presetMinimalDescription":"Агент из двух инструментов: постоянный bash и str_replace_editor.","presetMinimalName":"Минимальный режим","presetPtcDescription":"Полноценный агент разработки без инструмента рабочих процессов; остальные инструменты доступны через SDK режима PTC, что позволяет модели объединять многоэтапные операции в одну программу TypeScript.","presetPtcName":"Режим PTC","presetStandardDescription":"Полноценный кодинг-агент: правка файлов, консоль, поиск по файлам и в вебе, скиллы, планирование, цели, субагенты и воркфлоу.","presetStandardName":"Обычный режим","retry":"Повторить","revealedPathLabel":"Файлы пресета:","seatHint":"Пресет агента для сессии, которую вы собираетесь запустить","sectionIntro":"Пресет — это состав плагинов, на котором работает агент сессии: его инструменты, промпт и возможности. Скопируйте готовый и допилите под себя или попросите агента набросать свой в режиме «Конструктор».","selectionOffDefault":"По умолчанию","setDefault":"Сделать основным","showLocation":"Показать расположение","showPicker":"Разрешить выбор режимов агента","showPickerBeta":"Бета","showPickerDescription":"Если включено, для новых задач можно выбирать режимы: Стандартный, PTC, Creator, Минимальный и пользовательские. Если выключено, все новые задачи используют режим по умолчанию (по умолчанию Стандартный; настраивается). Влияет только на новые задачи.","switchRefused":"Не удалось переключиться на {name}: {reason}","title":"Пресет агента","userTrust":"Свой","view":"Посмотреть"},"settings.archivedSessions":{"empty":"Нет архивных сессий.","emptySearch":"Нет подходящих сессий.","loading":"Чтение сессий…","nav":"Архив сессий","search":"Поиск по архивным сессиям","time.days":"{n} дн","time.hours":"{n} ч","time.minutes":"{n} мин","time.months":"{n} мес","time.now":"сейчас","time.years":"{n} г","unarchive":"Разархивировать","unarchiveNamed":"Разархивировать «{title}»","unavailable":"Здесь нет архивных сессий, доступных для восстановления.","ungrouped":"Без группы"},"settings.locale":{"language.title":"Язык"},"settings.models":{"add":"Добавить провайдера","addModel":"Добавить модель","advancedHint":"Остальные поля живут в settings.yaml — правьте этот раздел напрямую.","apply":"Применить","applying":"Применение…","baseUrl":"Базовый URL","baseUrlDefault":"По умолчанию у провайдера","cancel":"Отмена","close":"Закрыть","conflict":"Пока карточка была открыта, настройки изменил кто-то ещё. Закройте и откройте заново, чтобы править актуальные значения.","contextWindow":"Окно контекста","contextWindowPlaceholder":"Как у провайдера по умолчанию","create":"Создать провайдера","creating":"Создание…","credentialConfigured":"API-ключ задан","credentialMissing":"API-ключ не задан","customAdd":"Добавить своего провайдера","customApi":"Протокол API","customApiUnset":"Не выбран","customBaseUrlInvalid":"Введите корректный URL (HTTP или HTTPS).","customBaseUrlPlaceholder":"https://gateway.example/v1","customDisplayName":"Отображаемое имя","customNeedsBaseUrl":"Своему провайдеру нужен базовый URL.","customNeedsModels":"Своему провайдеру нужна хотя бы одна модель.","customRoute":"Идентификатор провайдера","customRouteHint":"Идентификатор в нижнем регистре, начинается с буквы. По нему провайдер адресуется в запросах, и так же называется его ключ.","customRouteInvalid":"Начните со строчной буквы, дальше строчные буквы, цифры и дефисы.","customRouteTaken":"Такой идентификатор уже занят другим провайдером.","customTag":"Свой","customTitle":"Свой провайдер","customized":"Настройки изменены","deepSeekChatBaseUrl":"https://api.deepseek.com","deepSeekEndpointHint":"Используйте эндпоинт, совместимый с настроенным подключением.","deepSeekMessagesBaseUrl":"https://api.deepseek.com/anthropic","deleteConfirm":"Удалить {provider}","deleteDescription":"Удаление {provider} убирает его настройки. Ключ, которым он пользовался, хранится отдельно и останется.","deleteDescriptionWithCredential":"Удаление {provider} убирает его настройки и сохранённый API-ключ.","deleteTitle":"Удалить {provider}?","deleting":"Удаление {provider}…","edit":"Изменить","editProvider":"Изменить {provider}","fetchAdopt":"Добавить выбранные","fetchDescription":"Вот модели, доступные у этого провайдера. Отметьте те, что нужно добавить.","fetchDeselectAll":"Снять выбор","fetchEmpty":"Провайдер не вернул ни одной модели. Добавьте их вручную.","fetchModels":"Запросить список моделей","fetchNeedsBaseUrl":"Сначала укажите базовый URL, потом запрашивайте.","fetchNoMatches":"Нет подходящих моделей.","fetchSearch":"Поиск моделей","fetchSelectAll":"Выбрать все","fetchTitle":"Выберите модели","fetching":"Запрос к провайдеру…","intro":"Введите свои API-ключи, чтобы пользоваться моделями этих провайдеров.","keyBlank":"Введите API-ключ или оставьте поле пустым, чтобы сохранить прежний.","keyBlankNew":"Введите API-ключ или оставьте поле пустым, если провайдер авторизуется иначе.","keyEnvLocked":"Задан переменной окружения (только чтение)","keyIllegalCharacters":"Ключ в недопустимом формате. Проверьте его.","keyInput":"API-ключ","keyPlaceholder":"Введите API-ключ","keyPlaceholderNative":"Введите API-ключ или оставьте пустым для авторизации из окружения","keyRequired":"Чтобы продолжить, введите API-ключ.","keyStored":"Задан — введите новое значение, чтобы заменить","loadFailed":"Не удалось загрузить список провайдеров","maxTokens":"Максимум выходных токенов","maxTokensPlaceholder":"Как у провайдера по умолчанию","model":"Модель","modelAdvanced":"Ёмкости","modelCapacityInvalid":"Ёмкость задаётся числом, можно с суффиксом K или M.","modelContextInvalid":"Окно контекста — положительное число, например 131072, 256K или 1M.","modelContextWindow":"Окно контекста","modelDuplicate":"Каждый идентификатор модели встречается один раз.","modelId":"Идентификатор модели","modelIdDuplicate":"Идентификатор модели должен быть уникальным.","modelIdRequired":"Нужен идентификатор модели.","modelMaxTokens":"Максимум выходных токенов","modelMaxTokensInvalid":"Максимум выходных токенов — положительное число, например 8192, 64K или 1M.","modelName":"Отображаемое имя","modelNameInvalid":"Отображаемое имя не может быть пустым.","modelNamePlaceholder":"Пусто — возьмётся идентификатор модели","models":"Модели","modelsCustomized":"Каталог моделей изменён","modelsEmpty":"В выборе моделей не будет ничего. Неуказанные идентификаторы всё равно можно отправлять напрямую.","modelsInherited":"По умолчанию, как в адаптере","nav":"Модели","onboardingDescription":"Настройте официального провайдера DeepSeek, чтобы начать.","onboardingLater":"Настроить позже","onboardingSave":"Сохранить и продолжить","onboardingSaving":"Сохранение…","onboardingTitle":"Добавьте API-ключ, чтобы начать","provider":"Провайдер","readOnly":"В этой установке файл настроек доступен только для чтения.","remove":"Удалить","removeModel":"Удалить модель","removeProvider":"Удалить {provider}","resetModels":"Вернуть значения по умолчанию","retry":"Повторить","savedProvider":"{provider} сохранён.","settingsPathUnresolvable":"неразрешимый путь настроек","title":"Модели","welcomeBody":"DeepSeek Harness 0.1 находится на стадии тестирования для разработчиков Harness. Многие компоненты требуют дальнейшего улучшения, и мы приветствуем обратную связь от сообщества. Базовые плагины и системные API DeepSeek Harness продолжат активно развиваться в ближайшие месяцы.\n\nМы с нетерпением ждём возможности исследовать границы искусственного интеллекта вместе с разработчиками по всему миру на базе открытой, модульной и повторно используемой инфраструктуры. Приглашаем разработчиков присоединиться к экосистеме плагинов DSH.","welcomeContinue":"Продолжить","welcomeError":"Не удалось сохранить подтверждение. Попробуйте ещё раз.","welcomeTitle":"Уведомление о внутреннем тестировании"},"settings.permission":{"confirm.acknowledge":"Я понимаю риски и хочу продолжить","confirm.cancel":"Отмена","confirm.description":"Полный доступ позволяет новым сессиям реже спрашивать подтверждение и действовать напрямую, включая чувствительные операции, изменение файлов и внешние команды. Включайте, только если доверяете будущим задачам.","confirm.enable":"Включить полный доступ","confirm.title":"Включить полный доступ?","description":"Режим разрешений по умолчанию для новых сессий","loading":"Загрузка","preset.fullAccess":"Полный доступ","preset.readOnly":"Только чтение","preset.workspaceWrite":"Запись в рабочую область","title":"Разрешения","unavailable":"Недоступно"},"settings.pluginInventory":{"active":"Подключён","catalog":"Список плагинов","condition":"Отключено, когда","conditionalTag":"Условный","configuration":"Настройки","cordis":"Состояние Cordis","countUnit":"плагинов","disabledTag":"Выключен","empty":"Плагинов нет.","emptySearch":"Подходящих плагинов нет.","enabledIn":"Включено в","enabledTag":"Включён","error":"Плагины временно недоступны.","failed":"Не удалось подключить","failedCountLabel":"с ошибкой","failedTag":"Ошибка","fromPreset":"Из","globalSubtitle":"Общие для системы и каждой сессии","globalTitle":"Глобальные плагины","loading":"Чтение плагинов…","loadingPhase":"Загрузка","matchesInOtherPresets":"ещё {count} совпадений в других пресетах: ","moduleLabel":"Модуль","pending":"Ожидает зависимости","presetEnabledTag":"Включено через пресеты","presetOptionBroken":"{name} (не удалось загрузить)","presetOptionDefault":"{name} (по умолчанию)","presetProvidedDetail":"Отключено глобально; предоставляется пресетами агента для каждой сессии","presetSubtitle":"Формируются для каждой сессии пресетами агента","presetTitle":"Плагины сессии","retry":"Повторить","runtime":"Статус","search":"Поиск плагинов","switcherLabel":"Выберите пресет агента для просмотра","tab":"Список плагинов","unloading":"Выгружается","unobserved":"Не подключён","viewInPreset":"Посмотреть в группе пресетов"},"settings.plugins":{"agentLoopDescription":"Как агент раздаёт вызовы инструментов.","agentLoopMaxParallel":"Параллельных вызовов","agentLoopMaxParallelHint":"Сколько безопасных для параллели вызовов идёт одновременно в пределах шага.","agentLoopTitle":"Цикл агента","bashDescription":"Ограничения для каждой команды, которую запускает агент.","bashMaxOutputBytes":"Предел вывода на поток (байт)","bashMaxOutputBytesHint":"Всё сверх предела уходит во временный файл, а не теряется.","bashTimeoutMs":"Таймаут команды (мс)","bashTimeoutMsHint":"Сколько команда может выполняться до принудительного завершения.","bashTitle":"Консоль","collapse":"Скрыть настройки","configurableTab":"Настройки плагинов","discard":"Отменить","empty":"В этой установке настройки плагинов не выведены.","expand":"Показать настройки","intro":"Настройка и просмотр плагинов, установленных в этой сборке.","invalidNumber":"Введите число или оставьте пустым, чтобы взять значение по умолчанию.","nav":"Плагины","overridden":"Переопределено","readOnly":"В этой установке настройки доступны только для чтения.","reset":"Вернуть по умолчанию","save":"Сохранить","saveFailed":"Установка не приняла эти значения; они оставлены, чтобы вы их поправили.","saving":"Сохранение…","subagentModelSelectionAllowed":"Модели, доступные агентам","subagentModelSelectionChoose":"Если включено, агенты могут выбирать провайдера, модель и уровень рассуждений для каждого субагента из списка разрешённых моделей ниже. Применяется только к новым сессиям.","subagentModelSelectionConflict":"Настройки изменены в другом месте. Сбросьте черновик и попробуйте снова.","subagentModelSelectionDescription":"Управление моделями, которые агенты могут выбирать для субагентов.","subagentModelSelectionEmpty":"В данный момент ни один провайдер не предоставляет моделей.","subagentModelSelectionLoadFailed":"Не удалось загрузить модели.","subagentModelSelectionLoading":"Загрузка моделей…","subagentModelSelectionOff":"Субагенты используют настроенные значения по умолчанию или наследуют модель родительского агента. Сохранённые выборы моделей сохраняются.","subagentModelSelectionPartial":"Часть провайдеров моделей не удалось загрузить; сохранённые выборы остаются доступными для удаления.","subagentModelSelectionRequired":"Выберите хотя бы одну модель перед сохранением.","subagentModelSelectionRetry":"Повторить","subagentModelSelectionTitle":"Субагент","subagentModelSelectionToggle":"Разрешить агентам выбирать модели для субагентов","subagentModelSelectionUnavailable":"В данный момент недоступно","subagentModelSelectionUnavailableGroup":"Сохранены, но в данный момент недоступны","tabs":"Разделы плагинов","title":"Плагины","unsaved":"Не сохранено","webSearchApiKey":"API-ключ","webSearchApiKeyHint":"Хранится вне файла настроек. Оставьте пустым, чтобы сохранить текущий ключ.","webSearchApiKeySet":"Ключ задан.","webSearchApiKeyUnset":"Ключ не задан; без него поиск недоступен.","webSearchBaseUrl":"Адрес сервиса","webSearchBaseUrlHint":"Оставьте пустым, чтобы взять адрес провайдера по умолчанию.","webSearchDescription":"Поисковый провайдер DeepSeek.","webSearchMaxUses":"Максимум поисков на запрос","webSearchMaxUsesHint":"Сколько раз в рамках одного запроса можно искать, прежде чем придётся отвечать.","webSearchTitle":"Поиск в вебе"},"settings.theme":{"appearance.dark":"Тёмная","appearance.light":"Светлая","appearance.system":"Как в системе","appearance.title":"Оформление","fontSize.decrease":"Уменьшить размер шрифта","fontSize.description":"Влияет только на содержимое диалога","fontSize.increase":"Увеличить размер шрифта","fontSize.title":"Размер шрифта","fontSize.unit":"пкс"},"sidebar":{"panels.label":"Глобальные панели","session.new":"Новая сессия","session.new.label":"Новая сессия","toggle.collapse":"Свернуть панель","toggle.open":"Открыть панель"},"sidebarCodePreview":{"copied":"Скопировано","copy":"Копировать","title":"Код"},"sidebarDocumentPreview":{"changed":"Файл изменился, показано предыдущее содержимое.","error.notFound":"Файл не найден. Возможно, он был перемещён или удалён.","error.notRegularFile":"Не является обычным файлом, нечего отобразить.","error.notText":"Не текстовый файл, предпросмотр пока недоступен.","error.tooLarge":"Размер страницы превышает лимит {limit} и не может быть прочитан.","error.unavailable":"Сбой чтения: {message}","loadMore":"Загрузить ещё","loading":"Чтение…","openWith":"Открыть с помощью","reload":"Перечитать файл","reloadNow":"Обновить","rendererUnavailable":"Предпросмотр {name} недоступен.","resourceUnavailable":"Служба файловых ресурсов недоступна.","retry":"Повторить","unsupportedFile":"Предпросмотр для этого типа файлов пока недоступен.","viewer.text":"Простой текст","wrap.aria":"Перенос строк","wrap.disable":"Отключить перенос строк","wrap.enable":"Включить перенос строк"},"sidebarFiles":{"empty":"Файлы не найдены","entry.other":"Не является файлом или папкой и не может быть открыт.","error.notDirectory":"Указанный путь не является каталогом.","error.notFound":"Каталог больше не существует. Возможно, он был перемещён или удалён.","error.outsideWorkspace":"Каталог находится за пределами рабочей области, чтение заблокировано.","error.unavailable":"Ошибка чтения: {message}","filter.all":"Все файлы","filter.changed":"Изменённые","filter.placeholder":"Фильтр файлов…","guide.description":"Просматривайте файлы в рабочей области сессии и открывайте любой из них.","guide.title":"Файлы","loading":"Чтение…","menu.copyFullPath":"Копировать полный путь","menu.copyPath":"Копировать относительный путь","menu.delete":"Удалить","menu.openInEditor":"Открыть в редакторе","menu.rename":"Переименовать","menu.reveal":"Показать в проводнике","noWorkspace":"У этой сессии нет каталога рабочей области.","refresh":"Обновить дерево файлов","reload":"Перезагрузить","title":"Файлы рабочей области","tree.root":"Корень проекта","truncated":"Слишком много записей; показана только часть.","type.label":"Файлы"},"sidebarImage":{"failed":"Не удалось отобразить изображение.","loading":"Открытие изображения…","preview":"Предпросмотр изображения: {name}","title":"Изображение","unsupported":"Для предпросмотра изображения требуется полное содержимое файла."},"sidebarPdf":{"failed":"Не удалось отобразить PDF: {message}","loading":"Открытие PDF…","pageImage":"Страница PDF {page}","password":"Этот PDF защищён паролем; предпросмотр документов с паролем не поддерживается.","rendering":"Рендеринг страницы…","retry":"Повторить","title":"PDF","unsupported":"Для предпросмотра PDF требуется полное содержимое файла.","workerFailed":"Процесс рендеринга PDF не смог продолжить работу. Попробуйте снова."},"sidebarRight":{"chrome.collapse":"Свернуть панель","chrome.collapseAria":"Свернуть правую боковую панель","chrome.exitFullscreen":"Выйти из полноэкранного режима","chrome.expand":"Развернуть панель","chrome.expandAria":"Открыть правую боковую панель","chrome.toFullscreen":"На весь экран","dock.addTab":"Добавить вкладку","dock.closeFloat":"Закрыть плавающее окно","dock.closeTab":"Закрыть вкладку","dock.dockFloat":"Закрепить в панели","dock.drop.bottom":"Разделить по горизонтали снизу","dock.drop.center":"Переместить сюда","dock.drop.left":"Разделить по вертикали слева","dock.drop.right":"Разделить по вертикали справа","dock.drop.top":"Разделить по горизонтали сверху","dock.emptyPane":"Пустая панель","dock.float":"Открепить в окно","dock.moreTabs":"Ещё вкладки","dock.nextTab":"Следующая вкладка","dock.prevTab":"Предыдущая вкладка","dock.reopenClosed":"Открыть закрытую вкладку","dock.splitHoriz":"Разделить по горизонтали","dock.splitPane":"Разделить вправо","dock.splitPaneDisabled":"Максимум две панели","dock.splitPaneNarrow":"Недостаточно ширины для разделения; увеличьте боковую панель","dock.splitVert":"Разделить по вертикали","dock.tabMenu":"Меню вкладки","guide.body":"Файлы и артефакты из диалога открываются в этой колонке; элементы ниже открывают больше возможностей.","guide.lead":"В боковой панели отображается то, к чему вам нужен постоянный доступ.","tab.guide.title":"Начало","tab.unavailable":"Пока нет средств для отображения данного типа содержимого."},"sidebarTerminal":{"attachmentEnded":"Подключение к терминалу завершено. Переподключитесь для продолжения.","cleanupFailed":"Не удалось завершить терминал «{title}»: {message}","closed":"Терминал закрыт.","connecting":"Подключение…","control":"Перехватить управление","creating":"Запуск…","description":"Выполнение команд в рабочей области сессии","disconnected":"Отключено.","exited":"Процесс завершился с кодом {code}","failed":"Ошибка терминала: {message}","inputFull":"Буфер ввода переполнен. Переподключитесь и повторите попытку.","invalidOutput":"Не удалось получить экран терминала. Переподключитесь для восстановления.","loading":"Чтение окружения терминала…","missingTerminal":"Этот терминал больше не существует. Откройте новый терминал.","new":"Новый терминал","readonly":"Этот вид доступен только для чтения.","reconnect":"Переподключиться","recoveryFailed":"Не удалось восстановить терминал: {message}","rename":"Название терминала","retry":"Повторить","retryRecovery":"Повторить восстановление терминала","shell":"Выбрать командную оболочку","shellEmpty":"Нет доступных оболочек","shellLoading":"Загрузка оболочек…","terminalLimit":"Достигнут лимит терминалов. Закройте неиспользуемые терминалы и повторите попытку. Завершённые терминалы также учитываются в лимите.","title":"Терминал","unavailable":"Недоступно"},"sidebarTextpreview":{"changed":"Изменено","error.notFound":"Файл не найден на диске","error.notRegularFile":"Объект не является обычным файлом","error.notText":"Двоичный файл не может быть отображён как текст","error.outsideWorkspace":"Файл находится за пределами рабочей области","error.tooLarge":"Файл слишком велик; боковая панель не читает файлы более {limit}.","error.unavailable":"Ошибка чтения: {message}","loadMore":"Загрузить больше строк","loading":"Загрузка предпросмотра…","readonly":"Только чтение","reload":"Перечитать файл","reloadNow":"Перезагрузить","retry":"Повторить","title":"Предпросмотр файла","truncated":"Показаны первые {lines} строк из {total}","wrap":"Перенос строк"},"skill":{"menu.userOnly":"только вручную","row.failed":"Не удалось загрузить скилл","row.inspect":"Инспектировать","row.instructions":"Инструкции","row.running":"Загрузка скилла","row.stopped":"Загрузка скилла остановлена","row.title":"Навык"},"slash.menu":{"command":"Команды","crumbs.aria":"Навигация по папкам","drill.aria":"Открыть папку","drill.hint":"Открыть папку","drill.key":"Tab","loading":"Загрузка…","skill":"Скиллы","subagent":"Субагенты","suggestions.aria":"Подсказки по вводу"},"subagent":{"activity.inactive":"не работает","activity.running":"работает","branch.collapse":"Свернуть потомков {label}","branch.expand":"Развернуть потомков {label}","count.running.few":"{count} субагента работает","count.running.many":"{count} субагентов работает","count.running.one":"{count} субагент работает","count.running.other":"{count} субагентов работает","count.total.few":"{count} субагента","count.total.many":"{count} субагентов","count.total.one":"{count} субагент","count.total.other":"{count} субагентов","diagnostic.corrupt":"запись сессии повреждена","diagnostic.unavailable":"запись сессии временно недоступна","diagnostic.unsupported":"неподдерживаемая версия записи субагента","duration.days":"{days} дн","duration.daysHours":"{days} дн {hours} ч","duration.exactDays":"{days} дн {hours} ч {minutes} мин {seconds} с","duration.exactTitle":"Всего активного времени: {duration}","duration.hours":"{hours} ч {minutes} мин {seconds} с","duration.minutes":"{minutes} мин {seconds} с","duration.months":"~{months} мес","duration.monthsDays":"~{months} мес {days} дн","duration.seconds":"{seconds} с","duration.years":"~{years} г","duration.yearsMonths":"~{years} г {months} мес","load.error":"Не удалось загрузить субагентов","loading.aria":"Загрузка субагентов","loading.label":"Загрузка субагентов…","mode.continuable":"с продолжением","mode.oneShot":"разовый","readonly.body":"Родительская сессия офлайн; откройте её заново, чтобы продолжить переписку.","readonly.oneShot.body":"Разовые задачи не принимают продолжения; здесь можно изучить полную запись выполнения.","readonly.oneShot.title":"Запись разового субагента","readonly.title":"Пока этот субагент доступен только для чтения","retry":"Повторить","switcher.aria":"Переключить субагента: {title}","tokens.million":"{value}M","tokens.thousand":"{value}K","tokens.total":"{value} ток.","tree.aria":"Сессии субагентов"},"trajectory":{"block.label":"Блок #{index} {type}","block.openSummary":"Открыть сводку вызова инструмента блока #{index}","block.openSummaryTitle":"Открыть сводку вызова инструмента","code.copyOutput":"Скопировать вывод","code.copySource":"Скопировать код","code.originalJson":"Оригинальный JSON","code.output":"Вывод","code.running":"Выполняется…","code.source":"Код","column.input":"Входные данные","column.model":"Модель","column.output":"Вывод","column.think":"Рассуждения","column.time":"Время","column.tools":"Инструменты","details.assistantMessage":"Сообщение ассистента","details.blockType":"Тип блока","details.callId":"ID вызова","details.cancelled":"Отменено","details.close":"Закрыть сведения","details.compacted":"Сжато","details.completed":"Завершено","details.cost":"Примерная стоимость","details.duration":"Длительность","details.error":"Ошибка","details.event":"Сведения о событии","details.failed":"Сбой","details.failure.auth":"Недействительный ключ API","details.finishReason":"Причина завершения","details.hierarchy":"Иерархия","details.input":"Вход","details.inputTokens":"Входные токены","details.latency":"Задержка","details.messageId":"ID сообщения","details.model":"Модель","details.noCalls":"Нет вызовов инструментов","details.noData":"Нет данных для отображения","details.output":"Вывод","details.outputTokens":"Выходные токены","details.parameters":"Параметры","details.provider":"Провайдер","details.purpose":"Назначение","details.raw":"Исходные данные","details.reasoningTokens":"Токены рассуждений","details.request":"Запрос","details.resize":"Изменение размера панели сведений","details.resizeTitle":"Потяните для изменения размера. Двойной клик — сброс.","details.response":"Ответ","details.result":"Результат","details.retry":"Повтор","details.retryDelay":"Задержка повтора","details.running":"Выполняется","details.scheduled":"Запланировано","details.sessionId":"ID сессии","details.source":"Источник","details.status":"Статус","details.step":"Шаг #{index}","details.stepTitle":"Сведения о шаге","details.subtoolCalls":"Вложенные вызовы инструментов","details.summary":"Сводка","details.systemPrompt":"Системный промпт","details.thinking":"Ход мыслей","details.time":"Метка времени","details.title":"Детали траектории","details.tokens":"Токены","details.toolCall":"Вызов инструмента","details.toolCalls":"Вызовы инструментов","details.toolName":"Имя инструмента","details.totalTokens":"Всего токенов","details.tps":"Токенов/сек (TPS)","details.ttft":"Время до первого токена (TTFT)","details.turn":"Шаг диалога #{turn}","details.type":"Тип","details.unknown":"Неизвестно","details.userMessage":"Сообщение пользователя","details.viewJson":"Посмотреть JSON","empty.noData":"Траектория рассуждений пуста.","empty.subtitle":"Здесь появятся шаги, вызовы инструментов и метрики работы модели.","empty.title":"Нет записей траектории","export.json":"Экспорт в JSON","export.success":"Траектория экспортирована","filter.all":"Все","filter.errors":"Только ошибки","filter.model":"Модель","filter.search":"Поиск по траектории…","filter.status":"Статус","filter.tools":"Инструменты","filter.type":"Тип события","group.compaction":"Сжатие {seq}","group.message":"Сообщение","group.step":"Шаг {step}","group.turn":"Шаг диалога {turn}","header.actions":"Действия","header.blocks":"Блоки","header.duration":"Время","header.metrics":"Метрики","header.model":"Модель","header.step":"Шаг","header.title":"Траектория рассуждений","header.tokens":"Токены","header.tool":"Инструмент","history.clickToLoadEarlier":"Нажмите, чтобы загрузить более ранние шаги","history.loadEarlier":"Загрузить более ранние","history.loadingEarlier":"Загрузка более ранней истории…","history.loadingEarlierAria":"Загрузка более ранней истории","history.loadingTrajectory":"Загрузка траектории…","kind.assistant":"Ассистент","kind.compacted":"Сжатие","kind.context":"Контекст","kind.message":"Message","kind.sub":"Sub","kind.subtool":"SUBTOOL","kind.system":"Система","kind.tool":"Инструмент","kind.user":"Пользователь","layout.compacted":"Context compacted","layout.compacting":"Compacting context…","layout.compactionFailed":"Сжатие контекста failed","layout.compactionInterrupted":"Сжатие контекста was interrupted before completion.","layout.fileAttachments":"Файлы ×{count}","layout.imageOnly":"Images ×{count}","layout.initialSystemPrompt":"Initial System Prompt","layout.systemPromptAndToolsUpdated":"System Prompt and Tools Updated","layout.systemPromptUpdated":"System Prompt Updated","layout.toolCallOnly":"Вызов инструмента only","layout.toolsUpdated":"Tools Updated","legend.assistant":"Ответ ассистента","legend.call":"Вызов инструмента","legend.error":"Ошибка выполнения","legend.event":"Событие","legend.reasoning":"Рассуждения модели","legend.system":"Системное событие","legend.user":"Запрос пользователя","meta.active":"Активно","meta.calls":"{count} вызовов","meta.cancelled":"Отменено","meta.depth":"Глубина {depth}","meta.done":"Готово","meta.duration":"{duration}","meta.error":"Ошибка","meta.failed":"Сбой","meta.input":"Вход","meta.items":"{count} элементов","meta.model":"Модель","meta.output":"Выход","meta.pending":"В очереди","meta.reasoning":"Рассуждения","meta.retry":"Повтор","meta.running":"Выполняется","meta.speed":"{speed} ток./с","meta.status":"Статус","meta.step":"Шаг {step}","meta.time":"{time}","meta.tokens":"{tokens} ток.","meta.tools":"Инструменты","meta.ttft":"TTFT {ttft}","meta.turn":"Шаг {turn}","meta.type":"Тип","metrics.avgLatency":"Средняя задержка: {value}мс","metrics.avgTps":"Средний TPS: {value} ток./с","metrics.avgTtft":"Средний TTFT: {value}мс","metrics.cacheHitRate":"Попадание в кэш: {value}%","metrics.cacheTokens":"Кэшировано: {value}","metrics.inputTokens":"Вход: {value}","metrics.outputTokens":"Выход: {value}","metrics.reasoningTokens":"Рассуждения: {value}","metrics.summary":"Итого: {tokens} токенов за {duration} ({cost})","metrics.title":"Метрики шага","metrics.totalCalls":"Вызовов инструментов: {value}","metrics.totalCost":"Стоимость: {value}","metrics.totalDuration":"Общее время: {value}","metrics.totalSteps":"Всего шагов: {value}","metrics.totalTokens":"Всего токенов: {value}","nav.back":"Назад","nav.next":"Следующий шаг","nav.prev":"Предыдущий шаг","node.args":"Аргументы","node.branch":"Ветка {name}","node.call":"Вызов: {name}","node.chat":"Диалог","node.code":"Код","node.collapse":"Свернуть блок","node.compaction":"Сжатие контекста","node.decision":"Решение","node.done":"Завершено","node.duration":"{duration}мс","node.error":"Ошибка: {message}","node.escalation":"Эскалация прав","node.eval":"Оценка","node.event":"Событие","node.execution":"Выполнение","node.expand":"Развернуть блок","node.fallback":"Резервный путь","node.file":"Файл {path}","node.finish":"Финиш","node.generator":"Генерация","node.guard":"Защитный фильтр","node.hook":"Хук {name}","node.http":"HTTP {method} {url}","node.index":"Индекс","node.info":"Инфо","node.init":"Инициализация","node.injection":"Внедрение контекста","node.input":"Входные данные","node.inspect":"Инспекция","node.instruction":"Инструкция","node.intent":"Намерение","node.interrupted":"Прервано","node.iteration":"Итерация {n}","node.kernel":"Ядро","node.log":"Журнал","node.loop":"Цикл","node.mcp":"MCP {server}/{tool}","node.message":"Сообщение","node.model":"Модель {name}","node.modify":"Изменение","node.mutation":"Мутация","node.operation":"Операция {name}","node.output":"Результат","node.parser":"Парсер","node.patch":"Патч","node.plan":"План","node.plugin":"Плагин {name}","node.process":"Процесс","node.prompt":"Промпт","node.proxy":"Прокси","node.query":"Запрос","node.queue":"Очередь","node.raw":"Сырые данные","node.read":"Чтение {path}","node.reasoning":"Рассуждения","node.recall":"Вспоминание","node.reflection":"Рефлексия","node.regex":"Регулярное выражение","node.replay":"Воспроизведение","node.request":"Запрос","node.reset":"Сброс","node.resource":"Ресурс","node.response":"Ответ","node.result":"Результат","node.retry":"Повтор","node.rollback":"Откат","node.root":"Корень","node.route":"Маршрут","node.runner":"Исполнитель","node.sandbox":"Песочница","node.schema":"Схема","node.script":"Скрипт","node.search":"Поиск","node.section":"Секция","node.security":"Безопасность","node.segment":"Сегмент","node.select":"Выбор","node.session":"Сессия","node.shell":"Оболочка","node.signal":"Сигнал","node.skill":"Навык {name}","node.snapshot":"Снимок","node.spawn":"Запуск","node.start":"Старт","node.state":"Состояние","node.status":"Статус: {status}","node.step":"Шаг","node.stop":"Стоп","node.stream":"Поток","node.subagent":"Субагент {name}","node.summary":"Сводка","node.switch":"Переключение","node.sync":"Синхронизация","node.system":"Система","node.task":"Задача","node.terminal":"Терминал","node.test":"Тест","node.think":"Мысли","node.thought":"Мысли","node.time":"{time}","node.timeout":"Таймаут","node.token":"Токен","node.tokens":"{count} ток.","node.tool":"Инструмент {name}","node.trace":"Трассировка","node.transform":"Преобразование","node.trigger":"Триггер","node.turn":"Шаг","node.type":"Тип","node.unknown":"Неизвестный узел","node.update":"Обновление","node.user":"Пользователь","node.validation":"Валидация","node.variable":"Переменная","node.verification":"Верификация","node.view":"Вид","node.wait":"Ожидание","node.warning":"Предупреждение","node.watch":"Наблюдение","node.webhook":"Вебхук","node.worker":"Воркер","node.workspace":"Рабочая область","node.write":"Запись {path}","node.yield":"Возврат","options.json":"Request options JSON","options.notRecorded":"Options not recorded","record.json":"JSON","record.namedParametersJson":"{name} parameters JSON","record.noContent":"No content","record.noOutput":"No output","record.noPayload":"No payload captured","record.noResult":"No result captured","record.outputJson":"Result JSON","record.parameters":"Parameters","record.parametersJson":"parameters JSON","record.payloadJson":"Payload JSON","record.resultJson":"Result JSON","record.schemaUnavailable":"Schema unavailable","record.systemPrompt":"System Prompt","record.systemPromptMissing":"No system prompt in this request","record.thinking":"Thinking","record.toolCallOnly":"(tool call only)","record.tools":"Tools","record.toolsMissing":"No tools in this request","record.wrapLines":"Переносить строки","request.collapsedAssistant":"assistant","request.collapsedSummary":"Collapsed {kind} summary, {summary}","request.collapsedTurn":"turn","request.compaction":"Сжатие контекста · {section}","request.compactionPurpose":"Сжатие контекста","request.label":"Request #{request}","request.labelCompaction":"Request #{request} · Сжатие контекста","request.noContent":"no content","request.retryProgress":"{retry} of {maximum}","request.rowAria":"{request}{kind}, {content}","request.rowAriaCompaction":"Request {request}, compaction","request.rowPrefix":"Request {request}, ","section.betweenTurns":"Between turns","source.goal":"Goal","source.goalRound":"Goal · Round {round}","source.messageJson":"Message source JSON","source.notRecorded":"Source not recorded","source.plugin":"Plugin","source.pluginNamed":"Plugin · {plugin}","source.unknown":"Unknown","source.user":"User","status.aborted":"Прервано","status.active":"Активно","status.cancelled":"Отменено","status.completed":"Завершено","status.error":"Ошибка","status.failed":"Сбой","status.idle":"Ожидание","status.interrupted":"Прервано","status.paused":"Приостановлено","status.pending":"В очереди","status.rejected":"Отклонено","status.retry":"Повтор","status.running":"Выполняется","status.skipped":"Пропущено","status.stopped":"Остановлено","status.success":"Успешно","status.timeout":"Таймаут","status.waiting":"Ожидание","summary.steps.one":"{count} step","summary.steps.other":"{count} steps","summary.toolCalls.one":"{count} tool call","summary.toolCalls.other":"{count} tool calls","tab.diff":"Diff","tab.options":"Options","tab.payload":"Payload","tab.preview":"Preview","tab.raw":"Raw","tab.rawOutput":"Raw Output","tab.result":"Result","tab.schema":"Schema","tab.source":"Source","tab.summary":"Summary","tab.systemPrompt":"System Prompt","tab.timing":"Timing","tab.tools":"Tools","tab.usage":"Usage","timeline.aria":"Trajectory timeline","timeline.collapse":"Свернуть таймлайн","timeline.expand":"Развернуть таймлайн","timeline.noTimingData":"No timing data","timeline.now":"Текущий момент","timeline.overviewAria":"Времяline overview; drag horizontally to focus events","timeline.start":"Старт","timeline.started":"Started {time}","timeline.step":"Шаг #{step}","timeline.title":"Хронология выполнения","timeline.total":"Общее время: {duration}","timeline.ttftDecoding":"TTFT {ttft} · Decoding {decoding}","timing.duration":"Длительность","timing.durationTooShort":"Длительность too short","timing.firstTokenUnavailable":"First token unavailable","timing.generation":"Generation","timing.notAvailable":"Not available","timing.notRecorded":"Not recorded","timing.outputTokensUnavailable":"Output tokens unavailable","timing.request":"Request Timing","timing.sessionTimestamps":"Session timestamps","timing.sessionTimestampsRunning":"Session timestamps (running)","timing.showLocalTime":"Show local time","timing.showUnixTimestamp":"Show Unix timestamp","timing.source":"Timing source","timing.started":"Started","timing.stepStartUnavailable":"Шаг start unavailable","timing.throughput":"Throughput","timing.totalDuration":"Total duration","timing.ttft":"TTFT","timing.usageUnavailable":"Usage unavailable","toolbar.actualTime":"Реальное время","toolbar.aria":"Панель траектории","toolbar.calls":"Вызовы","toolbar.collapseCalls":"Свернуть вызовы","toolbar.collapseTurns":"Свернуть ходы","toolbar.duration":"Длительность","toolbar.expandCalls":"Развернуть вызовы","toolbar.expandTurns":"Развернуть ходы","toolbar.search":"Поиск по траектории","toolbar.searchPlaceholder":"Поиск","toolbar.turns":"Ходы","toolbar.useActualDuration":"По реальной длительности","toolbar.useEqualWidth":"Операции равной ширины","turn.label":"Turn {turn}","unit.milliseconds":"{value} ms","unit.seconds":"{value} s","unit.tokens":"{value} tok","unit.tokensPerSecond":"{value} tok/s","usage.cacheCreated":"Cache created","usage.cached":"Cached","usage.content":"Content","usage.input":"Input","usage.notReported":"Usage not reported","usage.other":"Other","usage.output":"Output","usage.reasoning":"Рассуждения","usage.sessionCumulative":"Session cumulative","usage.thisRequest":"This request","usage.tokens":"Токены","view.blocks":"Блоки","view.details":"Подробности","view.flow":"Поток","view.graph":"Граф","view.json":"JSON","view.metrics":"Метрики","view.raw":"Исходный вид","view.table":"Таблица","view.timeline":"Таймлайн","view.trajectory":"Траектория","view.tree":"Дерево"},"workflowRun":{"member.empty":"Пустое имя участника","member.open":"Открыть {name}","phase.empty":"Пустое имя фазы","phase.unassigned":"Вне фаз","run.empty":"Ни один участник не запущен","run.members.few":"{count} участника","run.members.many":"{count} участников","run.members.one":"{count} участник","run.members.other":"{count} участников","run.title":"{name}","status.cancelled":"Отменено","status.completed":"Завершено","status.failed":"Ошибка","status.interrupted":"Прервано","status.running":"Работает","statusCount.cancelled":"Отменено: {count}","statusCount.completed":"Завершено: {count}","statusCount.failed":"Ошибок: {count}","statusCount.interrupted":"Прервано: {count}","statusCount.running":"Работает: {count}"},"workspace":{"actions.newSession.aria":"Новая сессия в {name}","actions.session.aria":"Действия с сессией {name}","actions.workspace.aria":"Действия с рабочей папкой {name}","conflict.named":"Рабочая папка «{name}» уже есть.","date.ymd":"{d}.{m}.{y}","delete.desc":"Уберёт «{name}» из списка рабочих папок. Сама папка и журналы сессий останутся, а её сессии переедут в «Без папки».","delete.pending":"Удаление рабочей папки…","delete.workspace":"Удалить рабочую папку","empty.noMatches":"Ничего не найдено","empty.none":"Сессий пока нет","field.sessionName":"Название сессии","field.workspaceName":"Название рабочей папки","folderError.retry":"Выбрать снова","folderError.title":"Не удалось открыть папку","group.ungrouped":"Без папки","groupBy.flat":"Одним списком","groupBy.label":"Группировать","groupBy.workspace":"По рабочим папкам","hover.copied":"Скопировано","hover.created":"Создано {time}","menu.addWorkspace":"Добавить рабочую папку…","menu.archiveSession":"Убрать сессию в архив","menu.fork":"Ответвить сессию","orderBy.label":"Сортировать","orderBy.manual":"Вручную","orderBy.updated":"По изменению","picker.loading":"Загрузка рабочих папок…","rename":"Переименовать","rename.session.title":"Переименовать сессию","rename.workspace.title":"Переименовать рабочую папку","schedule.active":"Есть активная запланированная задача","search.clear":"Очистить поиск","search.hasMore":"Показаны первые {n} результатов. Уточните запрос.","search.hasMore.few":"Показаны первые {n} результата. Уточните запрос.","search.hasMore.one":"Найден один подходящий результат.","search.noMatches":"Подходящих сессий нет","search.pending":"Поиск по истории сессий…","search.placeholder":"Поиск по сессиям...","search.results.aria":"Результаты поиска","search.sessions.aria":"Поиск сессий","search.unavailable":"Поиск по содержимому временно недоступен. Показаны совпадения по названию.","section.sessions":"Сессии","section.workspaces":"Рабочие папки","session.new":"Новая сессия","sessions.collapse":"Показать меньше","sessions.count.few":"{n} сессии","sessions.count.many":"{n} сессий","sessions.count.one":"{n} сессия","sessions.count.other":"{n} сессий","sessions.expand":"Показать ещё {n}","status.completed":"Завершено","status.idle":"Простаивает","status.planReview":"План ждёт проверки","status.running":"Работает","status.subagentsRunning.few":"{n} субагента работает","status.subagentsRunning.many":"{n} субагентов работает","status.subagentsRunning.one":"{n} субагент работает","status.subagentsRunning.other":"{n} субагентов работает","status.waitingAnswer":"Ждёт ответа","status.waitingApproval":"Ждёт подтверждения","time.ago":"{t} назад","time.days":"{n} дн","time.hours":"{n} ч","time.minutes":"{n} мин","time.months":"{n} мес","time.now":"только что","time.years":"{n} г","viewOptions.label":"Параметры отображения","workspace.add":"Добавить рабочую папку"}}
520
+ const RU = {"common":{"back":"Назад","brand.localBuild":"Локальная сборка DSH","cancel":"Отмена","close":"Закрыть","collapse":"Свернуть","copied":"Скопировано","copy":"Копировать","copy.compactJson":"Копировать компактный JSON","copy.failed":"Не удалось скопировать","copy.json":"Копировать JSON","copy.optionsHint":"{action}; правый клик для вариантов копирования","copy.path":"Копировать путь к свойству","copy.prettyJson":"Копировать форматированный JSON","copy.value":"Копировать значение","delete":"Удалить","edit":"Изменить","expand":"Развернуть","json.collapseNode":"Свернуть узел JSON","json.expandNode":"Развернуть узел JSON","json.label":"JSON","load.failed":"Не удалось загрузить","loading":"Загрузка…","markdown.footnotes":"Сноски","markdown.truncatedCharacters":"… обрезано на {total} символах","more":"Ещё","next":"Дальше","none":"Нет","number.million":"{value}M","number.thousand":"{value}K","ok":"ОК","previous":"Назад","retry":"Повторить","save":"Сохранить","search":"Поиск","skip":"Пропустить","submit":"Отправить","submitting":"Отправка…","truncated":"Обрезано","unknown":"Неизвестно"},"dsh-cron":{"sidebar.label":"Задачи по расписанию"},"dsh-usage-stats":{"footer.todayLabel":"Сегодня"},"pluginMarket":{"trigger":"Магазин плагинов"}}
521
521
 
522
522
  /** zh-строка -> ru-строка для DOM-перевода панелей вне locale-ядра. */
523
523
  const ZH_RU = {}
@@ -542,19 +542,26 @@ const exportSessionToMarkdown = (session, options = {}) => {
542
542
  .then((res) => res.ok ? res.json() : null)
543
543
  .then((data) => {
544
544
  if (!data) return
545
- const pluginDicts = data.plugins || data
545
+ const allDicts = Object.assign({}, data.core || {}, data.plugins || {}, data)
546
546
  if (data.zhRu && typeof ZH_RU === 'object') {
547
547
  Object.assign(ZH_RU, data.zhRu)
548
548
  if (typeof updateZhRu === 'function') updateZhRu(data.zhRu)
549
549
  }
550
- for (const ns of Object.keys(pluginDicts)) {
551
- if (ns === 'zhRu' || ns === 'plugins' || RU[ns]) continue
552
- RU[ns] = pluginDicts[ns]
553
- ctx.effect(() => {
554
- try { return ctx.locale.register(ns, 'ru', pluginDicts[ns]) }
555
- catch (err) { return () => {} }
556
- }, 'dsh-russian-lang: ' + ns)
550
+ for (const ns of Object.keys(allDicts)) {
551
+ if (ns === 'zhRu' || ns === 'plugins' || ns === 'core') continue
552
+ const dict = allDicts[ns]
553
+ if (typeof dict !== 'object' || !dict) continue
554
+ if (!RU[ns]) {
555
+ RU[ns] = dict
556
+ ctx.effect(() => {
557
+ try { return ctx.locale.register(ns, 'ru', dict) }
558
+ catch (err) { return () => {} }
559
+ }, 'dsh-russian-lang: ' + ns)
560
+ } else {
561
+ Object.assign(RU[ns], dict)
562
+ }
557
563
  }
564
+ if (typeof syncZhDom === 'function') syncZhDom()
558
565
  })
559
566
  .catch(() => {})
560
567
  }
@@ -758,42 +765,52 @@ const exportSessionToMarkdown = (session, options = {}) => {
758
765
  '模拟 (看匹配)': 'Симуляция (проверка)',
759
766
  '执行 (真实触发)': 'Выполнение (реальный триггер)',
760
767
  '通知渠道测试': 'Тест каналов уведомлений',
768
+ '渠道': 'Канал',
769
+ 'Slack 风格单行摘要': 'Сводка в стиле Slack',
761
770
  '发送测试通知': 'Отправить тестовое уведомление',
762
- '发送测试卡片': 'Отправить тестовую карточку',
763
771
  '飞书通知': 'Уведомления Feishu',
772
+ '扫码连接飞书': 'Подключить Feishu по QR-коду',
773
+ '将创建名为 [DSH 通知机器人] 的飞书应用': 'Будет создано приложение Feishu [DSH 通知机器人]',
774
+ '卡片截断长度': 'Длина обрезки карточки',
775
+ '复制 YAML': 'Копировать YAML',
776
+ '去抖': 'Дебаунс',
764
777
  '已断开': 'Отключено',
765
778
  '已连接': 'Подключено',
766
- '扫码连接飞书': 'Подключить Feishu по QR-коду',
767
- '确定断开飞书连接': 'Отключить Feishu',
768
- '断开连接': 'Отключить',
769
- '断开失败': 'Не удалось отключить',
770
- '卡片预览': 'Предпросмотр карточки',
771
- '卡片内容最长': 'Макс. длина карточки',
772
- '卡片截断长度': 'Длина усечения карточки',
773
- '截断长度即时生效': 'Длина усечения применяется мгновенно',
774
- '按当前截断长度生成的卡片正文预览': 'Предпросмотр текста карточки при текущей длине усечения',
775
- '执行历史': 'История выполнения',
776
- '全部原因': 'Все причины',
777
- '清空过滤': 'Очистить фильтр',
778
- '暂无记录': 'Нет записей',
779
- '系统通知': 'Системные уведомления',
780
- '通知机器人': 'Бот уведомлений',
781
- '飞书扫码授权二维码': 'QR-код авторизации Feishu',
782
- '在浏览器中打开飞书授权链接': 'Открыть ссылку авторизации Feishu в браузере',
783
- '重新扫码会覆盖现有应用凭据与本': 'Повторное сканирование перезапишет учётные данные',
784
- '扫码者本人接收通知卡片': 'Получатель карточки уведомлений — авторизованный пользователь',
785
- '如未立即生效请重启': 'Если изменения не применились, перезапустите DSH',
786
- '网络请求失败': 'Сетевой запрос не удался',
787
- '重试': 'Повторить',
788
779
  '已保存': 'Сохранено',
789
780
  '保存失败': 'Не удалось сохранить',
790
781
  '编辑': 'Редактировать',
791
782
  '取消编辑': 'Отмена',
792
783
  '启用': 'Включить',
793
- '停用': 'Отключить'
784
+ '停用': 'Отключить',
785
+ '重试': 'Повторить',
786
+ '刷新': 'Обновить',
787
+ '网络请求失败': 'Сетевой запрос не удался',
788
+ '如未立即生效请重启': 'Если изменения не применились, перезапустите DSH',
789
+ '通知机器人': 'Бот уведомлений',
790
+ '飞书扫码授权二维码': 'QR-код авторизации Feishu',
791
+ '在浏览器中打开飞书授权链接': 'Открыть ссылку авторизации Feishu в браузере',
792
+ '重新扫码会覆盖现有应用凭据与本': 'Повторное сканирование перезапишет учётные данные',
793
+ '扫码者本人接收通知卡片': 'Получатель карточки уведомлений — авторизованный пользователь',
794
+ 'tool (可选)': 'Инструмент (опц.)',
795
+ 'runningSubagents (可选)': 'Подагенты (опц.)',
796
+ 'durationMs (可选)': 'Длительность мс (опц.)',
797
+ 'usage 输入 (可选)': 'Входные токены (опц.)',
798
+ 'usage 输出 (可选)': 'Выходные токены (опц.)',
799
+ 'profile (写入哪个 profile 的 cordis.patch.yml)': 'Профиль (куда записать cordis.patch.yml)',
800
+ 'URL (留空用 DSH_HOOKS_WEBHOOK_URL)': 'URL (по умолчанию DSH_HOOKS_WEBHOOK_URL)',
801
+ '当前已配置的 Hook 规则列表': 'Список текущих настроенных правил хуков',
802
+ '测试通道': 'Тест канала'
794
803
  }
795
804
  for (const [k, v] of Object.entries(CORE_ZH_PRESETS)) ZH_EXACT.set(k, v)
796
805
 
806
+ const zhSortedExact = []
807
+ const rebuildZhSorted = () => {
808
+ zhSortedExact.length = 0
809
+ for (const [k, v] of ZH_EXACT.entries()) zhSortedExact.push([k, v])
810
+ zhSortedExact.sort((a, b) => b[0].length - a[0].length)
811
+ }
812
+ rebuildZhSorted()
813
+
797
814
  const updateZhRu = (entries) => {
798
815
  if (!entries || typeof entries !== 'object') return
799
816
  for (const [zhText, ruText] of Object.entries(entries)) {
@@ -807,22 +824,39 @@ const exportSessionToMarkdown = (session, options = {}) => {
807
824
  }
808
825
  }
809
826
  ZH_PATTERNS.sort((a, b) => b.re.source.length - a.re.source.length)
827
+ rebuildZhSorted()
810
828
  }
811
829
  updateZhRu(ZH_RU)
830
+
812
831
  const zhTranslateText = (text) => {
813
832
  if (!ZH_CJK.test(text)) return null
814
833
  const exact = ZH_EXACT.get(text)
815
834
  if (exact !== undefined) return exact
835
+ const trimmed = text.trim()
836
+ if (trimmed !== text) {
837
+ const exactTrimmed = ZH_EXACT.get(trimmed)
838
+ if (exactTrimmed !== undefined) return text.replace(trimmed, exactTrimmed)
839
+ }
816
840
  for (const p of ZH_PATTERNS) {
817
- const m = p.re.exec(text)
818
- if (m && m[0] === text) {
841
+ const m = p.re.exec(trimmed)
842
+ if (m && m[0] === trimmed) {
819
843
  let out = p.ruParts[0]
820
844
  for (let i = 1; i < p.ruParts.length; i++) out += m[i] + p.ruParts[i]
821
- return out
845
+ return text.replace(trimmed, out)
822
846
  }
823
847
  }
848
+ let replaced = text
849
+ let changed = false
850
+ for (const [zhPhrase, ruPhrase] of zhSortedExact) {
851
+ if (zhPhrase.length >= 2 && replaced.includes(zhPhrase)) {
852
+ replaced = replaced.split(zhPhrase).join(ruPhrase)
853
+ changed = true
854
+ }
855
+ }
856
+ if (changed) return replaced
824
857
  return null
825
858
  }
859
+
826
860
  const DOM_EN_ATTRS = {
827
861
  'Streaming preview': 'Предпросмотр стриминга',
828
862
  'Visualization streaming preview': 'Предпросмотр визуализации',
@@ -831,6 +865,29 @@ const exportSessionToMarkdown = (session, options = {}) => {
831
865
  'Shield: Alert': 'Щит: Тревога'
832
866
  }
833
867
  const DOM_EN_TEXT = {
868
+ 'Scheduled tasks': 'Задачи по расписанию',
869
+ 'Today': 'Сегодня',
870
+ 'Plugin Market': 'Магазин плагинов',
871
+ 'Auto mode': 'Автоматический режим',
872
+ 'Full access': 'Полный доступ',
873
+ 'Read only': 'Только чтение',
874
+ 'Side card': 'Боковая панель',
875
+ 'panelName': 'Палитра команд',
876
+ 'Hooks': 'Хуки',
877
+ 'Manage what the side card shows and how it behaves': 'Настройка содержимого и поведения боковой панели',
878
+ 'Inject the sidebar-open tool for the model': 'Предоставить модели инструмент sidebar-open',
879
+ 'When enabled, the model can actively open files, folders, and HTTP(S) pages in the sidebar through the sidebar_open tool (off by default)': 'Если включено, модель может открывать файлы, папки и веб-страницы в боковой панели через инструмент sidebar_open (по умолчанию выключено)',
880
+ 'Position compatibility mode': 'Режим совместимости расположения',
881
+ 'Pick the title-bar compatibility scheme: auto-detect (default, conservative) / DSH official web / known desktop shells / custom (shift distance + custom CSS)': 'Выберите схему совместимости строки заголовка: автоопределение (по умолчанию) / официальный DSH Web / десктопные оболочки / пользовательский режим',
882
+ 'Auto-detect': 'Автоопределение',
883
+ 'Sidebar content': 'Содержимое боковой панели',
884
+ 'Changes': 'Изменения',
885
+ 'Tasks': 'Задачи',
886
+ 'Time Machine': 'Машина времени',
887
+ 'Live Canvas': 'Живой холст',
888
+ 'Side Chat (beta)': 'Боковой чат (бета)',
889
+ 'Terminal': 'Терминал',
890
+ 'Feature settings': 'Настройки функции',
834
891
  'Low': 'Низкий',
835
892
  'Medium': 'Средний',
836
893
  'High': 'Высокий',
@@ -838,9 +895,6 @@ const exportSessionToMarkdown = (session, options = {}) => {
838
895
  'Search engine (ModSearch)': 'Поисковая система (ModSearch)',
839
896
  'Search engine provider configuration.': 'Настройка провайдера поисковой системы.',
840
897
  'X search only': 'Только поиск в X',
841
- 'Auto mode': 'Автоматический режим',
842
- 'Full access': 'Полный доступ',
843
- 'Read only': 'Только чтение',
844
898
  'Security Auditor Shield': 'Защитный щит аудитора',
845
899
  'Shield: Safe': 'Щит: Безопасно',
846
900
  'Shield: Alert': 'Щит: Тревога',
@@ -859,40 +913,81 @@ const exportSessionToMarkdown = (session, options = {}) => {
859
913
  'Saved': 'Сохранено',
860
914
  'Refresh': 'Обновить',
861
915
  'Loading settings…': 'Загрузка настроек…',
862
- 'Put the ar-… key in DSH credentials or process env under this name. Never paste the key into this form.': 'Укажите ключ ar-… в учётных данных DSH или переменной окружения. Не вставляйте ключ в форму.'
916
+ 'Put the ar-… key in DSH credentials or process env under this name. Never paste the key into this form.': 'Укажите ключ ar-… в учётных данных DSH или переменной окружения. Не вставляйте ключ в форму.',
917
+ 'Preferred engine': 'Предпочитаемый движок',
918
+ 'API key': 'API-ключ',
919
+ 'stored, leave empty to keep it': 'сохранён, оставьте пустым для сохранения',
920
+ 'Separate multiple keys with commas. ModSearch rotates to the next key after authentication, rate-limit, or quota failures.': 'Разделяйте несколько ключей запятыми. ModSearch переключается на следующий ключ при ошибках аутентификации или лимитов.',
921
+ 'Built-in official endpoint, leave blank to use it': 'Встроенная официальная конечная точка, оставьте пустым',
922
+ 'Automatic engine chain Checked engines may join failover. Only engines ready here are listed.': 'Автоматическая цепочка движков: отмеченные движки участвуют в отказоустойчивости.',
923
+ 'Discard': 'Сбросить',
924
+ 'Model synchronization': 'Синхронизация моделей',
925
+ 'Refresh model catalogs for API-key providers. A dry-run is the default; applying changes is explicit.': 'Обновление каталогов моделей провайдеров API-ключей. По умолчанию выполняется проверка (dry-run); применение изменений явное.',
926
+ 'All API-key providers': 'Все провайдеры API-ключей',
927
+ 'Preview only (dry-run)': 'Только предпросмотр (dry-run)',
928
+ 'Confirm stale removal': 'Подтверждать удаление устаревших',
929
+ 'Refresh status': 'Обновить статус',
930
+ 'Refresh all': 'Обновить всё',
931
+ 'Discover': 'Обнаружить',
932
+ 'Check availability': 'Проверить доступность',
933
+ 'Check credentials': 'Проверить учётные данные',
934
+ 'Choose models': 'Выбрать модели',
935
+ 'Manual model selection': 'Выбор моделей вручную',
936
+ 'Images in chat are processed by the vision model you choose here. Leave both fields empty to auto-pick the first vision-capable model from the catalog.': 'Изображения в чате обрабатываются выбранной моделью зрения. Оставьте оба поля пустыми для автовыбора первой доступной модели.',
937
+ 'Mode': 'Режим',
938
+ 'Hybrid (auto-rewrite + tools)': 'Гибридный (авто-переписывание + инструменты)',
939
+ 'Describe strategy': 'Стратегия описания',
940
+ 'Auto (use vision LLM)': 'Авто (использовать Vision LLM)',
941
+ 'Escalation': 'Эскалация',
942
+ 'Simple only (one pass)': 'Только простая (один проход)',
943
+ 'Routing': 'Маршрутизация',
944
+ 'Channel order': 'Порядок каналов',
945
+ 'Issue Reporter': 'Репортёр проблем',
946
+ 'Turn a DSH plugin problem into a reviewable issue with automated diagnostics and previews.': 'Превратите проблему с плагином DSH в готовый issue с автоматической диагностикой.',
947
+ 'GitHub sign-in is not configured for this installation.': 'Вход через GitHub не настроен для этой установки.',
948
+ '0 plugins': '0 плагинов',
949
+ 'Catalog': 'Каталог',
950
+ 'Report Editor': 'Редактор отчёта',
951
+ 'My Reports': 'Мои отчёты',
952
+ 'Authorization': 'Авторизация',
953
+ 'Search installed plugins…': 'Поиск установленных плагинов…',
954
+ 'Search installed plugins...': 'Поиск установленных плагинов...',
955
+ 'Refresh inventory': 'Обновить список',
956
+ 'Loading inventory & status…': 'Загрузка списка и статуса…',
957
+ 'Loading inventory & status...': 'Загрузка списка и статуса...'
863
958
  }
959
+
864
960
  const ZH_WALKER = (root) => {
865
961
  try {
866
962
  const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)
867
963
  const hits = []
868
964
  for (let node = walker.nextNode(); node; node = walker.nextNode()) {
869
- if (node.nodeValue && node.nodeValue.length >= 2 && ZH_CJK.test(node.nodeValue)) {
965
+ const val = node.nodeValue
966
+ if (!val) continue
967
+ const trimmed = val.trim()
968
+ if (trimmed.length >= 1 && ZH_CJK.test(val)) {
870
969
  hits.push(node)
871
- } else if (node.nodeValue) {
872
- const trimmed = node.nodeValue.trim()
873
- if (DOM_EN_TEXT[trimmed]) {
874
- const p = node.parentElement
875
- if (p && (
876
- p.closest('[class*="effort"], [class*="slider"], [class*="reasoning"], [class*="selector"], [class*="Menu"], [class*="menu"], [role="menu"], [class*="status"], [class*="chip"], [class*="badge"], [class*="ar-"], [class*="card"], [class*="header"]') ||
877
- p.getAttribute('role') === 'option' || p.getAttribute('role') === 'menuitem' ||
878
- p.tagName === 'BUTTON' || p.tagName === 'LABEL' || p.tagName === 'SPAN' || p.tagName === 'A'
879
- )) {
880
- node.nodeValue = node.nodeValue.replace(trimmed, DOM_EN_TEXT[trimmed])
881
- }
970
+ } else if (trimmed.length >= 1 && DOM_EN_TEXT[trimmed]) {
971
+ const p = node.parentElement
972
+ if (p && !p.closest('code, pre, script, style, textarea, input, select, kbd, samp, [contenteditable="true"], [data-composer-input], [role="textbox"]')) {
973
+ node.nodeValue = val.replace(trimmed, DOM_EN_TEXT[trimmed])
882
974
  }
883
975
  }
884
976
  }
885
977
  for (const node of hits) {
886
978
  const next = zhTranslateText(node.nodeValue)
887
- if (next) node.nodeValue = next
979
+ if (next && next !== node.nodeValue) node.nodeValue = next
888
980
  }
889
981
  for (const el of root.querySelectorAll ? root.querySelectorAll('[title],[placeholder],[aria-label]') : []) {
890
982
  for (const attr of ['title', 'placeholder', 'aria-label']) {
891
983
  const v = el.getAttribute && el.getAttribute(attr)
892
984
  if (v) {
893
- if (DOM_EN_ATTRS[v]) {
894
- el.setAttribute(attr, DOM_EN_ATTRS[v])
895
- } else if (v.length >= 2 && ZH_CJK.test(v)) {
985
+ const tr = v.trim()
986
+ if (DOM_EN_TEXT[tr]) {
987
+ el.setAttribute(attr, v.replace(tr, DOM_EN_TEXT[tr]))
988
+ } else if (DOM_EN_ATTRS[tr]) {
989
+ el.setAttribute(attr, v.replace(tr, DOM_EN_ATTRS[tr]))
990
+ } else if (ZH_CJK.test(v)) {
896
991
  const next = zhTranslateText(v)
897
992
  if (next) el.setAttribute(attr, next)
898
993
  }
@@ -902,11 +997,16 @@ const exportSessionToMarkdown = (session, options = {}) => {
902
997
  if (root.getAttribute) {
903
998
  for (const attr of ['title', 'placeholder', 'aria-label']) {
904
999
  const v = root.getAttribute(attr)
905
- if (v && DOM_EN_ATTRS[v]) root.setAttribute(attr, DOM_EN_ATTRS[v])
1000
+ if (v) {
1001
+ const tr = v.trim()
1002
+ if (DOM_EN_TEXT[tr]) root.setAttribute(attr, v.replace(tr, DOM_EN_TEXT[tr]))
1003
+ else if (DOM_EN_ATTRS[tr]) root.setAttribute(attr, v.replace(tr, DOM_EN_ATTRS[tr]))
1004
+ }
906
1005
  }
907
1006
  }
908
1007
  } catch (err) { /* ignore */ }
909
1008
  }
1009
+
910
1010
  let zhObserver = null
911
1011
  const syncZhDom = () => {
912
1012
  try {
@@ -962,7 +1062,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
962
1062
  if (range.intersectsNode ? range.intersectsNode(node) : (sel.containsNode && sel.containsNode(node, true))) {
963
1063
  return
964
1064
  }
965
- } catch (e) {}
1065
+ } catch (e) { /* bestEffort */ void e; }
966
1066
  }
967
1067
 
968
1068
  let after = typoQuotes(before)
@@ -1053,7 +1153,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1053
1153
  if (propsKey && el[propsKey] && typeof el[propsKey].onChange === 'function') {
1054
1154
  el[propsKey].onChange({ target: el, currentTarget: el })
1055
1155
  }
1056
- } catch (e) {}
1156
+ } catch (e) { /* bestEffort */ void e; }
1057
1157
 
1058
1158
  try {
1059
1159
  el.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true }))
@@ -1064,7 +1164,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1064
1164
 
1065
1165
  if (typeof cursorStart === 'number' && typeof el.setSelectionRange === 'function') {
1066
1166
  const end = typeof cursorEnd === 'number' ? cursorEnd : cursorStart
1067
- try { el.setSelectionRange(cursorStart, end) } catch (e) {}
1167
+ try { el.setSelectionRange(cursorStart, end) } catch (e) { /* bestEffort */ void e; }
1068
1168
  }
1069
1169
  }
1070
1170
 
@@ -1134,7 +1234,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1134
1234
  sel.removeAllRanges()
1135
1235
  sel.addRange(range)
1136
1236
  }
1137
- } catch (e) {}
1237
+ } catch (e) { /* bestEffort */ void e; }
1138
1238
  }
1139
1239
 
1140
1240
  const isCaretInCode = (el, value, caretOffset) => {
@@ -1186,7 +1286,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1186
1286
 
1187
1287
  const targetOffset = typeof cursorStart === 'number' ? cursorStart : (initialOffset >= 0 ? Math.min(initialOffset, value.length) : value.length)
1188
1288
  setCaretCharacterOffset(host, targetOffset)
1189
- } catch (e) {}
1289
+ } catch (e) { /* bestEffort */ void e; }
1190
1290
  }
1191
1291
 
1192
1292
  const layoutDismiss = () => {
@@ -1401,7 +1501,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1401
1501
  }
1402
1502
  }
1403
1503
  }
1404
- } catch (e) {}
1504
+ } catch (e) { /* bestEffort */ void e; }
1405
1505
  }
1406
1506
  ctx.effect(() => {
1407
1507
  document.addEventListener('input', layoutOnInput, true)
@@ -1552,7 +1652,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1552
1652
  a.click()
1553
1653
  setDone(true)
1554
1654
  setTimeout(() => {
1555
- try { document.body.removeChild(a); URL.revokeObjectURL(url) } catch (e) {}
1655
+ try { document.body.removeChild(a); URL.revokeObjectURL(url) } catch (e) { /* bestEffort */ void e; }
1556
1656
  }, 30000)
1557
1657
  setTimeout(() => setDone(false), 2000)
1558
1658
  } catch (err) {
@@ -1591,7 +1691,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1591
1691
  const [loading, setLoading] = React.useState(false)
1592
1692
  const [open, setOpen] = React.useState(false)
1593
1693
  const [upStatus, setUpStatus] = React.useState({
1594
- currentVersion: '0.2.22',
1694
+ currentVersion: '0.2.23',
1595
1695
  latestVersion: undefined,
1596
1696
  updateAvailable: false
1597
1697
  })
@@ -1758,7 +1858,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1758
1858
  if (copyBtn) {
1759
1859
  copyBtn.addEventListener('click', (e) => {
1760
1860
  e.stopPropagation()
1761
- try { navigator.clipboard.writeText(displayText) } catch (err) {}
1861
+ try { navigator.clipboard.writeText(displayText) } catch (err) { /* bestEffort */ void err; }
1762
1862
  copyBtn.textContent = '✓ Скопировано'
1763
1863
  setTimeout(() => { copyBtn.textContent = '📋 Копировать' }, 2000)
1764
1864
  })
@@ -1956,7 +2056,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1956
2056
  React.createElement('label', { className: 'rl-item-label' },
1957
2057
  checkbox(value.slashAliases !== false && ruActive,
1958
2058
  (ev) => {
1959
- try { scope.set('slashAliases', ev.target.checked) } catch (err) {}
2059
+ try { scope.set('slashAliases', ev.target.checked) } catch (err) { /* bestEffort */ void err; }
1960
2060
  }, !ruActive || disabled),
1961
2061
  t('slashAliases')
1962
2062
  )
@@ -2032,7 +2132,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
2032
2132
  React.createElement('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', flexWrap: 'wrap', gap: '8px' } },
2033
2133
  React.createElement('div', null,
2034
2134
  React.createElement('div', { style: { fontWeight: 600, color: 'var(--dsw-alias-label-primary)' } },
2035
- t('updaterCurrent').replace('{version}', upStatus.currentVersion || '0.2.22')),
2135
+ t('updaterCurrent').replace('{version}', upStatus.currentVersion || '0.2.23')),
2036
2136
  upStatus.updateAvailable
2037
2137
  ? React.createElement('div', { style: { color: 'var(--dsw-alias-color-warning, #eab308)', marginTop: '2px', fontWeight: 500 } },
2038
2138
  t('updaterLatest').replace('{version}', upStatus.latestVersion || ''))
@@ -2145,7 +2245,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
2145
2245
  ),
2146
2246
  React.createElement('div', { className: 'rl-actions-row' },
2147
2247
  React.createElement('a', {
2148
- href: makeIssueUrl({}, '0.2.22'),
2248
+ href: makeIssueUrl({}, '0.2.23'),
2149
2249
  target: '_blank',
2150
2250
  rel: 'noopener noreferrer',
2151
2251
  className: 'rl-btn rl-btn-primary'