@goodandready/dsh-russian-lang 0.3.24 → 0.3.26

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/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  <h3>Полная русская локализация, умная типографика и исправление раскладки клавиатуры для DeepSeek Harness</h3>
6
6
 
7
7
  <p align="center">
8
- <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.3.24-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
8
+ <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.3.26-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-10b981.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
10
  <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
11
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
package/lib/client.js CHANGED
@@ -1136,7 +1136,7 @@ setTimeout(() => { copyKeyBtn.textContent = '📋' }, 1500)
1136
1136
  }}
1137
1137
  const copyReportBtn = modal.querySelector('.rl-copy-report-btn')
1138
1138
  if (copyReportBtn) {copyReportBtn.onclick = () => {const snippet = typeof generateBugReportSnippet === 'function'
1139
- ? generateBugReportSnippet({ key: k, ns, original: origText || rawText, current: rawText, override: textarea.value.trim(), pkgVersion: '0.3.24' })
1139
+ ? generateBugReportSnippet({ key: k, ns, original: origText || rawText, current: rawText, override: textarea.value.trim(), pkgVersion: '0.3.26' })
1140
1140
  : ('### Репорт: ' + (k || rawText) + '\n- Исходный: ' + (origText || rawText) + '\n- Перевод: ' + textarea.value.trim())
1141
1141
  try { navigator.clipboard.writeText(snippet) } catch (err) { void err; }
1142
1142
  copyReportBtn.textContent = '✓ Скопировано'
@@ -1434,7 +1434,7 @@ const [snap, setSnap] = React.useState(() => (scope && scope.getSnapshot ? scope
1434
1434
  const [ruActive, setRuActive] = React.useState(() => { try { return runtime.getLocale().active === 'ru' } catch (e) { return false } })
1435
1435
  const [typo, setTypoState] = React.useState(() =>
1436
1436
  (snap.value && snap.value.typography) || {})
1437
- const [upStatus, setUpStatus] = React.useState({currentVersion: '0.3.24',latestVersion: undefined,updateAvailable: false
1437
+ const [upStatus, setUpStatus] = React.useState({currentVersion: '0.3.26',latestVersion: undefined,updateAvailable: false
1438
1438
  })
1439
1439
  const [upLoading, setUpLoading] = React.useState(false)
1440
1440
  const [upMsg, setUpMsg] = React.useState(null)
@@ -1530,7 +1530,7 @@ scope.set('agentPromptPreset', val)
1530
1530
  } catch (err) { console.warn('dsh-russian-lang: set agentPromptPreset failed', err) }}},React.createElement('option', { value: 'technical_expert' }, t('presetExpert')),React.createElement('option', { value: 'tech_writer' }, t('presetWriter')),React.createElement('option', { value: 'concise' }, t('presetConcise')),React.createElement('option', { value: 'code_reviewer' }, t('presetReviewer')),React.createElement('option', { value: 'architect' }, t('presetArchitect')),React.createElement('option', { value: 'tutor' }, t('presetTutor')))),presetInfo ? React.createElement('div', { className: 'rl-preview-box' },React.createElement('div', { style: { fontWeight: 600, marginBottom: '4px', color: 'var(--dsw-alias-label-primary)' } }, '💬 ' + presetInfo.label + ':'),presetInfo.text
1531
1531
  ) : null
1532
1532
  ) : null
1533
- ),React.createElement('div', { className: 'rl-section-card' },React.createElement('div', { className: 'rl-section-title' },React.createElement('span', null, t('secUpdater')),React.createElement('span', { className: 'rl-badge ' + (upStatus.updateAvailable ? 'rl-badge-warn' : 'rl-badge-ok') },upStatus.updateAvailable ? t('badgeUpdateAvailable') : t('badgeUpToDate'))),React.createElement('div', { className: 'rl-section-desc' }, t('secUpdaterDesc')),React.createElement('div', { className: 'rl-item-card' },React.createElement('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', flexWrap: 'wrap', gap: '8px' } },React.createElement('div', null,React.createElement('div', { style: { fontWeight: 600, color: 'var(--dsw-alias-label-primary)' } },t('updaterCurrent').replace('{version}', upStatus.currentVersion || '0.3.24')),upStatus.updateAvailable
1533
+ ),React.createElement('div', { className: 'rl-section-card' },React.createElement('div', { className: 'rl-section-title' },React.createElement('span', null, t('secUpdater')),React.createElement('span', { className: 'rl-badge ' + (upStatus.updateAvailable ? 'rl-badge-warn' : 'rl-badge-ok') },upStatus.updateAvailable ? t('badgeUpdateAvailable') : t('badgeUpToDate'))),React.createElement('div', { className: 'rl-section-desc' }, t('secUpdaterDesc')),React.createElement('div', { className: 'rl-item-card' },React.createElement('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', flexWrap: 'wrap', gap: '8px' } },React.createElement('div', null,React.createElement('div', { style: { fontWeight: 600, color: 'var(--dsw-alias-label-primary)' } },t('updaterCurrent').replace('{version}', upStatus.currentVersion || '0.3.26')),upStatus.updateAvailable
1534
1534
  ? React.createElement('div', { style: { color: 'var(--dsw-alias-state-warning-primary)', marginTop: '2px', fontWeight: 500 } },t('updaterLatest').replace('{version}', upStatus.latestVersion || ''))
1535
1535
  : React.createElement('div', { style: { color: 'var(--dsw-alias-label-secondary)', marginTop: '2px' } },t('updaterUpToDate'))),upStatus.updateAvailable
1536
1536
  ? React.createElement('button', {type: 'button',className: 'rl-btn rl-btn-primary',disabled: upLoading,onClick: triggerUpdate,}, upLoading ? t('updaterUpdating') : t('updaterBtn').replace('{version}', upStatus.latestVersion || ''))
@@ -1568,7 +1568,7 @@ if (!input) return
1568
1568
  try {const parsed = JSON.parse(input)
1569
1569
  if (parsed && typeof parsed === 'object') {const merged = Object.assign({}, overrides, parsed)
1570
1570
  scope.set('overrides', merged)
1571
- }} catch (err) { alert(t('overridesImportError') + (err && err.message || err)) }}}, t('importJsonBtn')))),React.createElement('div', { className: 'rl-section-card' },React.createElement('div', { className: 'rl-section-title' },React.createElement('span', null, t('secSupport')),React.createElement('span', { className: 'rl-badge rl-badge-ok' }, '🟢 100.0%')),React.createElement('div', { className: 'rl-section-desc' }, t('secSupportDesc')),React.createElement('div', { className: 'rl-grid-3' },React.createElement('div', { className: 'rl-stat-box' },React.createElement('div', { className: 'rl-stat-val' }, '113'),React.createElement('div', { className: 'rl-stat-label' }, t('statNamespaces'))),React.createElement('div', { className: 'rl-stat-box' },React.createElement('div', { className: 'rl-stat-val' }, '1 225'),React.createElement('div', { className: 'rl-stat-label' }, t('statCoreKeys'))),React.createElement('div', { className: 'rl-stat-box' },React.createElement('div', { className: 'rl-stat-val' }, '5 924'),React.createElement('div', { className: 'rl-stat-label' }, t('statPluginKeys')))),React.createElement('div', { className: 'rl-actions-row' },React.createElement('a', {href: makeIssueUrl({}, '0.3.24'),target: '_blank',rel: 'noopener noreferrer',className: 'rl-btn rl-btn-primary'
1571
+ }} catch (err) { alert(t('overridesImportError') + (err && err.message || err)) }}}, t('importJsonBtn')))),React.createElement('div', { className: 'rl-section-card' },React.createElement('div', { className: 'rl-section-title' },React.createElement('span', null, t('secSupport')),React.createElement('span', { className: 'rl-badge rl-badge-ok' }, '🟢 100.0%')),React.createElement('div', { className: 'rl-section-desc' }, t('secSupportDesc')),React.createElement('div', { className: 'rl-grid-3' },React.createElement('div', { className: 'rl-stat-box' },React.createElement('div', { className: 'rl-stat-val' }, '113'),React.createElement('div', { className: 'rl-stat-label' }, t('statNamespaces'))),React.createElement('div', { className: 'rl-stat-box' },React.createElement('div', { className: 'rl-stat-val' }, '1 225'),React.createElement('div', { className: 'rl-stat-label' }, t('statCoreKeys'))),React.createElement('div', { className: 'rl-stat-box' },React.createElement('div', { className: 'rl-stat-val' }, '5 924'),React.createElement('div', { className: 'rl-stat-label' }, t('statPluginKeys')))),React.createElement('div', { className: 'rl-actions-row' },React.createElement('a', {href: makeIssueUrl({}, '0.3.26'),target: '_blank',rel: 'noopener noreferrer',className: 'rl-btn rl-btn-primary'
1572
1572
  }, '💬 ' + t('reportIssue')),React.createElement('div', { className: 'rl-hint-text', style: { flex: 1 } },t('exportMdHint')))))))
1573
1573
  }
1574
1574
  const RL_CSS = ['.rl-modal-mask{position:fixed;top:0;left:0;width:100vw;height:100vh;background:var(--dsw-alias-bg-mask);display:flex;align-items:center;justify-content:center;z-index:99999;backdrop-filter:blur(2px)}.rl-modal-box{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;width:calc(100vw - 40px);max-width:500px;box-shadow:var(--dsw-alias-shadow-l3);display:flex;flex-direction:column;gap:12px;padding:18px}.rl-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;list-style:none;overflow:hidden;transition:border-color .15s ease}.rl-head{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;display:flex;align-items:center;gap:12px;padding:14px 18px}.rl-head:hover{background:var(--dsw-alias-bg-layer-2)}.rl-head-main{flex:1;display:flex;flex-direction:column;gap:4px}.rl-title{color:var(--dsw-alias-label-primary);font-size:16px;font-weight:600;line-height:1.4;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.rl-sub{color:var(--dsw-alias-label-secondary);font-size:13px}.rl-chev{margin-left:auto;flex:none;color:var(--dsw-alias-label-tertiary);display:inline-flex;transition:transform .16s}.rl-chev-open{transform:rotate(180deg)}.rl-body{border-top:1px solid var(--dsw-alias-border-l2);padding:18px}.rl-page{display:flex;flex-direction:column;gap:16px;max-width:960px}.rl-section-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;padding:16px 18px;display:flex;flex-direction:column;gap:12px}.rl-section-title{font-size:14px;font-weight:600;color:var(--dsw-alias-label-primary);display:flex;align-items:center;justify-content:space-between;gap:8px}.rl-section-desc{font-size:12px;color:var(--dsw-alias-label-secondary);margin-top:-4px;line-height:1.4}.rl-grid-2{display:grid;grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));gap:10px}.rl-grid-3{display:grid;grid-template-columns:repeat(auto-fit, minmax(140px, 1fr));gap:10px}.rl-badge{font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2);display:inline-flex;align-items:center;gap:4px;font-weight:500}.rl-badge-ok{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 8%, transparent)}.rl-badge-warn{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary);background:color-mix(in srgb, var(--dsw-alias-state-warning-primary) 8%, transparent)}.rl-badge-dim{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3)}.rl-item-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:8px;padding:10px 12px;display:flex;flex-direction:column;gap:4px}.rl-item-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.rl-item-label{font-size:13px;font-weight:500;color:var(--dsw-alias-label-primary);display:flex;align-items:center;gap:8px;cursor:pointer}.rl-item-desc{font-size:11px;color:var(--dsw-alias-label-secondary);line-height:1.4}.rl-stat-box{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:8px;padding:10px 12px;display:flex;flex-direction:column;gap:2px}.rl-stat-val{font-size:16px;font-weight:700;color:var(--dsw-alias-label-primary)}.rl-stat-label{font-size:11px;color:var(--dsw-alias-label-secondary);letter-spacing:0.3px}.rl-preview-box{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:8px;padding:10px 12px;font-size:12px;color:var(--dsw-alias-label-secondary);line-height:1.4}.rl-btn{appearance:none;font:inherit;cursor:pointer;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:6px 12px;font-size:12px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font-weight:500;display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:all .15s ease;text-decoration:none}.rl-btn:hover:not(:disabled){background:var(--dsw-alias-bg-layer-1);border-color:var(--dsw-alias-label-secondary)}.rl-btn-primary{background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3);border-color:transparent}.rl-btn-primary:hover:not(:disabled){opacity:0.9}.rl-select{height:32px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);border-radius:6px;padding:0 8px;font-size:12px;outline:none;width:100%;max-width:380px}.rl-select:focus{border-color:var(--dsw-alias-state-brand-primary)}.rl-check{width:16px;height:16px;accent-color:var(--dsw-alias-label-primary);cursor:pointer;flex-shrink:0}.rl-hint-text{font-size:11px;color:var(--dsw-alias-label-secondary);line-height:1.4}.rl-actions-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding-top:4px}.rl-lang-chip{appearance:none;cursor:pointer;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:700;padding:2px 7px;border-radius:6px;display:inline-flex;align-items:center;transition:all .15s;margin:0 4px}.rl-lang-chip:hover{border-color:var(--dsw-alias-label-primary);color:var(--dsw-alias-label-primary)}.rl-lang-chip-active{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.rl-action-btn{appearance:none;background:0 0;border:1px solid transparent;border-radius:4px;color:var(--dsw-alias-label-secondary);cursor:pointer;font-size:11px;padding:2px 5px;display:inline-flex;align-items:center;transition:all .15s}.rl-action-btn:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3)}.rl-action-btn-active{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-border-l2)}.rl-turn-translation{margin:8px 0;padding:10px 12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:8px;font-size:13px;line-height:1.5}.rl-trans-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;border-bottom:1px solid var(--dsw-alias-border-l2);padding-bottom:4px}.rl-trans-title{font-size:11px;font-weight:600;color:var(--dsw-alias-label-secondary);text-transform:uppercase;letter-spacing:0.5px}.rl-trans-tools{display:flex;gap:4px}.rl-trans-btn{appearance:none;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);cursor:pointer;padding:2px 7px;border-radius:4px;font-size:11px}.rl-trans-btn:hover{background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary)}.rl-trans-body{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;user-select:text}.rl-export-md-btn{appearance:none;border:1px solid var(--dsw-alias-border-l2);height:32px;color:var(--dsw-alias-label-primary);cursor:pointer;background:transparent;border-radius:18px;justify-content:center;align-items:center;gap:4px;padding:6px 12px;font-size:13px;font-weight:500;display:inline-flex;white-space:nowrap;margin-left:6px;transition:all .15s ease}.rl-export-md-btn:hover{background:var(--dsw-alias-interactive-bg-hover)}.rl-inspector-hover{position:absolute;pointer-events:none;border:2px solid var(--dsw-alias-state-brand-primary);border-radius:4px;background:color-mix(in srgb,var(--dsw-alias-state-brand-primary) 12%,transparent);box-shadow:0 0 10px color-mix(in srgb,var(--dsw-alias-state-brand-primary) 30%,transparent);z-index:99998;transition:all .06s ease;display:none}.rl-inspector-badge{position:absolute;bottom:calc(100% + 4px);left:0;background:var(--dsw-alias-state-brand-primary);color:var(--dsw-alias-label-inverse);font-size:10px;font-weight:600;padding:2px 6px;border-radius:4px;white-space:nowrap;box-shadow:var(--dsw-alias-shadow-l2);pointer-events:none}.rl-inspector-pill{position:fixed;bottom:18px;right:18px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l1);border-radius:20px;padding:6px 12px;box-shadow:var(--dsw-alias-shadow-l3);display:none;align-items:center;gap:8px;font-size:12px;z-index:99990;user-select:none}.rl-inspector-pill-active{border-color:var(--dsw-alias-state-brand-primary);box-shadow:0 0 12px color-mix(in srgb,var(--dsw-alias-state-brand-primary) 35%,transparent)}'
@@ -1 +1 @@
1
- {"commandcode":{"accountSeparator":"────────────────────","accountTitle":"📊 {label}{badges}","activeBadge":" ✅ активен","barLine":" └ {bar} {pct}%","blockedInvalidKey":"⛔ API-ключ недействителен или истёк — сервер отклонил запросы (401); проверьте ключ аккаунта","blockedNetwork":"⚠️ Не удалось подключиться к Command Code — проверьте сеть или адрес API","blockedServiceUnavailable":"⚠️ Сервис Command Code временно недоступен (5xx); повторите позже","cooldownBadge":" ⏳ охлаждение, сброс {when}","costLine":" 💰 Расход {money} ({credits} кредитов)","creditsHeader":"── Кредиты ──────────────────────────","errorText":"Не удалось получить статистику Command Code: {message}","exceededWarning":" ⚠️ превышен!","fiveHourLine":" ⏱ 5-часовое {used} / {cap}{warn}","imageGate":"В сессии уже есть изображения, а модель {model} не поддерживает изображения; выберите модель с поддержкой зрения или удалите изображения из сессии.","invalidCredentialBadge":" ⛔ неверный ключ","monthlyLine":" 💳 В месяц {monthly} (куплено {purchased} / бесплатно {free})","noData":"(нет данных — проверьте API-ключ)","partialFailures":"⚠️ Сбои на некоторых эндпоинтах: {list}","planLine":" 📦 Тариф {name}{status}{period}","planPeriodSuffix":" · окончание периода: {date}","rateLimitBadge":" ⏳ лимит запросов (ожидание окна)","requestsLine":" 💬 Запросы {n} / сбоев {f} успешность {r}%","resetSuffix":"сброс {when}","title":"📊 Использование Command Code{account}","tokensLine":" 🔤 Токены {in} вход / {out} выход","unconfigured":" (API-ключ не настроен)","usageHeader":"── Запросы ──────────────────────────","weeklyLine":" 📅 Недельное {used} / {cap}{warn}","windowBarLine":" └ {bar} сброс {when}","windowsHeader":"── Использование окна ───────────────"},"panel.commandcode":{"active":"Активен","close":"Закрыть","closeHint":"Вернуться к диалогу","coolingDown":"Охлаждение","credits":"Кредиты","errorGeneric":"Не удалось получить данные об использовании аккаунта","errorInvalidKey":"API-ключ недействителен или истёк","errorInvalidKeyHint":"Сервер отклонил все запросы (401). Проверьте ключ для этого аккаунта или сгенерируйте новый в консоли commandcode.ai.","errorInvalidResponse":"Не удалось прочитать ответ Command Code","errorInvalidResponseHint":"Ответы на запросы получены, но их тело не удалось разобрать. Проверьте HTTP-прокси хоста или декодирование ответа.","errorNetwork":"Не удалось связаться с сервисом Command Code","errorNetworkHint":"Запрос не достиг сервера. Проверьте сетевое подключение или настройку базового URL API.","errorServiceUnavailable":"Сервис Command Code временно недоступен","errorServiceUnavailableHint":"Сервер возвращает ошибки (5xx). Повторите попытку через минуту.","exceeded":"Превышен","exhausted":"Исчерпан","failed":"ошибок","fiveHour":"5-часовое окно","fiveHourShort":"5 ч","free":"Бесплатно","invalidKey":"Неверный ключ","limits":"Лимиты","loading":"Загрузка…","monthly":"Месячный лимит","monthlyLimit":"Месячный лимит","monthlyUsed":"Использовано за месяц","nav":"Command Code","noKey":"Ключ не настроен","noKeyHint":"Добавьте API-ключ Command Code в Настройках, чтобы отслеживать квоту и кредиты.","partial":"Частично","periodEnds":"Окончание периода","plan":"Тариф","purchased":"Приобретено","refresh":"Обновить","refreshing":"Обновление…","remaining":"Осталось","requests":"Запросы","resets":"Сброс через","spend":"Расходы","subtitle":"Тарифы, кредиты и плавающие окна квот","successRate":"Успешность","tokens":"Токены","tokensIn":"Входящие токены","tokensOut":"Исходящие токены","unavailable":"Недоступно","unconfigured":"Не настроено","updated":"Обновлено","usage":"Использование","weekly":"Недельное окно","weeklyShort":"7 дн","windowUnlimited":"Без ограничений"},"settings.commandcode":{"accountActionClearKey":"Удалить ключ","accountActionKey":"Вставить новый ключ","accountActionLogin":"Войти для получения нового ключа","accountActionPin":"Закрепить этот аккаунт","accountActionRemove":"Удалить аккаунт","accountActionRename":"Переименовать","accountActionUnpin":"Переключать автоматически","accountActions":"Действия с аккаунтом","accountAdd":"Добавить аккаунт","accountAddConfirm":"Добавить","accountAddHint":"Вход откроет страницу авторизации Command Code и добавит аккаунт после подтверждения; также можно просто вставить API-ключ.","accountAddLogin":"Войти","accountAddPaste":"Вставить ключ","accountApply":"Применить","accountClearKeyConfirm":"Удалить сохранённый ключ для аккаунта по умолчанию? Провайдер вернётся к переменным окружения или официальному входу через CLI.","accountConfirmClear":"Удалить","accountConfirmRemove":"Удалить","accountDefault":"Основной аккаунт","accountKey":"API-ключ","accountKeyHint":"API-ключ этого аккаунта. Если оставить поле пустым, сохранённый ключ останется без изменений.","accountKeyPlaceholder":"Вставьте API-ключ","accountLabel":"Название аккаунта","accountLoginAfterSave":"Нажмите «Сохранить» внизу страницы, затем войдите в эту учётную запись в браузере для получения ключа.","accountModeAuto":"Режим: автоматическое переключение (по списку)","accountModePinned":"Режим: закреплён за «{name}», с переключением при недоступности","accountModelOwner":"на {name}","accountModels":"Выделенные модели","accountModelsHint":"Эти модели отдают предпочтение данному аккаунту, но переключаются при его недоступности. Модель принадлежит одному аккаунту; выбор здесь перенесёт её с любого другого.","accountNameN":"Аккаунт {n}","accountNamePlaceholder":"Название (необязательно; при входе используется имя учётной записи)","accountNoKeyHint":"Ключ ещё не настроен: войдите через браузер или вставьте API-ключ, созданный в консоли commandcode.ai.","accountOpFailed":"Не удалось применить изменение аккаунта. Повторите попытку.","accountRemove":"Удалить","accountRemoveConfirm":"Удалить «{name}»? Сохранённый ключ и выделенные модели будут удалены вместе с ним.","accountSeparator":"────────────────────","accountStatusPinned":"Закреплён","accountTitle":"📊 {label}{badges}","accountsHint":"Когда активный аккаунт достигает лимита использования (429) или его ключ недействителен (401), запросы переключаются на следующий аккаунт; когда все аккаунты исчерпаны, ошибка указывает ближайшее время сброса окна.","accountsRotationHint":"Действия с аккаунтом применяются немедленно. Когда текущий аккаунт исчерпывает лимит использования или его ключ перестаёт работать, запросы переключаются на следующий рабочий аккаунт в порядке списка.","accountsTitle":"Смена аккаунта","activeAccount":"Активный аккаунт","activeAccountAuto":"Авто (первый доступный аккаунт)","activeAccountHint":"Закрепите предпочтительный аккаунт; применяется к следующему запросу после сохранения. Если выбранный аккаунт исчерпан, запросы будут перенаправлены на другой доступный аккаунт.","activeBadge":" ✅ активен","advancedInvalid":"Число в расширенных настройках не готово к сохранению; раскройте, чтобы исправить.","advancedOverriddenMany":"{count} настроено","advancedOverriddenOne":"1 настроенный","advancedSettings":"Дополнительно","advancedSettingsHint":"Редко используемые параметры: базовый URL API, рабочая директория, тайм-ауты и фильтрация моделей.","apiBase":"Базовый URL API","apiBaseHint":"По умолчанию используется https://api.commandcode.ai; обычно оставляйте как есть.","apiKey":"API-ключ","apiKeyHint":"Создайте его в консоли commandcode.ai. Если оставить это поле пустым, сохранённый ключ останется без изменений.","apiKeyLocked":"Ключ предоставлен только для чтения","apiKeySet":"Настроено","apiKeyUnset":"Не настроено","barLine":" └ {bar} {pct}%","blockedInvalidKey":"⛔ API-ключ недействителен или истёк — сервер отклонил запросы (401); проверьте ключ аккаунта","blockedNetwork":"⚠️ Не удалось подключиться к Command Code — проверьте сеть или адрес API","blockedServiceUnavailable":"⚠️ Сервис Command Code временно недоступен (5xx); повторите позже","cancel":"Отмена","cardConfiguredHint":"API-ключ готов. Чтобы заменить его, добавить ротацию аккаунтов, проверить использование или изменить базовый API, откройте страницу \"Command Code\" в Настройках.","cardLoadingHint":"Загрузка конфигурации командного кода…","cardRegistrationHint":"Эта карта предоставлена плагином Command Code; для отображения всех элементов управления требуется более новая версия DeepSeek Harness.","cardRouteActive":"Активный","cardTitle":"Подключение командного кода","commandGuard":"ИИ-контроль команд","commandGuardHint":"Перед запросом подтверждения shell-команды служба typesafe/jev оценивает её безопасность: безопасные команды выполняются без подтверждения, остальные запрашивают подтверждение как обычно. По умолчанию выключено.","commandGuardLevel":"Порог автоодобрения","commandGuardLevelHigh":"Высокий","commandGuardLevelHint":"Более высокий порог требует большей уверенности для пропуска подтверждения, поэтому запросов подтверждения будет больше. Высокий = 0.95, Средний = 0.9 (по умолчанию), Низкий = 0.8. Если оценка занимает более 3 секунд, отображается обычный запрос подтверждения.","commandGuardLevelLow":"Низкий","commandGuardLevelMedium":"Средний","commandGuardThreshold":"Порог автоподтверждения (0.5–1)","commandGuardThresholdHint":"Автоподтверждение срабатывает, если typesafe/jev оценивает безопасность команды с вероятностью не ниже этой; по умолчанию 0.9.","commandGuardTimeoutMs":"Таймаут оценки (мс, 200–10000)","commandGuardTimeoutMsHint":"Если typesafe/jev не отвечает вовремя, отображается обычный запрос подтверждения; по умолчанию 1500.","cooldownBadge":" ⏳ охлаждение, сброс {when}","costLine":" 💰 Расход {money} ({credits} кредитов)","creditsHeader":"── Кредиты ──────────────────────────","discard":"Отменить","errorText":"Не удалось получить статистику Command Code: {message}","exceededWarning":" ⚠️ превышен!","filterModelsByPlan":"Скрыть модели вне тарифного плана","filterModelsByPlanHint":"Если включено, в выборе моделей отображаются только те, что входят в вашу подписку; при наличии баланса кредитов по запросу показывается полный каталог.","fiveHourLine":" ⏱ 5-часовое {used} / {cap}{warn}","hide":"Скрыть","imageGate":"В сессии уже есть изображения, а модель {model} не поддерживает изображения; выберите модель с поддержкой зрения или удалите изображения из сессии.","integrationsTitle":"Интеграции и отображение","intro":"Настройте подключение к Command Code Provider. API-ключ сохраняется только в локальной службе учетных данных и никогда не отображается; остальные поля записываются в пользовательские настройки и вступают в силу при следующем запросе.","invalidCredentialBadge":" ⛔ неверный ключ","invalidNumber":"Недопустимый номер","loginButton":"Войдите в Command Code","loginCancel":"Отменить вход","loginCancelled":"Вход отменён.","loginDenied":"Доступ запрещён. Попробуйте снова или вставьте ключ вручную.","loginFailedGeneric":"Не удалось войти; попробуйте снова или вставьте ключ вручную.","loginHintIdle":"Не хотите создавать ключ вручную? Войдите в систему, и ваш браузер откроет страницу авторизации commandcode.ai; одобренный ключ сохранится в локальном сервисе учетных данных и будет применяться к следующему запросу.","loginInvalidKey":"Доставленный ключ не прошел проверку (401). Попробуйте снова или вставьте его вручную.","loginNetwork":"Не удалось подключиться к сервису Command Code для проверки ключа; проверьте подключение к сети и повторите попытку.","loginOpenLink":"Откройте страницу авторизации ↗","loginSaveBefore":"Сохраните изменения страницы перед входом в эту учётную запись.","loginStarting":"Запуск локального серверного обработчика callback…","loginStoreFailed":"Не удалось сохранить ключ в локальной службе учетных данных; вставьте его вручную.","loginSuccess":"Вошли как","loginTimeout":"Истекло время ожидания ответа авторизации; попробуйте снова.","loginTitle":"Войти, чтобы получить ключ","loginUnavailable":"Вход в систему недоступен в этой среде; вставьте {API key} вместо этого.","loginWaiting":"Ожидание авторизации в вашем браузере…","modelAllowance":"${amount}/мес","modelAllowanceTitle":"Ежемесячный лимит использования этой модели в USD. Все модели делят общий месячный пул — это не дополнительный кредит поверх тарифного плана.","modelCatalogFailed":"Не удалось загрузить каталог моделей; сохранённые настройки продолжают действовать.","modelCount":"Выбрано моделей: {count}","modelPick":"Выбрать модели…","modelSearchEmpty":"Подходящих моделей не найдено","modelSearchPlaceholder":"Поиск модели по имени или ID…","modelStale":"Устаревшая модель (не найдена в текущем каталоге)","modelsTitle":"Модели","monthlyLine":" 💳 В месяц {monthly} (куплено {purchased} / бесплатно {free})","nav":"Код команды","noData":"(нет данных — проверьте API-ключ)","numberTooLarge":"Превышено допустимое максимальное значение (2147483647 мс)","numberTooSmall":"Должно быть не менее 1 (мс)","offloadSeenImagesForCache":"Не отправлять повторно уже просмотренные изображения","offloadSeenImagesForCacheHint":"Только для CLI-транспорта. После ответа модели на изображение долговечно заменять старые пиксели текстом во избежание сброса кэша при поступлении нового изображения. Чтобы снова просмотреть старое изображение, модель должна перечитать файл либо пользователь должен прикрепить его заново. По умолчанию выключено.","overridden":"Переопределено","partialFailures":"⚠️ Сбои на некоторых эндпоинтах: {list}","planLine":" 📦 Тариф {name}{status}{period}","planPeriodSuffix":" · окончание периода: {date}","privacyTitle":"Конфиденциальность и безопасность","rateLimitBadge":" ⏳ лимит запросов (ожидание окна)","readOnly":"Настройки доступны только для чтения.","requestTimeoutMs":"Таймаут запроса (мс)","requestTimeoutMsHint":"Время ожидания первого байта ответа; по умолчанию 60000.","requestsLine":" 💬 Запросы {n} / сбоев {f} успешность {r}%","reset":"Сбросить","resetSuffix":"сброс {when}","ruleAccount":"Целевой аккаунт","ruleAdd":"Добавить правило","ruleHint":"Отметьте модели для маршрутизации в выпадающем списке (множественный выбор), затем выберите целевой аккаунт.","ruleModel":"Модели","ruleModelCount":"Выбрано моделей: {count}","ruleModelPick":"Выберите модели…","ruleRemove":"Удалить","rulesCatalogFailed":"Не удалось загрузить каталог моделей — выбор моделей недоступен; сохранённые правила продолжают действовать.","rulesEmpty":"Правил пока нет.","rulesHint":"Выберите модели (множественный выбор) и направьте их на конкретный аккаунт. Когда модель из запроса совпадает с правилом и аккаунт доступен, запрос обслуживается им; при исчерпании или недоступности аккаунта происходит откат к стандартной ротации. Правила проверяются по порядку сверху вниз — срабатывает первое совпадение.","rulesOrder":"Порядок правил","rulesTitle":"Правила маршрутизации моделей","rulesTotal":"Всего правил: {count}","save":"Сохранить","saveFailed":"Не удалось сохранить, попробуйте снова.","saveInvalid":"Исправьте выделенное поле перед сохранением","saved":"Сохранено ✓","saving":"Сохранение","show":"Показать","showSidebarQuota":"Показывать карточку квоты в боковой панели","showSidebarQuotaHint":"Когда включено, карточка тарифа и квоты Command Code располагается внизу боковой панели (над Настройками) и открывает полный дашборд. По умолчанию выключено: ничего не отображается слева и фоновый опрос не выполняется. Применяется при сохранении.","streamIdleTimeoutMs":"Таймаут простоя потока (мс)","streamIdleTimeoutMsHint":"Как долго зависший поток считается мёртвым; по умолчанию 300000 (намеренно щедро — модели с долгим обдумыванием могут молчать минутами).","title":"Код команды","tokensLine":" 🔤 Токены {in} вход / {out} выход","transportMaxRetries":"Повторные попытки транспорта","transportMaxRetriesHint":"Сколько раз соединение пытается повториться автоматически; по умолчанию 5 (интервалы 0.5+1+2+4+8с, ~15с всего). После этого выдаётся ошибка вместо дальнейшего экспоненциального ожидания. Значение 0 отключает повторы. Для ограничений частоты и ответов 5xx действует отдельный более длительный интервал.","unconfigured":" (API-ключ не настроен)","unsaved":"Не сохранено","unsavedChanges":"У вас есть несохранённые изменения","updateAvailable":"доступно обновление","updateHint":"Доступна новая версия; нажмите для просмотра заметок о выпуске. Уведомление исчезнет после обновления плагина.","usageActive":"Активно","usageCooldown":"Охлаждение","usageCost":"Потратить","usageError":"Не удалось получить данные об использовании","usageExceeded":"Превышено","usageFailed":"не удалось","usageFiveHour":"5-часовое окно","usageFree":"Бесплатно","usageHeader":"── Запросы ──────────────────────────","usageInvalidKey":"Неверный ключ","usageInvalidResponse":"Не удалось прочитать ответ Command Code","usageInvalidResponseHint":"Ответы на запросы получены, но их тело не удалось разобрать. Проверьте HTTP-прокси хоста или декодирование ответа.","usageKeyClear":"Очистить сохранённый ключ","usageKeyClearStaged":"Будет очищено при сохранении","usageKeyInvalid":"Неверный или просроченный API-ключ","usageKeyInvalidHint":"Сервер отклоняет все запросы (401). Проверьте ключ, настроенный для этого аккаунта, или создайте новый в консоли commandcode.ai.","usageLoading":"Получение данных об использовании аккаунта…","usageMonthly":"Ежемесячно","usageMonthlyLeft":"Остаток на месяц","usageNetworkError":"Не удалось подключиться к сервису Command Code","usageNetworkHint":"На сервер не поступило ни одного запроса. Проверьте подключение к сети или настройку базового API.","usageNoKey":"Настройте API-ключ, чтобы увидеть здесь данные об использовании и состоянии кредитов этого аккаунта.","usagePartial":"Некоторые данные конечной точки недоступны","usagePeriodEnd":"Период заканчивается","usagePurchased":"Куплено","usageRefresh":"Обновить","usageRefreshing":"Обновление…","usageRequests":"Запросы","usageReset":"Сбросить","usageServiceUnavailable":"Сервис Command Code временно недоступен","usageServiceUnavailableHint":"Сервер вернул ошибки (5xx); попробуйте обновить позже.","usageSuccessRate":"Уровень успеха","usageTitle":"Использование аккаунта","usageTokens":"Токены","usageTokensIn":"в","usageTokensOut":"выход","usageUnconfigured":"Для этого аккаунта ещё не настроен API-ключ.","usageUndoKeyClear":"Отменить очистку","usageUpdated":"Обновлено","usageWeekly":"Еженедельное окно","visibleModelsCleanStale":"Очистить устаревшие ({count})","visibleModelsCount":"Выбрано моделей: {count}","visibleModelsHideInactive":"Скрыть неактивные","visibleModelsHint":"Выберите модели, которые будут доступны для назначения правил маршрутизации","visibleModelsPick":"Выбрать модели","visibleModelsReset":"Сбросить выбор моделей","visibleModelsShowAll":"Показать все модели","visibleModelsStaleHint":"{count} выбранных моделей больше нет в каталоге (возможно, выведены из эксплуатации); на остальные модели это не влияет. Удалите их или сохраните.","visibleModelsTitle":"Видимые модели","webSearch":"Использовать Command Code для веб-поиска DSH","webSearchHint":"Если включено, инструмент web_search для модели работает через Command Code (тот же API-ключ и base URL, что и в чате). Если выключено, используется встроенный поиск DeepSeek.","weeklyLine":" 📅 Недельное {used} / {cap}{warn}","windowBarLine":" └ {bar} сброс {when}","windowsHeader":"── Использование окна ───────────────","workingDir":"Рабочая директория","workingDirHint":"Необязательно. Оставьте пустым, чтобы использовать текущий рабочий каталог процесса (указан в поле); укажите путь только для фиксации конкретного расположения.","zdr":"Нулевое сохранение данных (ZDR)","zdrHint":"Отправлять запросы только через апстримы, которые не сохраняют системные промпты и ответы и никогда не обучаются на них (аналогично параметру CMD_ZDR=1 в CLI). Для некоторых моделей апстримы ZDR отсутствуют: запросы к таким моделям отклоняются, чтобы не нарушать защиту ZDR. Мощности ZDR тарифицируются по сквозным ставкам апстрима и обычно стоят дороже; индикация расходов продолжает показывать стандартные тарифы каталога. По умолчанию выключено."}}
1
+ {"commandcode":{"accountSeparator":"────────────────────","accountTitle":"📊 {label}{badges}","activeBadge":" ✅ активен","barLine":" └ {bar} {pct}%","blockedInvalidKey":"⛔ API-ключ недействителен или истёк — сервер отклонил запросы (401); проверьте ключ аккаунта","blockedNetwork":"⚠️ Не удалось подключиться к Command Code — проверьте сеть или адрес API","blockedServiceUnavailable":"⚠️ Сервис Command Code временно недоступен (5xx); повторите позже","cooldownBadge":" ⏳ охлаждение, сброс {when}","costLine":" 💰 Расход {money} ({credits} кредитов)","creditsHeader":"── Кредиты ──────────────────────────","errorText":"Не удалось получить статистику Command Code: {message}","exceededWarning":" ⚠️ превышен!","fiveHourLine":" ⏱ 5-часовое {used} / {cap}{warn}","imageGate":"В сессии уже есть изображения, а модель {model} не поддерживает изображения; выберите модель с поддержкой зрения или удалите изображения из сессии.","invalidCredentialBadge":" ⛔ неверный ключ","monthlyLine":" 💳 В месяц {monthly} (куплено {purchased} / бесплатно {free})","noData":"(нет данных — проверьте API-ключ)","partialFailures":"⚠️ Сбои на некоторых эндпоинтах: {list}","planLine":" 📦 Тариф {name}{status}{period}","planPeriodSuffix":" · окончание периода: {date}","rateLimitBadge":" ⏳ лимит запросов (ожидание окна)","requestsLine":" 💬 Запросы {n} / сбоев {f} успешность {r}%","resetSuffix":"сброс {when}","title":"📊 Использование Command Code{account}","tokensLine":" 🔤 Токены {in} вход / {out} выход","unconfigured":" (API-ключ не настроен)","usageHeader":"── Запросы ──────────────────────────","weeklyLine":" 📅 Недельное {used} / {cap}{warn}","windowBarLine":" └ {bar} сброс {when}","windowsHeader":"── Использование окна ───────────────"},"panel.commandcode":{"active":"Активен","close":"Закрыть","closeHint":"Вернуться к диалогу","coolingDown":"Охлаждение","credits":"Кредиты","errorGeneric":"Не удалось получить данные об использовании аккаунта","errorInvalidKey":"API-ключ недействителен или истёк","errorInvalidKeyHint":"Сервер отклонил все запросы (401). Проверьте ключ для этого аккаунта или сгенерируйте новый в консоли commandcode.ai.","errorInvalidResponse":"Не удалось прочитать ответ Command Code","errorInvalidResponseHint":"Ответы на запросы получены, но их тело не удалось разобрать. Проверьте HTTP-прокси хоста или декодирование ответа.","errorNetwork":"Не удалось связаться с сервисом Command Code","errorNetworkHint":"Запрос не достиг сервера. Проверьте сетевое подключение или настройку базового URL API.","errorServiceUnavailable":"Сервис Command Code временно недоступен","errorServiceUnavailableHint":"Сервер возвращает ошибки (5xx). Повторите попытку через минуту.","exceeded":"Превышен","exhausted":"Исчерпан","failed":"ошибок","fiveHour":"5-часовое окно","fiveHourShort":"5 ч","free":"Бесплатно","invalidKey":"Неверный ключ","limits":"Лимиты","loading":"Загрузка…","monthly":"Месячный лимит","monthlyLimit":"Месячный лимит","monthlyUsed":"Использовано за месяц","nav":"Command Code","noKey":"Ключ не настроен","noKeyHint":"Добавьте API-ключ Command Code в Настройках, чтобы отслеживать квоту и кредиты.","partial":"Частично","periodEnds":"Окончание периода","plan":"Тариф","purchased":"Приобретено","refresh":"Обновить","refreshing":"Обновление…","remaining":"Осталось","requests":"Запросы","resets":"Сброс через","spend":"Расходы","subtitle":"Тарифы, кредиты и плавающие окна квот","successRate":"Успешность","tokens":"Токены","tokensIn":"Входящие токены","tokensOut":"Исходящие токены","unavailable":"Недоступно","unconfigured":"Не настроено","updated":"Обновлено","usage":"Использование","weekly":"Недельное окно","weeklyShort":"7 дн","windowUnlimited":"Без ограничений"},"settings.commandcode":{"accountActionClearKey":"Удалить ключ","accountActionKey":"Вставить новый ключ","accountActionLogin":"Войти для получения нового ключа","accountActionPin":"Закрепить этот аккаунт","accountActionRemove":"Удалить аккаунт","accountActionRename":"Переименовать","accountActionUnpin":"Переключать автоматически","accountActions":"Действия с аккаунтом","accountAdd":"Добавить аккаунт","accountAddConfirm":"Добавить","accountAddHint":"Вход откроет страницу авторизации Command Code и добавит аккаунт после подтверждения; также можно просто вставить API-ключ.","accountAddLogin":"Войти","accountAddPaste":"Вставить ключ","accountApply":"Применить","accountClearKeyConfirm":"Удалить сохранённый ключ для аккаунта по умолчанию? Провайдер вернётся к переменным окружения или официальному входу через CLI.","accountConfirmClear":"Удалить","accountConfirmRemove":"Удалить","accountDefault":"Основной аккаунт","accountKey":"API-ключ","accountKeyHint":"API-ключ этого аккаунта. Если оставить поле пустым, сохранённый ключ останется без изменений.","accountKeyPlaceholder":"Вставьте API-ключ","accountLabel":"Название аккаунта","accountLoginAfterSave":"Нажмите «Сохранить» внизу страницы, затем войдите в эту учётную запись в браузере для получения ключа.","accountModeAuto":"Режим: автоматическое переключение (по списку)","accountModePinned":"Режим: закреплён за «{name}», с переключением при недоступности","accountModelOwner":"на {name}","accountModels":"Выделенные модели","accountModelsHint":"Эти модели отдают предпочтение данному аккаунту, но переключаются при его недоступности. Модель принадлежит одному аккаунту; выбор здесь перенесёт её с любого другого.","accountNameN":"Аккаунт {n}","accountNamePlaceholder":"Название (необязательно; при входе используется имя учётной записи)","accountNoKeyHint":"Ключ ещё не настроен: войдите через браузер или вставьте API-ключ, созданный в консоли commandcode.ai.","accountOpFailed":"Не удалось применить изменение аккаунта. Повторите попытку.","accountRemove":"Удалить","accountRemoveConfirm":"Удалить «{name}»? Сохранённый ключ и выделенные модели будут удалены вместе с ним.","accountSeparator":"────────────────────","accountStatusPinned":"Закреплён","accountTitle":"📊 {label}{badges}","accountsHint":"Когда активный аккаунт достигает лимита использования (429) или его ключ недействителен (401), запросы переключаются на следующий аккаунт; когда все аккаунты исчерпаны, ошибка указывает ближайшее время сброса окна.","accountsRotationHint":"Действия с аккаунтом применяются немедленно. Когда текущий аккаунт исчерпывает лимит использования или его ключ перестаёт работать, запросы переключаются на следующий рабочий аккаунт в порядке списка.","accountsTitle":"Смена аккаунта","activeAccount":"Активный аккаунт","activeAccountAuto":"Авто (первый доступный аккаунт)","activeAccountHint":"Закрепите предпочтительный аккаунт; применяется к следующему запросу после сохранения. Если выбранный аккаунт исчерпан, запросы будут перенаправлены на другой доступный аккаунт.","activeBadge":" ✅ активен","advancedInvalid":"Число в расширенных настройках не готово к сохранению; раскройте, чтобы исправить.","advancedOverriddenMany":"{count} настроено","advancedOverriddenOne":"1 настроенный","advancedSettings":"Дополнительно","advancedSettingsHint":"Редко используемые параметры: базовый URL API, рабочая директория, тайм-ауты и фильтрация моделей.","apiBase":"Базовый URL API","apiBaseHint":"По умолчанию используется https://api.commandcode.ai; обычно оставляйте как есть.","apiKey":"API-ключ","apiKeyHint":"Создайте его в консоли commandcode.ai. Если оставить это поле пустым, сохранённый ключ останется без изменений.","apiKeyLocked":"Ключ предоставлен только для чтения","apiKeySet":"Настроено","apiKeyUnset":"Не настроено","barLine":" └ {bar} {pct}%","blockedInvalidKey":"⛔ API-ключ недействителен или истёк — сервер отклонил запросы (401); проверьте ключ аккаунта","blockedNetwork":"⚠️ Не удалось подключиться к Command Code — проверьте сеть или адрес API","blockedServiceUnavailable":"⚠️ Сервис Command Code временно недоступен (5xx); повторите позже","cancel":"Отмена","cardConfiguredHint":"API-ключ готов. Чтобы заменить его, добавить ротацию аккаунтов, проверить использование или изменить базовый API, откройте страницу \"Command Code\" в Настройках.","cardLoadingHint":"Загрузка конфигурации Command Code…","cardRegistrationHint":"Эта карта предоставлена плагином Command Code; для отображения всех элементов управления требуется более новая версия DeepSeek Harness.","cardRouteActive":"Активный","cardTitle":"Command Code","commandGuard":"ИИ-контроль команд","commandGuardHint":"Перед запросом подтверждения shell-команды служба typesafe/jev оценивает её безопасность: безопасные команды выполняются без подтверждения, остальные запрашивают подтверждение как обычно. По умолчанию выключено.","commandGuardLevel":"Порог автоодобрения","commandGuardLevelHigh":"Высокий","commandGuardLevelHint":"Более высокий порог требует большей уверенности для пропуска подтверждения, поэтому запросов подтверждения будет больше. Высокий = 0.95, Средний = 0.9 (по умолчанию), Низкий = 0.8. Если оценка занимает более 3 секунд, отображается обычный запрос подтверждения.","commandGuardLevelLow":"Низкий","commandGuardLevelMedium":"Средний","commandGuardThreshold":"Порог автоподтверждения (0.5–1)","commandGuardThresholdHint":"Автоподтверждение срабатывает, если typesafe/jev оценивает безопасность команды с вероятностью не ниже этой; по умолчанию 0.9.","commandGuardTimeoutMs":"Таймаут оценки (мс, 200–10000)","commandGuardTimeoutMsHint":"Если typesafe/jev не отвечает вовремя, отображается обычный запрос подтверждения; по умолчанию 1500.","cooldownBadge":" ⏳ охлаждение, сброс {when}","costLine":" 💰 Расход {money} ({credits} кредитов)","creditsHeader":"── Кредиты ──────────────────────────","discard":"Отменить","errorText":"Не удалось получить статистику Command Code: {message}","exceededWarning":" ⚠️ превышен!","filterModelsByPlan":"Скрыть модели вне тарифного плана","filterModelsByPlanHint":"Если включено, в выборе моделей отображаются только те, что входят в вашу подписку; при наличии баланса кредитов по запросу показывается полный каталог.","fiveHourLine":" ⏱ 5-часовое {used} / {cap}{warn}","hide":"Скрыть","imageGate":"В сессии уже есть изображения, а модель {model} не поддерживает изображения; выберите модель с поддержкой зрения или удалите изображения из сессии.","integrationsTitle":"Интеграции и отображение","intro":"Настройте подключение к Command Code Provider. API-ключ сохраняется только в локальной службе учетных данных и никогда не отображается; остальные поля записываются в пользовательские настройки и вступают в силу при следующем запросе.","invalidCredentialBadge":" ⛔ неверный ключ","invalidNumber":"Недопустимый номер","loginButton":"Войдите в Command Code","loginCancel":"Отменить вход","loginCancelled":"Вход отменён.","loginDenied":"Доступ запрещён. Попробуйте снова или вставьте ключ вручную.","loginFailedGeneric":"Не удалось войти; попробуйте снова или вставьте ключ вручную.","loginHintIdle":"Не хотите создавать ключ вручную? Войдите в систему, и ваш браузер откроет страницу авторизации commandcode.ai; одобренный ключ сохранится в локальном сервисе учетных данных и будет применяться к следующему запросу.","loginInvalidKey":"Доставленный ключ не прошел проверку (401). Попробуйте снова или вставьте его вручную.","loginNetwork":"Не удалось подключиться к сервису Command Code для проверки ключа; проверьте подключение к сети и повторите попытку.","loginOpenLink":"Откройте страницу авторизации ↗","loginSaveBefore":"Сохраните изменения страницы перед входом в эту учётную запись.","loginStarting":"Запуск локального серверного обработчика callback…","loginStoreFailed":"Не удалось сохранить ключ в локальной службе учетных данных; вставьте его вручную.","loginSuccess":"Вошли как","loginTimeout":"Истекло время ожидания ответа авторизации; попробуйте снова.","loginTitle":"Войти, чтобы получить ключ","loginUnavailable":"Вход в систему недоступен в этой среде; вставьте {API key} вместо этого.","loginWaiting":"Ожидание авторизации в вашем браузере…","modelAllowance":"${amount}/мес","modelAllowanceTitle":"Ежемесячный лимит использования этой модели в USD. Все модели делят общий месячный пул — это не дополнительный кредит поверх тарифного плана.","modelCatalogFailed":"Не удалось загрузить каталог моделей; сохранённые настройки продолжают действовать.","modelCount":"Выбрано моделей: {count}","modelPick":"Выбрать модели…","modelSearchEmpty":"Подходящих моделей не найдено","modelSearchPlaceholder":"Поиск модели по имени или ID…","modelStale":"Устаревшая модель (не найдена в текущем каталоге)","modelsTitle":"Модели","monthlyLine":" 💳 В месяц {monthly} (куплено {purchased} / бесплатно {free})","nav":"Command Code","noData":"(нет данных — проверьте API-ключ)","numberTooLarge":"Превышено допустимое максимальное значение (2147483647 мс)","numberTooSmall":"Должно быть не менее 1 (мс)","offloadSeenImagesForCache":"Не отправлять повторно уже просмотренные изображения","offloadSeenImagesForCacheHint":"Только для CLI-транспорта. После ответа модели на изображение долговечно заменять старые пиксели текстом во избежание сброса кэша при поступлении нового изображения. Чтобы снова просмотреть старое изображение, модель должна перечитать файл либо пользователь должен прикрепить его заново. По умолчанию выключено.","overridden":"Переопределено","partialFailures":"⚠️ Сбои на некоторых эндпоинтах: {list}","planLine":" 📦 Тариф {name}{status}{period}","planPeriodSuffix":" · окончание периода: {date}","privacyTitle":"Конфиденциальность и безопасность","rateLimitBadge":" ⏳ лимит запросов (ожидание окна)","readOnly":"Настройки доступны только для чтения.","requestTimeoutMs":"Таймаут запроса (мс)","requestTimeoutMsHint":"Время ожидания первого байта ответа; по умолчанию 60000.","requestsLine":" 💬 Запросы {n} / сбоев {f} успешность {r}%","reset":"Сбросить","resetSuffix":"сброс {when}","ruleAccount":"Целевой аккаунт","ruleAdd":"Добавить правило","ruleHint":"Отметьте модели для маршрутизации в выпадающем списке (множественный выбор), затем выберите целевой аккаунт.","ruleModel":"Модели","ruleModelCount":"Выбрано моделей: {count}","ruleModelPick":"Выберите модели…","ruleRemove":"Удалить","rulesCatalogFailed":"Не удалось загрузить каталог моделей — выбор моделей недоступен; сохранённые правила продолжают действовать.","rulesEmpty":"Правил пока нет.","rulesHint":"Выберите модели (множественный выбор) и направьте их на конкретный аккаунт. Когда модель из запроса совпадает с правилом и аккаунт доступен, запрос обслуживается им; при исчерпании или недоступности аккаунта происходит откат к стандартной ротации. Правила проверяются по порядку сверху вниз — срабатывает первое совпадение.","rulesOrder":"Порядок правил","rulesTitle":"Правила маршрутизации моделей","rulesTotal":"Всего правил: {count}","save":"Сохранить","saveFailed":"Не удалось сохранить, попробуйте снова.","saveInvalid":"Исправьте выделенное поле перед сохранением","saved":"Сохранено ✓","saving":"Сохранение","show":"Показать","showSidebarQuota":"Показывать карточку квоты в боковой панели","showSidebarQuotaHint":"Когда включено, карточка тарифа и квоты Command Code располагается внизу боковой панели (над Настройками) и открывает полный дашборд. По умолчанию выключено: ничего не отображается слева и фоновый опрос не выполняется. Применяется при сохранении.","streamIdleTimeoutMs":"Таймаут простоя потока (мс)","streamIdleTimeoutMsHint":"Как долго зависший поток считается мёртвым; по умолчанию 300000 (намеренно щедро — модели с долгим обдумыванием могут молчать минутами).","title":"Command Code","tokensLine":" 🔤 Токены {in} вход / {out} выход","transportMaxRetries":"Повторные попытки транспорта","transportMaxRetriesHint":"Сколько раз соединение пытается повториться автоматически; по умолчанию 5 (интервалы 0.5+1+2+4+8с, ~15с всего). После этого выдаётся ошибка вместо дальнейшего экспоненциального ожидания. Значение 0 отключает повторы. Для ограничений частоты и ответов 5xx действует отдельный более длительный интервал.","unconfigured":" (API-ключ не настроен)","unsaved":"Не сохранено","unsavedChanges":"У вас есть несохранённые изменения","updateAvailable":"доступно обновление","updateHint":"Доступна новая версия; нажмите для просмотра заметок о выпуске. Уведомление исчезнет после обновления плагина.","usageActive":"Активно","usageCooldown":"Охлаждение","usageCost":"Потратить","usageError":"Не удалось получить данные об использовании","usageExceeded":"Превышено","usageFailed":"не удалось","usageFiveHour":"5-часовое окно","usageFree":"Бесплатно","usageHeader":"── Запросы ──────────────────────────","usageInvalidKey":"Неверный ключ","usageInvalidResponse":"Не удалось прочитать ответ Command Code","usageInvalidResponseHint":"Ответы на запросы получены, но их тело не удалось разобрать. Проверьте HTTP-прокси хоста или декодирование ответа.","usageKeyClear":"Очистить сохранённый ключ","usageKeyClearStaged":"Будет очищено при сохранении","usageKeyInvalid":"Неверный или просроченный API-ключ","usageKeyInvalidHint":"Сервер отклоняет все запросы (401). Проверьте ключ, настроенный для этого аккаунта, или создайте новый в консоли commandcode.ai.","usageLoading":"Получение данных об использовании аккаунта…","usageMonthly":"Ежемесячно","usageMonthlyLeft":"Остаток на месяц","usageNetworkError":"Не удалось подключиться к сервису Command Code","usageNetworkHint":"На сервер не поступило ни одного запроса. Проверьте подключение к сети или настройку базового API.","usageNoKey":"Настройте API-ключ, чтобы увидеть здесь данные об использовании и состоянии кредитов этого аккаунта.","usagePartial":"Некоторые данные конечной точки недоступны","usagePeriodEnd":"Период заканчивается","usagePurchased":"Куплено","usageRefresh":"Обновить","usageRefreshing":"Обновление…","usageRequests":"Запросы","usageReset":"Сбросить","usageServiceUnavailable":"Сервис Command Code временно недоступен","usageServiceUnavailableHint":"Сервер вернул ошибки (5xx); попробуйте обновить позже.","usageSuccessRate":"Уровень успеха","usageTitle":"Использование аккаунта","usageTokens":"Токены","usageTokensIn":"в","usageTokensOut":"выход","usageUnconfigured":"Для этого аккаунта ещё не настроен API-ключ.","usageUndoKeyClear":"Отменить очистку","usageUpdated":"Обновлено","usageWeekly":"Еженедельное окно","visibleModelsCleanStale":"Очистить устаревшие ({count})","visibleModelsCount":"Выбрано моделей: {count}","visibleModelsHideInactive":"Скрыть неактивные","visibleModelsHint":"Выберите модели, которые будут доступны для назначения правил маршрутизации","visibleModelsPick":"Выбрать модели","visibleModelsReset":"Сбросить выбор моделей","visibleModelsShowAll":"Показать все модели","visibleModelsStaleHint":"{count} выбранных моделей больше нет в каталоге (возможно, выведены из эксплуатации); на остальные модели это не влияет. Удалите их или сохраните.","visibleModelsTitle":"Видимые модели","webSearch":"Использовать Command Code для веб-поиска DSH","webSearchHint":"Если включено, инструмент web_search для модели работает через Command Code (тот же API-ключ и base URL, что и в чате). Если выключено, используется встроенный поиск DeepSeek.","weeklyLine":" 📅 Недельное {used} / {cap}{warn}","windowBarLine":" └ {bar} сброс {when}","windowsHeader":"── Использование окна ───────────────","workingDir":"Рабочая директория","workingDirHint":"Необязательно. Оставьте пустым, чтобы использовать текущий рабочий каталог процесса (указан в поле); укажите путь только для фиксации конкретного расположения.","zdr":"Нулевое сохранение данных (ZDR)","zdrHint":"Отправлять запросы только через апстримы, которые не сохраняют системные промпты и ответы и никогда не обучаются на них (аналогично параметру CMD_ZDR=1 в CLI). Для некоторых моделей апстримы ZDR отсутствуют: запросы к таким моделям отклоняются, чтобы не нарушать защиту ZDR. Мощности ZDR тарифицируются по сквозным ставкам апстрима и обычно стоят дороже; индикация расходов продолжает показывать стандартные тарифы каталога. По умолчанию выключено."}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-russian-lang",
3
- "version": "0.3.24",
3
+ "version": "0.3.26",
4
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.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",