@goodandready/dsh-russian-lang 0.3.26 → 0.3.28

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.
@@ -1 +1 @@
1
- {"dsh-key-rotation":{"activeBadge":"активен","addKey":"+ Добавить ключ","addKeyTitle":"Добавить API-ключ","addModel":"+ Добавить модель","addProvider":"+ Добавить провайдера","brokenKey":"повреждён (3× AUTH)","budgetLabel":"бюджет:","bulkApply":"Применить к выбранным","bulkCooldownPlaceholder":"Массовый таймаут (мс)","bulkImport":"Пакетный импорт","bulkImportBtn":"Импортировать ключи","bulkImportCancel":"Отмена","bulkImportDesc":"Вставьте API-ключи построчно, в формате .env (KEY=value) или CSV (KEY, вес):","bulkImportSuccess":"Импортировано ключей: {n}","bulkRemove":"Удалить выбранные","cancel":"Отмена","cardDesc":"Ротация API-ключей для провайдеров: пулы ключей, автоматическое переключение при исчерпании квот и rate-limit, кулдаун и восстановление.","chooseProvider":"Выберите провайдера","codesTitle":"Переключать при этих ошибках","confirm":"Подтвердить","confirmBulkRemoveDesc":"Выбранные провайдеры и все их ключи будут исключены из ротации. Действие можно отменить один раз сразу после удаления.","confirmBulkRemoveTitle":"Удалить выбранных провайдеров ({n})?","confirmRemoveProvDesc":"Вы уверены, что хотите удалить этого провайдера и все настроенные ключи из ротации?","confirmRemoveProvTitle":"Удалить провайдера {p}?","confirmResetDesc":"Это немедленно сбросит счётчики сбоев, таймеры охлаждения и переведёт автоматический выключатель (circuit breaker) в исходное состояние.","confirmResetTitle":"Сбросить охлаждение для {p}?","cooldown":"Кулдаун после ошибки (мс)","currentVersion":"Текущая версия","desc":"Ротация API-ключей по провайдерам. Для каждого провайдера укажите список его ключей (имена переменных окружения из DSH credentials). Плагин направляет запросы по очереди и автоматически переключается на следующий ключ при ошибках лимитов или квот.","dialogLabel":"Подтверждение","discard":"Сбросить","empty":"Провайдеры для ротации ключей не настроены.","emptyDesc":"Добавьте провайдера и хотя бы одно имя API-ключа для запуска ротации.","emptyKeys":"В пуле пока нет ключей.","emptyTitle":"Пулов пока нет","errorCount":"Ошибок: {n}","errorTitle":"Не удалось загрузить настройки","eventAt":"Время","eventCooldown":"Таймаут","eventKey":"Ключ","eventReason":"Причина","exportCsv":"Экспорт в CSV","exportOne":"Экспорт пула","exportPools":"Экспорт всех пулов в JSON","exportProvider":"Экспортировать этого провайдера","failover":"Автоматическое переключение","failoverDesc":"Переключаться на следующий ключ в пуле при получении кодов 429, 402, 403, 503","filterAll":"Все ключи","filterCooldown":"На кулдауне","filterErrors":"С ошибками","filterReady":"Готовы к работе","header.keys_badge":"настроенных ключей","header.pools_badge":"активных пулов","header.sub":"Автоматическая круговая (round-robin) ротация нескольких ключей, экспоненциальные таймауты при ошибках 429/5xx, защита цепи failover и безопасность учётных данных (~/.dsh/.credentials.yaml).","header.title":"Ротация ключей и отказоустойчивость","headerPoolsTitle":"Пулы ротации ключей","health":"Состояние пула","healthBad":"Все ключи исчерпаны или заблокированы","healthGood":"Все ключи работоспособны","healthScoreTitle":"рейтинг надёжности","healthWarn":"Часть ключей на кулдауне","hoursAgo":"{n} ч назад","importEnv":"Импорт из переменных окружения (.env)","importPools":"Импорт пулов из JSON","justNow":"только что","key":"Ключ","keyActive":"Активен","keyBlocked":"Заблокирован","keyCooldown":"Кулдаун ({time}с)","keyCooling":"охлаждение, {s}с","keyDisabled":"Отключён вручную","keyErrors":"Ошибок подряд: {n}","keyExpired":"истёк","keyExpiringSoon":"истекает через {n} дн.","keyFromEnv":"из переменных окружения, только чтение","keyHint":"Значение сохраняется в учётных данных DSH и никогда не отправляется обратно в браузер — отображаются только последние 5 символов.","keyLabel":"Ключ {n}","keyLatency":"Задержка: {time}мс","keyMissing":"учётные данные отсутствуют","keyName":"Имя ключа","keyPaused":"Приостановлен","keyPlaceholder":"OPENAI_API_KEY_2","keyPool":"Пул ключей","keyPriority":"Приоритет","keyQuota":"Квота исчерпана","keyRateLimit":"Превышен лимит запросов","keyReady":"готов","keyRemoved":"Ключ удалён","keyRevoked":"Отозван (401)","keySave":"Сохранить key","keySaved":"Ключ добавлен","keySuccess":"Успешных запросов: {n}","keyValuePlaceholder":"paste the key, then Сохранить","keyWeight":"Вес: {n}","keyWriteFailed":"не удалось сохранить ключ: {msg}","keysCount":"Ключей в пуле: {n}","keysTitle":"Список ключей","lastError":"Последняя ошибка: {msg}","lastSuccess":"Успешный запрос: {time}","latestVersion":"Последняя версия","liveEventStream":"Лента событий в реальном времени","liveEventStreamEmpty":"События ротации пока не зафиксированы","loadChartAria":"Распределение трафика по ключам","loadDistribution":"Распределение трафика","loading":"Загрузка пулов ротации…","metrics":"Метрики использования","metricsAvgLatency":"Средняя задержка","metricsErrors":"Ошибки","metricsSuccess":"Успешные","metricsThroughput":"Запросов/мин","metricsTotal":"Всего запросов","minutesAgo":"{n} мин назад","modalAddKey":"Добавление ключа в пул","modalAddProvider":"Добавление пула провайдера","modalClose":"Закрыть диалог","modalEditKey":"Редактирование ключа","modalEditProvider":"Редактирование провайдера","mode":"Режим выбора ключа","modeOrder":"По порядку (Sequential)","modeRandom":"Случайно (Random)","modeWeighted":"По весам / бюджету","modelKeys":"Учетные данные для этой модели","modelName":"Идентификатор модели","modelNamePlaceholder":"например, claude-sonnet","modelPoolsEmpty":"Субпулы моделей не настроены. Создайте пул, чтобы задать модели собственные ключи и лимиты токенов.","modelPoolsHint":"Выделение персонального бюджета токенов на модель для ключа. Ключ с исчерпанным лимитом пропускается только для этой модели — для остальных он остаётся доступен. Оставьте поле пустым для неограниченного расхода.","modelPoolsTitle":"Квоты токенов по моделям","moveDown":"Переместить вниз","moveUp":"Переместить вверх","mtExhausted":"Исчерпан","mtLocalOnly":"Учитывается локально по данным провайдера об успешных ответах.","mtRemaining":"Осталось: {n}","mtResetIn":"Сброс через: {t}","mtResetWindowHint":"Окно сброса определяется параметром quotaResetWindow.","mtUnlimited":"Без ограничений","mtUsedOf":"{u} / {l}","name":"Ротация API-ключей","noActivePools":"Нет активных пулов","noProviders":"Провайдеры не добавлены","noTrafficYet":"Трафик пока не зафиксирован","notRegistered":"не зарегистрирован","notSecretShape":"сохранено, но значение не похоже на API-ключ — проверьте опечатки","pauseKey":"Приостановить ключ в ротации","pausedBudget":"приостановлен","poolActive":"Пул активен","poolDisabled":"Пул отключён","poolEmpty":"В пуле нет активных ключей","poolExhausted":"пул исчерпан — все ключи охлаждаются","poolName":"Имя пула провайдера","proactiveGuardHint":"Заранее ставить ключи на паузу при приближении к квоте или заголовку Retry-After до получения 429","proactiveGuardLabel":"Превентивная защита от лимитов (Rate-Limit Guard)","provider":"Провайдер","providerActive":"Активен","providerCatalogUnavailable":"Список провайдеров недоступен","providerDisabled":"Отключён","providerName":"Имя провайдера (например openai, openrouter)","providerPlaceholder":"openai","providerRemoved":"Провайдер удалён","providerType":"Тип провайдера","providersTitle":"Провайдеры и их ключи","quotaExhausted":"Квота исчерпана","quotaResetIn":"Сброс через {time}","rateLimit":"Превышен лимит запросов","readOnly":"Настройки доступны только для чтения.","recentFailures":"Недавние сбои ({n})","removeKey":"Удалить ключ","removeModel":"Удалить этот пул модели","removeProvider":"Удалить провайдера","resetAll":"Сбросить статистику и кулдауны","resetAllSuccess":"Статистика и кулдауны успешно сброшены","resetCooldown":"Сбросить охлаждение","resetCooldowns":"Сбросить все кулдауны","resetSuccess":"Кулдауны ключей сброшены","resetting":"Сброс…","resumeKey":"Возобновить ротацию ключа","retestBroken":"Повторный тест","retestFail":"повторный тест не пройден — ключ всё ещё не работает","retry":"Повторить","retryCount":"Попыток повтора","retryInterval":"Интервал повтора (мс)","rotationMode":"Режим ротации","rotationSequential":"Последовательный (Round-Robin)","rotationWeighted":"Взвешенный (Weighted)","routingStrategyLabel":"Стратегия маршрутизации","routingStrategyLeastLoaded":"Минимальная нагрузка (по параллелизму)","routingStrategyLowestLatency":"Минимальная задержка (p95)","routingStrategyRoundRobin":"Круговой перебор (Round-Robin, по умолчанию)","rpmTitle":"запросов/мин: {u} использовано, {r} осталось","save":"Сохранить настройки","saveRefused":"Хост отклонил это сохранение. Ваш черновик сохранён; сбросьте его для загрузки актуальных настроек.","saveUnconfirmed":"Не удалось подтвердить результат сохранения. Ваш черновик сохранён; обновите страницу перед повторной попыткой.","saved":"Настройки сохранены","saving":"Сохранение…","scheduleDays":"Расписание ротации (дней, 0=выкл.)","secondsAgo":"{n} с назад","sectionBackup":"Резервные копии и снимки","sectionBackupDesc":"Экспорт и импорт пулов провайдеров и создание полных снимков конфигурации плагина.","sectionFailover":"Триггеры отказа и коды ошибок","sectionFailoverDesc":"Выбор условий и ошибок, вызывающих автоматическое переключение на следующий доступный ключ.","sectionStats":"Здоровье пула и телеметрия","sectionStatsDesc":"Телеметрия активных пулов ключей в реальном времени, доступные учётные данные и статус переключения.","sectionTiming":"Тайминги и расписание ротации","sectionTimingDesc":"Настройка длительности периода охлаждения (cooldown) и окон периодической ротации.","selectProvider":"Выбрать провайдера {p}","selfHealingHint":"Периодическая проверка бесплатной моделью для возврата вышедших из строя ключей (0 — отключено)","selfHealingLabel":"Интервал автовосстановления (мин)","settingsChanged":"Служба настроек изменилась. Сбросьте этот черновик и обновите страницу перед сохранением.","snapshotExport":"Снимок ⬇","snapshotImport":"Восстановить","sortUsage":"Сортировать по нагрузке","sparklineLatency":"Тренд задержки","sparklineTraffic":"Тренд трафика","statHealthy":"Исправны / Готовы","statKeys":"Всего ключей","statPools":"Настроенных пулов","statRequests":"запросов","status":"Статус","statusAvailable":"Доступен","statusCooldown":"Кулдаун","statusDisabled":"Отключён","statusExhausted":"Исчерпан","statusFailed":"Ошибка","strategy":"Стратегия failover","subtitle":"Ротация API-ключей по провайдерам: пулы ключей, автоматическое переключение при исчерпании квот/лимитов, охлаждение и восстановление.","switchCodes":"Коды переключения (через запятую)","switchCount":"Переключений: {n}","switchesNone":"переключений пока не было","switchesSome":"переключений: {n} · последнее: {reason}, {ago}","testAll":"Проверить все ключи","testFail":"СБОЙ","testKey":"Проверить ключ","testOk":"OK","testSuccess":"Ключ валиден: ответ за {time}мс","testing":"Тестирование…","testingAllProgress":"Проверка {n} из {total}…","title":"Ротация API-ключей (dsh-key-rotation)","tokenLimitHint":"Максимум токенов для этого ключа на модель за период квоты. Пусто = без ограничений.","tokenLimitLabel":"Лимит токенов","tokenLimitPlaceholder":"без ограничений","totalCalls":"Всего вызовов: {n}","totalErrors":"Всего сбоев: {n}","totalRequestsTitle":"всего запросов","unavailableDesc":"Хост не предоставил пространство настроек dsh-key-rotation. Откройте «Настройки» заново или проверьте, включён ли плагин.","unavailableTitle":"Мост настроек недоступен","undo":"Отменить","undoKey":"Ключ удалён","undoProvider":"Провайдер удалён","updateAvailable":"Доступно обновление","updateCheck":"Проверить обновления","updateFailed":"Сбой обновления","updateNone":"Установлена актуальная версия","updateRestart":"Обновление установлено. Перезапустите DSH для применения.","updateRun":"Обновить сейчас","updateRunning":"Обновление…","usedAgo":"{ago} назад","weight":"Вес ключа","weightHint":"вес в round-robin: сколько раз ключ участвует в цикле (1 = равная доля)"},"keyRotation":{"bulkImport":"Пакетный импорт","bulkImportBtn":"Импортировать ключи","bulkImportCancel":"Отмена","bulkImportDesc":"Вставьте API-ключи построчно, в формате .env (KEY=value) или CSV (KEY, вес):","bulkImportSuccess":"Импортировано ключей: {n}","currentVersion":"Текущая версия","keyPaused":"Приостановлен","keyRevoked":"Отозван (401)","latestVersion":"Последняя версия","pauseKey":"Приостановить ключ в ротации","resumeKey":"Возобновить ротацию ключа","sparklineLatency":"Тренд задержки","sparklineTraffic":"Тренд трафика","updateAvailable":"Доступно обновление","updateCheck":"Проверить обновления","updateFailed":"Сбой обновления","updateNone":"Установлена актуальная версия","updateRestart":"Обновление установлено. Перезапустите DSH для применения.","updateRun":"Обновить сейчас","updateRunning":"Обновление…"}}
1
+ {"dsh-key-rotation":{"activeBadge":"активен","addKey":"+ Добавить ключ","addKeyTitle":"Добавить API-ключ","addModel":"+ Добавить модель","addProvider":"+ Добавить провайдера","brokenKey":"повреждён (3× AUTH)","budgetLabel":"бюджет:","bulkApply":"Применить к выбранным","bulkCooldownPlaceholder":"Массовый таймаут (мс)","bulkImport":"Пакетный импорт","bulkImportBtn":"Импортировать ключи","bulkImportCancel":"Отмена","bulkImportDesc":"Вставьте API-ключи построчно, в формате .env (KEY=value) или CSV (KEY, вес):","bulkImportSuccess":"Импортировано ключей: {n}","bulkRemove":"Удалить выбранные","cancel":"Отмена","cardDesc":"Ротация API-ключей для провайдеров: пулы ключей, автоматическое переключение при исчерпании квот и rate-limit, кулдаун и восстановление.","chooseProvider":"Выберите провайдера","codesTitle":"Переключать при этих ошибках","confirm":"Подтвердить","confirmBulkRemoveDesc":"Выбранные провайдеры и все их ключи будут исключены из ротации. Действие можно отменить один раз сразу после удаления.","confirmBulkRemoveTitle":"Удалить выбранных провайдеров ({n})?","confirmRemoveProvDesc":"Вы уверены, что хотите удалить этого провайдера и все настроенные ключи из ротации?","confirmRemoveProvTitle":"Удалить провайдера {p}?","confirmResetDesc":"Это немедленно сбросит счётчики сбоев, таймеры охлаждения и переведёт автоматический выключатель (circuit breaker) в исходное состояние.","confirmResetTitle":"Сбросить охлаждение для {p}?","cooldown":"Кулдаун после ошибки (мс)","currentVersion":"Текущая версия","desc":"Ротация API-ключей по провайдерам. Для каждого провайдера укажите список его ключей (имена переменных окружения из DSH credentials). Плагин направляет запросы по очереди и автоматически переключается на следующий ключ при ошибках лимитов или квот.","dialogLabel":"Подтверждение","discard":"Сбросить","empty":"Провайдеры для ротации ключей не настроены.","emptyDesc":"Добавьте провайдера и хотя бы одно имя API-ключа для запуска ротации.","emptyKeys":"В пуле пока нет ключей.","emptyTitle":"Пулов пока нет","errorCount":"Ошибок: {n}","errorTitle":"Не удалось загрузить настройки","eventAt":"Время","eventCooldown":"Таймаут","eventKey":"Ключ","eventReason":"Причина","exportCsv":"Экспорт в CSV","exportOne":"Экспорт пула","exportPools":"Экспорт всех пулов в JSON","exportProvider":"Экспортировать этого провайдера","failover":"Автоматическое переключение","failoverDesc":"Переключаться на следующий ключ в пуле при получении кодов 429, 402, 403, 503","filterAll":"Все ключи","filterCooldown":"На кулдауне","filterErrors":"С ошибками","filterReady":"Готовы к работе","header.keys_badge":"настроенных ключей","header.pools_badge":"активных пулов","header.sub":"Автоматическая круговая (round-robin) ротация нескольких ключей, экспоненциальные таймауты при ошибках 429/5xx, защита цепи failover и безопасность учётных данных (~/.dsh/.credentials.yaml).","header.title":"Ротация ключей и отказоустойчивость","headerPoolsTitle":"Пулы ротации ключей","health":"Состояние пула","healthBad":"Все ключи исчерпаны или заблокированы","healthGood":"Все ключи работоспособны","healthScoreTitle":"рейтинг надёжности","healthWarn":"Часть ключей на кулдауне","hoursAgo":"{n} ч назад","importEnv":"Импорт из переменных окружения (.env)","importPools":"Импорт пулов из JSON","justNow":"только что","key":"Ключ","keyActive":"Активен","keyBlocked":"Заблокирован","keyCooldown":"Кулдаун ({time}с)","keyCooling":"охлаждение, {s}с","keyDisabled":"Отключён вручную","keyErrors":"Ошибок подряд: {n}","keyExpired":"истёк","keyExpiringSoon":"истекает через {n} дн.","keyFromEnv":"из переменных окружения, только чтение","keyHint":"Значение сохраняется в учётных данных DSH и никогда не отправляется обратно в браузер — отображаются только последние 5 символов.","keyLabel":"Ключ {n}","keyLatency":"Задержка: {time}мс","keyMissing":"учётные данные отсутствуют","keyName":"Имя ключа","keyPaused":"Приостановлен","keyPlaceholder":"OPENAI_API_KEY_2","keyPool":"Пул ключей","keyPriority":"Приоритет","keyQuota":"Квота исчерпана","keyRateLimit":"Превышен лимит запросов","keyReady":"готов","keyRemoved":"Ключ удалён","keyRevoked":"Отозван (401)","keySave":"Сохранить key","keySaved":"Ключ добавлен","keySuccess":"Успешных запросов: {n}","keyValuePlaceholder":"paste the key, then Сохранить","keyWeight":"Вес: {n}","keyWriteFailed":"не удалось сохранить ключ: {msg}","keysCount":"Ключей в пуле: {n}","keysTitle":"Список ключей","lastError":"Последняя ошибка: {msg}","lastSuccess":"Успешный запрос: {time}","latestVersion":"Последняя версия","liveEventStream":"Лента событий в реальном времени","liveEventStreamEmpty":"События ротации пока не зафиксированы","loadChartAria":"Распределение трафика по ключам","loadDistribution":"Распределение трафика","loading":"Загрузка пулов ротации…","metrics":"Метрики использования","metricsAvgLatency":"Средняя задержка","metricsErrors":"Ошибки","metricsSuccess":"Успешные","metricsThroughput":"Запросов/мин","metricsTotal":"Всего запросов","minutesAgo":"{n} мин назад","modalAddKey":"Добавление ключа в пул","modalAddProvider":"Добавление пула провайдера","modalClose":"Закрыть диалог","modalEditKey":"Редактирование ключа","modalEditProvider":"Редактирование провайдера","mode":"Режим выбора ключа","modeOrder":"По порядку (Sequential)","modeRandom":"Случайно (Random)","modeWeighted":"По весам / бюджету","modelKeys":"Учетные данные для этой модели","modelName":"Идентификатор модели","modelNamePlaceholder":"например, claude-sonnet","modelPoolsEmpty":"Субпулы моделей не настроены. Создайте пул, чтобы задать модели собственные ключи и лимиты токенов.","modelPoolsHint":"Выделение персонального бюджета токенов на модель для ключа. Ключ с исчерпанным лимитом пропускается только для этой модели — для остальных он остаётся доступен. Оставьте поле пустым для неограниченного расхода.","modelPoolsTitle":"Квоты токенов по моделям","moveDown":"Переместить вниз","moveUp":"Переместить вверх","mtExhausted":"Исчерпан","mtLocalOnly":"Учитывается локально по данным провайдера об успешных ответах.","mtRemaining":"Осталось: {n}","mtResetIn":"Сброс через: {t}","mtResetWindowHint":"Окно сброса определяется параметром quotaResetWindow.","mtUnlimited":"Без ограничений","mtUsedOf":"{u} / {l}","name":"Ротация API-ключей","noActivePools":"Нет активных пулов","noProviders":"Провайдеры не добавлены","noTrafficYet":"Трафик пока не зафиксирован","notRegistered":"не зарегистрирован","notSecretShape":"сохранено, но значение не похоже на API-ключ — проверьте опечатки","pauseKey":"Приостановить ключ в ротации","pausedBudget":"приостановлен","poolActive":"Пул активен","poolDisabled":"Пул отключён","poolEmpty":"В пуле нет активных ключей","poolExhausted":"пул исчерпан — все ключи охлаждаются","poolName":"Имя пула провайдера","proactiveGuardHint":"Заранее ставить ключи на паузу при приближении к квоте или заголовку Retry-After до получения 429","proactiveGuardLabel":"Превентивная защита от лимитов (Rate-Limit Guard)","provider":"Провайдер","providerActive":"Активен","providerCatalogUnavailable":"Список провайдеров недоступен","providerDisabled":"Отключён","providerName":"Имя провайдера (например openai, openrouter)","providerPlaceholder":"openai","providerRemoved":"Провайдер удалён","providerType":"Тип провайдера","providersTitle":"Провайдеры и их ключи","quotaExhausted":"Квота исчерпана","quotaResetIn":"Сброс через {time}","rateLimit":"Превышен лимит запросов","readOnly":"Настройки доступны только для чтения.","recentFailures":"Недавние сбои ({n})","removeKey":"Удалить ключ","removeModel":"Удалить этот пул модели","removeProvider":"Удалить провайдера","resetAll":"Сбросить статистику и кулдауны","resetAllSuccess":"Статистика и кулдауны успешно сброшены","resetCooldown":"Сбросить охлаждение","resetCooldowns":"Сбросить все кулдауны","resetSuccess":"Кулдауны ключей сброшены","resetting":"Сброс…","resumeKey":"Возобновить ротацию ключа","retestBroken":"Повторный тест","retestFail":"повторный тест не пройден — ключ всё ещё не работает","retry":"Повторить","retryCount":"Попыток повтора","retryInterval":"Интервал повтора (мс)","rotationMode":"Режим ротации","rotationSequential":"Последовательный (Round-Robin)","rotationWeighted":"Взвешенный (Weighted)","routingStrategyLabel":"Стратегия маршрутизации","routingStrategyLeastLoaded":"Минимальная нагрузка (по параллелизму)","routingStrategyLowestLatency":"Минимальная задержка (p95)","routingStrategyRoundRobin":"Круговой перебор (Round-Robin, по умолчанию)","rpmLimitLabel":"Лимит частоты (RPM)","rpmTitle":"запросов/мин: {u} использовано, {r} осталось","save":"Сохранить настройки","saveRefused":"Хост отклонил это сохранение. Ваш черновик сохранён; сбросьте его для загрузки актуальных настроек.","saveUnconfirmed":"Не удалось подтвердить результат сохранения. Ваш черновик сохранён; обновите страницу перед повторной попыткой.","saved":"Настройки сохранены","saving":"Сохранение…","scheduleDays":"Расписание ротации (дней, 0=выкл.)","secondsAgo":"{n} с назад","sectionBackup":"Резервные копии и снимки","sectionBackupDesc":"Экспорт и импорт пулов провайдеров и создание полных снимков конфигурации плагина.","sectionFailover":"Триггеры отказа и коды ошибок","sectionFailoverDesc":"Выбор условий и ошибок, вызывающих автоматическое переключение на следующий доступный ключ.","sectionStats":"Здоровье пула и телеметрия","sectionStatsDesc":"Телеметрия активных пулов ключей в реальном времени, доступные учётные данные и статус переключения.","sectionTiming":"Тайминги и расписание ротации","sectionTimingDesc":"Настройка длительности периода охлаждения (cooldown) и окон периодической ротации.","selectProvider":"Выбрать провайдера {p}","selfHealingHint":"Периодическая проверка бесплатной моделью для возврата вышедших из строя ключей (0 — отключено)","selfHealingLabel":"Интервал автовосстановления (мин)","settingsChanged":"Служба настроек изменилась. Сбросьте этот черновик и обновите страницу перед сохранением.","snapshotExport":"Снимок ⬇","snapshotImport":"Восстановить","sortUsage":"Сортировать по нагрузке","sparklineLatency":"Тренд задержки","sparklineTraffic":"Тренд трафика","statHealthy":"Исправны / Готовы","statKeys":"Всего ключей","statPools":"Настроенных пулов","statRequests":"запросов","status":"Статус","statusAvailable":"Доступен","statusCooldown":"Кулдаун","statusDisabled":"Отключён","statusExhausted":"Исчерпан","statusFailed":"Ошибка","strategy":"Стратегия failover","subtitle":"Ротация API-ключей по провайдерам: пулы ключей, автоматическое переключение при исчерпании квот/лимитов, охлаждение и восстановление.","switchCodes":"Коды переключения (через запятую)","switchCount":"Переключений: {n}","switchesNone":"переключений пока не было","switchesSome":"переключений: {n} · последнее: {reason}, {ago}","testAll":"Проверить все ключи","testFail":"СБОЙ","testKey":"Проверить ключ","testOk":"OK","testSuccess":"Ключ валиден: ответ за {time}мс","testing":"Тестирование…","testingAllProgress":"Проверка {n} из {total}…","title":"Ротация API-ключей (dsh-key-rotation)","tokenLimitHint":"Максимум токенов для этого ключа на модель за период квоты. Пусто = без ограничений.","tokenLimitLabel":"Лимит токенов","tokenLimitPlaceholder":"без ограничений","totalCalls":"Всего вызовов: {n}","totalErrors":"Всего сбоев: {n}","totalRequestsTitle":"всего запросов","tpmLimitLabel":"Лимит частоты (TPM)","tpmTitle":"токенов/мин: использовано {u}, осталось {r}","unavailableDesc":"Хост не предоставил пространство настроек dsh-key-rotation. Откройте «Настройки» заново или проверьте, включён ли плагин.","unavailableTitle":"Мост настроек недоступен","undo":"Отменить","undoKey":"Ключ удалён","undoProvider":"Провайдер удалён","updateAvailable":"Доступно обновление","updateCheck":"Проверить обновления","updateFailed":"Сбой обновления","updateNone":"Установлена актуальная версия","updateRestart":"Обновление установлено. Перезапустите DSH для применения.","updateRun":"Обновить сейчас","updateRunning":"Обновление…","usedAgo":"{ago} назад","weight":"Вес ключа","weightHint":"вес в round-robin: сколько раз ключ участвует в цикле (1 = равная доля)"},"keyRotation":{"bulkImport":"Пакетный импорт","bulkImportBtn":"Импортировать ключи","bulkImportCancel":"Отмена","bulkImportDesc":"Вставьте API-ключи построчно, в формате .env (KEY=value) или CSV (KEY, вес):","bulkImportSuccess":"Импортировано ключей: {n}","currentVersion":"Текущая версия","keyPaused":"Приостановлен","keyRevoked":"Отозван (401)","latestVersion":"Последняя версия","pauseKey":"Приостановить ключ в ротации","resumeKey":"Возобновить ротацию ключа","sparklineLatency":"Тренд задержки","sparklineTraffic":"Тренд трафика","updateAvailable":"Доступно обновление","updateCheck":"Проверить обновления","updateFailed":"Сбой обновления","updateNone":"Установлена актуальная версия","updateRestart":"Обновление установлено. Перезапустите DSH для применения.","updateRun":"Обновить сейчас","updateRunning":"Обновление…"}}
@@ -1 +1 @@
1
- {"dsh-task-tracker":{"board.back":"В чат","board.backHint":"Закрыть трекер задач и вернуться в чат","field.base":"URL сервера Task Tracker","field.filePath":"Пользовательский путь к файлу tasks.json (необязательно)","field.filePathPlaceholder":"~/.dsh/task-tracker/tasks.json","field.pass":"Пароль / Токен","field.passFile":"Путь к файлу пароля","field.user":"Пользователь","filePath":"Путь к файлу","loading":"Загрузка настроек трекера…","passHint":"Токен доступа к API Task Tracker","passPlaceholder":"Секретный токен","save":"Сохранить","saved":"Настройки сохранены","saving":"Сохранение…","sessions":"Сессии","sub":"Интеграция с внутренним трекером задач и тикетов","subtitle":"API входящих задач (базовый URL и Basic-аутентификация)","tasks.active":"Активные","tasks.add":"+ Добавить","tasks.addTask":"+ Добавить задачу","tasks.all":"Все","tasks.backToChat":"К чату","tasks.cancel":"Отмена","tasks.changeIcon":"Сменить иконку","tasks.chatWithAgent":"Чат с агентом","tasks.close":"Закрыть","tasks.completed":"Выполнено","tasks.confirmDelete":"Удалить эту задачу?","tasks.create":"+ Создать","tasks.createFolder":"Создать папку","tasks.delete":"Удалить","tasks.descPlaceholder":"Подробное описание задачи…","tasks.description":"Описание","tasks.empty":"Задачи не найдены","tasks.emptyInFolder":"В папке нет задач ","tasks.folder":"Папка","tasks.folderBtn":"Папка","tasks.folders":"Папки","tasks.form.desc":"Описание","tasks.form.descPlaceholder":"Подробное описание задачи…","tasks.form.folder":"Папка","tasks.form.priority":"Приоритет","tasks.form.title":"Название","tasks.form.titlePlaceholder":"Название задачи","tasks.loadingTasks":"Загрузка задач…","tasks.markComplete":"Отметить как выполненную","tasks.markIncomplete":"Вернуть в работу","tasks.meta.author":"Автор:","tasks.meta.created":"Создано:","tasks.modal.title":"Задача","tasks.newFolderPrompt":"Название новой папки:","tasks.newPlaceholder":"Что нужно сделать?","tasks.newTask":"Новая задача","tasks.openAgentChat":"💬 Обсудить задачу с агентом","tasks.priority":"Приоритет","tasks.priority.high":"Высокий","tasks.priority.low":"Низкий","tasks.priority.medium":"Средний","tasks.priority.normal":"Обычный","tasks.priorityHigh":"Высокий","tasks.priorityLow":"Низкий","tasks.priorityMedium":"Средний","tasks.priorityNone":"Обычный","tasks.promptTemplate":"Шаблон промпта","tasks.quickAddPlaceholder":"Что нужно сделать? Нажмите Enter для добавления","tasks.refresh":"Обновить","tasks.search":"Поиск задач…","tasks.showAllFolders":"Показать все папки","tasks.startChatWithAgent":"💬 Начать чат с агентом","tasks.status":"Статус","tasks.status.completed":"Завершено","tasks.statusActive":"Активно","tasks.statusCompleted":"Выполнено","tasks.taskDetails":"Детали задачи","tasks.tasksCountSuffix":"задач","tasks.title":"Задачи","tasks.titleLabel":"Название *","title":"Трекер задач (Task Tracker)","unavailable":"Область настроек недоступна","updater.available":"Доступно обновление: v{v}","updater.checkFailed":"Не удалось проверить обновления","updater.checking":"Проверка обновлений…","updater.upToDate":"Актуальная версия","updater.updateFailed":"Ошибка при обновлении","updater.updateNow":"Обновить сейчас","updater.updated":"Успешно обновлено до v{v}. Перезапустите DSH для применения.","updater.updating":"Обновление…","updater.version":"Версия","userHint":"Логин сервисного аккаунта"}}
1
+ {"dsh-task-tracker":{"board.back":"В чат","board.backHint":"Закрыть трекер задач и вернуться в чат","field.base":"URL сервера Task Tracker","field.filePath":"Пользовательский путь к файлу tasks.json (необязательно)","field.filePathPlaceholder":"~/.dsh/task-tracker/tasks.json","field.pass":"Пароль / Токен","field.passFile":"Путь к файлу пароля","field.user":"Пользователь","filePath":"Путь к файлу","loading":"Загрузка настроек трекера…","passHint":"Токен доступа к API Task Tracker","passPlaceholder":"Секретный токен","save":"Сохранить","saved":"Настройки сохранены","saving":"Сохранение…","sessions":"Сессии","sub":"Интеграция с внутренним трекером задач и тикетов","subtitle":"API входящих задач (базовый URL и Basic-аутентификация)","tasks.active":"Активные","tasks.add":"+ Добавить","tasks.addTask":"+ Добавить задачу","tasks.all":"Все","tasks.backToChat":"К чату","tasks.cancel":"Отмена","tasks.changeIcon":"Сменить иконку","tasks.chatWithAgent":"Чат с агентом","tasks.close":"Закрыть","tasks.completed":"Выполнено","tasks.confirmDelete":"Удалить эту задачу?","tasks.create":"+ Создать","tasks.createFolder":"Создать папку","tasks.delete":"Удалить","tasks.descPlaceholder":"Подробное описание задачи…","tasks.description":"Описание","tasks.empty":"Задачи не найдены","tasks.emptyInFolder":"В папке «%s» нет задач","tasks.folder":"Папка","tasks.folderBtn":"Папка","tasks.folders":"Папки","tasks.form.desc":"Описание","tasks.form.descPlaceholder":"Подробное описание задачи…","tasks.form.folder":"Папка","tasks.form.priority":"Приоритет","tasks.form.title":"Название","tasks.form.titlePlaceholder":"Название задачи","tasks.loadingTasks":"Загрузка задач…","tasks.markComplete":"Отметить как выполненную","tasks.markIncomplete":"Вернуть в работу","tasks.meta.author":"Автор:","tasks.meta.created":"Создано:","tasks.modal.title":"Задача","tasks.newFolderPrompt":"Название новой папки:","tasks.newPlaceholder":"Что нужно сделать?","tasks.newTask":"Новая задача","tasks.openAgentChat":"💬 Обсудить задачу с агентом","tasks.priority":"Приоритет","tasks.priority.high":"Высокий","tasks.priority.low":"Низкий","tasks.priority.medium":"Средний","tasks.priority.normal":"Обычный","tasks.priorityHigh":"Высокий","tasks.priorityLow":"Низкий","tasks.priorityMedium":"Средний","tasks.priorityNone":"Обычный","tasks.promptTemplate":"Шаблон промпта","tasks.quickAddPlaceholder":"Что нужно сделать? Нажмите Enter для добавления","tasks.refresh":"Обновить","tasks.search":"Поиск задач…","tasks.showAllFolders":"Показать все папки","tasks.startChatWithAgent":"💬 Начать чат с агентом","tasks.status":"Статус","tasks.status.completed":"Завершено","tasks.statusActive":"Активно","tasks.statusCompleted":"Выполнено","tasks.taskDetails":"Детали задачи","tasks.tasksCountSuffix":"задач","tasks.title":"Задачи","tasks.titleLabel":"Название *","title":"Трекер задач (Task Tracker)","unavailable":"Область настроек недоступна","updater.available":"Доступно обновление: v{v}","updater.checkFailed":"Не удалось проверить обновления","updater.checking":"Проверка обновлений…","updater.upToDate":"Актуальная версия","updater.updateFailed":"Ошибка при обновлении","updater.updateNow":"Обновить сейчас","updater.updated":"Успешно обновлено до v{v}. Перезапустите DSH для применения.","updater.updating":"Обновление…","updater.version":"Версия","userHint":"Логин сервисного аккаунта"}}
package/lib/translator.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { execFile } from 'node:child_process'
2
+ import { StringDecoder } from 'node:string_decoder'
2
3
 
3
4
  /**
4
5
  * Host-side translation services & LibreTranslate integration
@@ -24,6 +25,7 @@ export function readJsonBody(request, limit = 500_000) {
24
25
  return reject(err)
25
26
  }
26
27
 
28
+ const decoder = new StringDecoder('utf8')
27
29
  let body = ''
28
30
  let bytesReceived = 0
29
31
  let settled = false
@@ -40,7 +42,7 @@ export function readJsonBody(request, limit = 500_000) {
40
42
  err.statusCode = 413
41
43
  return reject(err)
42
44
  }
43
- body += buf.toString('utf8')
45
+ body += decoder.write(buf)
44
46
  }
45
47
 
46
48
  request.on('data', onData)
@@ -48,6 +50,7 @@ export function readJsonBody(request, limit = 500_000) {
48
50
  request.on('end', () => {
49
51
  if (settled) return
50
52
  settled = true
53
+ body += decoder.end()
51
54
  try {
52
55
  resolve(body ? JSON.parse(body) : {})
53
56
  } catch (err) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-russian-lang",
3
- "version": "0.3.26",
4
- "description": "Russian localization for DeepSeek Harness (DSH v0.2.0-rc.2+) web UI: adds Русский as native language option. 100.0% coverage across 8,576 UI keys (101 namespaces: Core 2,442 + Plugins 6,134). Features full DSH v0.2.0-rc.2 core support and complete GoodAndReady plugin catalog.",
3
+ "version": "0.3.28",
4
+ "description": "Russian localization for DeepSeek Harness (DSH v0.2.0-rc.2+) web UI: adds Русский as native language option. 100.0% coverage across 8,584 UI keys (101 namespaces: Core 2,442 + Plugins 6,142). Features full DSH v0.2.0-rc.2 core support and complete GoodAndReady plugin catalog.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -12,7 +12,9 @@
12
12
  },
13
13
  "files": [
14
14
  "lib",
15
+ "!lib/client.template.js",
15
16
  "bin",
17
+ "glossary.json",
16
18
  "cordis.patch.yml",
17
19
  "README.md",
18
20
  "LICENSE"