From f0f776c310909ee758c215f2ae367cf1f97c5004 Mon Sep 17 00:00:00 2001
From: Diego Rodrigues de Sa e Souza
<8016841+diegosouzapw@users.noreply.github.com>
Date: Wed, 3 Jun 2026 08:04:17 -0300
Subject: [PATCH] fix(i18n): fill missing zh-CN and ru UI translations (#3026,
#3067) (#3103)
zh-CN and ru were each missing 9 whole sections (~823 keys: quotaPlans, activity, agentBridge, trafficInspector, cliCommon, cliCode, cliAgents, acpAgents, agentSkills) added after the last sweep, so those UI strings fell back to English. Filled via the canonical i18n sync+translate pipeline (scripts/i18n/sync-ui-keys.mjs --translate-markers). Both catalogs are now at full key parity with en.json (70 sections / 8025 keys), 0 __MISSING__ markers, valid JSON, Prettier-clean.
---
CHANGELOG.md | 1 +
src/i18n/messages/ru.json | 2334 +++++++++++++++++++++++-----------
src/i18n/messages/zh-CN.json | 1069 ++++++++++++++--
3 files changed, 2620 insertions(+), 784 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9a28591224..ec89baf291 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,6 +22,7 @@ _Development cycle in progress — entries are added as work merges into `releas
### 🔧 Bug Fixes
+- **i18n:** fill the missing Chinese (zh-CN) and Russian (ru) UI translations — both locales were missing 9 entire sections (`quotaPlans`, `activity`, `agentBridge`, `trafficInspector`, `cliCommon`, `cliCode`, `cliAgents`, `acpAgents`, `agentSkills`, ~823 keys each) added after the last translation sweep, so those buttons/labels rendered in English. Both catalogs are now at full key parity with `en.json` (8025 keys). ([#3026](https://github.com/diegosouzapw/OmniRoute/issues/3026), [#3067](https://github.com/diegosouzapw/OmniRoute/issues/3067))
- **dashboard:** fix "Ambiguous model" error in the provider Playground for vendor-namespaced models — the Playground only prefixed models without a `/`, so ids like `moonshotai/kimi-k2.6` or `nvidia/zyphra/zamba2-7b-instruct` (NVIDIA NIM) were sent bare and rejected when the same id exists under multiple providers. The Playground now always qualifies the selected model with its `providerId/` prefix (without double-prefixing). ([#3050](https://github.com/diegosouzapw/OmniRoute/issues/3050))
- **db:** stop accepting duplicate API keys for the same provider — `createProviderConnection` now dedups by the decrypted key value (not just by name), so re-adding the same key under a different/blank name updates the existing connection instead of inserting a second row. Whitespace-only differences also dedup. ([#3023](https://github.com/diegosouzapw/OmniRoute/issues/3023))
- **dashboard:** "Import from /models" now works for no-auth providers (e.g. OpenCode Free) — the button used to silently no-op because no-auth providers have no connection row, so `handleImportModels` returned early and the models route 404'd. The route now serves the provider's model catalog when called with a no-auth provider id, and the dashboard falls back to the provider id when there is no connection. ([#3047](https://github.com/diegosouzapw/OmniRoute/issues/3047))
diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json
index e02a89a9b0..66ff6e4635 100644
--- a/src/i18n/messages/ru.json
+++ b/src/i18n/messages/ru.json
@@ -54,8 +54,8 @@
"none": "Нет",
"yes": "Да",
"no": "Нет",
- "on": "__MISSING__:ON",
- "off": "__MISSING__:OFF",
+ "on": "ВКЛ.",
+ "off": "Выкл.",
"warning": "Предупреждение",
"note": "Примечание",
"free": "Бесплатно",
@@ -708,7 +708,8 @@
"batchFilesListSearchPlaceholder": "Поиск по идентификатору или имени файла…",
"batchFilesListFilesTable": "Файлы",
"batchPageLoadingMore": "Загрузка еще…",
- "recommended": "__MISSING__:Recommended",
+ "recommended": "Рекомендуется",
+ "understand": "Я понимаю",
"batchConceptTitle": "Batch processing",
"batchConceptSubtitle": "Process thousands of requests asynchronously at ~50% of the cost (24h window). Ideal for evaluations, classification, and embeddings.",
"batchConceptHowItWorks": "How it works",
@@ -773,36 +774,13 @@
"filesListUploadButton": "Upload",
"filesListUsedByColumn": "Used by",
"filesListUsedByNone": "None",
- "filesListDelete": "Delete",
- "filesListDownload": "Download",
- "batchDetailActionCancel": "Cancel batch",
- "batchDetailActionRetry": "Retry failed requests",
- "batchDetailCancelling": "Cancelling…",
- "batchDetailRetrying": "Preparing retry…",
- "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
- "batchActionCancelError": "Failed to cancel batch. Try again.",
- "batchActionRetryError": "Failed to retry failed requests. Try again.",
- "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
- "batchListProgressPartial": "(partial)",
"filesListSizeColumn": "Size",
+ "batchListProgressPartial": "(partial)",
"batchListProviderColumn": "Provider",
"batchListProviderUnknown": "—",
- "batchListBatchCreated": "Batch {id} created — refreshing list…",
- "batchListBatchCreatedDismiss": "Dismiss",
- "batchListRefreshing": "Refreshing…",
- "batchListRefresh": "Refresh",
- "uploadFileModalRemove": "Remove",
- "uploadFileModalUploading": "Uploading…",
- "wizardInputReading": "Reading file…",
- "wizardInputReady": "Ready",
- "wizardInputLargeFileLabel": "Large file — sampling validation",
- "wizardInputCsvJsonlReady": "JSONL generated — ready to validate.",
- "wizardInputLargeFileWarning": "Large file detected — validation runs by sampling (first 5 MB + last 100 KB). Full validation happens server-side.",
- "wizardCostWindow24h": "24h completion window",
- "wizardValidationFieldsOk": "required fields valid",
"batchListProviderOther": "Other",
"batchListTitle": "Batches",
"batchListCount": "{count} batches",
@@ -839,7 +817,30 @@
"wizardCostWindow": "Window",
"wizardDestinationSelectProvider": "Select a provider…",
"wizardDestinationSelectModel": "Select a model…",
- "wizardDestinationConnectProvider": "Connect a provider"
+ "wizardDestinationConnectProvider": "Connect a provider",
+ "batchListBatchCreated": "Batch {id} created — refreshing list…",
+ "batchListBatchCreatedDismiss": "Dismiss",
+ "batchListRefreshing": "Refreshing…",
+ "batchListRefresh": "Refresh",
+ "uploadFileModalRemove": "Remove",
+ "uploadFileModalUploading": "Uploading…",
+ "wizardInputReading": "Reading file…",
+ "wizardInputReady": "Ready",
+ "wizardInputLargeFileLabel": "Large file — sampling validation",
+ "wizardInputCsvJsonlReady": "JSONL generated — ready to validate.",
+ "wizardInputLargeFileWarning": "Large file detected — validation runs by sampling (first 5 MB + last 100 KB). Full validation happens server-side.",
+ "wizardCostWindow24h": "24h completion window",
+ "wizardValidationFieldsOk": "required fields valid",
+ "filesListDelete": "Delete",
+ "filesListDownload": "Download",
+ "batchDetailActionCancel": "Cancel batch",
+ "batchDetailActionRetry": "Retry failed requests",
+ "batchDetailCancelling": "Cancelling…",
+ "batchDetailRetrying": "Preparing retry…",
+ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
+ "batchActionCancelError": "Failed to cancel batch. Try again.",
+ "batchActionRetryError": "Failed to retry failed requests. Try again.",
+ "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
},
"sidebar": {
"home": "Главная",
@@ -870,8 +871,8 @@
"endpointsSubtitle": "URL-адреса вашего подключения к AI",
"apiManager": "Менеджер API",
"apiManagerSubtitle": "Управление ключами API и доступом",
- "embeddedServices": "__MISSING__:Embedded Services",
- "embeddedServicesSubtitle": "__MISSING__:Manage local proxy services",
+ "embeddedServices": "Встроенные Сервисы",
+ "embeddedServicesSubtitle": "Управление локальными прокси-сервисами",
"logs": "Журналы",
"webhooks": "Вебхуки",
"webhooksSubtitle": "Получайте уведомления о событиях",
@@ -978,7 +979,7 @@
"settingsAi": "AI Settings",
"settingsSecurity": "Security",
"settingsFeatureFlags": "Флаги функций",
- "settingsAuthz": "__MISSING__:Authz",
+ "settingsAuthz": "Authz",
"settingsRouting": "Routing",
"settingsResilience": "Resilience",
"settingsAdvanced": "Advanced",
@@ -1058,10 +1059,28 @@
"settingsFeatureFlagsSubtitle": "Переключить возможности системы",
"settingsSidebar": "Sidebar",
"settingsSidebarSubtitle": "Customize sidebar layout",
- "settingsAuthzSubtitle": "__MISSING__:Route inventory and bypass policy",
+ "settingsAuthzSubtitle": "Политика маршрутизации инвентаря и обхода",
"docsSubtitle": "Documentation",
"issuesSubtitle": "Report a bug",
- "changelogSubtitle": "Release notes"
+ "changelogSubtitle": "Release notes",
+ "costsQuotaPlans": "Планы и Квоты",
+ "costsQuotaPlansSubtitle": "Настройте планы по провайдеру",
+ "activity": "Активность",
+ "activitySubtitle": "Дружелюбная лента недавних событий",
+ "logsGroup": "Журналы",
+ "systemGroup": "Система",
+ "costsOverview": "Обзор",
+ "costsOverviewSubtitle": "Консолидированный анализ затрат",
+ "agentBridge": "Агентский Мост",
+ "agentBridgeSubtitle": "Перехват трафика агента IDE",
+ "trafficInspector": "Инспектор Трафика",
+ "trafficInspectorSubtitle": "Мониторинг вызовов LLM + отладка любого HTTPS-трафика",
+ "cliCode": "CLI Кодов",
+ "cliCodeSubtitle": "Инструменты кода, указывающие на OmniRoute",
+ "cliAgents": "CLI Агенты",
+ "cliAgentsSubtitle": "Автономные CLI-агенты",
+ "acpAgents": "Агенты ACP",
+ "acpAgentsSubtitle": "CLIs, запущенные OmniRoute"
},
"webhooks": {
"title": "Вебхуки",
@@ -1109,91 +1128,91 @@
"signatureTitle": "Подписи вебхуков",
"signatureDescription": "Каждая доставка включает заголовок X-Webhook-Signature, подписанный HMAC-SHA256 с использованием секрета веб-перехватчика. Проверьте подпись, прежде чем доверять полезной нагрузке.",
"wizard": {
- "cancel": "__MISSING__:Cancel",
- "step1Title": "__MISSING__:Select Integration",
- "step2Title": "__MISSING__:Configure Target",
- "step3Title": "__MISSING__:Events & Test",
- "back": "__MISSING__:Back",
- "next": "__MISSING__:Next",
- "finish": "__MISSING__:Finish",
- "step1Desc": "__MISSING__:Select the target integration system for this webhook."
+ "cancel": "Отменить",
+ "step1Title": "Выбрать интеграцию",
+ "step2Title": "Настроить Цель",
+ "step3Title": "События и тестирование",
+ "back": "Назад",
+ "next": "Далее",
+ "finish": "Завершить",
+ "step1Desc": "Выберите целевую интеграционную систему для этого вебхука."
},
"howItWorks": {
- "step1": "__MISSING__:Choose an integration provider (e.g. Slack, Discord, custom webhook) and set up the connection details.",
- "step2": "__MISSING__:Configure system events to subscribe to (e.g. completion errors, model fallbacks, or usage limits).",
- "step3": "__MISSING__:Verify the configuration by sending a test payload to make sure the endpoint receives it.",
- "step4": "__MISSING__:Secure your endpoint by validating the X-Webhook-Signature HMAC-SHA256 header using the webhook's secret.",
- "title": "__MISSING__:How Webhooks Work",
- "customOnly": "__MISSING__:Only applicable for custom endpoint integrations.",
- "hmacRecipeTitle": "__MISSING__:HMAC Verification Recipe",
- "hmacRecipe": "__MISSING__:To verify webhook payloads in Node.js, compute the HMAC-SHA256 of the raw request body using your secret key. Compare it to the X-Webhook-Signature header using timingSafeEqual.",
- "timeoutNote": "__MISSING__:Webhook deliveries have a timeout of 10 seconds.",
- "retryNote": "__MISSING__:Failed deliveries are retried up to 5 times with exponential backoff.",
- "docsLink": "__MISSING__:Read the full Webhooks developer guide",
- "hmacRecipePython": "__MISSING__:Python HMAC verification: hmac.new(secret, body, hashlib.sha256).hexdigest()",
- "hmacRecipeBash": "__MISSING__:Bash HMAC verification: echo -n \"$body\" | openssl dgst -sha256 -hmac \"$secret\""
+ "step1": "Выберите провайдера интеграции (например, Slack, Discord, пользовательский вебхук) и настройте детали подключения.",
+ "step2": "Настройте системные события для подписки (например, ошибки завершения, резервные модели или лимиты использования).",
+ "step3": "Проверьте конфигурацию, отправив тестовый полезный нагрузку, чтобы убедиться, что конечная точка ее получает.",
+ "step4": "Обеспечьте безопасность вашей конечной точки, проверяя заголовок X-Webhook-Signature HMAC-SHA256 с использованием секрета вебхука.",
+ "title": "Как работают вебхуки",
+ "customOnly": "Применимо только для интеграций с пользовательскими конечными точками.",
+ "hmacRecipeTitle": "Рецепт проверки HMAC",
+ "hmacRecipe": "Чтобы проверить полезные нагрузки вебхуков в Node.js, вычислите HMAC-SHA256 сырого тела запроса с использованием вашего секретного ключа. Сравните его с заголовком X-Webhook-Signature, используя timingSafeEqual.",
+ "timeoutNote": "Доставки вебхуков имеют тайм-аут в 10 секунд.",
+ "retryNote": "Неудачные доставки повторяются до 5 раз с экспоненциальным увеличением времени ожидания.",
+ "docsLink": "Прочитайте полный справочник разработчика по Webhooks",
+ "hmacRecipePython": "Python HMAC проверка: hmac.new(secret, body, hashlib.sha256).hexdigest()",
+ "hmacRecipeBash": "Проверка HMAC в Bash: echo -n \"$body\" | openssl dgst -sha256 -hmac \"$secret\""
},
"deliveries": {
- "title": "__MISSING__:Delivery Logs",
- "loadFailed": "__MISSING__:Failed to load webhook delivery logs.",
- "empty": "__MISSING__:No deliveries recorded yet. Trigger an event or send a test payload.",
- "status": "__MISSING__:Status",
- "event": "__MISSING__:Event",
- "latency": "__MISSING__:Latency",
- "at": "__MISSING__:Sent At"
+ "title": "Журналы Доставки",
+ "loadFailed": "Не удалось загрузить журналы доставки вебхуков.",
+ "empty": "Пока нет зафиксированных доставок. Запустите событие или отправьте тестовую нагрузку.",
+ "status": "Статус",
+ "event": "Событие",
+ "latency": "Задержка",
+ "at": "Отправлено в"
},
"kinds": {
- "comingSoon": "__MISSING__:Coming Soon",
- "slack": "__MISSING__:Slack",
- "slackDesc": "__MISSING__:Post system events directly into a Slack channel",
- "telegram": "__MISSING__:Telegram",
- "telegramDesc": "__MISSING__:Send event messages using a Telegram bot",
- "discord": "__MISSING__:Discord",
- "discordDesc": "__MISSING__:Deliver real-time updates directly to a Discord server",
- "custom": "__MISSING__:Custom Webhook",
- "customDesc": "__MISSING__:Deliver system event payloads to any HTTPS endpoint",
- "email": "__MISSING__:Email Notification",
- "emailDesc": "__MISSING__:Receive summary updates via email",
- "pagerduty": "__MISSING__:PagerDuty",
- "pagerdutyDesc": "__MISSING__:Trigger alerts on PagerDuty for critical system issues",
- "teams": "__MISSING__:Microsoft Teams",
- "teamsDesc": "__MISSING__:Forward system notifications to Microsoft Teams channels"
+ "comingSoon": "Скоро будет",
+ "slack": "Slack",
+ "slackDesc": "Публикуйте системные события напрямую в канал Slack",
+ "telegram": "Телеграм",
+ "telegramDesc": "Отправляйте сообщения о событиях с помощью бота Telegram",
+ "discord": "Discord",
+ "discordDesc": "Доставляйте обновления в реальном времени прямо на сервер Discord",
+ "custom": "Пользовательский вебхук",
+ "customDesc": "Доставлять полезные нагрузки системных событий на любой HTTPS-эндпоинт",
+ "email": "Уведомление по электронной почте",
+ "emailDesc": "Получать обновления сводки по электронной почте",
+ "pagerduty": "PagerDuty",
+ "pagerdutyDesc": "Запускать оповещения в PagerDuty для критических системных проблем",
+ "teams": "Microsoft Teams",
+ "teamsDesc": "Перенаправить системные уведомления в каналы Microsoft Teams"
},
- "testPayloadSent": "__MISSING__:Test Payload Sent",
- "testResponse": "__MISSING__:Test Response",
+ "testPayloadSent": "Тестовый полезный нагрузка отправлена",
+ "testResponse": "Тестовый ответ",
"validateUrl": {
- "checking": "__MISSING__:Checking URL...",
- "ok": "__MISSING__:URL is valid",
- "blockedPrivate": "__MISSING__:URL is a blocked private address",
- "invalidUrl": "__MISSING__:Invalid URL format"
+ "checking": "Проверка URL...",
+ "ok": "URL действителен",
+ "blockedPrivate": "URL является заблокированным частным адресом",
+ "invalidUrl": "Неверный формат URL"
},
"custom": {
- "endpointUrl": "__MISSING__:Endpoint URL",
- "endpointUrlPlaceholder": "__MISSING__:https://api.yourdomain.com/webhook",
- "secretKey": "__MISSING__:Secret Key",
- "secretKeyPlaceholder": "__MISSING__:Enter secret key or leave blank to auto-generate",
- "secretKeyHint": "__MISSING__:Used to sign the payload header for authentication."
+ "endpointUrl": "URL конечной точки",
+ "endpointUrlPlaceholder": "https://api.yourdomain.com/webhook",
+ "secretKey": "Секретный ключ",
+ "secretKeyPlaceholder": "Введите секретный ключ или оставьте пустым для автоматической генерации",
+ "secretKeyHint": "Используется для подписи заголовка полезной нагрузки для аутентификации."
},
"discord": {
- "webhookUrl": "__MISSING__:Discord Webhook URL",
- "webhookUrlPlaceholder": "__MISSING__:https://discord.com/api/webhooks/...",
- "webhookUrlHint": "__MISSING__:The webhook URL copied from your Discord channel integration settings.",
- "tutorial": "__MISSING__:How to create a Discord webhook:"
+ "webhookUrl": "URL вебхука Discord",
+ "webhookUrlPlaceholder": "https://discord.com/api/webhooks/...",
+ "webhookUrlHint": "URL вебхука, скопированная из настроек интеграции вашего канала Discord.",
+ "tutorial": "Как создать вебхук Discord:"
},
"slack": {
- "webhookUrl": "__MISSING__:Slack Webhook URL",
- "webhookUrlPlaceholder": "__MISSING__:https://hooks.slack.com/services/...",
- "webhookUrlHint": "__MISSING__:The webhook URL copied from your Slack Incoming Webhooks integration.",
- "tutorial": "__MISSING__:How to create a Slack webhook:"
+ "webhookUrl": "URL вебхука Slack",
+ "webhookUrlPlaceholder": "https://hooks.slack.com/services/...",
+ "webhookUrlHint": "URL вебхука, скопированная из вашей интеграции Slack Incoming Webhooks.",
+ "tutorial": "Как создать вебхук Slack:"
},
"telegram": {
- "botToken": "__MISSING__:Telegram Bot Token",
- "botTokenPlaceholder": "__MISSING__:123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
- "botTokenHint": "__MISSING__:The HTTP API token received from @BotFather when creating your bot.",
- "chatId": "__MISSING__:Telegram Chat ID / Channel",
- "chatIdPlaceholder": "__MISSING__:-100123456789 or @channelname",
- "chatIdHint": "__MISSING__:The unique numerical identifier or public username of the chat/channel.",
- "tutorial": "__MISSING__:How to configure Telegram webhook:"
+ "botToken": "Токен бота Telegram",
+ "botTokenPlaceholder": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
+ "botTokenHint": "Токен HTTP API, полученный от @BotFather при создании вашего бота.",
+ "chatId": "ID чата Telegram / Канал",
+ "chatIdPlaceholder": "-100123456789 или @channelname",
+ "chatIdHint": "Уникальный числовой идентификатор или публичное имя пользователя чата/канала.",
+ "tutorial": "Как настроить вебхук Telegram:"
}
},
"compliance": {
@@ -1262,7 +1281,47 @@
"a2aEvents": "События",
"a2aArtifacts": "Артефакты",
"a2aNoTasks": "Задачи A2A не зарегистрированы.",
- "a2aLoadingTasks": "Загрузка задач A2A..."
+ "a2aLoadingTasks": "Загрузка задач A2A...",
+ "actor": "Актер",
+ "actorPlaceholder": "Фильтровать по актеру",
+ "eventTypes": {
+ "apiKey.activate": "Ключ API активирован",
+ "apiKey.ban": "Ключ API заблокирован",
+ "apiKey.deactivate": "Ключ API деактивирован",
+ "apiKey.regenerate": "Ключ API восстановлен",
+ "apiKey.scopes.grant": "Предоставленные области ключа API",
+ "apiKey.scopes.revoke": "Области API-ключа отозваны",
+ "apiKey.scopes.update": "Области ключа API обновлены",
+ "apiKey.unban": "API Ключ Разблокирован",
+ "auth.login.error": "Ошибка входа",
+ "auth.login.failed": "Не удалось войти",
+ "auth.login.locked": "Вход заблокирован",
+ "auth.login.misconfigured": "Ошибка конфигурации входа",
+ "auth.login.setup_required": "Требуется настройка входа",
+ "auth.login.success": "Успешный вход",
+ "auth.logout.success": "Успешный выход",
+ "compliance.cleanup": "Очистка соответствия",
+ "provider.credentials.applied": "Учетные данные поставщика применены",
+ "provider.credentials.batch_revoked": "Учетные данные поставщика отозваны批量",
+ "provider.credentials.bulk_created": "Учетные данные поставщика созданы массово",
+ "provider.credentials.bulk_imported": "Учетные данные поставщика массово импортированы",
+ "provider.credentials.created": "Учетные данные провайдера созданы",
+ "provider.credentials.imported": "Учетные данные поставщика импортированы",
+ "provider.credentials.revoked": "Учетные данные провайдера отозваны",
+ "provider.credentials.updated": "Учетные данные провайдера обновлены",
+ "provider.validation.ssrf_blocked": "Провайдер SSRF заблокирован",
+ "quota.plan.updated": "План квоты обновлён",
+ "quota.pool.created": "Создан пул квот",
+ "quota.pool.deleted": "Пул квот удалён",
+ "quota.pool.updated": "Квота пула обновлена",
+ "quota.store.driver_changed": "Драйвер хранилища квот изменен",
+ "server.start": "Запуск сервера",
+ "service.reveal_api_key": "Ключ API сервиса раскрыт",
+ "settings.update": "Настройки обновлены",
+ "settings.update_failed": "Не удалось обновить настройки",
+ "sync.token.created": "Токен синхронизации создан",
+ "sync.token.revoked": "Токен синхронизации отозван"
+ }
},
"themesPage": {
"title": "Темы",
@@ -1371,7 +1430,8 @@
"settingsResilienceDescription": "Circuit breaker, retry, and fallback configuration",
"settingsAdvancedDescription": "Advanced payload rules, request limits, and proxy API settings",
"mitmProxyDescription": "Configure MITM proxy settings for traffic inspection and debugging",
- "oneProxyDescription": "Configure 1Proxy settings for advanced proxy chaining"
+ "oneProxyDescription": "Configure 1Proxy settings for advanced proxy chaining",
+ "omniSkillsDescription": "Установите и управляйте песочными навыками для автоматизированного выполнения запросов и инструментов"
},
"home": {
"quickStart": "Быстрый старт",
@@ -1416,81 +1476,81 @@
},
"analytics": {
"title": "Аналитика",
- "usageAnalyticsTitle": "__MISSING__:Usage Analytics",
+ "usageAnalyticsTitle": "Аналитика использования",
"diversityScoreTitle": "Разнообразие поставщиков",
- "diversityScoreDesc": "__MISSING__:Provider concentration snapshot for the recent traffic window.",
- "diversityShannonEntropy": "__MISSING__:Shannon entropy",
- "diversityWindow": "__MISSING__:Window: {count} reqs · Last {mins} mins",
- "diversityHealthy": "__MISSING__:Healthy Distribution",
- "diversityRiskHigh": "__MISSING__:High Vendor Lock-in Risk",
- "diversityRiskModerate": "__MISSING__:Moderate Distribution",
- "diversityScoreLabel": "__MISSING__:score",
- "diversityHigherExplanation": "__MISSING__:Higher values mean traffic is spread across multiple providers.",
- "diversityNoData": "__MISSING__:No recent usage data available.",
- "chartRequests": "__MISSING__:Requests",
- "chartInput": "__MISSING__:Input",
- "chartOutput": "__MISSING__:Output",
- "chartTotal": "__MISSING__:Total",
- "chartCost": "__MISSING__:Cost",
- "chartShare": "__MISSING__:Share",
- "chartServiceTier": "__MISSING__:Service Tier",
- "chartServiceTierSplit": "__MISSING__:Fast / Standard cost split",
- "chartCostPct": "__MISSING__:{pct}% of cost",
- "chartUsageDetail": "__MISSING__:Usage Detail",
- "chartCacheRead": "__MISSING__:Cache read",
- "chartCostByProvider": "__MISSING__:Cost by Provider",
- "chartNoCostData": "__MISSING__:No cost data",
- "chartModelUsageOverTime": "__MISSING__:Model Usage Over Time",
- "chartNoData": "__MISSING__:No data",
- "chartWeekly": "__MISSING__:Weekly",
- "chartModelBreakdown": "__MISSING__:Model Breakdown",
- "chartModel": "__MISSING__:Model",
- "chartProvider": "__MISSING__:Provider",
- "chartProviderBreakdown": "__MISSING__:Provider Breakdown",
- "filterAllKeys": "__MISSING__:All Keys",
- "filterSearchKeys": "__MISSING__:Search keys…",
- "filterNoKeysMatch": "__MISSING__:No keys match",
- "filterOneKey": "__MISSING__:1 key",
- "filterMultipleKeys": "__MISSING__:{count} keys",
- "rangeToday": "__MISSING__:Today",
- "rangeYesterday": "__MISSING__:Yesterday",
- "rangeLast3Days": "__MISSING__:Last 3 days",
- "rangeThisWeek": "__MISSING__:This week",
- "rangeLast14Days": "__MISSING__:Last 14 days",
- "rangeThisMonth": "__MISSING__:This month",
- "rangeQuickSelect": "__MISSING__:Quick Select",
- "rangeStart": "__MISSING__:Start",
- "rangeEnd": "__MISSING__:End",
- "rangeCancel": "__MISSING__:Cancel",
- "rangeApply": "__MISSING__:Apply",
- "rangeErrorInvalid": "__MISSING__:Start must be before end",
- "period1D": "__MISSING__:1D",
- "period7D": "__MISSING__:7D",
- "period30D": "__MISSING__:30D",
- "period90D": "__MISSING__:90D",
- "periodYTD": "__MISSING__:YTD",
- "periodAll": "__MISSING__:All",
- "totalTokens": "__MISSING__:Total Tokens",
- "inputTokens": "__MISSING__:Input Tokens",
- "outputTokens": "__MISSING__:Output Tokens",
- "estCost": "__MISSING__:Est. Cost",
- "infraTitle": "__MISSING__:Infrastructure",
- "infraAccounts": "__MISSING__:Accounts",
- "infraProviders": "__MISSING__:Providers",
- "infraApiKeys": "__MISSING__:API Keys",
- "infraModels": "__MISSING__:Models",
- "perfTitle": "__MISSING__:Performance",
- "perfAvgTokens": "__MISSING__:Avg Tokens/Req",
- "perfCostReq": "__MISSING__:Cost/Req",
- "perfIoRatio": "__MISSING__:I/O Ratio",
- "perfFastReq": "__MISSING__:Fast Requests",
- "highlightsTitle": "__MISSING__:Highlights",
- "highlightsTopModel": "__MISSING__:Top Model",
- "highlightsTopProvider": "__MISSING__:Top Provider",
- "highlightsBusiestDay": "__MISSING__:Busiest Day",
- "highlightsDiversity": "__MISSING__:Diversity",
- "highlightsFallbackRate": "__MISSING__:Fallback Rate",
- "customRange": "__MISSING__:Custom",
+ "diversityScoreDesc": "Снимок концентрации провайдеров за недавний временной интервал трафика.",
+ "diversityShannonEntropy": "Энтропия Шеннона",
+ "diversityWindow": "Окно: {count} запросов · Последние {mins} мин",
+ "diversityHealthy": "Здоровое распределение",
+ "diversityRiskHigh": "Высокий риск привязки к поставщику",
+ "diversityRiskModerate": "Умеренное распределение",
+ "diversityScoreLabel": "счет",
+ "diversityHigherExplanation": "Более высокие значения означают, что трафик распределяется между несколькими провайдерами.",
+ "diversityNoData": "Нет доступных данных о недавнем использовании.",
+ "chartRequests": "Запросы",
+ "chartInput": "Ввод",
+ "chartOutput": "Вывод",
+ "chartTotal": "Итого",
+ "chartCost": "Стоимость",
+ "chartShare": "Поделиться",
+ "chartServiceTier": "Уровень обслуживания",
+ "chartServiceTierSplit": "Быстрый / Стандартный раздел затрат",
+ "chartCostPct": "{pct}% от стоимости",
+ "chartUsageDetail": "Детали использования",
+ "chartCacheRead": "Чтение кэша",
+ "chartCostByProvider": "Стоимость по Провайдеру",
+ "chartNoCostData": "Нет данных о стоимости",
+ "chartModelUsageOverTime": "Использование модели с течением времени",
+ "chartNoData": "Нет данных",
+ "chartWeekly": "Еженедельно",
+ "chartModelBreakdown": "Разбор Модели",
+ "chartModel": "Модель",
+ "chartProvider": "Поставщик",
+ "chartProviderBreakdown": "Разбивка по провайдерам",
+ "filterAllKeys": "Все ключи",
+ "filterSearchKeys": "Поиск ключей…",
+ "filterNoKeysMatch": "Нет совпадающих ключей",
+ "filterOneKey": "1 ключ",
+ "filterMultipleKeys": "{count} ключей",
+ "rangeToday": "Сегодня",
+ "rangeYesterday": "Вчера",
+ "rangeLast3Days": "Последние 3 дня",
+ "rangeThisWeek": "На этой неделе",
+ "rangeLast14Days": "Последние 14 дней",
+ "rangeThisMonth": "Этот месяц",
+ "rangeQuickSelect": "Быстрый выбор",
+ "rangeStart": "Начать",
+ "rangeEnd": "Конец",
+ "rangeCancel": "Отменить",
+ "rangeApply": "Применить",
+ "rangeErrorInvalid": "Начало должно быть раньше конца",
+ "period1D": "1D",
+ "period7D": "7D",
+ "period30D": "30Д",
+ "period90D": "90D",
+ "periodYTD": "Год к дате",
+ "periodAll": "Все",
+ "totalTokens": "Всего токенов",
+ "inputTokens": "Входные токены",
+ "outputTokens": "Токены вывода",
+ "estCost": "Ориентировочная стоимость",
+ "infraTitle": "Инфраструктура",
+ "infraAccounts": "Учетные записи",
+ "infraProviders": "Поставщики",
+ "infraApiKeys": "API ключи",
+ "infraModels": "Модели",
+ "perfTitle": "Производительность",
+ "perfAvgTokens": "Среднее количество токенов/запрос",
+ "perfCostReq": "Стоимость/Запрос",
+ "perfIoRatio": "Соотношение Ввод/Вывод",
+ "perfFastReq": "Быстрые запросы",
+ "highlightsTitle": "Основные моменты",
+ "highlightsTopModel": "Топ Модель",
+ "highlightsTopProvider": "Лучший Провайдер",
+ "highlightsBusiestDay": "Самый Загруженный День",
+ "highlightsDiversity": "Разнообразие",
+ "highlightsFallbackRate": "Коэффициент резервирования",
+ "customRange": "Пользовательский",
"overviewDescription": "Отслеживайте шаблоны использования API, потребление токенов, затраты и тенденции активности среди всех поставщиков и моделей.",
"evalsDescription": "Запустите оценочные пакеты для тестирования и проверки конечных точек LLM. Сравнивайте качество модели, обнаруживайте регрессии и измеряйте задержку тестирования.",
"overview": "Обзор",
@@ -1607,11 +1667,16 @@
"keyCreatedNote": "Скопируйте и сохраните этот ключ сейчас — он больше не будет отображаться.",
"done": "Готово",
"savePermissions": "Сохранить разрешения",
- "endpointRestrictions": "__MISSING__:Allowed Endpoints",
- "allEndpointsAllowed": "__MISSING__:This key can access all API endpoints.",
- "endpointsRestricted": "__MISSING__:Restricted to {count} endpoint{count, plural, one {} other {s}}.",
+ "endpointRestrictions": "Allowed Endpoints",
+ "allEndpointsAllowed": "This key can access all API endpoints.",
+ "endpointsRestricted": "Restricted to {count} endpoint{count, plural, one {} other {s}}.",
"autoResolve": "Авторазрешение",
"autoResolveDesc": "Автоматически сопоставлять неоднозначные имена моделей с нативным провайдером для этого API-ключа.",
+ "streamDefaultMode": "Совместимость по умолчанию для потока",
+ "streamDefaultModeDesc": "Управление пропущенными флагами `stream` для этого ключа. Режим JSON возвращает нестриминговые ответы, если клиент явно не запрашивает SSE.",
+ "streamDefaultLegacy": "Унаследованный",
+ "streamDefaultJson": "Совместимый с JSON",
+ "streamDefaultBadge": "JSON поток по умолчанию",
"keyActive": "Ключ активен",
"keyActiveDesc": "Включить или отключить этот API-ключ. Отключённые ключи сразу отклоняются с 403.",
"accessSchedule": "Расписание доступа",
@@ -1683,24 +1748,27 @@
"expirationDate": "Срок годности",
"managementAccess": "Доступ к управлению",
"allowedConnections": "Разрешенные соединения",
- "searchPlaceholder": "__MISSING__:Search by name or token...",
- "activeOnly": "__MISSING__:Active only",
- "filterStatus": "__MISSING__:STATUS",
- "filterType": "__MISSING__:TYPE",
- "filterAll": "__MISSING__:All",
- "filterStatusActive": "__MISSING__:Active",
- "filterStatusDisabled": "__MISSING__:Disabled",
- "filterStatusBanned": "__MISSING__:Banned",
- "filterStatusExpired": "__MISSING__:Expired",
- "filterTypeStandard": "__MISSING__:Standard",
- "filterTypeManage": "__MISSING__:Manage",
- "filterTypeRestricted": "__MISSING__:Restricted",
- "shownOf": "__MISSING__:{shown} of {total} shown",
- "emptyFilterTitle": "__MISSING__:No keys match your filters",
- "emptyFilterClear": "__MISSING__:Clear filters",
- "endpointRestrictions": "Allowed Endpoints",
- "allEndpointsAllowed": "This key can access all API endpoints.",
- "endpointsRestricted": "Restricted to {count} endpoint{count, plural, one {} other {s}}."
+ "searchPlaceholder": "Поиск по имени или токену...",
+ "activeOnly": "Только активные",
+ "filterStatus": "СТАТУС",
+ "filterType": "ТИП",
+ "filterAll": "Все",
+ "filterStatusActive": "Активный",
+ "filterStatusDisabled": "Отключено",
+ "filterStatusBanned": "Заблокировано",
+ "filterStatusExpired": "Истек срок действия",
+ "filterTypeStandard": "Стандартный",
+ "filterTypeManage": "Управление",
+ "filterTypeRestricted": "Ограниченный",
+ "shownOf": "{shown} из {total} показано",
+ "emptyFilterTitle": "Нет ключей, соответствующих вашим фильтрам",
+ "emptyFilterClear": "Сбросить фильтры",
+ "disableNonPublicModels": "Отключить непубличные модели",
+ "disableNonPublicModelsDesc": "Отклонять запросы на модели, которые не обнаружены или не помечены как общедоступные в каталоге провайдера",
+ "normalKeysSection": "Обычные клавиши",
+ "quotaKeysSection": "Ключи квоты",
+ "quotaPill": "КВОТА",
+ "quotaModeOnly": "qtSd-only"
},
"auditLog": {
"title": "Журнал аудита",
@@ -1739,22 +1807,22 @@
"videoDescription": "Создавайте видео с AnimateDiff, Stable Video Diffusion через ComfyUI или SD WebUI.",
"musicDescription": "Создавайте музыку с помощью Stable Audio Open или MusicGen через ComfyUI.",
"kinds": {
- "embedding": "__MISSING__:Embedding",
- "image": "__MISSING__:Image",
- "imageToText": "__MISSING__:Image to Text",
- "tts": "__MISSING__:Text to Speech",
- "stt": "__MISSING__:Speech to Text",
- "webSearch": "__MISSING__:Web Search",
- "webFetch": "__MISSING__:Web Fetch",
- "video": "__MISSING__:Video",
- "music": "__MISSING__:Music"
+ "embedding": "Встраивание",
+ "image": "Изображение",
+ "imageToText": "Изображение в текст",
+ "tts": "Текст в Речь",
+ "stt": "Речь в текст",
+ "webSearch": "Веб-поиск",
+ "webFetch": "Веб-извлечение",
+ "video": "Видео",
+ "music": "Музыка"
},
- "noProviders": "__MISSING__:No providers configured for this kind yet.",
- "addConnection": "__MISSING__:Add Connection",
- "backToProviders": "__MISSING__:Back to Providers",
- "connections": "__MISSING__:{count} Connections",
- "noConnections": "__MISSING__:No connections yet — add one from the provider page.",
- "loading": "__MISSING__:Loading..."
+ "noProviders": "Для этого типа еще не настроены провайдеры.",
+ "addConnection": "Добавить соединение",
+ "backToProviders": "Назад к Провайдерам",
+ "connections": "{count} Подключения",
+ "noConnections": "Пока нет подключений — добавьте одно на странице провайдера.",
+ "loading": "Загрузка..."
},
"search": {
"searchQuery": "Поисковый запрос",
@@ -2027,7 +2095,7 @@
"amp": "Use when you want Amp CLI routed through OmniRoute with stable shorthand aliases and OpenAI-compatible setup.",
"qwen": "Use when you want Qwen Code CLI with OmniRoute-managed provider settings and multi-provider model access.",
"hermes": "Используйте, когда вам нужен легкий помощник с искусственным интеллектом, встроенный в терминал, для быстрых задач.",
- "hermes-agent": "__MISSING__:Use when you need Hermes Agent (by Nousresearch) with default, delegation, vision and auxiliary models routed through OmniRoute.",
+ "hermes-agent": "Используйте, когда вам нужен Hermes Agent (от Nousresearch) с моделями по умолчанию, делегирования, видения и вспомогательными, маршрутизированными через OmniRoute.",
"custom": "Используйте для пользовательских реализаций инструментов или общих конфигураций, совместимых с OpenAI."
},
"toolDescriptions": {
@@ -2047,7 +2115,7 @@
"qwen": "Alibaba Qwen Code CLI",
"amp": "Sourcegraph Amp coding assistant CLI",
"hermes": "Помощник по терминалу Hermes AI",
- "hermes-agent": "__MISSING__:Hermes Agent (by Nousresearch) - Advanced terminal AI with multi-model support (delegation, vision, compression, etc.)",
+ "hermes-agent": "Агент Hermes (от Nousresearch) - Продвинутый терминальный ИИ с поддержкой нескольких моделей (делегирование, зрение, сжатие и т.д.)",
"custom": "Универсальный генератор конфигурации CLI или SDK, совместимый с OpenAI."
},
"guides": {
@@ -2434,17 +2502,17 @@
"recommendationsApplied": "Рекомендации применены к этому комбо.",
"intelligentPanelTitle": "Intelligent Routing Dashboard",
"intelligentPanelDesc": "Real-time scoring and health status for this auto-routing combo.",
- "configOnlyStatus": "__MISSING__:Configuration View",
- "configOnlyHint": "__MISSING__:This panel shows routing inputs only. Live breaker state is available on the Health page.",
- "routingInputs": "__MISSING__:Routing Inputs",
- "routingInputsHint": "__MISSING__:Mode pack and weighting stay here; breaker runtime state stays on the Health page.",
- "emailVisibilityHint": "__MISSING__:Account emails here follow the global privacy toggle.",
- "emailVisibilityTooltip": "__MISSING__:Use the eye icon to reveal or hide account emails globally across combos, providers and quota screens.",
- "manualModel": "__MISSING__:Manual model",
- "manualModelInvalid": "__MISSING__:Enter a model as provider/model.",
- "manualModelUnknownProvider": "__MISSING__:Unknown provider prefix.",
- "builderDynamicAccountShort": "__MISSING__:Dynamic account",
- "builderNeedValidName": "__MISSING__:Define a valid combo name before continuing.",
+ "configOnlyStatus": "Представление конфигурации",
+ "configOnlyHint": "Эта панель показывает только входные данные маршрутизации. Состояние автоматического выключателя в реальном времени доступно на странице состояния.",
+ "routingInputs": "Маршрутизация Входов",
+ "routingInputsHint": "Режим упаковки и вес остаются здесь; состояние выполнения размыкателя остается на странице состояния.",
+ "emailVisibilityHint": "Электронные адреса аккаунтов здесь следуют глобальному переключателю конфиденциальности.",
+ "emailVisibilityTooltip": "Используйте значок глаза, чтобы показать или скрыть адреса электронной почты аккаунта глобально на экранах комбинаций, провайдеров и квот.",
+ "manualModel": "Ручная модель",
+ "manualModelInvalid": "Введите модель в формате provider/model.",
+ "manualModelUnknownProvider": "Неизвестный префикс провайдера.",
+ "builderDynamicAccountShort": "Динамический аккаунт",
+ "builderNeedValidName": "Определите допустимое имя комбо перед продолжением.",
"statusOverview": "Status Overview",
"normalOperation": "Normal Operation",
"allProvidersHealthy": "Providers are reporting healthy routing conditions.",
@@ -2755,7 +2823,7 @@
"currentPeriod": "Текущая половина",
"exportCSV": "Экспортировать в формате CSV",
"exportJSON": "Экспортировать в формате JSON",
- "legacyFreeLabel": "__MISSING__:Legacy / Free",
+ "legacyFreeLabel": "Устаревший / Бесплатный",
"costExplorerTitle": "Обозреватель затрат",
"costExplorerDescription": "Изучайте расходы по поставщику, модели, ключу API, аккаунту или уровню сервиса.",
"groupProvider": "Поставщик",
@@ -2763,14 +2831,14 @@
"groupApiKey": "Ключ API",
"groupAccount": "Аккаунт",
"groupServiceTier": "Уровень сервиса",
- "serviceTierFast": "__MISSING__:Fast",
- "serviceTierFlex": "__MISSING__:Flex",
- "serviceTierStandard": "__MISSING__:Standard",
- "serviceTierBreakdownTitle": "__MISSING__:Service Tier",
- "serviceTierBreakdownSubtitle": "__MISSING__:Fast / Flex / Standard split",
- "serviceTierUsageSaved": "__MISSING__:usage saved",
- "serviceTierCostSaved": "__MISSING__:saved",
- "serviceTierCostShareSuffix": "__MISSING__:of cost",
+ "serviceTierFast": "Быстрый",
+ "serviceTierFlex": "Флекс",
+ "serviceTierStandard": "Стандартный",
+ "serviceTierBreakdownTitle": "Уровень обслуживания",
+ "serviceTierBreakdownSubtitle": "Быстрый / Гибкий / Стандартный сплит",
+ "serviceTierUsageSaved": "использование сохранено",
+ "serviceTierCostSaved": "сохранено",
+ "serviceTierCostShareSuffix": "стоимость",
"dimension": "Измерение",
"share": "Доля",
"legacyOrFree": "Устаревшее / бесплатно",
@@ -2983,16 +3051,16 @@
"localServer": "Локальный сервер",
"cloudOmniroute": "Облачный OmniRoute",
"copyUrl": "Копировать URL",
- "badgeLoopbackTooltip": "__MISSING__:This endpoint is only accessible locally (loopback only)",
- "badgeAlwaysProtectedTooltip": "__MISSING__:This endpoint is always protected and requires authorization",
- "badgeInternalTooltip": "__MISSING__:This is an internal system endpoint",
- "tierAll": "__MISSING__:All",
- "tierAuth": "__MISSING__:Authenticated",
- "tierLoopback": "__MISSING__:Loopback",
- "tierAlwaysProtected": "__MISSING__:Always Protected",
- "tierPublic": "__MISSING__:Public",
- "hideInternal": "__MISSING__:Hide Internal",
- "showInternal": "__MISSING__:Show Internal"
+ "badgeLoopbackTooltip": "Этот конечный пункт доступен только локально (только для обратной связи)",
+ "badgeAlwaysProtectedTooltip": "Этот конечный пункт всегда защищен и требует авторизации",
+ "badgeInternalTooltip": "Это конечная точка внутренней системы",
+ "tierAll": "Все",
+ "tierAuth": "Аутентифицировано",
+ "tierLoopback": "Циклический вызов",
+ "tierAlwaysProtected": "Всегда Защищено",
+ "tierPublic": "Публичный",
+ "hideInternal": "Скрыть внутренние",
+ "showInternal": "Показать Внутренний"
},
"endpoints": {
"tabProxy": "Прокси конечных точек",
@@ -3022,20 +3090,20 @@
"processStatus": "Статус процесса",
"online": "В сети",
"offline": "Не в сети",
- "disableLabel": "__MISSING__:Disable {label}",
- "enableLabel": "__MISSING__:Enable {label}",
- "transportMode": "__MISSING__:Transport Mode",
- "transportStdioDesc": "__MISSING__:Local — IDE spawns process via omniroute --mcp",
- "transportSseDesc": "__MISSING__:Remote — Server-Sent Events over HTTP",
- "transportStreamableHttpDesc": "__MISSING__:Remote — Modern bidirectional HTTP",
- "copy": "__MISSING__:Copy",
+ "disableLabel": "Отключить {label}",
+ "enableLabel": "Включить {label}",
+ "transportMode": "Режим Транспорта",
+ "transportStdioDesc": "Локально — IDE запускает процесс через omniroute --mcp",
+ "transportSseDesc": "Удаленный — События, отправляемые сервером по HTTP",
+ "transportStreamableHttpDesc": "Удаленный — Современный двунаправленный HTTP",
+ "copy": "Копировать",
"mcpDashboardCopyUrl": "Копировать URL",
- "mcpDisabledTitle": "__MISSING__:MCP is disabled",
- "mcpDisabledDesc": "__MISSING__:Enable MCP above to configure transport mode and view server telemetry.",
- "mcpIntro": "__MISSING__:Model Context Protocol — {tools} tools across {scopes} scopes, {transports} transports (stdio / SSE / Streamable HTTP).",
- "mcpStep1": "__MISSING__:Run via {code}",
- "mcpStep2": "__MISSING__:Configure your MCP client to connect over stdio transport.",
- "mcpStep3": "__MISSING__:Invoke tools like {code1} and {code2}.",
+ "mcpDisabledTitle": "MCP отключен",
+ "mcpDisabledDesc": "Включите MCP выше, чтобы настроить режим передачи и просмотреть телеметрию сервера.",
+ "mcpIntro": "Протокол Контекста Модели — {tools} инструменты в {scopes} областях, {transports} транспортах (stdio / SSE / Streamable HTTP).",
+ "mcpStep1": "Запустить через {code}",
+ "mcpStep2": "Настройте свой клиент MCP для подключения через транспорт stdio.",
+ "mcpStep3": "Вызовите инструменты, такие как {code1} и {code2}.",
"pid": "PID",
"sessionUptime": "Время работы сеанса",
"lastHeartbeat": "Последний heartbeat",
@@ -3117,7 +3185,7 @@
"cancelled": "отменена"
},
"agentCard": "Карточка агента",
- "agentCardPath": "__MISSING__:/.well-known/agent.json",
+ "agentCardPath": "/.well-known/agent.json",
"version": "Версия",
"url": "URL",
"capabilities": "Возможности",
@@ -3156,54 +3224,199 @@
"rpcMethodGet": "задачи/получить",
"rpcMethodCancel": "задачи/отмена",
"serviceLabel": "А2А",
- "online": "__MISSING__:Online",
- "offline": "__MISSING__:Offline",
- "disableLabel": "__MISSING__:Disable {label}",
- "enableLabel": "__MISSING__:Enable {label}",
- "a2aDisabledTitle": "__MISSING__:A2A is disabled",
- "a2aDisabledDesc": "__MISSING__:Enable A2A above to view task telemetry, agent details, and validation tools.",
- "a2aIntro": "__MISSING__:Agent2Agent JSON-RPC 2.0 endpoint — send tasks, stream responses, cancel in-flight jobs.",
- "a2aStep1": "__MISSING__:Discover the agent card at {code}.",
- "a2aStep2": "__MISSING__:Send JSON-RPC to {code1} using {code2} or {code3}.",
- "a2aStep3": "__MISSING__:Track and cancel tasks with {code1} and {code2}."
+ "online": "В сети",
+ "offline": "Офлайн",
+ "disableLabel": "Отключить {label}",
+ "enableLabel": "Включить {label}",
+ "a2aDisabledTitle": "A2A отключен",
+ "a2aDisabledDesc": "Включите A2A выше, чтобы просмотреть телеметрию задач, детали агента и инструменты валидации.",
+ "a2aIntro": "Agent2Agent JSON-RPC 2.0 конечная точка — отправка задач, потоковые ответы, отмена выполняемых заданий.",
+ "a2aStep1": "Откройте карточку агента по {code}.",
+ "a2aStep2": "Отправьте JSON-RPC на {code1} с использованием {code2} или {code3}.",
+ "a2aStep3": "Отслеживайте и отменяйте задачи с {code1} и {code2}."
},
"memory": {
- "title": "Память",
- "description": "Постоянная кросс-сессионная память для диалогов",
- "memories": "Память",
- "totalEntries": "Всего записей",
- "tokensUsed": "Использовано токенов",
- "hitRate": "Коэффициент попадания",
- "loading": "Загрузка...",
- "noMemories": "Записей памяти не найдено",
- "search": "Поиск",
- "allTypes": "Все типы",
- "export": "Экспорт",
- "import": "Импорт",
- "addMemory": "Добавить запись памяти",
- "type": "Тип",
- "key": "Ключ",
- "content": "Содержимое",
- "created": "Создано",
- "actions": "Действия",
- "delete": "Delete",
- "factual": "Фактическая",
- "episodic": "Эпизодическая",
- "procedural": "Процедурная",
- "semantic": "Семантическая",
"a": "A",
- "pipelineOk": "Конвейер в порядке ({latencyMs}ms)",
- "pipelineError": "Ошибка конвейера",
- "healthUnknown": "Здоровье неизвестно",
- "checkingHealth": "Проверка…",
- "checkHealth": "Проверить здоровье",
- "pageInfo": "Страница {page} из {totalPages} (всего {total})",
- "previous": "Предыдущий",
- "next": "Далее",
+ "actions": "Действия",
+ "addMemory": "Добавить запись памяти",
+ "allTypes": "Все типы",
"cancel": "Отмена",
- "save": "Сохранить",
+ "checkHealth": "Проверить здоровье",
+ "checkingHealth": "Проверка…",
+ "compactOld": "Компактный старый",
+ "concept": {
+ "title": "Разговорная Память",
+ "description": "OmniRoute учится на каждом разговоре, запоминая факты, эпизоды, процедуры и семантические концепции, которые делают ответы более точными и контекстно осведомленными.",
+ "howWorksToggle": "Как это работает",
+ "howWorksContent": "1. Автоматическое извлечение: в конце каждого ответа факты и эпизоды обнаруживаются и сохраняются автоматически.\n2. Извлечение: перед каждым ответом наиболее релевантные воспоминания ищутся с помощью FTS5 (точно), векторного (семантического) или гибридного RRF.\n3. Инъекция: релевантные воспоминания внедряются в контекст помощника для улучшения качества ответа.\n4. Управление: используйте эту страницу для просмотра, редактирования, экспорта и сжатия старых воспоминаний."
+ },
+ "content": "Содержимое",
+ "contentPlaceholder": "Значение или контент JSON, который нужно запомнить",
+ "created": "Создано",
+ "delete": "Delete",
+ "deleteConfirmDesc": "Это действие нельзя отменить. Память будет удалена навсегда.",
+ "deleteConfirmTitle": "Удалить память?",
+ "description": "Постоянная кросс-сессионная память для диалогов",
+ "editMemory": "Редактировать память",
+ "editModal": {
+ "title": "Редактировать память",
+ "metadataLabel": "Метаданные (JSON)",
+ "metadataInvalid": "Неверный JSON",
+ "saveFailed": "Не удалось сохранить память"
+ },
+ "embedding": {
+ "autoLabel": "Автоматический",
+ "autoDesc": "Использует лучшее доступное: удаленный провайдер > статический > трансформеры",
+ "remoteLabel": "Удаленный провайдер",
+ "remoteDesc": "Использует встраивание через API провайдера (требуется ключ API)",
+ "staticLabel": "Статическая локальная (зелье)",
+ "staticDesc": "Локальная эмбеддинг без WASM или внешних зависимостей",
+ "transformersLabel": "Transformers.js (MiniLM)",
+ "transformersDesc": "Локальная эмбеддинг через @huggingface/transformers (~400МБ ОЗУ)",
+ "providerModelLabel": "Поставщик / Модель",
+ "noRemoteProviders": "Нет провайдеров с настроенным API-ключом",
+ "selectProviderModel": "Выберите модель",
+ "staticEnabledLabel": "Включить Статическую Зелье",
+ "staticEnabledDesc": "Скачайте и используйте модель potion-base-8M локально",
+ "transformersEnabledLabel": "Включить Transformers.js",
+ "transformersEnabledDesc": "Подписаться на локальный MiniLM (~400MB RAM, ~3s холодный старт)",
+ "transformersWarning": "Требуется ~400МБ ОЗУ и ~3с холодного старта при первом семантическом запросе."
+ },
+ "emptyState": {
+ "title": "Пока нет воспоминаний",
+ "description": "Воспоминания создаются автоматически из разговоров. Вы также можете добавить их вручную, используя кнопку выше."
+ },
+ "engine": {
+ "statusTitle": "Статус Двигателя",
+ "embeddingTitle": "Встраиваемый источник",
+ "rerankTitle": "Пересортировать (необязательно)",
+ "reindexNow": "Перестроить индекс сейчас",
+ "reindexStarted": "Начата переиндексация ({pending} в ожидании)",
+ "reindexFailed": "Не удалось запустить переиндексацию",
+ "keywordLabel": "Ключевое слово (FTS5)",
+ "keywordReason": "Поиск по ключевым словам всегда доступен",
+ "embeddingLabel": "Встраивание",
+ "vectorStoreLabel": "Векторное Хранилище",
+ "qdrantLabel": "Qdrant",
+ "rerankLabel": "Переоценить",
+ "qdrantDisabled": "Отключено",
+ "qdrantOk": "Здорово ({latencyMs}мс)",
+ "qdrantError": "Ошибка подключения",
+ "needsReindex": "{count} память(ей) нуждается в переиндексации",
+ "configureCta": "Настроить",
+ "vectorStoreInstallHint": "Чтобы включить векторный поиск: npm install sqlite-vec (нужен нативный Node.js, а не WASM), затем перезапустите."
+ },
+ "episodic": "Эпизодическая",
+ "export": "Экспорт",
+ "factual": "Фактическая",
+ "healthUnknown": "Здоровье неизвестно",
+ "hitRate": "Коэффициент попадания",
+ "import": "Импорт",
+ "importError": "Не удалось импортировать файл",
+ "importResult": "{imported} импортировано, {skipped} пропущено",
+ "key": "Ключ",
"keyPlaceholder": "например user.preferences.theme",
- "contentPlaceholder": "Значение или контент JSON, который нужно запомнить"
+ "loading": "Загрузка...",
+ "memories": "Память",
+ "next": "Далее",
+ "noMemories": "Записей памяти не найдено",
+ "pageInfo": "Страница {page} из {totalPages} (всего {total})",
+ "pipelineError": "Ошибка конвейера",
+ "pipelineOk": "Конвейер в порядке ({latencyMs}ms)",
+ "playground": {
+ "infoTitle": "Площадка Памяти",
+ "infoDesc": "Симулируйте, что будет получено для данного запроса. Память не изменяется — предварительный просмотр только для чтения.",
+ "queryLabel": "Тестовый запрос",
+ "queryPlaceholder": "Введите вопрос или тестовую фразу...",
+ "strategyLabel": "Стратегия",
+ "strategyExact": "Точный (FTS5)",
+ "strategySemantic": "Семантический (векторный)",
+ "strategyHybrid": "Гибрид (RRF)",
+ "budgetLabel": "Бюджет (токены)",
+ "simulate": "Симулировать",
+ "resultsTitle": "{count} результат(ов)",
+ "resolutionTitle": "Разрешение поиска",
+ "resolutionEmbedding": "Встраивание",
+ "resolutionStore": "Векторное хранилище",
+ "resolutionStrategy": "Используемая стратегия",
+ "rerankApplied": "Переназначение применено",
+ "fallback": "Резервный вариант",
+ "noResults": "Не найдено ни одной записи для этого запроса.",
+ "tokensUsed": "используемые токены",
+ "none": "нет",
+ "errorFetch": "Не удалось получить предварительный просмотр"
+ },
+ "previous": "Предыдущий",
+ "procedural": "Процедурная",
+ "qdrant": {
+ "title": "Qdrant (Векторное Хранилище Уровень 2)",
+ "description": "Дополнительная интеграция Qdrant для масштабируемого семантического поиска",
+ "enableLabel": "Включить Qdrant",
+ "enableDesc": "Когда включено, Qdrant используется в качестве основного хранилища векторов",
+ "testConnection": "Проверить соединение",
+ "testing": "Тестирование...",
+ "statusActive": "Активный",
+ "statusError": "Ошибка",
+ "statusDisabled": "Отключено",
+ "healthOk": "Соединение установлено ({latencyMs}мс)",
+ "healthError": "Ошибка подключения",
+ "saved": "Настройки сохранены",
+ "saveError": "Не удалось сохранить",
+ "portLabel": "Порт",
+ "embeddingModelLabel": "Модель Встраивания",
+ "optional": "необязательный",
+ "apiKeyKeepPlaceholder": "Оставьте пустым, чтобы сохранить текущий ключ",
+ "apiKeyOptional": "Оставьте пустым, если не используете аутентификацию",
+ "removeApiKey": "Удалить",
+ "quickSelectModel": "Быстрый выбор",
+ "searchTestTitle": "Тест семантического поиска",
+ "searchPlaceholder": "Введите тестовый запрос...",
+ "searching": "Поиск...",
+ "search": "Поиск",
+ "cleanupTitle": "Очистить старые баллы",
+ "cleanupDesc": "Удалить точки Qdrant для истекших воспоминаний (период хранения).",
+ "cleaning": "Очистка...",
+ "cleanNow": "Очистить сейчас",
+ "cleanupSuccess": "{count} балл(ов) удалено",
+ "cleanupFailed": "Очистка не удалась"
+ },
+ "rerank": {
+ "enableLabel": "Включить Ререйтинг",
+ "enableDesc": "Переставляет результаты с помощью модели повторной оценки после поиска",
+ "warning": "Rerank добавляет +200-500 мс задержки и дополнительные расходы на запрос. Используйте с осторожностью.",
+ "providerModelLabel": "Пересортировать Провайдер / Модель",
+ "noProviderWithKey": "Нет провайдера с настроенным API-ключом. Настройте провайдера для использования rerank.",
+ "selectProviderModel": "Выберите провайдера/модель"
+ },
+ "save": "Сохранить",
+ "saving": "Сохранение...",
+ "search": "Поиск",
+ "semantic": "Семантическая",
+ "summarize": {
+ "title": "Компактные старые воспоминания",
+ "noCandidates": "Нет доступных для компактации воспоминаний (критерий: старше 30 дней).",
+ "candidatesDesc": "{count} воспоминаний будет сжато в сводки. Это действие нельзя отменить.",
+ "confirm": "Компактный сейчас"
+ },
+ "tabs": {
+ "memories": "Воспоминания",
+ "playground": "Игровая площадка",
+ "engine": "Двигатель"
+ },
+ "title": "Память",
+ "tokensUsed": "Использовано токенов",
+ "tooltip": {
+ "totalEntries": "Всего сохраненных воспоминаний для этого ключа API",
+ "tokensUsed": "Оценочное общее количество токенов, занимаемых активными памятью",
+ "hitRate": "Коэффициент попаданий кэша по ID (не точность семантического воспоминания)",
+ "factual": "Объективные, постоянные факты из контекста пользователя",
+ "episodic": "События и впечатления из истории разговоров",
+ "procedural": "Процедуры, рабочие процессы и инструкции, которые ассистент должен соблюдать",
+ "semantic": "Концепции, предпочтения и предметные знания"
+ },
+ "totalEntries": "Всего записей",
+ "type": "Тип",
+ "memoryEnabled": "Включена память"
},
"skills": {
"title": "Навыки",
@@ -3235,42 +3448,42 @@
"q": "Q",
"filterSkillsPlaceholder": "Фильтрация навыков по имени, описанию или тегу",
"allModes": "Все режимы",
- "totalSkills": "__MISSING__:Total Skills",
- "enabledSkills": "__MISSING__:Enabled",
- "totalExecutions": "__MISSING__:Executions",
- "successRate": "__MISSING__:Success Rate",
- "marketplaceTab": "__MISSING__:Marketplace",
- "applyFilters": "__MISSING__:Apply filters",
- "popularDefaultsLabel": "__MISSING__:Popular by default for selected provider:",
- "onMode": "__MISSING__:ON",
- "offMode": "__MISSING__:OFF",
- "autoMode": "__MISSING__:AUTO",
- "installSkillButton": "__MISSING__:Install Skill",
- "installSkillModalTitle": "__MISSING__:Install Skill",
- "installJsonPlaceholder": "__MISSING__:Paste skill manifest JSON here...",
- "installing": "__MISSING__:Installing...",
- "installSuccess": "__MISSING__:Skill installed ({id})",
- "installError": "__MISSING__:Install failed",
- "invalidJson": "__MISSING__:Invalid JSON",
- "searchMarketplacePlaceholder": "__MISSING__:Search skills...",
- "searchMarketplace": "__MISSING__:Search Marketplace",
- "marketplaceEmpty": "__MISSING__:No skills found in marketplace",
- "marketplaceError": "__MISSING__:Search failed",
- "installingFromMarketplace": "__MISSING__:Installing from marketplace...",
- "popularSkills": "__MISSING__:Popular Skills",
+ "totalSkills": "Всего навыков",
+ "enabledSkills": "Включено",
+ "totalExecutions": "Исполнения",
+ "successRate": "Уровень Успеха",
+ "marketplaceTab": "Маркетплейс",
+ "applyFilters": "Применить фильтры",
+ "popularDefaultsLabel": "Популярно по умолчанию для выбранного провайдера:",
+ "onMode": "ВКЛ.",
+ "offMode": "ВЫКЛ.",
+ "autoMode": "АВТО",
+ "installSkillButton": "Установить Навык",
+ "installSkillModalTitle": "Установить навык",
+ "installJsonPlaceholder": "Вставьте JSON манифеста навыков сюда...",
+ "installing": "Установка...",
+ "installSuccess": "Навык установлен ({id})",
+ "installError": "Установка не удалась",
+ "invalidJson": "Неверный JSON",
+ "searchMarketplacePlaceholder": "Поиск навыков...",
+ "searchMarketplace": "Поиск Маркета",
+ "marketplaceEmpty": "Навыки не найдены на рынке",
+ "marketplaceError": "Поиск не удался",
+ "installingFromMarketplace": "Установка из магазина...",
+ "popularSkills": "Популярные навыки",
"skillsMarketplace": "Рынок навыков",
- "searching": "__MISSING__:Searching...",
- "pageInfo": "__MISSING__:Page {page} of {totalPages} ({total} total)",
- "previous": "__MISSING__:Previous",
- "next": "__MISSING__:Next",
- "activeProvider": "__MISSING__:Active provider:",
- "changeInSettings": "__MISSING__:Change this in Settings → Memory & Skills.",
- "installs": "__MISSING__:installs",
- "marketplaceSkillsMpHint": "__MISSING__:Configure your SkillsMP API key in Settings to browse the marketplace.",
- "marketplaceSkillsShHint": "__MISSING__:Search the skills.sh open directory to discover and install agent skills.",
- "installSkillModalDesc": "__MISSING__:Paste a skill manifest JSON or upload a .json file.",
- "uploadJson": "__MISSING__:Upload JSON",
- "cancel": "__MISSING__:Cancel",
+ "searching": "Поиск...",
+ "pageInfo": "Страница {page} из {totalPages} ({total} всего)",
+ "previous": "Предыдущий",
+ "next": "Далее",
+ "activeProvider": "Активный провайдер:",
+ "changeInSettings": "Измените это в Настройки → Память и Навыки.",
+ "installs": "установки",
+ "marketplaceSkillsMpHint": "Настройте свой ключ API SkillsMP в Настройках, чтобы просматривать рынок.",
+ "marketplaceSkillsShHint": "Ищите в открытом каталоге skills.sh, чтобы обнаружить и установить навыки агентов.",
+ "installSkillModalDesc": "Вставьте JSON манифест навыка или загрузите файл .json.",
+ "uploadJson": "Загрузить JSON",
+ "cancel": "Отменить",
"installSkill": "Установить навык"
},
"health": {
@@ -3358,35 +3571,35 @@
"noSessionQuotaMonitorsActive": "Ни один активный монитор квоты сеанса не активен.",
"gracefulDegradationStatus": "Статус постепенной деградации",
"additionalModels": "+{count} еще модели",
- "providerHealthMatrixTitle": "__MISSING__:Provider Health Matrix",
- "providerHealthMatrixDescription": "__MISSING__:Provider × account × model states from breakers, cooldowns, lockouts and logs.",
- "healthMatrixRange": "__MISSING__:Health matrix range",
- "providerFilter": "__MISSING__:Provider filter",
- "onlyIssues": "__MISSING__:Only issues",
- "refresh": "__MISSING__:Refresh",
- "accounts": "__MISSING__:Accounts",
- "models": "__MISSING__:Models",
- "issues": "__MISSING__:Issues",
- "loadingProviderHealthMatrix": "__MISSING__:Loading provider health matrix...",
- "failedProviderHealthMatrix": "__MISSING__:Failed to load Provider Health Matrix: {error}",
- "noProvidersMatchedFilters": "__MISSING__:No providers matched the current filters.",
- "modelPillSummary": "__MISSING__:{requests} req · {successRate} success · {latency} avg",
- "modelLockoutSummary": "__MISSING__:{reason} · {duration} left",
- "locked": "__MISSING__:locked",
- "inferred": "__MISSING__:inferred",
- "inactive": "__MISSING__:Inactive",
- "noConnectionId": "__MISSING__:no connection id",
- "accountModelSummary": "__MISSING__:{connectionId} · {count} models",
- "cooldown": "__MISSING__:cooldown",
- "durationRemaining": "__MISSING__:{duration} remaining",
- "noSyncedModelsOrTraffic": "__MISSING__:No synced models or recent traffic yet.",
- "providerRowSummary": "__MISSING__:{active}/{total} active accounts · {requests} req · {successRate} success · {latency} avg",
- "cooldownCount": "__MISSING__:{count} cooldown",
- "lockoutCount": "__MISSING__:{count} lockouts",
- "issueCount": "__MISSING__:{count} issues",
- "score": "__MISSING__:Score",
- "lastRequest": "__MISSING__:Last request",
- "lastError": "__MISSING__:Last error"
+ "providerHealthMatrixTitle": "Матрица Здоровья Провайдера",
+ "providerHealthMatrixDescription": "Поставщик × аккаунт × модель состояния от разрывов, перерывов, блокировок и журналов.",
+ "healthMatrixRange": "Диапазон матрицы здоровья",
+ "providerFilter": "Фильтр провайдеров",
+ "onlyIssues": "Только проблемы",
+ "refresh": "Обновить",
+ "accounts": "Учетные записи",
+ "models": "Модели",
+ "issues": "Проблемы",
+ "loadingProviderHealthMatrix": "Загрузка матрицы состояния провайдера...",
+ "failedProviderHealthMatrix": "Не удалось загрузить матрицу состояния провайдера: {error}",
+ "noProvidersMatchedFilters": "Нет провайдеров, соответствующих текущим фильтрам.",
+ "modelPillSummary": "{requests} запрос · {successRate} успех · {latency} ср.",
+ "modelLockoutSummary": "{reason} · осталось {duration}",
+ "locked": "заблокировано",
+ "inferred": "выведенный",
+ "inactive": "Неактивный",
+ "noConnectionId": "нет идентификатора соединения",
+ "accountModelSummary": "{connectionId} · {count} моделей",
+ "cooldown": "восстановление",
+ "durationRemaining": "Осталось {duration}",
+ "noSyncedModelsOrTraffic": "Нет синхронизированных моделей или недавнего трафика.",
+ "providerRowSummary": "{active}/{total} активных аккаунтов · {requests} запросов · {successRate} успех · {latency} ср.",
+ "cooldownCount": "{count} время восстановления",
+ "lockoutCount": "{count} блокировок",
+ "issueCount": "{count} проблемы",
+ "score": "Счет",
+ "lastRequest": "Последний запрос",
+ "lastError": "Последняя ошибка"
},
"telemetry": {
"title": "Системная телеметрия",
@@ -3514,15 +3727,15 @@
"provider": "Provider",
"account": "Account",
"elapsed": "Elapsed",
- "activeStage": "__MISSING__:Stage",
- "activeStageUnknown": "__MISSING__:Not sent to upstream yet",
- "activeStageRegistered": "__MISSING__:Registered",
- "activeStagePayloadPrepared": "__MISSING__:Payload prepared",
- "activeStageWaitingAccountSlot": "__MISSING__:Waiting for account slot",
- "activeStageWaitingRateLimit": "__MISSING__:Waiting for rate limiter",
- "activeStageRateLimitSlotAcquired": "__MISSING__:Rate limit slot acquired",
- "activeStageSendingToProvider": "__MISSING__:Sending to upstream",
- "activeStageProviderResponseStarted": "__MISSING__:Upstream response started",
+ "activeStage": "Сцена",
+ "activeStageUnknown": "Еще не отправлено на upstream",
+ "activeStageRegistered": "Зарегистрировано",
+ "activeStagePayloadPrepared": "Полезная нагрузка подготовлена",
+ "activeStageWaitingAccountSlot": "Ожидание слота аккаунта",
+ "activeStageWaitingRateLimit": "Ожидание ограничителя скорости",
+ "activeStageRateLimitSlotAcquired": "Слот ограничения скорости получен",
+ "activeStageSendingToProvider": "Отправка на upstream",
+ "activeStageProviderResponseStarted": "Ответ от upstream начат",
"count": "Count",
"payloads": "Payloads",
"viewPayloads": "View",
@@ -3541,7 +3754,10 @@
"fetchFailed": "Failed to fetch logs",
"copyFailed": "Failed to copy log entry",
"copyLogEntry": "Copy log entry"
- }
+ },
+ "compressionLogTitle": "Журнал сжатия",
+ "compressionLogEmpty": "Пока нет сжатых запросов. Статистика сжатия появится здесь, когда запросы будут обработаны с включенным сжатием.",
+ "tokens": "токены"
},
"onboarding": {
"welcome": "Добро пожаловать",
@@ -3651,22 +3867,22 @@
"expiringSoonBadge": "Expiring Soon",
"freeTier": "Уровень бесплатного пользования",
"freeTierAvailable": "Доступен бесплатный уровень",
- "hasFreeTooltip": "__MISSING__:Free tier available",
- "noAuthLabel": "__MISSING__:No Auth",
- "noAuthProviders": "__MISSING__:No Auth Providers",
- "upstreamProxyLabel": "__MISSING__:Upstream Proxy",
- "freeAggregated": "__MISSING__:All providers with free tier (also shown in their native category)",
+ "hasFreeTooltip": "Доступен бесплатный тариф",
+ "noAuthLabel": "Нет аутентификации",
+ "noAuthProviders": "Нет провайдеров аутентификации",
+ "upstreamProxyLabel": "Прокси-сервер вверх по потоку",
+ "freeAggregated": "Все провайдеры с бесплатным уровнем (также показано в их родной категории)",
"deprecated": "Устарело",
"deprecatedProvider": "Этот провайдер устарел",
"riskNotice": {
- "title": "__MISSING__:Before continuing",
- "tooltip": "__MISSING__:Provider with usage caveats — click for details",
- "oauth": "__MISSING__:This provider uses your official product session/OAuth, which is not authorized for proxy/router use.\n\nWe don't recommend intensive autonomous agent usage (OpenCloud-style, long multi-step flows, large batches) — the upstream may react by restricting or banning the account.\n\nUse at your own risk.",
- "webCookie": "__MISSING__:This provider authenticates through your web session cookies. The upstream service may invalidate the session at any time, requiring you to log in again. Not recommended for long unattended operations.\n\nUse at your own risk.",
- "deprecated": "__MISSING__:This provider was discontinued by its upstream and may stop working without notice. Existing connections may continue working until the upstream fully removes access. Consider alternatives.",
- "dontShowAgain": "__MISSING__:Don't show this again for this provider",
- "understand": "__MISSING__:I understand, continue",
- "cancel": "__MISSING__:Cancel"
+ "title": "Перед продолжением",
+ "tooltip": "Провайдер с ограничениями по использованию — нажмите для получения деталей",
+ "oauth": "Этот провайдер использует вашу официальную сессию продукта/OAuth, которая не разрешена для использования с прокси/маршрутизатором.\n\nМы не рекомендуем интенсивное использование автономных агентов (в стиле OpenCloud, длинные многошаговые потоки, большие партии) — вышестоящий сервис может отреагировать, ограничив или заблокировав аккаунт.\n\nИспользуйте на свой страх и риск.",
+ "webCookie": "Этот провайдер аутентифицируется через ваши веб-сессионные куки. Внешний сервис может аннулировать сессию в любое время, требуя повторного входа в систему. Не рекомендуется для длительных unattended операций.\n\nИспользуйте на свой страх и риск.",
+ "deprecated": "Этот провайдер был прекращен его поставщиком и может перестать работать без предупреждения. Существующие подключения могут продолжать работать до тех пор, пока поставщик полностью не удалит доступ. Рассмотрите альтернативы.",
+ "dontShowAgain": "Больше не показывать это для этого провайдера",
+ "understand": "Я понимаю, продолжай",
+ "cancel": "Отмена"
},
"disabled": "Отключено",
"enableProvider": "Включить провайдера",
@@ -4188,12 +4404,12 @@
"geminiCliProjectIdLabel": "Идентификатор проекта Google Cloud",
"geminiCliProjectIdPlaceholder": "мой-gcp-идентификатор-проекта",
"antigravityProjectIdHint": "Необязательное переопределение запросов кода антигравитационного облака. Оставьте пустым, чтобы использовать проект, обнаруженный во время Google OAuth.",
- "antigravityClientProfileLabel": "__MISSING__:Client profile",
- "antigravityClientProfileHint": "__MISSING__:Choose which Antigravity client identity OmniRoute presents to the API.",
- "antigravityClientProfileIde": "__MISSING__:IDE",
- "antigravityClientProfileHarness": "__MISSING__:Harness / CLI",
- "codexFastTierActiveChip": "__MISSING__:Codex Fast tier is active",
- "tierFast": "__MISSING__:Fast",
+ "antigravityClientProfileLabel": "Профиль клиента",
+ "antigravityClientProfileHint": "Выберите, какую идентичность клиента Antigravity OmniRoute представляет API.",
+ "antigravityClientProfileIde": "IDE",
+ "antigravityClientProfileHarness": "Harness / CLI",
+ "codexFastTierActiveChip": "Активен уровень Codex Fast",
+ "tierFast": "Быстро",
"antigravityProjectIdLabel": "Идентификатор проекта Google Cloud",
"antigravityProjectIdPlaceholder": "мой-gcp-идентификатор-проекта",
"grokWebCookieHint": "Grok Web Cookie Hint",
@@ -4291,25 +4507,25 @@
"providerDetailPathAutoDetectedAllOs": "Путь определяется автоматически для каждой ОС (Linux/Mac/Windows).",
"providerDetailMyClaudeAccountPlaceholder": "Мой аккаунт Клода",
"providerDetailPathAutoDetected": "Путь определяется автоматически для каждой ОС (Linux/Mac).",
- "webFetch": "__MISSING__:Web Fetch",
- "webFetchTooltip": "__MISSING__:Providers that extract content from web URLs (HTML → Markdown, scrape, screenshot)",
- "webFetchProvidersHeading": "__MISSING__:Web Fetch Providers",
- "compatibleProvidersDesc": "__MISSING__:OpenAI-compatible and Anthropic-compatible endpoints you host or configure. Point any OpenAI SDK to your own URL and route requests here.",
- "oauthProvidersDesc": "__MISSING__:Providers authenticated via OAuth — sign in once and OmniRoute handles token rotation automatically.",
+ "webFetch": "Веб-загрузка",
+ "webFetchTooltip": "Поставщики, которые извлекают контент из веб-URL (HTML → Markdown, скрейпинг, скриншот)",
+ "webFetchProvidersHeading": "Поставщики Веб-Запросов",
+ "compatibleProvidersDesc": "Совместимые с OpenAI и Anthropic конечные точки, которые вы хостите или настраиваете. Укажите любой SDK OpenAI на ваш собственный URL и направляйте запросы сюда.",
+ "oauthProvidersDesc": "Поставщики, аутентифицированные через OAuth — войдите один раз, и OmniRoute автоматически управляет ротацией токенов.",
"webCookieProvidersDesc": "Эти провайдеры используют веб-сессии браузера, файлы cookie или веб-токены вместо ключей API. Откройте поставщика, чтобы добавить необходимые учетные данные сеанса.",
- "apiKeyProvidersDesc": "__MISSING__:Standard API key providers. Add your key once and OmniRoute routes, retries, and rate-limits on your behalf.",
- "noAuthProvidersDesc": "__MISSING__:Open endpoints that require no credentials — ready to use immediately without any sign-up.",
- "upstreamProxyProvidersDesc": "__MISSING__:Route outbound traffic through an upstream proxy before it reaches the provider. Useful for corporate networks or traffic inspection.",
- "webFetchProvidersDesc": "__MISSING__:Providers that fetch and extract content from web URLs. Use them to ground prompts with live web data.",
- "aggregatorsGatewaysDesc": "__MISSING__:Multi-provider aggregators and AI gateways that expose a single unified API across dozens of underlying models.",
- "enterpriseCloudDesc": "__MISSING__:Enterprise-tier and cloud-hosted models with enhanced SLAs, compliance certifications, and dedicated capacity.",
- "cloudAgentProvidersDesc": "__MISSING__:Autonomous cloud agents that execute long-running tasks with plan approval and live status tracking.",
- "localProvidersDesc": "__MISSING__:Self-hosted models running on your own hardware. No data leaves your infrastructure.",
- "searchProvidersDesc": "__MISSING__:Web and document search providers. Attach them to LLM calls for Retrieval-Augmented Generation.",
- "audioProvidersDesc": "__MISSING__:Text-to-speech and speech-to-text providers for voice I/O and audio transcription pipelines.",
- "embeddingRerankProvidersDesc": "__MISSING__:Vector embedding and reranking providers for semantic search, RAG pipelines, and similarity scoring.",
- "imageProvidersDesc": "__MISSING__:Image generation and vision providers — create images from text or analyse existing ones.",
- "videoProvidersDesc": "__MISSING__:Video generation providers. Create short video clips from text prompts or images.",
+ "apiKeyProvidersDesc": "Стандартные поставщики API-ключей. Добавьте свой ключ один раз, и OmniRoute будет маршрутизировать, повторять попытки и ограничивать скорость от вашего имени.",
+ "noAuthProvidersDesc": "Открытые конечные точки, которые не требуют учетных данных — готовы к использованию сразу без регистрации.",
+ "upstreamProxyProvidersDesc": "Направьте исходящий трафик через прокси-сервер перед тем, как он достигнет провайдера. Полезно для корпоративных сетей или инспекции трафика.",
+ "webFetchProvidersDesc": "Провайдеры, которые извлекают и извлекают контент из веб-URL. Используйте их для обоснования подсказок с помощью актуальных веб-данных.",
+ "aggregatorsGatewaysDesc": "Мульти-провайдерные агрегаторы и AI-шлюзы, которые предоставляют единый унифицированный API для десятков базовых моделей.",
+ "enterpriseCloudDesc": "Модели корпоративного уровня и облачного хостинга с улучшенными SLA, сертификатами соответствия и выделенной мощностью.",
+ "cloudAgentProvidersDesc": "Автономные облачные агенты, которые выполняют длительные задачи с утверждением плана и отслеживанием статуса в реальном времени.",
+ "localProvidersDesc": "Модели, размещенные на собственном оборудовании. Никакие данные не покидают вашу инфраструктуру.",
+ "searchProvidersDesc": "Поставщики веб- и документного поиска. Присоедините их к вызовам LLM для генерации с дополнением извлечения.",
+ "audioProvidersDesc": "Поставщики синтеза речи и распознавания речи для голосового ввода/вывода и аудиотранскрипционных потоков.",
+ "embeddingRerankProvidersDesc": "Поставщики векторного встраивания и повторной оценки для семантического поиска, RAG-пайплайнов и оценки схожести.",
+ "imageProvidersDesc": "Поставщики генерации изображений и визуализации — создавайте изображения из текста или анализируйте существующие.",
+ "videoProvidersDesc": "Поставщики генерации видео. Создавайте короткие видеоклипы из текстовых подсказок или изображений.",
"onboardingWizard": "Мастер регистрации поставщика",
"onboardingWizardShort": "Мастер регистрации",
"onboardingWizardDescription": "Подключите поставщиков API-ключей, пользовательских совместимых и OAuth с проверкой, сохранением и немедленной проверкой соединения.",
@@ -4401,7 +4617,21 @@
"webNoAuthGuideBody": "{provider} не требует ключа API или файла cookie. Сохраните соединение, чтобы использовать его бесплатную конечную веб-точку.",
"webSessionCredentialValidationFailed": "Проверка учетных данных сеанса не удалась. Войдите еще раз, скопируйте новые учетные данные и повторите попытку.",
"checkCookie": "Проверить куки",
- "checkWebToken": "Проверить токен"
+ "checkWebToken": "Проверить токен",
+ "huggingchatLabel": "HuggingChat (Бесплатно)",
+ "huggingchatDesc": "Бесплатный LLM чат через huggingface.co/chat",
+ "phindLabel": "Phind (Бесплатно)",
+ "phindDesc": "Бесплатный AI-чат для разработчиков",
+ "poeWebLabel": "Poe Web",
+ "poeWebDesc": "Многофункциональный чат через poe.com",
+ "veniceWebLabel": "Венеция Веб",
+ "veniceWebDesc": "Чат ИИ с акцентом на конфиденциальность",
+ "v0VercelWebLabel": "v0 Vercel Web",
+ "v0VercelWebDesc": "Генерация кода ИИ через v0.dev",
+ "kimiWebLabel": "Kimi Web",
+ "kimiWebDesc": "Китайский рынок AI чата через kimi.moonshot.cn",
+ "doubaoWebLabel": "Doubao Web",
+ "doubaoWebDesc": "Чат AI ByteDance через doubao.com"
},
"settings": {
"title": "Настройки",
@@ -4412,65 +4642,65 @@
"cache": "Кэш",
"resilience": "Устойчивость",
"routingSettingsIntro": "Управляет тем, как ваши запросы маршрутизируются, преобразуются и отправляются поставщикам ИИ.",
- "routingOpDropParagraphContainsLabel": "__MISSING__:Drop paragraph (contains)",
- "routingOpDropParagraphStartsWithLabel": "__MISSING__:Drop paragraph (starts with)",
- "routingOpReplaceTextLabel": "__MISSING__:Replace text",
- "routingOpReplaceRegexLabel": "__MISSING__:Replace regex",
- "routingOpDropBlockContainsLabel": "__MISSING__:Drop block (contains)",
- "routingOpPrependSystemBlockLabel": "__MISSING__:Prepend system block",
- "routingOpAppendSystemBlockLabel": "__MISSING__:Append system block",
- "routingOpInjectBillingHeaderLabel": "__MISSING__:Inject billing header",
- "routingOpObfuscateWordsLabel": "__MISSING__:Obfuscate words (ZWJ)",
- "routingOpDropParagraphContainsDesc": "__MISSING__:Removes any paragraph (text block split on blank lines) inside the system prompt whose text contains ANY of the listed substrings. Use to strip third-party client fingerprints like 'github.com/anomalyco/opencode' or 'docs.openwebui.com' that Anthropic's classifier flags.",
- "routingOpDropParagraphStartsWithDesc": "__MISSING__:Removes any paragraph that STARTS WITH one of the listed prefixes. Use for identity lines like 'You are OpenCode' or 'You are Open WebUI' that announce the calling client.",
- "routingOpReplaceTextDesc": "__MISSING__:Replaces a literal substring with another literal substring. Use for known trigger phrases — e.g. rewrite 'Here is some useful information about the environment you are running in:' to 'Environment context you are running in:' (an empirically-validated trigger phrase).",
- "routingOpReplaceRegexDesc": "__MISSING__:Replaces text matching a regular expression. Use when you need patterns (character classes, optional whitespace, anchors) instead of literal substrings. A malformed pattern is caught at runtime when the op runs.",
- "routingOpDropBlockContainsDesc": "__MISSING__:Removes ENTIRE system blocks (not just paragraphs) whose text contains any of the listed substrings. Use when a whole block is fingerprint-bearing and you want it gone — e.g. an injected MCP-server description.",
- "routingOpPrependSystemBlockDesc": "__MISSING__:Inserts a new text block at the FRONT of the system array. Use to add the SDK identity 'You are a Claude agent, built on Anthropic's Claude Agent SDK.' that Anthropic's classifier expects.",
- "routingOpAppendSystemBlockDesc": "__MISSING__:Inserts a new text block at the END of the system array. Use for cosmetic additions that don't need to be at position [0].",
- "routingOpInjectBillingHeaderDesc": "__MISSING__:Prepends the special 'x-anthropic-billing-header: cc_version=...; cc_entrypoint=...; cch=...;' text block that Anthropic's classifier validates. Required for CC bridge relay endpoints; for the native claude provider OmniRoute already injects its own billing line so this op is usually redundant there.",
- "routingOpObfuscateWordsDesc": "__MISSING__:Inserts a Zero-Width-Joiner character after the first letter of each listed word, so 'opencode' becomes 'opencode'. Reads identical to humans but bypasses classifier word matches. Targets system blocks, user/assistant messages, and tool descriptions.",
- "routingNeedlesHint": "__MISSING__:List of substrings. A paragraph matches if it contains ANY one of them. Add one per line via 'Add entry'.",
- "routingPrefixesHint": "__MISSING__:List of strings. A paragraph matches if it starts with any one of them (leading whitespace is trimmed before matching).",
- "routingCaseSensitiveHint": "__MISSING__:When ON, 'OpenCode' and 'opencode' are different strings. When OFF (default), the comparison ignores case.",
- "routingMatchLiteralHint": "__MISSING__:Exact literal substring to find. No regex syntax — special chars like . * ? are treated as themselves.",
- "routingReplacementTextHint": "__MISSING__:Replacement string. Leave blank to delete the match. The output preserves surrounding text.",
- "routingAllOccurrencesHint": "__MISSING__:When ON (default), every instance is replaced. When OFF, only the first match is replaced.",
- "routingPatternHint": "__MISSING__:JavaScript regex source. Don't wrap in slashes — just 'foo(.*)bar'. Server rejects patterns that fail to compile.",
- "routingRegexFlagsHint": "__MISSING__:JavaScript regex flags (g = all matches, i = case-insensitive, s = dot matches newline, m = multiline). Default 'g'.",
- "routingBlockTextHint": "__MISSING__:Full text of the new system block. Use a literal string; the system block stores text only.",
- "routingIdempotencyKeyHint": "__MISSING__:Optional. If set, the op skips when a block whose text starts with this key is already present. Prevents double-prepend on retries.",
- "routingBillingEntrypointHint": "__MISSING__:Value injected as 'cc_entrypoint='. Anthropic accepts 'sdk-cli' (Agent SDK), 'cli' (Claude Code CLI), or other documented values.",
- "routingBillingVersionFormatHint": "__MISSING__:How the 3-char build hash after cc_version= is computed. 'ex-machina' = sha256 of CCH_SALT+chars-from-first-user-msg+version (per-message). 'omniroute-daystamp' = sha256 of YYYY-MM-DD+version (stable per-day).",
- "routingBillingCchAlgoHint": "__MISSING__:How the 5-char cch= token is computed. 'sha256-first-user' = sha256 of first user message text. 'xxhash64-body' = body-level signing fills it later. 'static-zero' = literal '00000' placeholder.",
- "routingObfuscateWordsHint": "__MISSING__:Lowercase words to obfuscate. ZWJ insertion is applied case-insensitively, so 'opencode' also matches 'OpenCode' and 'OPENCODE'.",
- "routingObfuscateTargetsHint": "__MISSING__:Which body regions to scan for the words: system blocks, user/assistant messages, and/or tool descriptions.",
- "routingObfuscateTargetsLabel": "__MISSING__:Targets",
- "routingSummarizeDropParagraphContains": "__MISSING__:drop paragraphs containing: {items}",
- "routingSummarizeDropParagraphStartsWith": "__MISSING__:drop paragraphs starting with: {items}",
- "routingSummarizeReplaceText": "__MISSING__:replace \"{match}\" → \"{replacement}\"",
- "routingSummarizeReplaceRegex": "__MISSING__:regex /{pattern}/{flags} → \"{replacement}\"",
- "routingSummarizeDropBlockContains": "__MISSING__:drop blocks containing: {items}",
- "routingSummarizePrependSystemBlock": "__MISSING__:prepend block: \"{text}\"",
- "routingSummarizeAppendSystemBlock": "__MISSING__:append block: \"{text}\"",
- "routingSummarizeInjectBillingHeader": "__MISSING__:inject billing header (entrypoint={entrypoint}, version={versionFormat}, cch={cchAlgo})",
- "routingSummarizeObfuscateWords": "__MISSING__:obfuscate {count} word(s) via ZWJ in {targets}",
- "routingDefaultAutoVariantLKGP": "__MISSING__:Last Known Good Provider",
- "routingDefaultAutoVariantLKGPDesc": "__MISSING__:Last Known Good Provider",
- "routingDefaultAutoVariantCoding": "__MISSING__:Quality-first for code",
- "routingDefaultAutoVariantCodingDesc": "__MISSING__:Quality-first for code",
- "routingDefaultAutoVariantFast": "__MISSING__:Low-latency routing",
- "routingDefaultAutoVariantFastDesc": "__MISSING__:Low-latency routing",
- "routingDefaultAutoVariantCheap": "__MISSING__:Cost-optimized",
- "routingDefaultAutoVariantCheapDesc": "__MISSING__:Cost-optimized",
- "routingDefaultAutoVariantOffline": "__MISSING__:High availability",
- "routingDefaultAutoVariantOfflineDesc": "__MISSING__:High availability",
- "routingDefaultAutoVariantSmart": "__MISSING__:Best discovery (10% explore)",
- "routingDefaultAutoVariantSmartDesc": "__MISSING__:Best discovery (10% explore)",
- "routingOpSummaryCount": "__MISSING__:{count, plural, =0 {no ops} one {# op} other {# ops}}",
- "routingOpEnabled": "__MISSING__:enabled",
- "routingOpDisabled": "__MISSING__:disabled",
- "routingOpStatusSeparator": "__MISSING__: · ",
+ "routingOpDropParagraphContainsLabel": "Удалить абзац (содержит)",
+ "routingOpDropParagraphStartsWithLabel": "Удалить абзац (начинается с)",
+ "routingOpReplaceTextLabel": "Заменить текст",
+ "routingOpReplaceRegexLabel": "Заменить regex",
+ "routingOpDropBlockContainsLabel": "Удалить блок (содержит)",
+ "routingOpPrependSystemBlockLabel": "Предварить системный блок",
+ "routingOpAppendSystemBlockLabel": "Добавить системный блок",
+ "routingOpInjectBillingHeaderLabel": "Вставить заголовок счета",
+ "routingOpObfuscateWordsLabel": "Обфусцировать слова (ZWJ)",
+ "routingOpDropParagraphContainsDesc": "Удаляет любой абзац (текстовый блок, разделенный пустыми строками) внутри системного запроса, текст которого содержит ЛЮБОЙ из перечисленных подстрок. Используйте для удаления отпечатков третьих сторон, таких как 'github.com/anomalyco/opencode' или 'docs.openwebui.com', которые отмечает классификатор Anthropic.",
+ "routingOpDropParagraphStartsWithDesc": "Удаляет любой абзац, который НАЧИНАЕТСЯ с одного из перечисленных префиксов. Используйте для строк идентификации, таких как 'Вы — OpenCode' или 'Вы — Open WebUI', которые объявляют вызывающий клиент.",
+ "routingOpReplaceTextDesc": "Заменяет буквальную подстроку на другую буквальную подстроку. Используйте для известных триггерных фраз — например, перепишите 'Here is some useful information about the environment you are running in:' на 'Environment context you are running in:' (эмпирически подтвержденная триггерная фраза).",
+ "routingOpReplaceRegexDesc": "Заменяет текст, соответствующий регулярному выражению. Используйте, когда вам нужны шаблоны (символьные классы, необязательные пробелы, якоря) вместо буквальных подстрок. Неправильный шаблон будет пойман во время выполнения, когда операция запустится.",
+ "routingOpDropBlockContainsDesc": "Удаляет ЦЕЛЫЕ системные блоки (не только абзацы), текст которых содержит любые из перечисленных подстрок. Используйте, когда целый блок содержит отпечатки и вы хотите его удалить — например, описание внедренного MCP-сервера.",
+ "routingOpPrependSystemBlockDesc": "Вставляет новый текстовый блок в НАЧАЛО массива системы. Используйте для добавления идентификатора SDK 'Вы агент Claude, созданный на основе SDK агента Claude от Anthropic.', который ожидает классификатор Anthropic.",
+ "routingOpAppendSystemBlockDesc": "Вставляет новый текстовый блок В КОНЕЦ массива системы. Используйте для косметических добавлений, которые не должны находиться на позиции [0].",
+ "routingOpInjectBillingHeaderDesc": "Добавляет специальный текстовый блок 'x-anthropic-billing-header: cc_version=...; cc_entrypoint=...; cch=...;', который проверяет классификатор Anthropic. Требуется для конечных точек моста CC; для нативного провайдера claude OmniRoute уже вставляет свою собственную строку биллинга, поэтому эта операция обычно избыточна там.",
+ "routingOpObfuscateWordsDesc": "Вставляет символ нулевой ширины после первой буквы каждого указанного слова, так что 'opencode' становится 'opencode'. Читается идентично для людей, но обходит совпадения слов классификатора. Нацеливается на системные блоки, сообщения пользователей/ассистентов и описания инструментов.",
+ "routingNeedlesHint": "Список подстрок. Параграф соответствует, если он содержит ХОТЯ БЫ одну из них. Добавьте по одной строке через 'Добавить запись'.",
+ "routingPrefixesHint": "Список строк. Параграф соответствует, если он начинается с любой из них (ведущий пробел удаляется перед сравнением).",
+ "routingCaseSensitiveHint": "Когда ВКЛ, 'OpenCode' и 'opencode' - это разные строки. Когда ВЫКЛ (по умолчанию), сравнение игнорирует регистр.",
+ "routingMatchLiteralHint": "Точный буквальный подстрока для поиска. Синтаксис regex не используется — специальные символы, такие как . * ?, рассматриваются как сами себя.",
+ "routingReplacementTextHint": "Строка замены. Оставьте пустым, чтобы удалить совпадение. Вывод сохраняет окружающий текст.",
+ "routingAllOccurrencesHint": "Когда ВКЛ (по умолчанию), каждый экземпляр заменяется. Когда ВЫКЛ, заменяется только первое совпадение.",
+ "routingPatternHint": "Исходный regex JavaScript. Не оборачивайте в слэши — просто 'foo(.*)bar'. Сервер отклоняет шаблоны, которые не компилируются.",
+ "routingRegexFlagsHint": "Флаги регулярных выражений JavaScript (g = все совпадения, i = нечувствительность к регистру, s = точка совпадает с новой строкой, m = многострочный). По умолчанию 'g'.",
+ "routingBlockTextHint": "Полный текст нового системного блока. Используйте буквальную строку; системный блок хранит только текст.",
+ "routingIdempotencyKeyHint": "Необязательно. Если установлено, операция пропускается, когда блок, текст которого начинается с этого ключа, уже присутствует. Предотвращает двойное добавление при повторных попытках.",
+ "routingBillingEntrypointHint": "Значение вставлено как 'cc_entrypoint='. Anthropic принимает 'sdk-cli' (Agent SDK), 'cli' (Claude Code CLI) или другие задокументированные значения.",
+ "routingBillingVersionFormatHint": "Как вычисляется 3-символьный хэш сборки после cc_version=? 'ex-machina' = sha256 от CCH_SALT+символы из первого сообщения пользователя+версия (по сообщению). 'omniroute-daystamp' = sha256 от ГГГГ-ММ-ДД+версия (стабильная за день).",
+ "routingBillingCchAlgoHint": "Как вычисляется токен 5-символьного cch= . 'sha256-first-user' = sha256 текста первого сообщения пользователя. 'xxhash64-body' = подпись на уровне тела заполняется позже. 'static-zero' = буквальный заполнитель '00000'.",
+ "routingObfuscateWordsHint": "Приведите слова к нижнему регистру для обфускации. Вставка ZWJ применяется без учета регистра, поэтому 'opencode' также соответствует 'OpenCode' и 'OPENCODE'.",
+ "routingObfuscateTargetsHint": "Какие области тела сканировать для слов: системные блоки, сообщения пользователя/ассистента и/или описания инструментов.",
+ "routingObfuscateTargetsLabel": "Цели",
+ "routingSummarizeDropParagraphContains": "удалить абзацы, содержащие: {items}",
+ "routingSummarizeDropParagraphStartsWith": "удалить абзацы, начинающиеся с: {items}",
+ "routingSummarizeReplaceText": "заменить \"{match}\" → \"{replacement}\"",
+ "routingSummarizeReplaceRegex": "regex /{pattern}/{flags} → \"{replacement}\"",
+ "routingSummarizeDropBlockContains": "удалить блоки, содержащие: {items}",
+ "routingSummarizePrependSystemBlock": "добавить блок: \"{text}\"",
+ "routingSummarizeAppendSystemBlock": "добавить блок: \"{text}\"",
+ "routingSummarizeInjectBillingHeader": "внедрить заголовок выставления счетов (точка входа={entrypoint}, версия={versionFormat}, cch={cchAlgo})",
+ "routingSummarizeObfuscateWords": "обфусцировать {count} слово(а) с помощью ZWJ в {targets}",
+ "routingDefaultAutoVariantLKGP": "Последний Известный Рабочий Провайдер",
+ "routingDefaultAutoVariantLKGPDesc": "Последний Известный Рабочий Провайдер",
+ "routingDefaultAutoVariantCoding": "Качество прежде всего для кода",
+ "routingDefaultAutoVariantCodingDesc": "Качество прежде всего для кода",
+ "routingDefaultAutoVariantFast": "Маршрутизация с низкой задержкой",
+ "routingDefaultAutoVariantFastDesc": "Маршрутизация с низкой задержкой",
+ "routingDefaultAutoVariantCheap": "Оптимизированный по стоимости",
+ "routingDefaultAutoVariantCheapDesc": "Оптимизировано по стоимости",
+ "routingDefaultAutoVariantOffline": "Высокая доступность",
+ "routingDefaultAutoVariantOfflineDesc": "Высокая доступность",
+ "routingDefaultAutoVariantSmart": "Лучшее открытие (10% исследовать)",
+ "routingDefaultAutoVariantSmartDesc": "Лучшее открытие (10% исследовать)",
+ "routingOpSummaryCount": "{count, plural, =0 {нет операций} one {# операция} other {# операций}}",
+ "routingOpEnabled": "включено",
+ "routingOpDisabled": "отключено",
+ "routingOpStatusSeparator": "·",
"resilienceSettingsIntro": "Автоматическая повторная попытка, время восстановления и возврат в случае сбоя поставщиков.",
"aiSettingsIntro": "Специальные настройки ИИ для расчета бюджета, поведения модели и сжатия.",
"systemPrompt": "Системная подсказка",
@@ -4545,6 +4775,13 @@
"modelsDevInfoOrder": "Переопределение пользователя → models.dev → LiteLLM → Жёстко заданное значение по умолчанию",
"systemTheme": "Системная тема",
"debugToggle": "Включить режим отладки",
+ "homePinProviderQuotaToHome": "Pin Information to Home Page",
+ "homeProviderQuotaLimits": "Provider Quota Limits",
+ "homeProviderQuotaLimitsDesc": "Pin the Provider Quota status container (with Refresh All button) to the top of the Home page.",
+ "homeQuickStart": "Quick Start",
+ "homeQuickStartDesc": "Show the Quick Start panel on the Home page.",
+ "homeProviderTopology": "Provider Topology",
+ "homeProviderTopologyDesc": "Show the Provider Topology on the Home page.",
"sidebarVisibilityToggle": "Показывать элементы боковой панели",
"enableCache": "Включить кеш",
"cacheTTL": "Срок жизни кэша",
@@ -4666,12 +4903,12 @@
"configure": "Настроить",
"globalSystemPrompt": "Глобальная системная подсказка",
"saved": "Сохранено",
- "beforePromptLabel": "__MISSING__:Before Prompt",
- "beforePromptDesc": "__MISSING__:Injected before agent/provider system instructions",
- "beforePromptPlaceholder": "__MISSING__:Instructions inserted before agent/provider prompt...",
- "afterPromptLabel": "__MISSING__:After Prompt",
- "afterPromptDesc": "__MISSING__:Injected after agent/provider system instructions",
- "afterPromptPlaceholder": "__MISSING__:Instructions inserted after agent/provider prompt...",
+ "beforePromptLabel": "Перед Подсказкой",
+ "beforePromptDesc": "Вставлено перед системными инструкциями агента/поставщика",
+ "beforePromptPlaceholder": "Инструкции вставлены перед запросом агента/поставщика...",
+ "afterPromptLabel": "После запроса",
+ "afterPromptDesc": "Вставлено после инструкций системы агента/поставщика",
+ "afterPromptPlaceholder": "Инструкции вставлены после запроса агента/поставщика...",
"chars": "{count} символов",
"thinkingBudgetTitle": "Думая о бюджете",
"thinkingBudgetDesc": "Контролируйте использование токенов рассуждения ИИ во всех запросах",
@@ -5228,36 +5465,36 @@
"oneproxySuccess": "Успех",
"oneproxyFailed": "Не удалось",
"routingAntigravitySignatureTitle": "Режим кэша сигнатур Антигравитации",
- "routingAntigravitySignatureDesc": "__MISSING__:Control whether OmniRoute reuses only stored Gemini thought signatures or accepts validated client-provided signatures in Antigravity-compatible tool-call flows.",
- "routingAntigravitySignatureEnabledLabel": "__MISSING__:Enabled",
- "routingAntigravitySignatureEnabledDesc": "__MISSING__:Current behavior. Ignore client-provided signatures and keep using the stored OmniRoute flow.",
- "routingAntigravitySignatureBypassLabel": "__MISSING__:Bypass",
- "routingAntigravitySignatureBypassDesc": "__MISSING__:Accept client-provided signatures after lightweight validation and fall back to the stored signature when invalid.",
- "routingAntigravitySignatureBypassStrictLabel": "__MISSING__:Bypass Strict",
- "routingAntigravitySignatureBypassStrictDesc": "__MISSING__:Require full protobuf validation before accepting a client-provided signature.",
+ "routingAntigravitySignatureDesc": "Управляйте тем, использует ли OmniRoute только сохраненные подписи мыслей Gemini или принимает проверенные подписи, предоставленные клиентом, в совместимых с Antigravity потоках вызовов инструментов.",
+ "routingAntigravitySignatureEnabledLabel": "Включено",
+ "routingAntigravitySignatureEnabledDesc": "Т текущее поведение. Игнорировать предоставленные клиентом подписи и продолжать использовать сохраненный поток OmniRoute.",
+ "routingAntigravitySignatureBypassLabel": "Обойти",
+ "routingAntigravitySignatureBypassDesc": "Принимать предоставленные клиентом подписи после легкой проверки и возвращаться к сохраненной подписи при недействительной.",
+ "routingAntigravitySignatureBypassStrictLabel": "Обойти строгий режим",
+ "routingAntigravitySignatureBypassStrictDesc": "Требуется полная валидация protobuf перед принятием подписи, предоставленной клиентом.",
"routingHeaderFingerprintTitle": "Отпечаток заголовка (для каждого поставщика)",
"routingServerRejectedSave": "⚠ Сервер отклонил сохранение:",
"routingAddTransformOp": "Добавьте операцию преобразования",
"routingClientCacheControlTitle": "Управление кэшем клиента",
- "routingClientCacheControlDesc": "__MISSING__:Configure whether OmniRoute preserves client-provided cache_control markers",
- "routingClientCacheControlAutoDesc": "__MISSING__:For deterministic Claude-compatible flows, preserve client-provided cache_control as-is. If the request has no cache_control, OmniRoute does not inject any bridge-owned markers for CC-compatible third-party proxy compatibility.",
- "routingClientCacheControlAlwaysLabel": "__MISSING__:Always Preserve",
- "routingClientCacheControlAlwaysDesc": "__MISSING__:Always forward client-provided cache_control headers to upstream providers as-is.",
- "routingClientCacheControlNeverLabel": "__MISSING__:Never Preserve",
- "routingClientCacheControlNeverDesc": "__MISSING__:Always remove client cache_control headers and let OmniRoute manage caching where native provider flows support it.",
+ "routingClientCacheControlDesc": "Настройте, сохраняет ли OmniRoute предоставленные клиентом маркеры cache_control",
+ "routingClientCacheControlAutoDesc": "Для детерминированных потоков, совместимых с Claude, сохраняйте предоставленный клиентом cache_control без изменений. Если в запросе нет cache_control, OmniRoute не вставляет никаких маркеров, принадлежащих мосту, для совместимости с прокси третьих сторон, совместимыми с CC.",
+ "routingClientCacheControlAlwaysLabel": "Всегда Сохранять",
+ "routingClientCacheControlAlwaysDesc": "Всегда передавайте заголовки cache_control, предоставленные клиентом, поставщикам выше по цепочке без изменений.",
+ "routingClientCacheControlNeverLabel": "Никогда не сохранять",
+ "routingClientCacheControlNeverDesc": "Всегда удаляйте заголовки cache_control клиента и позволяйте OmniRoute управлять кэшированием, где это поддерживается потоками нативного провайдера.",
"routingZeroConfigTitle": "Автоматическая маршрутизация без настройки",
- "routingZeroConfigDesc": "__MISSING__:Enable automatic provider selection using the auto/ prefix. When enabled, requests to auto, auto/coding, auto/fast, etc. will dynamically route across all connected providers.",
+ "routingZeroConfigDesc": "Включите автоматический выбор провайдера, используя префикс auto/. При включении запросы к auto, auto/coding, auto/fast и т. д. будут динамически маршрутизироваться по всем подключенным провайдерам.",
"routingDefaultAutoVariant": "Автоматический вариант по умолчанию",
"visionBridge": "Видение моста",
- "visionBridgeDesc": "__MISSING__:Run an automatic vision-to-text fallback before routing image requests to text-only models.",
- "visionBridgeEnabledLabel": "__MISSING__:Enabled",
- "visionBridgeEnabledDesc": "__MISSING__:Toggle the pre-call bridge that replaces image parts with extracted text.",
+ "visionBridgeDesc": "Запустите автоматическое преобразование изображения в текст перед перенаправлением запросов изображений на модели только для текста.",
+ "visionBridgeEnabledLabel": "Включено",
+ "visionBridgeEnabledDesc": "Переключите предварительный мост вызова, который заменяет части изображения извлеченным текстом.",
"visionBridgeModel": "Модель моста",
"visionBridgeModelPlaceholder": "опенай/gpt-4o-мини",
- "visionBridgeModelHint": "__MISSING__:Any OmniRoute model ID that supports vision can be used here.",
+ "visionBridgeModelHint": "Любой идентификатор модели OmniRoute, который поддерживает визуализацию, может быть использован здесь.",
"visionBridgePrompt": "Подсказка о мосте",
"visionBridgePromptPlaceholder": "Кратко опишите этот образ.",
- "visionBridgePromptHint": "__MISSING__:Sent to the vision model before the extracted description is injected back into the original request.",
+ "visionBridgePromptHint": "Отправлено в модель зрения до того, как извлеченное описание будет внедрено обратно в оригинальный запрос.",
"visionBridgeTimeoutMs": "Тайм-аут (мс)",
"visionBridgeMaxImagesPerRequest": "Максимальное количество изображений на запрос",
"resilienceMaxBackoffSteps": "Max backoff steps",
@@ -5314,48 +5551,48 @@
"cliproxyapiStatus": "Статус CLIProxyAPI",
"cliproxyapiNotDetected": "Не обнаружено",
"payloadRulesTitle": "Правила полезной нагрузки",
- "payloadRulesDesc": "__MISSING__:Configure request payload mutations by model and protocol. Changes are persisted in settings and hot reloaded into the runtime immediately after save.",
- "payloadRuleDefaultTitle": "__MISSING__:default",
- "payloadRuleDefaultDesc": "__MISSING__:Applies params only when the target path is missing from the outgoing payload.",
- "payloadRuleOverrideTitle": "__MISSING__:override",
- "payloadRuleOverrideDesc": "__MISSING__:Forces values onto the payload, replacing anything already present at that path.",
- "payloadRuleFilterTitle": "__MISSING__:filter",
- "payloadRuleFilterDesc": "__MISSING__:Removes blocked params from the payload before the upstream request is sent.",
- "payloadRuleDefaultRawTitle": "__MISSING__:defaultRaw",
- "payloadRuleDefaultRawDesc": "__MISSING__:Like default, but string values are parsed as JSON first when possible. The legacy input alias default-raw is also accepted on save.",
- "payloadEditorTitle": "__MISSING__:Editor",
- "payloadEditorDesc": "__MISSING__:Use the runtime schema shape: default, override, filter, defaultRaw. The API also accepts the legacy input key default-raw.",
- "payloadEditorReady": "__MISSING__:Ready",
- "payloadResetInfo": "__MISSING__:Editor reset to the neutral template. Save to apply it.",
- "payloadSaveSuccess": "__MISSING__:Payload rules saved and hot reloaded.",
- "payloadJsonParseError": "__MISSING__:JSON parse error: {error}",
- "payloadMustBeObject": "__MISSING__:Payload rules must be a JSON object.",
- "payloadInvalidJson": "__MISSING__:Invalid JSON payload.",
- "payloadValidJsonRequired": "__MISSING__:Payload rules must be valid JSON before saving.",
- "savePayloadRules": "__MISSING__:Save Payload Rules",
- "requestLimitsTitle": "__MISSING__:Request Limits",
- "requestLimitsDesc": "__MISSING__:Configure global request limits and concurrency guards.",
- "maxRequestSizeLabel": "__MISSING__:Max Request Size (MB)",
- "maxRequestSizeDesc": "__MISSING__:Maximum allowed size for incoming API requests.",
- "maxResponseSizeLabel": "__MISSING__:Max Response Size (MB)",
- "maxResponseSizeDesc": "__MISSING__:Maximum allowed size for outgoing API responses.",
- "maxRequestTokensLabel": "__MISSING__:Max Request Tokens",
- "maxRequestTokensDesc": "__MISSING__:Maximum total tokens allowed in a single request.",
- "maxResponseTokensLabel": "__MISSING__:Max Response Tokens",
- "maxResponseTokensDesc": "__MISSING__:Maximum total tokens allowed in a single response.",
+ "payloadRulesDesc": "Настройте мутации полезной нагрузки запроса по модели и протоколу. Изменения сохраняются в настройках и немедленно загружаются в среду выполнения после сохранения.",
+ "payloadRuleDefaultTitle": "по умолчанию",
+ "payloadRuleDefaultDesc": "Применяет параметры только в том случае, если целевой путь отсутствует в исходящем полезном нагрузке.",
+ "payloadRuleOverrideTitle": "переопределить",
+ "payloadRuleOverrideDesc": "Принуждает значения в полезную нагрузку, заменяя все, что уже присутствует по этому пути.",
+ "payloadRuleFilterTitle": "фильтр",
+ "payloadRuleFilterDesc": "Удаляет заблокированные параметры из полезной нагрузки перед отправкой запроса на сервер.",
+ "payloadRuleDefaultRawTitle": "defaultRaw",
+ "payloadRuleDefaultRawDesc": "Как по умолчанию, но строковые значения сначала разбираются как JSON, если это возможно. Устаревший псевдоним ввода default-raw также принимается при сохранении.",
+ "payloadEditorTitle": "Редактор",
+ "payloadEditorDesc": "Используйте схему времени выполнения: default, override, filter, defaultRaw. API также принимает устаревший ключ ввода default-raw.",
+ "payloadEditorReady": "Готово",
+ "payloadResetInfo": "Редактор сброшен к нейтральному шаблону. Сохраните, чтобы применить его.",
+ "payloadSaveSuccess": "Правила полезной нагрузки сохранены и горячо перезагружены.",
+ "payloadJsonParseError": "Ошибка разбора JSON: {error}",
+ "payloadMustBeObject": "Правила полезной нагрузки должны быть объектом JSON.",
+ "payloadInvalidJson": "Неверная нагрузка JSON.",
+ "payloadValidJsonRequired": "Правила полезной нагрузки должны быть действительным JSON перед сохранением.",
+ "savePayloadRules": "Сохранить правила полезной нагрузки",
+ "requestLimitsTitle": "Ограничения Запросов",
+ "requestLimitsDesc": "Настройте глобальные лимиты запросов и защиту от одновременных запросов.",
+ "maxRequestSizeLabel": "Максимальный размер запроса (МБ)",
+ "maxRequestSizeDesc": "Максимально допустимый размер для входящих API-запросов.",
+ "maxResponseSizeLabel": "Максимальный размер ответа (МБ)",
+ "maxResponseSizeDesc": "Максимально допустимый размер для исходящих API-ответов.",
+ "maxRequestTokensLabel": "Максимальное количество токенов запроса",
+ "maxRequestTokensDesc": "Максимальное количество токенов, разрешенное в одном запросе.",
+ "maxResponseTokensLabel": "Максимальное количество токенов ответа",
+ "maxResponseTokensDesc": "Максимальное количество токенов, разрешенное в одном ответе.",
"modelCooldownsTitle": "Модели в кулдауне",
"modelCooldownsEmpty": "Сейчас нет моделей в режиме восстановления.",
"codexFastTierTitle": "Быстрый уровень Кодекса",
"codexFastTierDesc": "Глобально внедрите service_tier=priority для запросов OpenAI Codex.",
"codexFastTierHint": "Если эта функция включена, OmniRoute добавляет атрибут service_tier=priority к исходящим запросам Кодекса для соединений, для которых еще не указан уровень. Для уровня приоритета требуется ключ OpenAI Enterprise API или путь Codex для аутентификации ChatGPT; другие типы ключей получат от OpenAI ошибку, связанную с уровнем. Настройки для каждого соединения на странице поставщика Кодекса имеют приоритет.",
"codexFastTierSaveError": "Не удалось обновить настройки уровня быстрого доступа Кодекса.",
- "codexFastTierTierLabel": "__MISSING__:Service tier",
- "codexFastTierTierPriority": "__MISSING__:Priority",
- "codexFastTierTierFlex": "__MISSING__:Flex",
- "codexFastTierTierDefault": "__MISSING__:Default",
- "codexFastTierModelsLabel": "__MISSING__:Fast-tier models",
- "codexFastTierModelsHint": "__MISSING__:Only checked models receive service_tier when Fast Tier is enabled.",
- "codexFastTierModelCheckbox": "__MISSING__:Enable Fast Tier for {model}",
+ "codexFastTierTierLabel": "Уровень обслуживания",
+ "codexFastTierTierPriority": "Приоритет",
+ "codexFastTierTierFlex": "Гибкость",
+ "codexFastTierTierDefault": "По умолчанию",
+ "codexFastTierModelsLabel": "Модели быстрого уровня",
+ "codexFastTierModelsHint": "Только проверенные модели получают service_tier, когда включен Fast Tier.",
+ "codexFastTierModelCheckbox": "Включить Быстрый Уровень для {model}",
"claudeFastModeTitle": "Клод Быстрый режим",
"claudeFastModeDesc": "Переключить выбранные запросы Клода в антропный быстрый режим (скорость: «быстрый»).",
"claudeFastModeHint": "Anthropic официально не поддерживает быстрый режим для клиентов в стиле SDK. Если этот параметр включен, OmniRoute пересылает заголовок X-CPA-Force-Fast-Mode, чтобы парная сборка CLIProxyAPI могла включить подмену точки входа. Только перечисленные модели Opus проходят проверку на стороне клиента Anthropic. Уровень подписки, максимальный план и кредитный баланс в быстром режиме по-прежнему применяются на стороне сервера — Anthropic может возвращать out_of_credits, даже если переключатель включен.",
@@ -5363,58 +5600,58 @@
"claudeFastModeModelCheckbox": "Включить быстрый режим для {model}",
"claudeFastModeSaveError": "Не удалось обновить настройки быстрого режима Клода.",
"authz": {
- "title": "__MISSING__:Authz Inventory",
- "description": "__MISSING__:5-tier route classification with live bypass policy. Read shows the full taxonomy; mutations re-prompt for the management password.",
- "loading": "__MISSING__:Loading inventory…",
- "loadError": "__MISSING__:Failed to load authz inventory",
+ "title": "Инвентаризация Authz",
+ "description": "5-уровневая классификация маршрутов с живой политикой обхода. Чтение показывает полную таксономию; мутации повторно запрашивают пароль управления.",
+ "loading": "Загрузка инвентаря…",
+ "loadError": "Не удалось загрузить инвентарь authz",
"tier": {
- "LOCAL_ONLY": "__MISSING__:Local only",
- "ALWAYS_PROTECTED": "__MISSING__:Always protected",
- "MANAGEMENT": "__MISSING__:Management",
- "CLIENT_API": "__MISSING__:Client API",
- "PUBLIC": "__MISSING__:Public"
+ "LOCAL_ONLY": "Только локально",
+ "ALWAYS_PROTECTED": "Всегда защищено",
+ "MANAGEMENT": "Управление",
+ "CLIENT_API": "Клиентский API",
+ "PUBLIC": "Общий"
},
"bypass": {
- "section": "__MISSING__:Manage-scope bypass",
+ "section": "Управление обходом области",
"kill_switch": {
- "label": "__MISSING__:Bypass kill-switch",
- "desc": "__MISSING__:Master toggle. When off, no LOCAL_ONLY prefix is reachable from non-loopback regardless of the per-prefix list."
+ "label": "Обойти аварийный выключатель",
+ "desc": "Главный переключатель. Когда выключен, префикс LOCAL_ONLY недоступен из ненаправленного соединения, независимо от списка префиксов."
},
"prefix": {
- "label": "__MISSING__:Bypassable prefixes",
- "desc": "__MISSING__:LOCAL_ONLY prefixes that manage-scope API keys (or dashboard sessions) may reach from non-loopback hosts.",
- "add": "__MISSING__:Add prefix",
- "placeholder": "__MISSING__:/api/mcp/v2/",
- "empty": "__MISSING__:No prefixes configured. Bypass effectively off."
+ "label": "Обходимые префиксы",
+ "desc": "Префиксы LOCAL_ONLY, которые управляют ключами API (или сессиями панели управления), могут достигать не петлевых хостов.",
+ "add": "Добавить префикс",
+ "placeholder": "/api/mcp/v2/",
+ "empty": "Префиксы не настроены. Обход фактически отключен."
},
- "cli_tools_runtime_note": "__MISSING__:Spawn-capable prefix. Compile-time deny; cannot be made bypassable. Shown read-only."
+ "cli_tools_runtime_note": "Префикс, способный к созданию. Запрет на этапе компиляции; не может быть обойден. Отображается как только для чтения."
},
"password": {
"prompt": {
- "label": "__MISSING__:Current password",
- "desc": "__MISSING__:Re-confirm to apply security-impacting changes."
+ "label": "Текущий пароль",
+ "desc": "Повторно подтвердите применение изменений, влияющих на безопасность."
},
- "placeholder": "__MISSING__:Current management password",
- "cancel": "__MISSING__:Cancel",
- "submit": "__MISSING__:Apply"
+ "placeholder": "Текущий пароль управления",
+ "cancel": "Отменить",
+ "submit": "Применить"
},
- "save": "__MISSING__:Save changes",
- "saved": "__MISSING__:Authz settings updated",
- "pending": "__MISSING__:Unsaved changes",
+ "save": "Сохранить изменения",
+ "saved": "Настройки Authz обновлены",
+ "pending": "Несохранённые изменения",
"badge": {
- "bypassable": "__MISSING__:Bypassable via manage scope",
- "strict": "__MISSING__:Strict loopback",
- "auth_required": "__MISSING__:Auth required",
- "public": "__MISSING__:Public",
- "always_protected": "__MISSING__:Always protected",
- "spawn_capable": "__MISSING__:Spawn-capable"
+ "bypassable": "Обходимо через управление областью",
+ "strict": "Строгий обратный цикл",
+ "auth_required": "Требуется аутентификация",
+ "public": "Публичный",
+ "always_protected": "Всегда защищено",
+ "spawn_capable": "Способный к созданию экземпляров"
},
"error": {
- "PASSWORD_REQUIRED": "__MISSING__:Current password required to apply these changes.",
- "PASSWORD_MISMATCH": "__MISSING__:Current password is incorrect.",
- "INSUFFICIENT_SCOPE": "__MISSING__:API key lacks the manage scope.",
- "BYPASS_PREFIX_NOT_ALLOWED": "__MISSING__:One or more prefixes target spawn-capable routes and cannot be bypassed.",
- "GENERIC": "__MISSING__:Failed to update authz settings."
+ "PASSWORD_REQUIRED": "Текущий пароль необходим для применения этих изменений.",
+ "PASSWORD_MISMATCH": "Текущий пароль неверен.",
+ "INSUFFICIENT_SCOPE": "Ключ API не имеет области управления.",
+ "BYPASS_PREFIX_NOT_ALLOWED": "Один или несколько префиксов нацелены на маршруты, способные к спавну, и не могут быть обойдены.",
+ "GENERIC": "Не удалось обновить настройки authz."
}
},
"resilienceBaseCooldownLabel": "Базовое время восстановления",
@@ -5463,22 +5700,19 @@
"qdrantCleanupSuccess": "ОК: удалено {count} баллов (хранение: {days} дней)",
"qdrantCleanupFailed": "Очистка не удалась",
"qdrantCleanupError": "Ошибка: {error}",
- "vercelRelaySuccess": "__MISSING__:Vercel Relay deployed successfully",
- "vercelRelayButton": "__MISSING__:Deploy Vercel Relay",
- "vercelRelayModalTitle": "__MISSING__:Deploy Vercel Relay",
- "vercelRelayWarning": "__MISSING__:Warning: A Vercel deployment token is required. This token will only be used to create the serverless relay and will never be stored by OmniRoute.",
- "vercelRelayTokenLabel": "__MISSING__:Vercel Access Token",
- "vercelRelayProjectNameLabel": "__MISSING__:Vercel Project Name",
- "vercelRelayFreeTierNote": "__MISSING__:Relays are lightweight proxy endpoints deployed on Vercel's free tier to bypass local network/region limitations.",
- "vercelRelayDeploying": "__MISSING__:Deploying...",
- "vercelRelayDeploy": "__MISSING__:Deploy",
- "homePinProviderQuotaToHome": "Pin Information to Home Page",
- "homeProviderQuotaLimits": "Provider Quota Limits",
- "homeProviderQuotaLimitsDesc": "Pin the Provider Quota status container (with Refresh All button) to the top of the Home page.",
- "homeQuickStart": "Quick Start",
- "homeQuickStartDesc": "Show the Quick Start panel on the Home page.",
- "homeProviderTopology": "Provider Topology",
- "homeProviderTopologyDesc": "Show the Provider Topology on the Home page."
+ "vercelRelaySuccess": "Vercel Relay успешно развернут",
+ "vercelRelayButton": "Развернуть Vercel Relay",
+ "vercelRelayModalTitle": "Развернуть Vercel Relay",
+ "vercelRelayWarning": "Предупреждение: требуется токен развертывания Vercel. Этот токен будет использоваться только для создания безсерверного реле и никогда не будет храниться OmniRoute.",
+ "vercelRelayTokenLabel": "Токен доступа Vercel",
+ "vercelRelayProjectNameLabel": "Название проекта Vercel",
+ "vercelRelayFreeTierNote": "Реле — это легковесные прокси-эндпоинты, развернутые на бесплатном тарифе Vercel, чтобы обойти ограничения локальной сети/региона.",
+ "vercelRelayDeploying": "Развёртывание...",
+ "vercelRelayDeploy": "Развернуть",
+ "proxyGlobalConfigTab": "Глобальная Конфигурация",
+ "proxyPoolTab": "Пул Прокси",
+ "freePoolTab": "Бесплатный Пул",
+ "proxyDocumentationTab": "Документация"
},
"contextRtk": {
"title": "RTK Engine",
@@ -5519,7 +5753,7 @@
"result": "Result",
"previewEmpty": "Run a sample to preview RTK output.",
"detected": "Detected",
- "masterSwitchOffAlert": "__MISSING__:Token Saver master switch is OFF — these settings will not affect requests until you turn it on from the Endpoint page.",
+ "masterSwitchOffAlert": "Мастер-переключатель Token Saver выключен — эти настройки не повлияют на запросы, пока вы не включите его на странице Endpoint.",
"tokensFiltered": "Tokens filtered",
"filtersActive": "Filters active",
"requests": "Requests",
@@ -5574,8 +5808,8 @@
"enabled": "Enabled",
"autoDetect": "Auto-detect language",
"rulesCount": "{count} rules",
- "inputCompressionTitle": "__MISSING__:Input compression",
- "inputCompressionDesc": "__MISSING__:Rewrite chat history with shorter wording. Reduces input tokens by ~50%.",
+ "inputCompressionTitle": "Сжатие ввода",
+ "inputCompressionDesc": "Перепишите историю чата с более короткими формулировками. Сокращает входные токены примерно на 50%.",
"analyticsTitle": "Compression Analytics",
"noAnalytics": "No compression analytics yet.",
"outputMode": "Режим вывода",
@@ -5819,7 +6053,76 @@
"routeConnectionLabel": "Подключение",
"scenarioVision": "Видение (понимание изображения)",
"scenarioSchemaCoercion": "Приведение схемы (структурированный вывод)",
- "techniques": "Техники:"
+ "techniques": "Техники:",
+ "friendlyTitle": "Переводчик",
+ "friendlySubtitle": "Используйте ваше существующее приложение с любым провайдером — без переписывания кода.",
+ "conceptHeadline": "Ваше приложение говорит на \"языке\" одного API. Переводчик преобразует его для использования другого провайдера.",
+ "conceptDiagramAppLabel": "Ваше приложение",
+ "conceptDiagramSourceLabel": "Формат источника",
+ "conceptDiagramHubLabel": "OpenAI (хаб)",
+ "conceptDiagramTargetLabel": "Целевой провайдер",
+ "conceptDiagramExampleApp": "например, Anthropic SDK",
+ "conceptDiagramExampleSource": "claude",
+ "conceptDiagramExampleTarget": "Гемини",
+ "conceptHowItWorksToggle": "Как это работает",
+ "conceptHowItWorksBody": "Ваше приложение отправляет запрос в своем собственном формате. Переводчик определяет формат, преобразует его через OpenAI как промежуточный узел (или напрямую, когда доступен прямой переводчик), отправляет его выбранному провайдеру и возвращает ответ, преобразованный обратно в формат вашего приложения.",
+ "tabTranslate": "Перевести",
+ "tabMonitor": "Монитор",
+ "tabTranslateAriaLabel": "Перейдите на вкладку Перевод",
+ "tabMonitorAriaLabel": "Перейдите на вкладку Монитор",
+ "simpleAppUsesLabel": "Мое приложение использует",
+ "simpleAppUsesHint": "Формат API, на котором работает ваше приложение (например, Anthropic SDK = claude).",
+ "simpleSendToLabel": "Отправить на",
+ "simpleSendToHint": "Куда на самом деле отправить запрос (поставщик, подключенный в OmniRoute).",
+ "simpleStartWithLabel": "Начать с",
+ "simpleStartWithExamplePlaceholder": "Выберите готовый пример",
+ "simpleStartWithCustomOption": "Вставьте ваш запрос (расширенный)",
+ "simpleModeLabel": "Режим",
+ "simpleModePreview": "Предварительный просмотр перевода только",
+ "simpleModeSend": "Отправить и увидеть ответ",
+ "simpleAdvancedToggle": "Расширенный",
+ "simpleInputPanelTitle": "Ввод",
+ "simpleInputPanelHint": "Свободное текстовое сообщение или готовый пример",
+ "simpleResultPanelTitle": "Перевод + Ответ",
+ "narratedDetected": "✓ Обнаружено: {format}",
+ "narratedTranslating": "Перевод на {target}...",
+ "narratedSending": "Отправка на {target}...",
+ "narratedSuccess": "→ переведено на {target} · ответ за {latency}мс",
+ "narratedError": "Не удалось: {reason}",
+ "narratedSeeTranslatedJson": "посмотрите переведенный JSON",
+ "narratedSeePipeline": "посмотреть конвейер",
+ "advancedSectionTitle": "Расширенный",
+ "advancedSectionSubtitle": "Сырой JSON, конвейер и технические инструменты. Всё здесь такое же, как в старых вкладках — просто reorganized.",
+ "advancedRawJsonTitle": "Сырой JSON (автоопределение + Monaco)",
+ "advancedRawJsonSubtitle": "Вставьте JSON-запрос; формат определяется автоматически.",
+ "advancedPipelineTitle": "Промежуточный конвейер OpenAI",
+ "advancedPipelineSubtitle": "Визуализируйте каждый шаг перевода (центр и спицы).",
+ "advancedStreamTransformTitle": "Потоковый Трансформер (Чат → Ответы SSE)",
+ "advancedStreamTransformSubtitle": "Преобразует Chat Completions SSE в Responses API.",
+ "advancedTestBenchTitle": "Тестовый стенд (8 сценариев)",
+ "advancedTestBenchSubtitle": "Запускает все сценарии и сообщает о прохождении/непрохождении + процент совместимости %.",
+ "advancedCompressionTitle": "Предварительный просмотр сжатия",
+ "advancedCompressionSubtitle": "Оцените экономию токенов в различных режимах сжатия.",
+ "monitorOriginHint": "События, сгенерированные Translate или основным конвейером, появляются здесь в реальном времени.",
+ "monitorEmptyCta": "Перейдите на вкладку Перевод и отправьте запрос — он появится здесь.",
+ "monitorOpenTranslateButton": "Перейти к переводу",
+ "pipelineStepClientRequest": "Запрос клиента",
+ "pipelineStepClientRequestDesc": "Запрос получен в формате клиента",
+ "pipelineStepFormatDetected": "Формат обнаружен",
+ "pipelineStepFormatDetectedDesc": "Автоопределённый формат источника",
+ "pipelineStepOpenAIIntermediate": "OpenAI Промежуточный",
+ "pipelineStepOpenAIIntermediateDesc": "Переведено в формат OpenAI hub",
+ "pipelineStepProviderFormat": "Формат Провайдера",
+ "pipelineStepProviderFormatDesc": "Переведено в целевой формат поставщика",
+ "pipelineStepProviderResponse": "Ответ Провайдера",
+ "pipelineStepProviderResponseDesc": "Потоковый ответ от поставщика",
+ "conceptDiagramArrow1": "говорит",
+ "conceptDiagramArrow2": "переводит",
+ "conceptDiagramArrow3": "конвертирует",
+ "conceptDiagramExampleHub": "OpenAI",
+ "conceptDiagramHubTooltip": "Промежуточный хаб, используемый переводчиком для преобразования между форматами, которые не имеют прямого соответствия.",
+ "conceptDiagramSourceTooltip": "Формат API, с которым работает ваше приложение (например, Anthropic SDK = claude).",
+ "conceptDiagramTargetTooltip": "Провайдер, куда фактически будет отправлен запрос."
},
"usage": {
"title": "Использование",
@@ -5870,19 +6173,19 @@
"runStepDescription": "Выполняйте тестовые сценарии для конечных точек LLM через OmniRoute. Каждый случай отправляется как реальный запрос API.",
"evaluate": "Оценить",
"evaluateStepDescription": "Ответы сравниваются с ожидаемыми критериями. См. «Годен/не годен» для каждого случая с показателями задержки и подробной обратной связью.",
- "evalsStrategyContainsLabel": "__MISSING__:Contains",
- "evalsStrategyExactLabel": "__MISSING__:Exact Match",
- "evalsStrategyRegexLabel": "__MISSING__:Regex",
- "evalsStrategyCustomLabel": "__MISSING__:Custom Logic",
- "evalsStrategyContainsDescription": "__MISSING__:Checks if the LLM output contains the expected substring.",
- "evalsStrategyExactDescription": "__MISSING__:Checks if the LLM output exactly matches the expected value.",
- "evalsStrategyRegexDescription": "__MISSING__:Validates the LLM output against a regular expression pattern.",
- "evalsStrategyCustomDescription": "__MISSING__:Custom evaluation logic (configured via JSON).",
- "historyColumnSuiteName": "__MISSING__:Suite Name",
- "historyColumnTarget": "__MISSING__:Target",
- "historyColumnPassRate": "__MISSING__:Pass Rate",
- "historyColumnAvgLatencyMs": "__MISSING__:Avg Latency",
- "historyColumnCreatedAt": "__MISSING__:Executed",
+ "evalsStrategyContainsLabel": "Содержит",
+ "evalsStrategyExactLabel": "Точное соответствие",
+ "evalsStrategyRegexLabel": "Регулярное выражение",
+ "evalsStrategyCustomLabel": "Пользовательская Логика",
+ "evalsStrategyContainsDescription": "Проверяет, содержит ли вывод LLM ожидаемую подстроку.",
+ "evalsStrategyExactDescription": "Проверяет, соответствует ли вывод LLM точно ожидаемому значению.",
+ "evalsStrategyRegexDescription": "Проверяет вывод LLM на соответствие шаблону регулярного выражения.",
+ "evalsStrategyCustomDescription": "Пользовательская логика оценки (настраивается через JSON).",
+ "historyColumnSuiteName": "Имя набора",
+ "historyColumnTarget": "Цель",
+ "historyColumnPassRate": "Процент Успеха",
+ "historyColumnAvgLatencyMs": "Средняя задержка",
+ "historyColumnCreatedAt": "Выполнено",
"evalSuites": "Оценочные пакеты",
"evalSuitesHint": "Щелкните пакет, чтобы просмотреть тестовые примеры, а затем запустите его для оценки конечных точек LLM.",
"evalsLoading": "Загрузка тестовых пакетов...",
@@ -5977,9 +6280,9 @@
"rawPlanWithValue": "Необработанный план: {plan}",
"noPlanFromProvider": "Нет плана от провайдера",
"noQuotaData": "Нет данных о квотах",
- "cardExpand": "__MISSING__:Expand",
- "cardCollapse": "__MISSING__:Collapse",
- "moreQuotas": "__MISSING__:+{count} more",
+ "cardExpand": "Развернуть",
+ "cardCollapse": "Свернуть",
+ "moreQuotas": "+{count} еще",
"ungrouped": "Без группы",
"viewFlat": "Плоский",
"viewByEnvironment": "По средам",
@@ -5993,23 +6296,23 @@
"tierPro": "Про",
"tierPlus": "Плюс",
"tierFree": "Бесплатно",
- "tierLite": "__MISSING__:Lite",
+ "tierLite": "Лайт",
"tierUnknown": "Неизвестно",
- "statTotal": "__MISSING__:Total",
- "statCritical": "__MISSING__:Critical",
- "statAlert": "__MISSING__:Alert",
- "statHealthy": "__MISSING__:Healthy",
- "filterPurchaseTypeLabel": "__MISSING__:Type",
- "filterTierLabel": "__MISSING__:Tier",
- "purchaseAll": "__MISSING__:All",
- "purchaseOauthSub": "__MISSING__:Subscription",
- "purchaseOauthFree": "__MISSING__:OAuth Free",
- "purchaseApiKey": "__MISSING__:API Key",
- "creditsLabel": "__MISSING__:Credits",
- "creditBalanceHint": "__MISSING__:Remaining balance",
- "unlimitedLabel": "__MISSING__:Unlimited",
- "refreshing": "__MISSING__:Refreshing",
- "resetsIn": "__MISSING__:Resets in",
+ "statTotal": "Итого",
+ "statCritical": "Критический",
+ "statAlert": "Предупреждение",
+ "statHealthy": "Здоровый",
+ "filterPurchaseTypeLabel": "Тип",
+ "filterTierLabel": "Уровень",
+ "purchaseAll": "Все",
+ "purchaseOauthSub": "Подписка",
+ "purchaseOauthFree": "OAuth Бесплатно",
+ "purchaseApiKey": "API ключ",
+ "creditsLabel": "Кредиты",
+ "creditBalanceHint": "Остаток средств",
+ "unlimitedLabel": "Безлимитный",
+ "refreshing": "Обновление",
+ "resetsIn": "Сбросы через",
"editCutoffs": "Редактировать обрезки",
"forceRefresh": "Обновить сейчас",
"suiteBuilderSaveFailed": "Failed to save suite",
@@ -6158,10 +6461,10 @@
"quotaAlerts": "Оповещения о квотах",
"quotaTableRefreshing": "⟳ Освежающий...",
"noSpendLast30Days": "Никаких расходов за последние 30 дней.",
- "updatedShort": "__MISSING__:Updated",
- "lastRefreshed": "__MISSING__:Last refreshed",
- "providerQuota": "__MISSING__:Provider Quota",
- "providerQuotaHomeHint": "__MISSING__:Live status across connected accounts"
+ "updatedShort": "Обновлено",
+ "lastRefreshed": "Последнее обновление",
+ "providerQuota": "Квота Провайдера",
+ "providerQuotaHomeHint": "Живой статус по подключенным аккаунтам"
},
"modals": {
"waitingAuth": "Ожидание авторизации",
@@ -6718,12 +7021,12 @@
"browseAllSkillsOnGithub": "Просмотреть все навыки на GitHub",
"apiSkills": "Навыки API",
"cliSkills": "Навыки работы с интерфейсом командной строки",
- "apiSkillsSubtitle": "__MISSING__:{count} skills — control OmniRoute via REST / HTTP",
- "cliSkillsSubtitle": "__MISSING__:{count} skills — control OmniRoute via the omniroute terminal binary",
- "howToUseStep1": "__MISSING__:Click {copyUrl} on the skill you want your agent to know about.",
- "howToUseStep2": "__MISSING__:In your AI agent (Claude, Cursor, Cline…), say:",
- "howToUseStep2Code": "__MISSING__:Use the skill at [pasted-url]",
- "howToUseStep3": "__MISSING__:The agent fetches the SKILL.md and learns OmniRoute's API or CLI — no manual docs needed."
+ "apiSkillsSubtitle": "{count} навыков — управление OmniRoute через REST / HTTP",
+ "cliSkillsSubtitle": "{count} навыков — управление OmniRoute через двоичный файл терминала omniroute",
+ "howToUseStep1": "Нажмите {copyUrl} на умении, о котором вы хотите, чтобы ваш агент знал.",
+ "howToUseStep2": "В вашем AI-агенте (Claude, Cursor, Cline…) скажите:",
+ "howToUseStep2Code": "Используйте навык по адресу [pasted-url]",
+ "howToUseStep3": "Агент получает SKILL.md и изучает API или CLI OmniRoute — документация не требуется."
},
"cloudAgents": {
"title": "Облачные агенты",
@@ -6742,28 +7045,28 @@
"tasks": "Задачи",
"taskDetail": "Подробности задачи",
"noTasks": "Заданий пока нет. Создайте его, чтобы начать.",
- "noTasksTitle": "__MISSING__:No tasks yet",
- "noTasksDesc": "__MISSING__:Create your first task to get started.",
- "tasksTab": "__MISSING__:Tasks",
- "agentsTab": "__MISSING__:Agents",
- "settingsTab": "__MISSING__:Settings",
- "agentsEnabled": "__MISSING__:Enabled",
- "agentsDisabled": "__MISSING__:Disabled",
- "filterAllProviders": "__MISSING__:All Providers",
- "filterAll": "__MISSING__:All",
- "autoRefreshing": "__MISSING__:Auto-refreshing",
- "viewPR": "__MISSING__:View Pull Request",
- "connected": "__MISSING__:Connected",
- "notConnected": "__MISSING__:Not connected",
- "configure": "__MISSING__:Configure",
- "settingsTitle": "__MISSING__:Cloud Agent Settings",
- "settingsDesc": "__MISSING__:Configure local preferences for cloud agents.",
- "settingEnableAgents": "__MISSING__:Enable cloud agents",
- "settingEnableAgentsDesc": "__MISSING__:Allow OmniRoute to orchestrate autonomous coding agents.",
- "settingAutoPR": "__MISSING__:Auto-create PR",
- "settingAutoPRDesc": "__MISSING__:When a task is completed, automatically create a Pull Request with the changes.",
- "settingRequireApproval": "__MISSING__:Require plan approval",
- "settingRequireApprovalDesc": "__MISSING__:Always wait for manual approval before an agent executes a proposed plan.",
+ "noTasksTitle": "Нет задач пока",
+ "noTasksDesc": "Создайте свою первую задачу, чтобы начать.",
+ "tasksTab": "Задачи",
+ "agentsTab": "Агенты",
+ "settingsTab": "Настройки",
+ "agentsEnabled": "Включено",
+ "agentsDisabled": "Отключено",
+ "filterAllProviders": "Все провайдеры",
+ "filterAll": "Все",
+ "autoRefreshing": "Автообновление",
+ "viewPR": "Просмотреть Запрос На Вливание",
+ "connected": "Подключено",
+ "notConnected": "Не подключено",
+ "configure": "Настроить",
+ "settingsTitle": "Настройки облачного агента",
+ "settingsDesc": "Настройте локальные предпочтения для облачных агентов.",
+ "settingEnableAgents": "Включить облачные агенты",
+ "settingEnableAgentsDesc": "Разрешите OmniRoute управлять автономными кодирующими агентами.",
+ "settingAutoPR": "Автоматическое создание PR",
+ "settingAutoPRDesc": "Когда задача завершена, автоматически создайте Pull Request с изменениями.",
+ "settingRequireApproval": "Требуется одобрение плана",
+ "settingRequireApprovalDesc": "Всегда ожидайте ручного одобрения перед выполнением агентом предложенного плана.",
"untitledTask": "Задача без названия",
"created": "Создано",
"conversation": "Разговор",
@@ -6864,7 +7167,7 @@
"clearError": "Не удалось очистить кэш.",
"unavailable": "Кэш недоступен",
"unavailableDesc": "Не удалось получить статистику кэша. Убедитесь, что сервер запущен.",
- "loadingCacheAria": "__MISSING__:Loading cache",
+ "loadingCacheAria": "Загрузка кэша",
"promptCache": "Кэш промптов (на стороне провайдера)",
"semanticCache": "Semantic Cache",
"promptCacheSectionDesc": "Shows provider-side prompt caching activity from usage history so you can see where cache control is active and how much input reuse you are getting.",
@@ -6906,9 +7209,9 @@
"peakCached": "Пик кэша",
"cached": "В кэше",
"overview": "Обзор",
- "tableProvider": "__MISSING__:Provider",
- "tableModel": "__MISSING__:Model",
- "performanceTitle": "__MISSING__:Performance",
+ "tableProvider": "Поставщик",
+ "tableModel": "Модель",
+ "performanceTitle": "Производительность",
"semanticCacheSectionDesc": "OmniRoute's own deterministic response cache. When enabled, repeated non-streaming temperature=0 requests can be served locally without hitting the upstream provider.",
"semanticCacheDisabledDesc": "Semantic cache is disabled. OmniRoute will skip local response reuse until you turn it back on in Settings.",
"semanticEntriesDesc": "Persisted semantic cache records currently stored in SQLite. Provider-side prompt cache activity is not listed here.",
@@ -6960,11 +7263,11 @@
"cachePerformanceP95Latency": "p95 Задержка (мс)",
"retry": "Повторить попытку",
"reasoningAvgChars": "Среднее число символов",
- "tableShare": "__MISSING__:Share",
- "justNow": "__MISSING__:just now",
- "minutesAgo": "__MISSING__:{minutes}m ago",
- "hoursAgo": "__MISSING__:{hours}h ago",
- "daysAgo": "__MISSING__:{days}d ago",
+ "tableShare": "Поделиться",
+ "justNow": "только что",
+ "minutesAgo": "{minutes}м назад",
+ "hoursAgo": "{hours}ч назад",
+ "daysAgo": "{days}д назад",
"entries": "Записи"
},
"proxyConfigModal": {
@@ -7110,12 +7413,12 @@
"bulkLabelScopeIds": "Идентификаторы областей (разделенные запятой или новой строкой)",
"bulkScopeIdsPlaceholder": "поставщик-openai, поставщик-антропный",
"bulkApply": "Применить",
- "labelScope": "__MISSING__:Scope",
- "labelProxy": "__MISSING__:Proxy",
- "scopeGlobal": "__MISSING__:global",
- "scopeProvider": "__MISSING__:provider",
- "scopeAccount": "__MISSING__:account",
- "scopeCombo": "__MISSING__:combo",
+ "labelScope": "Область действия",
+ "labelProxy": "Прокси",
+ "scopeGlobal": "глобальный",
+ "scopeProvider": "поставщик",
+ "scopeAccount": "учетная запись",
+ "scopeCombo": "комбо",
"bulkImportErrorMissingName": "Отсутствует ИМЯ",
"bulkImportErrorMissingHost": "Отсутствует ХОСТ",
"bulkImportErrorInvalidPort": "Неверный ПОРТ (должен быть 1-65535).",
@@ -7232,7 +7535,16 @@
"improveConfirm": "Improve",
"exportCode": "Export code",
"exportCodeTitle": "Export Code",
+ "exportShort": "Экспорт",
"noStateToExport": "No playground state available to export.",
+ "closeExportModal": "Закрыть модальное окно экспорта",
+ "close": "Закрыть",
+ "exportRealKeyWarning": "Предупреждение о безопасности: экспорт заблокирован — в выводе был обнаружен реальный ключ API. Пожалуйста, сбросьте свой ключ API и попробуйте снова.",
+ "placeholderHintPrefix": "Заменить",
+ "placeholderHintSuffix": "с вашим фактическим ключом API или установите его как переменную окружения.",
+ "copyLangCode": "Скопировать код {language}",
+ "loadingPresets": "Загрузка…",
+ "loadPresetPlaceholder": "Загрузить пресет…",
"copyCode": "Copy",
"copiedCode": "Copied!",
"addModel": "+ Add model",
@@ -7257,44 +7569,64 @@
"invalidJson": "Invalid JSON",
"running": "Running…",
"runLabel": "Run",
- "enterToolResult": "Enter tool result…"
+ "enterToolResult": "Enter tool result…",
+ "build": {
+ "step1Label": "Что тестировать?",
+ "step2Label": "Настроить",
+ "step3Label": "Запустить",
+ "step1Title": "Что вы хотите протестировать?",
+ "step1Subtitle": "Выберите возможность, которую вы хотите исследовать в этой сессии.",
+ "step2Title": "Настроить",
+ "step2Subtitle": "Настройте инструменты или JSON-схему, которые будут использоваться в запросе.",
+ "step3Title": "Запустить",
+ "modeToolsTitle": "Инструменты",
+ "modeToolsDesc": "Тестирование вызова функции — определите инструменты и посмотрите, как модель их вызывает.",
+ "modeJsonTitle": "JSON",
+ "modeJsonDesc": "Тест структурированного вывода — ограничьте ответ схемой JSON.",
+ "modeBothTitle": "Инструменты + JSON",
+ "modeBothDesc": "Объедините вызов функции и структурированный вывод в одном запросе.",
+ "backButton": "Назад",
+ "nextButton": "Далее",
+ "runButton": "Запустить",
+ "promptPlaceholder": "Введите ваше сообщение… (Enter для отправки, Shift+Enter для новой строки)"
+ }
},
"miniPlayground": {
- "endpoint": "__MISSING__:Endpoint",
- "apiKey": "__MISSING__:API Key",
- "model": "__MISSING__:Model",
- "voice": "__MISSING__:Voice",
- "speed": "__MISSING__:Speed",
- "input": "__MISSING__:Input",
- "url": "__MISSING__:URL",
- "format": "__MISSING__:Format",
- "depth": "__MISSING__:Depth",
- "copyCurl": "__MISSING__:Copy cURL",
- "copied": "__MISSING__:Copied!",
- "run": "__MISSING__:Run",
- "running": "__MISSING__:Running...",
- "response": "__MISSING__:Response",
- "tunnel": "__MISSING__:Tunnel",
- "send": "__MISSING__:Send",
- "selectKey": "__MISSING__:Select key",
- "testLabel": "__MISSING__:Test",
- "expandTest": "__MISSING__:Expand test",
- "collapseTest": "__MISSING__:Collapse test",
- "revealKey": "__MISSING__:Reveal key",
- "hideKey": "__MISSING__:Hide key",
- "download": "__MISSING__:Download",
- "play": "__MISSING__:Play",
- "query": "__MISSING__:Query",
- "numResults": "__MISSING__:Max results",
- "prompt": "__MISSING__:Prompt",
- "size": "__MISSING__:Size",
- "duration": "__MISSING__:Duration",
- "question": "__MISSING__:Question",
- "audioFile": "__MISSING__:Audio file",
- "noKeysFound": "__MISSING__:No API keys found. Add one in the Keys section.",
- "exampleLabel": "__MISSING__:Example",
- "latency": "__MISSING__:{ms}ms",
- "statsLine": "__MISSING__:{ms}ms · {tokensIn} in / {tokensOut} out tokens"
+ "endpoint": "Конечная точка",
+ "apiKey": "API ключ",
+ "model": "Модель",
+ "voice": "Голос",
+ "speed": "Скорость",
+ "input": "Ввод",
+ "url": "URL",
+ "format": "Формат",
+ "depth": "Глубина",
+ "copyCurl": "Скопировать cURL",
+ "copied": "Скопировано!",
+ "run": "Запустить",
+ "running": "Запуск...",
+ "response": "Ответ",
+ "tunnel": "Туннель",
+ "send": "Отправить",
+ "selectKey": "Выберите ключ",
+ "testLabel": "Тест",
+ "expandTest": "Расширить тест",
+ "collapseTest": "Свернуть тест",
+ "revealKey": "Показать ключ",
+ "hideKey": "Скрыть ключ",
+ "download": "Скачать",
+ "play": "Играть",
+ "query": "Запрос",
+ "numResults": "Максимум результатов",
+ "prompt": "Подсказка",
+ "size": "Размер",
+ "duration": "Продолжительность",
+ "question": "Вопрос",
+ "audioFile": "Аудиофайл",
+ "noKeysFound": "Не найдены ключи API. Добавьте один в разделе Ключи.",
+ "exampleLabel": "Пример",
+ "latency": "{ms}мс",
+ "statsLine": "{ms}мс · {tokensIn} входящих / {tokensOut} исходящих токенов"
},
"requestLogger": {
"recording": "Recording",
@@ -7398,7 +7730,8 @@
"loadingProxyLogs": "Loading proxy logs...",
"noProxyLogs": "No proxy logs yet. Configure proxies and make API calls to see them here.",
"noMatchingLogs": "No logs match the current filters.",
- "tlsFingerprint": "Chrome 124 TLS Fingerprint"
+ "tlsFingerprint": "Chrome 124 TLS Fingerprint",
+ "colPublicIp": "Публичный IP"
},
"endpointOptions": {
"speech": "Speech",
@@ -7538,7 +7871,86 @@
"betaConfigSavedSuffix": "(пока не сохраняется на сервере). Ограничение количества запросов еще не встроено в конвейер прокси. Этот экран позволяет вам спроектировать и визуализировать разделение квоты; реальное обеспечение соблюдения требований появится в будущей итерации с сохранением БД и перехватом восходящих вызовов.",
"policyLabel": "Политика:",
"resetIn": "сброс в",
- "quotaTotal": "всего"
+ "quotaTotal": "всего",
+ "kpiAvgUtilization": "Средняя загрузка",
+ "kpiBorrowingNow": "Заем сейчас",
+ "conceptTitle": "Как работает долевое распределение квоты",
+ "conceptIntro": "Quota Share делит квоту провайдера между несколькими API-ключами, используя экономию ресурсов: каждый ключ получает пропорциональную долю, но может занимать из свободного баланса, не превышая глобальный лимит.",
+ "conceptFairShare": "Справедливая доля: каждый ключ получает квоту, пропорциональную его заданному весу",
+ "conceptBorrowing": "Заем: ключи могут использовать свободный баланс других, не нарушая лимит",
+ "conceptGlobalCap": "Жесткий глобальный лимит: абсолютный предел провайдера никогда не превышается",
+ "conceptWindows": "Windows: 5ч, почасово, ежедневно, еженедельно, ежемесячно — каждый отслеживается независимо",
+ "conceptKeyHowTitle": "Включение ключа для квоты",
+ "conceptKeyHowDesc": "Создайте ключ в API Manager обычным образом — он автоматически появится на шаге ключа в мастере. Установите флажок Exclusive, чтобы сделать его только для квоты. Отдельного шага включения не требуется.",
+ "conceptExclusiveTitle": "Что делает \"Exclusive\"",
+ "conceptExclusiveDesc": "Эксклюзивный ключ видит/использует только модели квоты пула quotaShared-* — все остальные модели скрыты от его /v1/models и заблокированы.",
+ "burnRateTitle": "Темп сжигания",
+ "burnRateExhaustsIn": "Выхлопы в",
+ "dimensionResetIn": "Сбросы через",
+ "realConsumedColumn": "Потреблено",
+ "deficitColumn": "Дефицит",
+ "borrowingIndicator": "заимствование",
+ "migratedFromLocalStorageNotice": "Пулы успешно мигрированы из localStorage.",
+ "policyCapAbsoluteLabel": "Абсолютный предел",
+ "policyCapAbsolutePlaceholder": "Числовой предел (необязательно)",
+ "multiDimensionLabel": "Многомерный",
+ "stackedBarTitle": "Срезы по ключу API",
+ "usedSuffix": "использовано {percent}%",
+ "wizardTitle": "Новый пул квот",
+ "editPoolTitle": "Редактировать пул",
+ "saveChanges": "Сохранить изменения",
+ "wizardStep1Label": "Учетная запись",
+ "wizardStep2Label": "Ограничение",
+ "wizardStep3Label": "Ключи",
+ "wizardStep1Title": "Выберите соединение провайдера",
+ "wizardStep1Subtitle": "Выберите учетную запись провайдера, для которой этот пул будет делиться квотой, задайте имя и политику по умолчанию.",
+ "wizardStep2Title": "Настроить размеры квоты",
+ "wizardStep2Subtitle": "Определите размеры плана квоты (единица, окно, лимит) для выбранного соединения. Оставьте без изменений, чтобы сохранить текущие настройки.",
+ "wizardStep3Title": "Выделить API-ключи",
+ "wizardStep3Subtitle": "Назначьте ключи API этому пулу с распределением веса в процентах и необязательными лимитами.",
+ "wizardPoolNameLabel": "Имя пула",
+ "wizardPoolNamePlaceholder": "Мой пул квот",
+ "wizardNext": "Далее",
+ "wizardBack": "Назад",
+ "wizardCreatePool": "Создать пул",
+ "wizardDimensionsEditedNotice": "Размеры отредактированы — будут сохранены как ручное переопределение при создании бассейна.",
+ "wizardExclusiveLabel": "Эксклюзивная квота",
+ "wizardExclusiveHint": "Когда включено, эти ключи API будут разрешены только для использования виртуальных моделей этого пула (применяется согласование allowedQuotas при сохранении).",
+ "wizardPreviewLabel": "Предварительный просмотр имен виртуальных моделей",
+ "wizardConnectionsLabel": "Подключения провайдеров",
+ "wizardPrimaryBadge": "основной",
+ "wizardAdditionalConnectionsNote": "Дополнительные подключения используют свои стандартные лимиты каталога (можно редактировать позже).",
+ "wizardSingleProviderNote": "Пул использует единого поставщика",
+ "wizardPreviewMoreModels": "+{count} еще",
+ "accountQuotaTitle": "Квота аккаунта",
+ "accountQuotaNone": "—",
+ "logTitle": "Журнал использования",
+ "logEmpty": "Пока нет использования",
+ "groupLabel": "Группа",
+ "newGroup": "Новая группа",
+ "renameGroup": "Переименовать группу",
+ "groupSelectHint": "Фильтровать пулы по группе",
+ "groupAllocationNote": "Распределения применяются ко всем пулам в этой группе через общий слой квоты.",
+ "groupNamePrompt": "Введите имя группы",
+ "wizardGroupLabel": "Группа",
+ "allGroups": "Все группы",
+ "endpointsTitle": "Доступные конечные точки",
+ "endpointsHint": "Вызывайте эти виртуальные модели с любым выделенным ключом — маршрутизация + квота обрабатываются по группе.",
+ "previewForKey": "Предварительный просмотр ключа",
+ "previewKeyNone": "(все конечные точки)",
+ "endpointsBaseUrl": "Базовый URL",
+ "endpointsCollapse": "Свернуть",
+ "endpointsExpand": "Расширить",
+ "endpointsAnthropicNote": "Anthropic-native",
+ "endpointsResponsesNote": "Ответы OpenAI — codex/github",
+ "endpointsWsNote": "WebSocket — только кодекс",
+ "betaText": "Доля квоты функционирует, но ожидаются ошибки. Нашли одну? Пожалуйста, сообщите об этом.",
+ "betaReportLink": "Сообщить о проблеме",
+ "deleteGroup": "Удалить группу",
+ "deleteGroupConfirm": "Удалить эту группу? Сначала необходимо переназначить или удалить её пулы.",
+ "deleteGroupHasPools": "В этой группе все еще есть пулы — сначала переназначьте или удалите их.",
+ "ungroupedTitle": "Не сгруппировано",
+ "ungroupedHint": "Эти пулы не назначены известной группе. Отредактируйте пул, чтобы переместить его в реальную группу."
},
"plugins": {
"title": "Plugins",
@@ -7575,5 +7987,509 @@
"enabled": "Enabled",
"disabled": "Disabled",
"hooks": "Hooks"
+ },
+ "quotaPlans": {
+ "title": "Планы и Квоты",
+ "description": "Настройте планы квот для каждого провайдера — размеры (%, запросы, токены, $) и временные окна",
+ "providerLabel": "Поставщик / Подключение",
+ "detectedPlanLabel": "Обнаруженный план",
+ "manualPlanLabel": "Ручное управление",
+ "unconfiguredLabel": "Не настроено — требуется ручная настройка",
+ "dimensionLabel": "Размеры",
+ "addDimension": "Добавить размер",
+ "removeDimension": "Удалить",
+ "limitLabel": "Ограничение",
+ "unitOptions": {
+ "percent": "%",
+ "requests": "запросы",
+ "tokens": "токены",
+ "usd": "USD ($)"
+ },
+ "windowOptions": {
+ "5h": "5 часов",
+ "hourly": "Каждый час",
+ "daily": "Ежедневно",
+ "weekly": "Еженедельно",
+ "monthly": "Ежемесячно"
+ },
+ "useCatalogButton": "Использовать каталог",
+ "saveOverrideButton": "Сохранить переопределение",
+ "revertToCatalogButton": "Вернуться к каталогу",
+ "unknownProviderNotice": "Выберите провайдера слева, чтобы настроить его план квот.",
+ "catalogTitle": "Известный каталог",
+ "catalogDescription": "Автоматически обнаруженные планы для следующих провайдеров:"
+ },
+ "activity": {
+ "title": "Активность",
+ "description": "Лента недавних событий",
+ "emptyTitle": "Пока нет активности",
+ "emptyDescription": "Когда вы добавляете провайдеров, создаете комбинации или вращаете ключи, события будут отображаться здесь.",
+ "todayHeader": "Сегодня",
+ "yesterdayHeader": "Вчера",
+ "filterAll": "Все",
+ "filterProviders": "Поставщики",
+ "filterCombos": "Комбо",
+ "filterApiKeys": "API ключи",
+ "filterSettings": "Настройки",
+ "filterQuota": "Квота",
+ "filterAuth": "Аутентификация",
+ "filterSystem": "Система",
+ "relative": {
+ "justNow": "только что",
+ "minutesAgo": "{n} мин. назад",
+ "hoursAgo": "{n} ч назад",
+ "yesterday": "вчера",
+ "daysAgo": "{n} дней назад"
+ },
+ "eventVerb": {
+ "providerAdded": "{actor} добавил провайдер {target}",
+ "providerRemoved": "{actor} удалил провайдер {target}",
+ "providerTested": "{actor} протестировал провайдер {target}",
+ "comboCreated": "{actor} создал комбо {target}",
+ "comboUpdated": "{actor} обновил комбо {target}",
+ "comboDeleted": "{actor} удалил комбо {target}",
+ "apiKeyCreated": "{actor} создал API-ключ {target}",
+ "apiKeyRevoked": "{actor} отозвал API-ключ {target}",
+ "apiKeyRotated": "{actor} повернул API-ключ {target}",
+ "budgetThreshold": "Достигнут предел бюджета для {target}",
+ "settingUpdated": "{actor} обновил настройку {target}",
+ "authLogin": "{actor} вошел в систему",
+ "authLogout": "{actor} вышел из системы",
+ "cloudAgentSession": "Сессия облачного агента начата для {target}",
+ "mcpToolRegistered": "Инструмент MCP {target} зарегистрирован",
+ "webhookCreated": "{actor} создал вебхук {target}",
+ "webhookDeleted": "{actor} удалил вебхук {target}",
+ "quotaPoolCreated": "{actor} создал пул квот {target}",
+ "quotaPoolUpdated": "{actor} обновил пул квот {target}",
+ "quotaPoolDeleted": "{actor} удалил квоту пула {target}",
+ "quotaPlanUpdated": "{actor} обновил план квоты {target}",
+ "quotaStoreDriverChanged": "Драйвер QuotaStore изменён",
+ "updateApplied": "Обновление {target} применено",
+ "deployCompleted": "Развертывание завершено",
+ "skillInstalled": "{actor} установил навык {target}",
+ "skillRemoved": "{actor} удалил навык {target}",
+ "providerCredentialsCreated": "{actor} создал учетные данные для {target}",
+ "providerCredentialsApplied": "Учетные данные для {target} применены",
+ "providerCredentialsUpdated": "{actor} обновил учетные данные для {target}",
+ "providerCredentialsRevoked": "{actor} отозвал учетные данные для {target}",
+ "providerCredentialsBatchRevoked": "{actor} пакетно отозвал учетные данные",
+ "providerCredentialsBulkCreated": "{actor} массово создал учетные данные",
+ "providerCredentialsBulkImported": "{actor} массово импортировал учетные данные",
+ "providerCredentialsImported": "{actor} импортированные учетные данные",
+ "providerSsrfBlocked": "Попытка SSRF заблокирована для {target}",
+ "authLoginSuccess": "{actor} вошел",
+ "authLoginError": "Ошибка входа для {actor}",
+ "authLoginFailed": "Не удалось войти для {actor}",
+ "authLoginLocked": "{actor} заблокирован после слишком большого количества попыток",
+ "authLoginMisconfigured": "Недействительная конфигурация аутентификации",
+ "authLoginSetupRequired": "Требуется настройка аутентификации",
+ "authLogoutSuccess": "{actor} вышел из системы",
+ "syncTokenCreated": "{actor} создал токен синхронизации",
+ "syncTokenRevoked": "{actor} отозвал токен синхронизации",
+ "settingsUpdate": "{actor} обновил настройки",
+ "settingsUpdateFailed": "Не удалось обновить настройки",
+ "serviceRevealApiKey": "{actor} раскрыл API-ключ для {target}",
+ "genericEvent": "{actor} {target}"
+ }
+ },
+ "agentBridge": {
+ "title": "AgentBridge",
+ "subtitle": "Используйте агенты IDE с моделями OmniRoute — конфигурация не требуется",
+ "riskBannerTitle": "Используйте на свой страх и риск",
+ "riskBannerBody": "AgentBridge перехватывает HTTPS-трафик от агентов IDE. Активируя его, вы берете на себя ответственность за соблюдение условий обслуживания каждого агента. Никогда не используйте на устройствах или сетях, где запрещена проверка TLS.",
+ "riskBannerDismiss": "Отклонить",
+ "serverCardTitle": "Сервер AgentBridge",
+ "statusRunning": "Запуск",
+ "statusStopped": "Остановлено",
+ "statusActive": "Активный",
+ "statusDnsOff": "DNS выключен",
+ "statusSetupRequired": "Требуется настройка",
+ "statusInvestigating": "Расследование",
+ "serverPort": "Порт",
+ "serverConns": "Соединения",
+ "serverIntercepted": "Перехвачено",
+ "serverLastStarted": "Последний запуск",
+ "startServer": "Начать",
+ "stopServer": "Стоп",
+ "restartServer": "Перезапустить",
+ "trustCert": "Доверенный сертификат",
+ "downloadCert": "Скачать сертификат",
+ "regenerateCert": "Сгенерировать сертификат",
+ "starting": "Запуск…",
+ "stopping": "Остановка…",
+ "restarting": "Перезапуск…",
+ "trusting": "Доверяю…",
+ "regenerating": "Регенерация…",
+ "upstreamCaLabel": "Сертификат CA Upstream (корпоративный)",
+ "upstreamCaPlaceholder": "/etc/ssl/certs/corp-ca.pem",
+ "upstreamCaTest": "Проверка TLS",
+ "upstreamCaTestOk": "Тест TLS пройден",
+ "upstreamCaTestError": "Не удалось пройти тест TLS — проверьте путь и файл CA",
+ "bypassSectionTitle": "Список обхода",
+ "bypassSectionDesc": "Хосты, соответствующие этим шаблонам, туннелируются напрямую (без TLS-дешифрования). По умолчанию это включает банки, .gov и корпоративные SSO.",
+ "bypassDefaultsLabel": "Шаблоны обхода по умолчанию (только для чтения)",
+ "bypassUserLabel": "Пользовательские шаблоны обхода (по одному на строку, glob или regex)",
+ "saveBypassList": "Сохранить список обхода",
+ "agentListTitle": "Агенты IDE",
+ "filterAll": "Все",
+ "filterActive": "Активный",
+ "filterSetupRequired": "Требуется настройка",
+ "filterInvestigating": "Расследование",
+ "searchAgents": "Поиск агентов…",
+ "noAgentsMatch": "Нет агентов, соответствующих текущему фильтру",
+ "agentHosts": "Перехваченные хосты",
+ "certTrusted": "Сертификат доверен",
+ "certNotTrusted": "Сертификат не доверен",
+ "investigatingNotice": "Этот агент находится под расследованием. Хосты и API все еще подтверждаются. Настройка будет доступна, как только будет задокументирован upstream API.",
+ "modelMappingsLabel": "Сопоставления моделей",
+ "sourceModel": "Исходная модель (агент нативный)",
+ "targetModel": "Целевая модель (OmniRoute)",
+ "noMappings": "Нет настроенных сопоставлений моделей. Запустите мастер настройки для автоматического обнаружения моделей.",
+ "selectModel": "Выбрать…",
+ "saveMappings": "Сохранить сопоставления",
+ "setupWizard": "Мастер настройки",
+ "startDns": "Запустить DNS",
+ "stopDns": "Остановить DNS",
+ "toggling": "Переключение…",
+ "viewTraffic": "Просмотр трафика",
+ "emptyNoProvidersTitle": "Поставщики еще не настроены",
+ "emptyNoProvidersBody": "Чтобы использовать AgentBridge, сначала подключите хотя бы одного провайдера. Это будет место назначения, куда направляются запросы IDE.",
+ "emptyGoToProviders": "Перейти к Провайдерам",
+ "wizardTitle": "Мастер настройки",
+ "wizardSubtitle": "3-шаговая настройка",
+ "wizardStep1Label": "Проверить",
+ "wizardStep2Label": "DNS",
+ "wizardStep3Label": "Сопоставления",
+ "wizardStep1Desc": "Подтвердите, что сервер работает и сертификат установлен.",
+ "wizardStep2Desc": "Следующие записи будут добавлены в /etc/hosts для перенаправления трафика через AgentBridge:",
+ "wizardStep3Desc": "Теперь вы можете настроить сопоставления моделей в карточке агента. Перезапустите IDE, чтобы применить изменения.",
+ "wizardStep3Success": "Агент настроен!",
+ "wizardServerCheck": "Сервер AgentBridge",
+ "wizardRunning": "выполнение",
+ "wizardNotRunning": "не запущено",
+ "wizardCertCheck": "Сертификат",
+ "wizardTrusted": "доверенный",
+ "wizardNotTrusted": "еще не доверено — используйте кнопку Доверить сертификат",
+ "wizardTutorialTitle": "Инструкции по настройке:",
+ "wizardEnableDns": "Добавить записи в /etc/hosts",
+ "wizardDnsAlreadyEnabled": "DNS уже включен для этого агента",
+ "enablingDns": "Включение…",
+ "modelSelectorTitle": "Выберите целевую модель",
+ "modelSelectorSearch": "Поиск моделей…",
+ "noModelsFound": "Модели не найдены",
+ "quickLinks": "Быстрые ссылки",
+ "quickLinkProviders": "Настроить провайдеров",
+ "quickLinkInspector": "Просмотр трафика в Traffic Inspector",
+ "save": "Сохранить",
+ "saving": "Сохранение…",
+ "cancel": "Отмена",
+ "back": "Назад",
+ "next": "Далее",
+ "done": "Готово",
+ "loading": "Загрузка…",
+ "riskNoticeTitle": "Признание риска",
+ "riskNoticeBody": "AgentBridge будет перехватывать HTTPS-трафик от этого агента, перенаправляя его API-хосты через DNS. Включайте только в том случае, если вы принимаете на себя ответственность за соблюдение условий обслуживания агента и любых применимых сетевых политик.",
+ "pageMoved": {
+ "goNow": "Иди сейчас",
+ "message": "MITM Proxy теперь находится под AgentBridge.",
+ "title": "Эта страница была перемещена"
+ }
+ },
+ "trafficInspector": {
+ "title": "Инспектор Трафика",
+ "subtitle": "Мониторинг вызовов LLM и отладка HTTPS-трафика любого приложения",
+ "captureModesTitle": "Режимы захвата",
+ "agentBridgeMode": "AgentBridge",
+ "agentBridgeModeDesc": "Перехват трафика от всех подключенных агентов IDE",
+ "customHostsMode": "Пользовательские хосты",
+ "customHostsModeDesc": "Добавить конкретные хосты для перехвата",
+ "httpProxyMode": "HTTP Прокси",
+ "httpProxyModeDesc": "Используйте переменную окружения HTTP_PROXY",
+ "systemWideMode": "Системный уровень",
+ "systemWideModeDesc": "Перехватить весь системный трафик (расширенный)",
+ "filterBarTitle": "Фильтры",
+ "profileLlmOnly": "Только LLM",
+ "profileCustom": "Пользовательский",
+ "profileAll": "Все",
+ "filterHost": "Фильтр хоста…",
+ "filterAgent": "Агент",
+ "filterStatus": "Статус",
+ "pauseBtn": "Пауза",
+ "resumeBtn": "Резюме",
+ "clearBtn": "Очистить",
+ "exportHar": "Экспорт .har",
+ "recordSession": "REC",
+ "stopSession": "Стоп",
+ "liveBadge": "в прямом эфире",
+ "offlineBadge": "офлайн",
+ "noRequests": "Запросы еще не зафиксированы.",
+ "noRequestsDesc": "Убедитесь, что AgentBridge запущен, или включите другой режим захвата.",
+ "selectRequest": "Выберите запрос, чтобы просмотреть его.",
+ "tabConversation": "Разговор",
+ "tabHeaders": "Заголовки",
+ "tabRequest": "Запрос",
+ "tabResponse": "Ответ",
+ "tabTiming": "Время",
+ "tabLlm": "LLM",
+ "tabStats": "Статистика",
+ "requestHeaders": "Заголовки запроса",
+ "responseHeaders": "Заголовки ответа",
+ "rawEvents": "Сырые события",
+ "mergedView": "Слитный вид",
+ "noBody": "Нет тела.",
+ "streaming": "стриминг…",
+ "manageHosts": "Управление хостами",
+ "copySnippet": "Скопировать фрагмент прокси",
+ "addHost": "Добавить",
+ "hostPlaceholder": "api.openai.com",
+ "noHostsYet": "Пока не добавлено ни одного пользовательского хоста.",
+ "noSessionsYet": "Нет сессий еще",
+ "allTraffic": "Весь трафик (без сессии)",
+ "sessionsDropdown": "Сессии",
+ "annotationPlaceholder": "Добавить заметку…",
+ "contextFingerprint": "Контекстный отпечаток",
+ "llmProvider": "Обнаруженный провайдер",
+ "llmApiKind": "Тип API",
+ "llmModel": "Модель",
+ "llmMessages": "Сообщения",
+ "llmStream": "Поток",
+ "llmMappedTo": "Сопоставлено с",
+ "llmCostEstimate": "Смета затрат",
+ "systemProxyExitWarning": "Прокси-сервер для всей системы все еще активен — покинуть страницу все равно?",
+ "customHostsTitle": "Пользовательские хосты",
+ "loading": "Загрузка…",
+ "copied": "Скопировано!",
+ "copy": "Копировать",
+ "httpProxyTitle": "HTTP Proxy Snippet — порт {port}",
+ "notRecording": "Не записывается",
+ "anyStatus": "Любой статус",
+ "viewingRecordedSession": "Просмотр записанной сессии",
+ "backToLive": "Назад к прямому эфиру",
+ "untitledSession": "Безымянная сессия",
+ "contextHistory": "История контекста",
+ "modelResponse": "Ответ Модели",
+ "conversationNoMessages": "Сообщений не найдено в этом запросе.",
+ "conversationNotAvailable": "Данные разговора недоступны. Это может быть не запрос LLM или тело не удалось разобрать.",
+ "loadingCharts": "Загрузка графиков…",
+ "statsErrors": "Ошибки",
+ "statsLatency": "Задержка (последние 50 запросов)",
+ "statsNoData": "Пока нет запросов. Начните запись сессии, чтобы собрать данные для статистики.",
+ "statsStatusDistribution": "Распределение статусов",
+ "statsSuccessful": "Успешно",
+ "statsTotalRequests": "Всего запросов",
+ "timingProxyOverhead": "Накладные расходы прокси",
+ "timingUpstreamResponse": "Ответ от upstream",
+ "timingNoData": "Нет данных о времени.",
+ "timingTotalLatency": "Общая задержка",
+ "timingTimestamp": "Метка времени",
+ "timingMethod": "Метод",
+ "timingStatus": "Статус",
+ "timingRequestSize": "Размер запроса",
+ "timingResponseSize": "Размер ответа",
+ "pausedNewBadge": "{count} новых",
+ "clearContextFilter": "очистить"
+ },
+ "cliCommon": {
+ "concept": {
+ "code": {
+ "title": "Код CLI",
+ "phrase": "Инструменты кода, которые вы указываете на OmniRoute",
+ "flow": "Вы → CLI Код → OmniRoute → Провайдер",
+ "seeOther": "Смотреть →"
+ },
+ "agent": {
+ "title": "CLI Агенты",
+ "phrase": "Универсальные автономные CLI-агенты, которые вы нацеливаете на OmniRoute",
+ "flow": "Вы → CLI Агент → OmniRoute → Провайдер",
+ "seeOther": "Смотреть →"
+ },
+ "acp": {
+ "title": "Агенты ACP",
+ "phrase": "CLIs, которые OmniRoute запускает в качестве бэкенда выполнения (обратный поток)",
+ "flow": "Клиент → OmniRoute → запустить CLI (stdio/ACP) → ответ",
+ "seeOther": "Смотреть →"
+ }
+ },
+ "comparison": {
+ "title": "Поймите 3 типа CLI в OmniRoute",
+ "thisPage": "[Эта страница ✓]",
+ "code": {
+ "title": "Инструмент кода",
+ "desc": "Точки к Omni",
+ "flow": "вы → CLI → Omni → провайдер",
+ "examples": "например: claude, codex"
+ },
+ "agent": {
+ "title": "Широкий автономный агент",
+ "desc": "Точки к Omni",
+ "flow": "вы → агент → Omni",
+ "examples": "например: гермес, гусь"
+ },
+ "acp": {
+ "title": "CLI, используемый в качестве бэкенда Omni",
+ "desc": "Обратное выполнение",
+ "flow": "Omni → spawn CLI → resp",
+ "examples": "например: claude, codex (ACP)"
+ }
+ },
+ "card": {
+ "detected": "Обнаружено",
+ "notDetected": "Не обнаружено",
+ "configured": "Настроено",
+ "notConfigured": "Не настроено",
+ "configure": "Настроить →",
+ "howToInstall": "Как установить →",
+ "manualConfig": "Ручная настройка",
+ "installGuide": "Руководство по установке",
+ "endpointLabel": "Конечная точка",
+ "baseUrlPartial": "Частичный базовый URL",
+ "refreshDetection": "Обнаружение обновления",
+ "alsoAcp": "также ACP"
+ },
+ "detail": {
+ "back": "Назад",
+ "apply": "Сохранить",
+ "reset": "Очистить",
+ "manualConfig": "Ручная настройка",
+ "vendor": "Поставщик",
+ "category": "Тип",
+ "detectionStatus": "Обнаружение",
+ "configStatus": "Конфигурация",
+ "baseUrlLabel": "Базовый URL",
+ "apiKeyLabel": "API ключ",
+ "modelMappingLabel": "Сопоставление моделей",
+ "noActiveProviders": "Нет активных провайдеров.",
+ "noActiveProvidersDesc": "Перейдите в Провайдеры, чтобы подключить как минимум 1 провайдера перед настройкой CLI.",
+ "openProviders": "Открыть Провайдеры →"
+ }
+ },
+ "cliCode": {
+ "pageTitle": "CLI Кодов",
+ "pageSubtitle": "Инструменты кода, указывающие на OmniRoute",
+ "searchPlaceholder": "Поиск CLI…",
+ "filterDetectionLabel": "Обнаружение",
+ "filterBaseUrlLabel": "Базовый URL",
+ "detectionAll": "Все",
+ "detectionInstalled": "Установлено",
+ "detectionNotFound": "Не найдено",
+ "baseUrlAll": "Все",
+ "baseUrlFull": "Полный",
+ "baseUrlPartial": "Частичный"
+ },
+ "cliAgents": {
+ "pageTitle": "CLI Агенты",
+ "pageSubtitle": "Универсальные автономные CLI-агенты",
+ "refreshDetection": "Обновление обнаружения",
+ "searchPlaceholder": "Поиск агента…",
+ "detectionFilterLabel": "Обнаружение",
+ "detectionAll": "Все",
+ "detectionInstalled": "Установлено",
+ "detectionNotInstalled": "Не установлено",
+ "visibleCount": "{count} видимо",
+ "emptyState": "Не найдено CLI-агентов с текущими фильтрами."
+ },
+ "acpAgents": {
+ "pageTitle": "Агенты ACP",
+ "pageSubtitle": "CLIs, которые OmniRoute запускает в качестве бэкенда выполнения",
+ "scanning": "Обнаружение агентов…",
+ "refresh": "Обновить",
+ "setupGuideTitle": "Руководство по настройке",
+ "setupGuideDetectCliTitle": "Обнаружить CLI",
+ "setupGuideDetectCliDesc": "Агенты идентифицируются с помощью выполнения команды --version в PATH.",
+ "setupGuideCustomAgentTitle": "Добавить пользовательского агента",
+ "setupGuideCustomAgentDesc": "Заполните форму ниже, чтобы зарегистрировать пользовательского CLI-агента.",
+ "setupGuideCommandMissingTitle": "Команда не найдена",
+ "setupGuideCommandMissingDesc": "Проверьте, что бинарный файл находится в PATH.",
+ "fingerprintSettingsHint": "Настройте маршрутизацию и отпечатки в",
+ "settingsRoutingLink": "Настройки → Маршрутизация",
+ "installed": "Установлено",
+ "notFound": "Не найдено",
+ "builtIn": "Встроенный",
+ "custom": "Пользовательский",
+ "agentUseCaseHint": "Доступно для спавна через ACP.",
+ "remove": "Удалить",
+ "addCustomAgent": "Добавить пользовательского агента",
+ "addCustomAgentDesc": "Зарегистрируйте пользовательского CLI-агента для запуска через ACP.",
+ "addAgent": "Добавить агента",
+ "agentName": "Имя",
+ "agentNamePlaceholder": "Мой Агент",
+ "binaryName": "Двоичный",
+ "binaryNamePlaceholder": "например: myagent",
+ "versionCommand": "Команда версии",
+ "versionCommandPlaceholder": "myagent --version",
+ "spawnArgs": "Аргументы запуска",
+ "spawnArgsPlaceholder": "например: --quiet, --json",
+ "cliCodeRedirectCta": "Открыть CLI Code's"
+ },
+ "agentSkills": {
+ "pageTitle": "Навыки агента",
+ "pageSubtitle": "Научите вашего агента работать с OmniRoute — 22 области API + 20 семейств CLI",
+ "conceptCard": {
+ "agent": {
+ "title": "Навыки агента — Исходящие",
+ "description": "Навыки агента — это читаемые машиной документы SKILL.md, которые внешние AI-агенты (Claude Code, Cursor, Copilot…) загружают с GitHub, чтобы узнать, как управлять OmniRoute через REST или CLI. Они читаются агентом, а не выполняются OmniRoute.",
+ "crossLinkLabel": "Понять разницу →"
+ },
+ "omni": {
+ "title": "Omni Skills — Входящие",
+ "description": "Omni Skills — это инструменты песочницы, которые OmniRoute внедряет в контекст модели при каждом запросе. Они выполняются OmniRoute, а не считываются агентом.",
+ "crossLinkLabel": "Понять разницу →"
+ },
+ "comparison": {
+ "colAgent": "Навыки агента",
+ "colOmni": "Омни Навыки",
+ "whatIs": {
+ "label": "Что это такое",
+ "agent": "Машиночитаемый SKILL.md, который обучает внешнего агента управлять OmniRoute",
+ "omni": "Исполняемые инструменты, которые OmniRoute внедряет в запросы LLM в качестве инструментов"
+ },
+ "direction": {
+ "label": "Направление",
+ "agent": "Исходящий — внешний агент учится управлять OmniRoute",
+ "omni": "Inbound — OmniRoute предоставляет инструменты для моделей, проходящих через него"
+ },
+ "executor": {
+ "label": "Исполнитель",
+ "agent": "Внешний агент (читает markdown → действует через API/CLI)",
+ "omni": "OmniRoute сам по себе (перехватывает tool_calls, Docker песочница)"
+ },
+ "storage": {
+ "label": "Хранилище",
+ "agent": "Динамический каталог (/api/agent-skills) → SKILL.md на GitHub",
+ "omni": "SQLite (SkillsMP / skills.sh / local)"
+ },
+ "tagline": {
+ "label": "Слоган",
+ "agent": "Научите вашего агента использовать OmniRoute",
+ "omni": "Предоставьте исполняемые инструменты для моделей OmniRoute"
+ }
+ }
+ },
+ "filters": {
+ "category": "Категория",
+ "area": "Область",
+ "searchPlaceholder": "Поиск навыков…"
+ },
+ "categoryApi": "API",
+ "categoryCli": "CLI",
+ "filterAll": "Все",
+ "coverageLabel": "Покрытие",
+ "mcpUrl": "MCP URL",
+ "a2aLink": "A2A",
+ "copyUrl": "Скопировать URL",
+ "viewOnGithub": "Посмотреть на GitHub",
+ "previewLoading": "Загрузка документации по навыкам…",
+ "previewError": "Не удалось загрузить документацию по навыкам.",
+ "previewEmpty": "Выберите навык, чтобы просмотреть его документацию.",
+ "generateButton": "Сгенерировать недостающие навыки",
+ "coverageBar": {
+ "complete": "Завершено",
+ "partial": "Частичный"
+ },
+ "noSkillsFound": "Не найдено навыков, соответствующих вашим фильтрам.",
+ "regenerateConfirm": "Это приведет к регенерации всех отсутствующих SKILL.md файлов. Продолжить?",
+ "regenerateRunning": "Регенерация навыков…",
+ "regenerateSuccess": "Навыки успешно восстановлены.",
+ "regenerateError": "Не удалось восстановить навыки."
}
}
diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json
index dda95c3a42..6b3da8a9c3 100644
--- a/src/i18n/messages/zh-CN.json
+++ b/src/i18n/messages/zh-CN.json
@@ -709,6 +709,7 @@
"batchFilesListFilesTable": "文件",
"batchPageLoadingMore": "加载更多...",
"recommended": "推荐",
+ "understand": "我明白",
"batchConceptTitle": "Batch processing",
"batchConceptSubtitle": "Process thousands of requests asynchronously at ~50% of the cost (24h window). Ideal for evaluations, classification, and embeddings.",
"batchConceptHowItWorks": "How it works",
@@ -773,36 +774,13 @@
"filesListUploadButton": "Upload",
"filesListUsedByColumn": "Used by",
"filesListUsedByNone": "None",
- "filesListDelete": "Delete",
- "filesListDownload": "Download",
- "batchDetailActionCancel": "Cancel batch",
- "batchDetailActionRetry": "Retry failed requests",
- "batchDetailCancelling": "Cancelling…",
- "batchDetailRetrying": "Preparing retry…",
- "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
- "batchActionCancelError": "Failed to cancel batch. Try again.",
- "batchActionRetryError": "Failed to retry failed requests. Try again.",
- "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
"filesListUsedByRoleInput": "input",
"filesListUsedByRoleOutput": "output",
"filesListUsedByRoleError": "error",
- "batchListProgressPartial": "(partial)",
"filesListSizeColumn": "Size",
+ "batchListProgressPartial": "(partial)",
"batchListProviderColumn": "Provider",
"batchListProviderUnknown": "—",
- "batchListBatchCreated": "Batch {id} created — refreshing list…",
- "batchListBatchCreatedDismiss": "Dismiss",
- "batchListRefreshing": "Refreshing…",
- "batchListRefresh": "Refresh",
- "uploadFileModalRemove": "Remove",
- "uploadFileModalUploading": "Uploading…",
- "wizardInputReading": "Reading file…",
- "wizardInputReady": "Ready",
- "wizardInputLargeFileLabel": "Large file — sampling validation",
- "wizardInputCsvJsonlReady": "JSONL generated — ready to validate.",
- "wizardInputLargeFileWarning": "Large file detected — validation runs by sampling (first 5 MB + last 100 KB). Full validation happens server-side.",
- "wizardCostWindow24h": "24h completion window",
- "wizardValidationFieldsOk": "required fields valid",
"batchListProviderOther": "Other",
"batchListTitle": "Batches",
"batchListCount": "{count} batches",
@@ -839,7 +817,30 @@
"wizardCostWindow": "Window",
"wizardDestinationSelectProvider": "Select a provider…",
"wizardDestinationSelectModel": "Select a model…",
- "wizardDestinationConnectProvider": "Connect a provider"
+ "wizardDestinationConnectProvider": "Connect a provider",
+ "batchListBatchCreated": "Batch {id} created — refreshing list…",
+ "batchListBatchCreatedDismiss": "Dismiss",
+ "batchListRefreshing": "Refreshing…",
+ "batchListRefresh": "Refresh",
+ "uploadFileModalRemove": "Remove",
+ "uploadFileModalUploading": "Uploading…",
+ "wizardInputReading": "Reading file…",
+ "wizardInputReady": "Ready",
+ "wizardInputLargeFileLabel": "Large file — sampling validation",
+ "wizardInputCsvJsonlReady": "JSONL generated — ready to validate.",
+ "wizardInputLargeFileWarning": "Large file detected — validation runs by sampling (first 5 MB + last 100 KB). Full validation happens server-side.",
+ "wizardCostWindow24h": "24h completion window",
+ "wizardValidationFieldsOk": "required fields valid",
+ "filesListDelete": "Delete",
+ "filesListDownload": "Download",
+ "batchDetailActionCancel": "Cancel batch",
+ "batchDetailActionRetry": "Retry failed requests",
+ "batchDetailCancelling": "Cancelling…",
+ "batchDetailRetrying": "Preparing retry…",
+ "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
+ "batchActionCancelError": "Failed to cancel batch. Try again.",
+ "batchActionRetryError": "Failed to retry failed requests. Try again.",
+ "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)"
},
"sidebar": {
"home": "首页",
@@ -1061,7 +1062,25 @@
"settingsAuthzSubtitle": "路由清单与绕过策略",
"docsSubtitle": "Documentation",
"issuesSubtitle": "Report a bug",
- "changelogSubtitle": "Release notes"
+ "changelogSubtitle": "Release notes",
+ "costsQuotaPlans": "计划与配额",
+ "costsQuotaPlansSubtitle": "按提供商配置计划",
+ "activity": "活动",
+ "activitySubtitle": "近期事件的友好动态",
+ "logsGroup": "日志",
+ "systemGroup": "系统",
+ "costsOverview": "概述",
+ "costsOverviewSubtitle": "综合成本分析",
+ "agentBridge": "代理桥接",
+ "agentBridgeSubtitle": "拦截 IDE 代理流量",
+ "trafficInspector": "流量检查器",
+ "trafficInspectorSubtitle": "监控 LLM 调用 + 调试任何 HTTPS 流量",
+ "cliCode": "CLI 代码的",
+ "cliCodeSubtitle": "指向 OmniRoute 的代码工具",
+ "cliAgents": "CLI 代理",
+ "cliAgentsSubtitle": "自主 CLI 代理",
+ "acpAgents": "ACP 代理",
+ "acpAgentsSubtitle": "由 OmniRoute 生成的 CLI"
},
"webhooks": {
"title": "Webhook",
@@ -1262,7 +1281,47 @@
"a2aEvents": "活动",
"a2aArtifacts": "文物",
"a2aNoTasks": "没有记录 A2A 任务。",
- "a2aLoadingTasks": "正在加载 A2A 任务..."
+ "a2aLoadingTasks": "正在加载 A2A 任务...",
+ "actor": "演员",
+ "actorPlaceholder": "按演员筛选",
+ "eventTypes": {
+ "apiKey.activate": "API 密钥已激活",
+ "apiKey.ban": "API 密钥已被禁止",
+ "apiKey.deactivate": "API 密钥已停用",
+ "apiKey.regenerate": "API 密钥已重新生成",
+ "apiKey.scopes.grant": "API 密钥范围已授予",
+ "apiKey.scopes.revoke": "API 密钥范围已被撤销",
+ "apiKey.scopes.update": "API 密钥范围已更新",
+ "apiKey.unban": "API 密钥已解禁",
+ "auth.login.error": "登录错误",
+ "auth.login.failed": "登录失败",
+ "auth.login.locked": "登录被锁定",
+ "auth.login.misconfigured": "登录配置错误",
+ "auth.login.setup_required": "需要登录设置",
+ "auth.login.success": "登录成功",
+ "auth.logout.success": "注销成功",
+ "compliance.cleanup": "合规清理",
+ "provider.credentials.applied": "提供者凭据已应用",
+ "provider.credentials.batch_revoked": "提供者凭据批次已撤销",
+ "provider.credentials.bulk_created": "提供者凭据批量创建",
+ "provider.credentials.bulk_imported": "提供者凭据已批量导入",
+ "provider.credentials.created": "提供者凭据已创建",
+ "provider.credentials.imported": "提供者凭据已导入",
+ "provider.credentials.revoked": "提供者凭据已被撤销",
+ "provider.credentials.updated": "提供者凭据已更新",
+ "provider.validation.ssrf_blocked": "提供者 SSRF 被阻止",
+ "quota.plan.updated": "配额计划已更新",
+ "quota.pool.created": "配额池已创建",
+ "quota.pool.deleted": "配额池已删除",
+ "quota.pool.updated": "配额池已更新",
+ "quota.store.driver_changed": "配额存储驱动程序已更改",
+ "server.start": "服务器启动",
+ "service.reveal_api_key": "服务 API 密钥已泄露",
+ "settings.update": "设置已更新",
+ "settings.update_failed": "设置更新失败",
+ "sync.token.created": "同步令牌已创建",
+ "sync.token.revoked": "同步令牌已撤销"
+ }
},
"themesPage": {
"title": "主题",
@@ -1371,7 +1430,8 @@
"settingsResilienceDescription": "Circuit breaker, retry, and fallback configuration",
"settingsAdvancedDescription": "Advanced payload rules, request limits, and proxy API settings",
"mitmProxyDescription": "Configure MITM proxy settings for traffic inspection and debugging",
- "oneProxyDescription": "Configure 1Proxy settings for advanced proxy chaining"
+ "oneProxyDescription": "Configure 1Proxy settings for advanced proxy chaining",
+ "omniSkillsDescription": "安装和管理用于自动提示和工具执行的沙箱技能"
},
"home": {
"quickStart": "快速入门",
@@ -1612,6 +1672,11 @@
"endpointsRestricted": "仅限 {count} 个端点。",
"autoResolve": "自动解析",
"autoResolveDesc": "为这个 API 密钥自动将有歧义的模型名解析到原生提供商。",
+ "streamDefaultMode": "流默认兼容性",
+ "streamDefaultModeDesc": "此键省略了 `stream` 标志。JSON 模式返回非流式响应,除非客户端明确请求 SSE。",
+ "streamDefaultLegacy": "遗留",
+ "streamDefaultJson": "JSON 兼容",
+ "streamDefaultBadge": "JSON 流默认",
"keyActive": "密钥启用状态",
"keyActiveDesc": "启用或禁用此 API 密钥。被禁用的密钥会立即返回 403。",
"accessSchedule": "访问时段",
@@ -1697,7 +1762,13 @@
"filterTypeRestricted": "受限",
"shownOf": "已显示 {shown} / {total}",
"emptyFilterTitle": "没有密钥匹配当前筛选条件",
- "emptyFilterClear": "清除筛选"
+ "emptyFilterClear": "清除筛选",
+ "disableNonPublicModels": "禁用非公开模型",
+ "disableNonPublicModelsDesc": "拒绝对未发现或未标记为公共的模型在提供者目录中的请求",
+ "normalKeysSection": "普通键",
+ "quotaKeysSection": "配额密钥",
+ "quotaPill": "配额",
+ "quotaModeOnly": "qtSd-only"
},
"auditLog": {
"title": "审核日志",
@@ -3165,42 +3236,187 @@
"a2aStep3": "使用 {code1} 和 {code2} 跟踪并取消任务。"
},
"memory": {
- "title": "记忆管理",
- "description": "查看并管理已存储的记忆条目",
- "memories": "记忆",
- "totalEntries": "总条目数",
- "tokensUsed": "已用 Tokens",
- "hitRate": "命中率",
- "loading": "正在加载记忆...",
- "noMemories": "未找到记忆条目",
- "search": "搜索记忆...",
- "allTypes": "全部类型",
- "export": "导出",
- "import": "导入",
- "addMemory": "添加记忆",
- "type": "类型",
- "key": "键",
- "content": "内容",
- "created": "创建时间",
- "actions": "操作",
- "delete": "删除",
- "factual": "事实型",
- "episodic": "情景型",
- "procedural": "程序型",
- "semantic": "语义型",
"a": "A",
- "pipelineOk": "管道正常 ({latencyMs}ms)",
- "pipelineError": "管道错误",
- "healthUnknown": "健康状况不明",
- "checkingHealth": "正在检查...",
- "checkHealth": "检查健康状况",
- "pageInfo": "第 {page} 页,共 {totalPages}(共 {total})",
- "previous": "上一页",
- "next": "下一步",
+ "actions": "操作",
+ "addMemory": "添加记忆",
+ "allTypes": "全部类型",
"cancel": "取消",
- "save": "保存",
+ "checkHealth": "检查健康状况",
+ "checkingHealth": "正在检查...",
+ "compactOld": "紧凑旧版",
+ "concept": {
+ "title": "对话记忆",
+ "description": "OmniRoute 从每次对话中学习,记住事实、事件、程序和语义概念,使响应更加准确和上下文感知。",
+ "howWorksToggle": "它是如何工作的",
+ "howWorksContent": "1. 自动提取:在每个响应结束时,事实和事件会被自动检测并保存。\n2. 检索:在每个响应之前,通过FTS5(精确)、向量(语义)或混合RRF搜索最相关的记忆。\n3. 注入:相关记忆被注入到助手上下文中,以提高响应质量。\n4. 管理:使用此页面查看、编辑、导出和压缩旧记忆。"
+ },
+ "content": "内容",
+ "contentPlaceholder": "要记住的值或 JSON 内容",
+ "created": "创建时间",
+ "delete": "删除",
+ "deleteConfirmDesc": "此操作无法撤销。内存将被永久删除。",
+ "deleteConfirmTitle": "删除内存?",
+ "description": "查看并管理已存储的记忆条目",
+ "editMemory": "编辑内存",
+ "editModal": {
+ "title": "编辑内存",
+ "metadataLabel": "元数据 (JSON)",
+ "metadataInvalid": "无效的 JSON",
+ "saveFailed": "保存内存失败"
+ },
+ "embedding": {
+ "autoLabel": "自动",
+ "autoDesc": "使用最佳可用选项:远程提供者 > 静态 > 转换器",
+ "remoteLabel": "远程提供者",
+ "remoteDesc": "通过提供者 API 使用嵌入(需要 API 密钥)",
+ "staticLabel": "静态本地(药水)",
+ "staticDesc": "不使用WASM或外部依赖的本地嵌入",
+ "transformersLabel": "Transformers.js (MiniLM)",
+ "transformersDesc": "通过 @huggingface/transformers 本地嵌入 (~400MB RAM)",
+ "providerModelLabel": "提供者 / 模型",
+ "noRemoteProviders": "没有配置 API 密钥的提供者",
+ "selectProviderModel": "选择一个模型",
+ "staticEnabledLabel": "启用静态药水",
+ "staticEnabledDesc": "在本地下载并使用 potion-base-8M 模型",
+ "transformersEnabledLabel": "启用 Transformers.js",
+ "transformersEnabledDesc": "选择本地 MiniLM(约 400MB RAM,约 3 秒冷启动)",
+ "transformersWarning": "需要约400MB内存,并在第一次语义查询时冷启动约3秒。"
+ },
+ "emptyState": {
+ "title": "还没有记忆",
+ "description": "记忆是从对话中自动创建的。您也可以使用上面的按钮手动添加它们。"
+ },
+ "engine": {
+ "statusTitle": "引擎状态",
+ "embeddingTitle": "嵌入源",
+ "rerankTitle": "重新排序(可选)",
+ "reindexNow": "立即重新索引",
+ "reindexStarted": "重新索引已开始({pending} 个待处理)",
+ "reindexFailed": "重新索引启动失败",
+ "keywordLabel": "关键字 (FTS5)",
+ "keywordReason": "关键字搜索始终可用",
+ "embeddingLabel": "嵌入",
+ "vectorStoreLabel": "向量存储",
+ "qdrantLabel": "Qdrant",
+ "rerankLabel": "重新排序",
+ "qdrantDisabled": "禁用",
+ "qdrantOk": "健康 ({latencyMs}ms)",
+ "qdrantError": "连接错误",
+ "needsReindex": "{count} 个内存需要重新索引",
+ "configureCta": "配置",
+ "vectorStoreInstallHint": "要启用向量搜索:npm install sqlite-vec(需要本地 Node.js,而不是 WASM),然后重启。"
+ },
+ "episodic": "情景型",
+ "export": "导出",
+ "factual": "事实型",
+ "healthUnknown": "健康状况不明",
+ "hitRate": "命中率",
+ "import": "导入",
+ "importError": "导入文件失败",
+ "importResult": "{imported} 导入, {skipped} 跳过",
+ "key": "键",
"keyPlaceholder": "例如用户偏好主题",
- "contentPlaceholder": "要记住的值或 JSON 内容"
+ "loading": "正在加载记忆...",
+ "memories": "记忆",
+ "next": "下一步",
+ "noMemories": "未找到记忆条目",
+ "pageInfo": "第 {page} 页,共 {totalPages}(共 {total})",
+ "pipelineError": "管道错误",
+ "pipelineOk": "管道正常 ({latencyMs}ms)",
+ "playground": {
+ "infoTitle": "内存游乐场",
+ "infoDesc": "模拟将为给定查询检索到的内容。没有修改任何记忆 — 只读预览。",
+ "queryLabel": "测试查询",
+ "queryPlaceholder": "输入问题或测试短语...",
+ "strategyLabel": "策略",
+ "strategyExact": "精确 (FTS5)",
+ "strategySemantic": "语义(向量)",
+ "strategyHybrid": "混合 (RRF)",
+ "budgetLabel": "预算(代币)",
+ "simulate": "模拟",
+ "resultsTitle": "{count} 个结果",
+ "resolutionTitle": "搜索分辨率",
+ "resolutionEmbedding": "嵌入",
+ "resolutionStore": "向量存储",
+ "resolutionStrategy": "使用的策略",
+ "rerankApplied": "重新排序已应用",
+ "fallback": "后备",
+ "noResults": "未找到与此查询相关的记忆。",
+ "tokensUsed": "已使用的令牌",
+ "none": "无",
+ "errorFetch": "获取预览失败"
+ },
+ "previous": "上一页",
+ "procedural": "程序型",
+ "qdrant": {
+ "title": "Qdrant(向量存储 Tier 2)",
+ "description": "可选的 Qdrant 集成用于可扩展的语义搜索",
+ "enableLabel": "启用 Qdrant",
+ "enableDesc": "启用后,Qdrant 将作为主要向量存储使用",
+ "testConnection": "测试连接",
+ "testing": "测试中...",
+ "statusActive": "活动",
+ "statusError": "错误",
+ "statusDisabled": "禁用",
+ "healthOk": "连接正常 ({latencyMs}ms)",
+ "healthError": "连接错误",
+ "saved": "设置已保存",
+ "saveError": "保存失败",
+ "portLabel": "端口",
+ "embeddingModelLabel": "嵌入模型",
+ "optional": "可选",
+ "apiKeyKeepPlaceholder": "留空以保持当前密钥",
+ "apiKeyOptional": "如果不使用身份验证,请留空",
+ "removeApiKey": "移除",
+ "quickSelectModel": "快速选择",
+ "searchTestTitle": "语义搜索测试",
+ "searchPlaceholder": "输入测试查询...",
+ "searching": "搜索中...",
+ "search": "搜索",
+ "cleanupTitle": "清理旧积分",
+ "cleanupDesc": "删除过期记忆(保留期)的 Qdrant 点。",
+ "cleaning": "清理中...",
+ "cleanNow": "立即清理",
+ "cleanupSuccess": "已移除 {count} 点数",
+ "cleanupFailed": "清理失败"
+ },
+ "rerank": {
+ "enableLabel": "启用重新排序",
+ "enableDesc": "在搜索后使用重新排序模型对结果进行重新排序",
+ "warning": "Rerank 会增加 +200-500ms 的延迟和每个请求的额外成本。请谨慎使用。",
+ "providerModelLabel": "重新排序提供者 / 模型",
+ "noProviderWithKey": "没有配置 API 密钥的提供者。请配置一个提供者以使用 rerank。",
+ "selectProviderModel": "选择一个提供者/模型"
+ },
+ "save": "保存",
+ "saving": "保存中...",
+ "search": "搜索记忆...",
+ "semantic": "语义型",
+ "summarize": {
+ "title": "压缩旧记忆",
+ "noCandidates": "没有符合压缩条件的记忆(标准:超过30天)。",
+ "candidatesDesc": "{count} 个记忆将被压缩为摘要。此操作无法撤销。",
+ "confirm": "立即紧凑"
+ },
+ "tabs": {
+ "memories": "记忆",
+ "playground": "游乐场",
+ "engine": "引擎"
+ },
+ "title": "记忆管理",
+ "tokensUsed": "已用 Tokens",
+ "tooltip": {
+ "totalEntries": "此 API 密钥存储的总记忆数",
+ "tokensUsed": "活动记忆占用的估计总令牌数",
+ "hitRate": "按 ID 读取的缓存命中率(不是语义回忆准确性)",
+ "factual": "用户上下文中的客观、永久性事实",
+ "episodic": "对话历史中的事件和经历",
+ "procedural": "助手应遵循的程序、工作流程和指令",
+ "semantic": "概念、偏好和领域知识"
+ },
+ "totalEntries": "总条目数",
+ "type": "类型",
+ "memoryEnabled": "内存已启用"
},
"skills": {
"title": "技能",
@@ -3538,7 +3754,10 @@
"fetchFailed": "获取日志失败",
"copyFailed": "复制日志条目失败",
"copyLogEntry": "复制日志条目"
- }
+ },
+ "compressionLogTitle": "压缩日志",
+ "compressionLogEmpty": "尚未有压缩请求。启用压缩处理请求时,压缩统计信息将出现在此处。",
+ "tokens": "令牌"
},
"onboarding": {
"welcome": "欢迎",
@@ -4398,7 +4617,21 @@
"webNoAuthGuideBody": "{provider} 不需要 API 密钥或 cookie。保存连接以使用其免费 Web 端点。",
"webSessionCredentialValidationFailed": "会话凭据验证失败。重新登录,复制新的凭据,然后重试。",
"checkCookie": "检查cookie",
- "checkWebToken": "检查令牌"
+ "checkWebToken": "检查令牌",
+ "huggingchatLabel": "HuggingChat(免费)",
+ "huggingchatDesc": "通过 huggingface.co/chat 免费使用 LLM 聊天",
+ "phindLabel": "Phind(免费)",
+ "phindDesc": "免费的开发者专用 AI 聊天",
+ "poeWebLabel": "Poe 网页",
+ "poeWebDesc": "通过 poe.com 进行多模型聊天",
+ "veniceWebLabel": "威尼斯网络",
+ "veniceWebDesc": "隐私专注的 AI 聊天",
+ "v0VercelWebLabel": "v0 Vercel Web",
+ "v0VercelWebDesc": "通过 v0.dev 的 AI 代码生成",
+ "kimiWebLabel": "Kimi Web",
+ "kimiWebDesc": "通过 kimi.moonshot.cn 访问中国市场的 AI 聊天",
+ "doubaoWebLabel": "豆包网",
+ "doubaoWebDesc": "字节跳动 AI 聊天通过 doubao.com"
},
"settings": {
"title": "设置",
@@ -4542,6 +4775,13 @@
"modelsDevInfoOrder": "用户覆盖 → models.dev → LiteLLM → 硬编码默认值",
"systemTheme": "系统主题",
"debugToggle": "启用调试模式",
+ "homePinProviderQuotaToHome": "Pin Information to Home Page",
+ "homeProviderQuotaLimits": "Provider Quota Limits",
+ "homeProviderQuotaLimitsDesc": "Pin the Provider Quota status container (with Refresh All button) to the top of the Home page.",
+ "homeQuickStart": "Quick Start",
+ "homeQuickStartDesc": "Show the Quick Start panel on the Home page.",
+ "homeProviderTopology": "Provider Topology",
+ "homeProviderTopologyDesc": "Show the Provider Topology on the Home page.",
"sidebarVisibilityToggle": "显示侧边栏项目",
"enableCache": "启用缓存",
"cacheTTL": "缓存生存时间",
@@ -5469,13 +5709,10 @@
"vercelRelayFreeTierNote": "中继是在 Vercel 免费层上部署的轻量级代理端点,用于绕过本地网络/区域限制。",
"vercelRelayDeploying": "正在部署...",
"vercelRelayDeploy": "部署",
- "homePinProviderQuotaToHome": "Pin Information to Home Page",
- "homeProviderQuotaLimits": "Provider Quota Limits",
- "homeProviderQuotaLimitsDesc": "Pin the Provider Quota status container (with Refresh All button) to the top of the Home page.",
- "homeQuickStart": "Quick Start",
- "homeQuickStartDesc": "Show the Quick Start panel on the Home page.",
- "homeProviderTopology": "Provider Topology",
- "homeProviderTopologyDesc": "Show the Provider Topology on the Home page."
+ "proxyGlobalConfigTab": "全局配置",
+ "proxyPoolTab": "代理池",
+ "freePoolTab": "免费泳池",
+ "proxyDocumentationTab": "文档"
},
"contextRtk": {
"title": "RTK 引擎",
@@ -5816,7 +6053,76 @@
"routeConnectionLabel": "连接方式",
"scenarioVision": "视觉(图像理解)",
"scenarioSchemaCoercion": "模式强制(结构化输出)",
- "techniques": "技巧:"
+ "techniques": "技巧:",
+ "friendlyTitle": "翻译器",
+ "friendlySubtitle": "使用您现有的应用程序与任何提供商 — 无需重写代码。",
+ "conceptHeadline": "您的应用程序使用一个 API 的“语言”。翻译器将其转换为使用另一个提供者。",
+ "conceptDiagramAppLabel": "您的应用程序",
+ "conceptDiagramSourceLabel": "源格式",
+ "conceptDiagramHubLabel": "OpenAI (中心)",
+ "conceptDiagramTargetLabel": "目标提供者",
+ "conceptDiagramExampleApp": "例如 Anthropic SDK",
+ "conceptDiagramExampleSource": "claude",
+ "conceptDiagramExampleTarget": "双子座",
+ "conceptHowItWorksToggle": "它是如何工作的",
+ "conceptHowItWorksBody": "您的应用以其自己的格式发送请求。翻译器检测该格式,通过 OpenAI 作为中介中心进行转换(或在可用的情况下直接进行转换),将其发送到所选提供商,并将响应转换回您应用的格式。",
+ "tabTranslate": "翻译",
+ "tabMonitor": "监视器",
+ "tabTranslateAriaLabel": "前往翻译选项卡",
+ "tabMonitorAriaLabel": "转到监视器选项卡",
+ "simpleAppUsesLabel": "我的应用程序使用",
+ "simpleAppUsesHint": "您的应用程序使用的 API 格式(例如,Anthropic SDK = claude)。",
+ "simpleSendToLabel": "发送到",
+ "simpleSendToHint": "实际将请求发送到哪里(在 OmniRoute 中连接的提供者)。",
+ "simpleStartWithLabel": "开始于",
+ "simpleStartWithExamplePlaceholder": "选择一个现成的示例",
+ "simpleStartWithCustomOption": "粘贴您的请求(高级)",
+ "simpleModeLabel": "模式",
+ "simpleModePreview": "仅预览翻译",
+ "simpleModeSend": "发送并查看响应",
+ "simpleAdvancedToggle": "高级",
+ "simpleInputPanelTitle": "输入",
+ "simpleInputPanelHint": "自由文本消息或现成示例",
+ "simpleResultPanelTitle": "翻译 + 回复",
+ "narratedDetected": "✓ 检测到: {format}",
+ "narratedTranslating": "正在翻译到 {target}...",
+ "narratedSending": "正在发送到 {target}...",
+ "narratedSuccess": "→ 翻译为 {target} · 响应时间 {latency}ms",
+ "narratedError": "失败:{reason}",
+ "narratedSeeTranslatedJson": "查看翻译后的 JSON",
+ "narratedSeePipeline": "查看管道",
+ "advancedSectionTitle": "高级",
+ "advancedSectionSubtitle": "原始 JSON、管道和技术工具。这里的一切与旧标签相同——只是重新组织了一下。",
+ "advancedRawJsonTitle": "原始 JSON(自动检测 + Monaco)",
+ "advancedRawJsonSubtitle": "粘贴一个 JSON 请求;格式会自动检测。",
+ "advancedPipelineTitle": "OpenAI 中间管道",
+ "advancedPipelineSubtitle": "可视化每个翻译步骤(中心辐射模型)。",
+ "advancedStreamTransformTitle": "流转换器 (聊天 → 响应 SSE)",
+ "advancedStreamTransformSubtitle": "将聊天完成 SSE 转换为响应 API。",
+ "advancedTestBenchTitle": "测试平台 (8 个场景)",
+ "advancedTestBenchSubtitle": "运行所有场景并报告通过/失败 + 兼容性 %。",
+ "advancedCompressionTitle": "压缩预览",
+ "advancedCompressionSubtitle": "估算不同压缩模式下的令牌节省。",
+ "monitorOriginHint": "由 Translate 或主管道生成的事件会实时显示在这里。",
+ "monitorEmptyCta": "转到翻译选项卡并发送请求 — 它将出现在这里。",
+ "monitorOpenTranslateButton": "前往翻译",
+ "pipelineStepClientRequest": "客户端请求",
+ "pipelineStepClientRequestDesc": "以客户端格式接收到请求",
+ "pipelineStepFormatDetected": "检测到的格式",
+ "pipelineStepFormatDetectedDesc": "自动检测到的源格式",
+ "pipelineStepOpenAIIntermediate": "OpenAI 中级",
+ "pipelineStepOpenAIIntermediateDesc": "翻译为 OpenAI hub 格式",
+ "pipelineStepProviderFormat": "提供者格式",
+ "pipelineStepProviderFormatDesc": "翻译为提供者目标格式",
+ "pipelineStepProviderResponse": "提供者响应",
+ "pipelineStepProviderResponseDesc": "来自提供者的流式响应",
+ "conceptDiagramArrow1": "说话",
+ "conceptDiagramArrow2": "翻译",
+ "conceptDiagramArrow3": "转换",
+ "conceptDiagramExampleHub": "OpenAI",
+ "conceptDiagramHubTooltip": "翻译器用于在没有直接映射的格式之间转换的中间枢纽。",
+ "conceptDiagramSourceTooltip": "您的应用程序使用的 API 格式(例如,Anthropic SDK = claude)。",
+ "conceptDiagramTargetTooltip": "请求将实际发送到的提供者。"
},
"usage": {
"title": "用量",
@@ -7229,7 +7535,16 @@
"improveConfirm": "Improve",
"exportCode": "Export code",
"exportCodeTitle": "Export Code",
+ "exportShort": "导出",
"noStateToExport": "No playground state available to export.",
+ "closeExportModal": "关闭导出模态框",
+ "close": "关闭",
+ "exportRealKeyWarning": "安全警告:导出被阻止 — 输出中检测到真实的 API 密钥。请重置您的 API 密钥并重试。",
+ "placeholderHintPrefix": "替换",
+ "placeholderHintSuffix": "使用您的实际 API 密钥,或将其设置为环境变量。",
+ "copyLangCode": "复制 {language} 代码",
+ "loadingPresets": "加载中…",
+ "loadPresetPlaceholder": "加载预设…",
"copyCode": "Copy",
"copiedCode": "Copied!",
"addModel": "+ Add model",
@@ -7254,7 +7569,27 @@
"invalidJson": "Invalid JSON",
"running": "Running…",
"runLabel": "Run",
- "enterToolResult": "Enter tool result…"
+ "enterToolResult": "Enter tool result…",
+ "build": {
+ "step1Label": "测试什么?",
+ "step2Label": "配置",
+ "step3Label": "运行",
+ "step1Title": "你想测试什么?",
+ "step1Subtitle": "选择您想在本次会议中探索的功能。",
+ "step2Title": "配置",
+ "step2Subtitle": "设置请求中将使用的工具或 JSON 架构。",
+ "step3Title": "运行",
+ "modeToolsTitle": "工具",
+ "modeToolsDesc": "测试函数调用 — 定义工具并查看模型如何调用它们。",
+ "modeJsonTitle": "JSON",
+ "modeJsonDesc": "测试结构化输出 — 将响应限制为 JSON 架构。",
+ "modeBothTitle": "工具 + JSON",
+ "modeBothDesc": "在单个请求中结合函数调用和结构化输出。",
+ "backButton": "返回",
+ "nextButton": "下一步",
+ "runButton": "运行",
+ "promptPlaceholder": "输入您的消息…(按 Enter 发送,Shift+Enter 换行)"
+ }
},
"miniPlayground": {
"endpoint": "端点",
@@ -7395,7 +7730,8 @@
"loadingProxyLogs": "正在加载代理日志...",
"noProxyLogs": "尚无代理日志。配置代理并发起 API 调用后会显示在这里。",
"noMatchingLogs": "没有日志匹配当前筛选条件。",
- "tlsFingerprint": "Chrome 124 TLS 指纹"
+ "tlsFingerprint": "Chrome 124 TLS 指纹",
+ "colPublicIp": "公共IP"
},
"endpointOptions": {
"speech": "语音",
@@ -7535,7 +7871,86 @@
"betaConfigSavedSuffix": "(尚未保留在服务器上)。每个请求上限的强制执行尚未连接到代理管道中。此屏幕可让您设计和可视化配额分配;真正的执行将在未来的迭代中通过数据库持久性和上游调用拦截来实现。",
"policyLabel": "政策:",
"resetIn": "重置于",
- "quotaTotal": "总计"
+ "quotaTotal": "总计",
+ "kpiAvgUtilization": "平均利用率",
+ "kpiBorrowingNow": "现在借款",
+ "conceptTitle": "配额分成是如何工作的",
+ "conceptIntro": "配额共享通过节约型公平分享将提供者的配额分配给多个 API 密钥:每个密钥获得一个按比例分配的份额,但可以在不超过全球上限的情况下从自由余额中借用。",
+ "conceptFairShare": "公平共享:每个键接收与其配置权重成比例的配额",
+ "conceptBorrowing": "借用:密钥可以在不违反上限的情况下消耗他人的自由余额",
+ "conceptGlobalCap": "硬性全球上限:提供者的绝对限制永远不会被超越",
+ "conceptWindows": "Windows: 5小时,按小时、按日、按周、按月 — 每个独立跟踪",
+ "conceptKeyHowTitle": "为配额启用密钥",
+ "conceptKeyHowDesc": "在 API 管理器中正常创建密钥 — 它会自动出现在向导的密钥步骤中。在那里勾选独占以使其仅限配额。没有单独的启用步骤。",
+ "conceptExclusiveTitle": "“Exclusive” 的作用是什么",
+ "conceptExclusiveDesc": "独占密钥仅查看/使用池的 quotaShared-* 模型 — 其他所有模型在其 /v1/models 中被隐藏并被阻止。",
+ "burnRateTitle": "烧钱率",
+ "burnRateExhaustsIn": "排气在",
+ "dimensionResetIn": "重置于",
+ "realConsumedColumn": "已消耗",
+ "deficitColumn": "赤字",
+ "borrowingIndicator": "借款",
+ "migratedFromLocalStorageNotice": "池成功从 localStorage 迁移。",
+ "policyCapAbsoluteLabel": "绝对上限",
+ "policyCapAbsolutePlaceholder": "数字限制(可选)",
+ "multiDimensionLabel": "多维",
+ "stackedBarTitle": "按 API 密钥切片",
+ "usedSuffix": "已使用 {percent}%",
+ "wizardTitle": "新配额池",
+ "editPoolTitle": "编辑池",
+ "saveChanges": "保存更改",
+ "wizardStep1Label": "账户",
+ "wizardStep2Label": "限制",
+ "wizardStep3Label": "密钥",
+ "wizardStep1Title": "选择提供商连接",
+ "wizardStep1Subtitle": "选择此池将共享配额的提供者帐户,设置名称和默认策略。",
+ "wizardStep2Title": "配置配额维度",
+ "wizardStep2Subtitle": "为所选连接定义配额计划维度(单位、窗口、限制)。保持不变以保持当前设置。",
+ "wizardStep3Title": "分配 API 密钥",
+ "wizardStep3Subtitle": "将 API 密钥分配给该池,设置权重 % 分配和可选上限。",
+ "wizardPoolNameLabel": "池名称",
+ "wizardPoolNamePlaceholder": "我的配额池",
+ "wizardNext": "下一个",
+ "wizardBack": "返回",
+ "wizardCreatePool": "创建池",
+ "wizardDimensionsEditedNotice": "已编辑的尺寸 - 在创建泳池时将作为手动覆盖保存。",
+ "wizardExclusiveLabel": "独占配额",
+ "wizardExclusiveHint": "启用后,这些 API 密钥将仅允许使用此池的虚拟模型(在保存时应用 allowedQuotas 对账)。",
+ "wizardPreviewLabel": "虚拟模型名称预览",
+ "wizardConnectionsLabel": "提供者连接",
+ "wizardPrimaryBadge": "主要",
+ "wizardAdditionalConnectionsNote": "附加连接使用其目录默认限制(稍后可编辑)。",
+ "wizardSingleProviderNote": "一个池使用单一提供者",
+ "wizardPreviewMoreModels": "+{count} 更多",
+ "accountQuotaTitle": "账户配额",
+ "accountQuotaNone": "—",
+ "logTitle": "使用日志",
+ "logEmpty": "尚未使用",
+ "groupLabel": "组",
+ "newGroup": "新建组",
+ "renameGroup": "重命名组",
+ "groupSelectHint": "按组过滤池",
+ "groupAllocationNote": "分配适用于此组中的所有池,通过共享配额层。",
+ "groupNamePrompt": "输入组名",
+ "wizardGroupLabel": "组",
+ "allGroups": "所有组",
+ "endpointsTitle": "可用的端点",
+ "endpointsHint": "使用任何分配的密钥调用这些虚拟模型 — 路由 + 配额按组处理。",
+ "previewForKey": "密钥预览",
+ "previewKeyNone": "(所有端点)",
+ "endpointsBaseUrl": "基础 URL",
+ "endpointsCollapse": "折叠",
+ "endpointsExpand": "展开",
+ "endpointsAnthropicNote": "Anthropic-native",
+ "endpointsResponsesNote": "OpenAI 响应 — codex/github",
+ "endpointsWsNote": "WebSocket — 仅限 codex",
+ "betaText": "配额共享功能正常,但预计会有错误。发现一个了吗?请报告。",
+ "betaReportLink": "报告问题",
+ "deleteGroup": "删除组",
+ "deleteGroupConfirm": "要删除此组吗?必须先重新分配或移除其池。",
+ "deleteGroupHasPools": "该组仍然有池 — 请先重新分配或删除它们。",
+ "ungroupedTitle": "未分组",
+ "ungroupedHint": "这些池未分配给已知组。编辑一个池以将其移动到真实组中。"
},
"plugins": {
"title": "Plugins",
@@ -7572,5 +7987,509 @@
"enabled": "Enabled",
"disabled": "Disabled",
"hooks": "Hooks"
+ },
+ "quotaPlans": {
+ "title": "计划与配额",
+ "description": "为每个提供商配置配额计划 — 维度(%、请求、令牌、$)和时间窗口",
+ "providerLabel": "提供者 / 连接",
+ "detectedPlanLabel": "检测到的计划",
+ "manualPlanLabel": "手动覆盖",
+ "unconfiguredLabel": "未配置 — 需要手动设置",
+ "dimensionLabel": "尺寸",
+ "addDimension": "添加维度",
+ "removeDimension": "移除",
+ "limitLabel": "限制",
+ "unitOptions": {
+ "percent": "%",
+ "requests": "请求",
+ "tokens": "令牌",
+ "usd": "美元 ($)"
+ },
+ "windowOptions": {
+ "5h": "5 小时",
+ "hourly": "每小时",
+ "daily": "每日",
+ "weekly": "每周",
+ "monthly": "每月"
+ },
+ "useCatalogButton": "使用目录",
+ "saveOverrideButton": "保存覆盖",
+ "revertToCatalogButton": "恢复到目录",
+ "unknownProviderNotice": "在左侧选择一个提供商以配置其配额计划。",
+ "catalogTitle": "已知目录",
+ "catalogDescription": "自动检测到以下提供商的计划:"
+ },
+ "activity": {
+ "title": "活动",
+ "description": "最近事件动态",
+ "emptyTitle": "尚无活动",
+ "emptyDescription": "当您添加提供者、创建组合或旋转密钥时,事件将出现在这里。",
+ "todayHeader": "今天",
+ "yesterdayHeader": "昨天",
+ "filterAll": "全部",
+ "filterProviders": "提供者",
+ "filterCombos": "组合",
+ "filterApiKeys": "API 密钥",
+ "filterSettings": "设置",
+ "filterQuota": "配额",
+ "filterAuth": "认证",
+ "filterSystem": "系统",
+ "relative": {
+ "justNow": "刚刚",
+ "minutesAgo": "{n}分钟前",
+ "hoursAgo": "{n} 小时前",
+ "yesterday": "昨天",
+ "daysAgo": "{n} 天前"
+ },
+ "eventVerb": {
+ "providerAdded": "{actor} 添加了提供者 {target}",
+ "providerRemoved": "{actor} 移除了提供者 {target}",
+ "providerTested": "{actor} 测试了提供者 {target}",
+ "comboCreated": "{actor} 创建了组合 {target}",
+ "comboUpdated": "{actor} 更新了组合 {target}",
+ "comboDeleted": "{actor} 移除了组合 {target}",
+ "apiKeyCreated": "{actor} 创建了 API 密钥 {target}",
+ "apiKeyRevoked": "{actor} 撤销了 API 密钥 {target}",
+ "apiKeyRotated": "{actor} 旋转了 API 密钥 {target}",
+ "budgetThreshold": "已达到 {target} 的预算阈值",
+ "settingUpdated": "{actor} 更新了设置 {target}",
+ "authLogin": "{actor} 已登录",
+ "authLogout": "{actor} 已注销",
+ "cloudAgentSession": "为 {target} 启动了云代理会话",
+ "mcpToolRegistered": "MCP 工具 {target} 已注册",
+ "webhookCreated": "{actor} 创建了 webhook {target}",
+ "webhookDeleted": "{actor} 移除了 webhook {target}",
+ "quotaPoolCreated": "{actor} 创建了配额池 {target}",
+ "quotaPoolUpdated": "{actor} 更新了配额池 {target}",
+ "quotaPoolDeleted": "{actor} 移除了配额池 {target}",
+ "quotaPlanUpdated": "{actor} 更新了配额计划 {target}",
+ "quotaStoreDriverChanged": "QuotaStore 驱动已更改",
+ "updateApplied": "已应用更新 {target}",
+ "deployCompleted": "部署完成",
+ "skillInstalled": "{actor} 安装了技能 {target}",
+ "skillRemoved": "{actor} 移除了技能 {target}",
+ "providerCredentialsCreated": "{actor} 为 {target} 创建了凭据",
+ "providerCredentialsApplied": "已应用 {target} 的凭据",
+ "providerCredentialsUpdated": "{actor} 更新了 {target} 的凭据",
+ "providerCredentialsRevoked": "{actor} 撤销了 {target} 的凭据",
+ "providerCredentialsBatchRevoked": "{actor} 批量撤销凭证",
+ "providerCredentialsBulkCreated": "{actor} 批量创建了凭据",
+ "providerCredentialsBulkImported": "{actor} 批量导入了凭据",
+ "providerCredentialsImported": "{actor} 导入的凭据",
+ "providerSsrfBlocked": "已阻止对 {target} 的 SSRF 尝试",
+ "authLoginSuccess": "{actor} 已登录",
+ "authLoginError": "{actor} 的登录错误",
+ "authLoginFailed": "{name} 登录失败",
+ "authLoginLocked": "{actor} 在尝试次数过多后被锁定",
+ "authLoginMisconfigured": "身份验证配置无效",
+ "authLoginSetupRequired": "需要进行身份验证设置",
+ "authLogoutSuccess": "{actor} 已注销",
+ "syncTokenCreated": "{actor} 创建了同步令牌",
+ "syncTokenRevoked": "{actor} 撤销了同步令牌",
+ "settingsUpdate": "{actor} 更新了设置",
+ "settingsUpdateFailed": "设置更新失败",
+ "serviceRevealApiKey": "{actor} 揭露了 {target} 的 API 密钥",
+ "genericEvent": "{actor} {target}"
+ }
+ },
+ "agentBridge": {
+ "title": "AgentBridge",
+ "subtitle": "使用 IDE 代理与 OmniRoute 模型 — 无需配置",
+ "riskBannerTitle": "自行承担风险",
+ "riskBannerBody": "AgentBridge 拦截来自 IDE 代理的 HTTPS 流量。通过激活它,您接受遵守每个代理服务条款的责任。切勿在禁止 TLS 检查的设备或网络上使用。",
+ "riskBannerDismiss": "关闭",
+ "serverCardTitle": "AgentBridge 服务器",
+ "statusRunning": "运行中",
+ "statusStopped": "已停止",
+ "statusActive": "活动",
+ "statusDnsOff": "DNS 关闭",
+ "statusSetupRequired": "需要设置",
+ "statusInvestigating": "调查中",
+ "serverPort": "端口",
+ "serverConns": "连接",
+ "serverIntercepted": "拦截成功",
+ "serverLastStarted": "最后启动时间",
+ "startServer": "开始",
+ "stopServer": "停止",
+ "restartServer": "重启",
+ "trustCert": "信任证书",
+ "downloadCert": "下载证书",
+ "regenerateCert": "重新生成证书",
+ "starting": "正在启动…",
+ "stopping": "停止中…",
+ "restarting": "正在重启…",
+ "trusting": "信任中……",
+ "regenerating": "重新生成中…",
+ "upstreamCaLabel": "上游 CA 证书(企业)",
+ "upstreamCaPlaceholder": "/etc/ssl/certs/corp-ca.pem",
+ "upstreamCaTest": "测试 TLS",
+ "upstreamCaTestOk": "TLS 测试通过",
+ "upstreamCaTestError": "TLS 测试失败 — 检查路径和 CA 文件",
+ "bypassSectionTitle": "绕过列表",
+ "bypassSectionDesc": "匹配这些模式的主机将直接隧道(不进行 TLS 解密)。默认包括银行、.gov 和企业 SSO。",
+ "bypassDefaultsLabel": "默认绕过模式(只读)",
+ "bypassUserLabel": "自定义绕过模式(每行一个,glob 或正则表达式)",
+ "saveBypassList": "保存绕过列表",
+ "agentListTitle": "IDE 代理",
+ "filterAll": "全部",
+ "filterActive": "活跃",
+ "filterSetupRequired": "需要设置",
+ "filterInvestigating": "调查中",
+ "searchAgents": "搜索代理…",
+ "noAgentsMatch": "没有代理与当前筛选条件匹配",
+ "agentHosts": "拦截的主机",
+ "certTrusted": "证书已信任",
+ "certNotTrusted": "证书不受信任",
+ "investigatingNotice": "该代理正在接受调查。主机和 API 接口仍在确认中。一旦上游 API 文档完成,设置将可用。",
+ "modelMappingsLabel": "模型映射",
+ "sourceModel": "源模型(代理原生)",
+ "targetModel": "目标模型 (OmniRoute)",
+ "noMappings": "未配置模型映射。运行设置向导以自动检测模型。",
+ "selectModel": "选择…",
+ "saveMappings": "保存映射",
+ "setupWizard": "设置向导",
+ "startDns": "启动 DNS",
+ "stopDns": "停止 DNS",
+ "toggling": "切换中…",
+ "viewTraffic": "查看流量",
+ "emptyNoProvidersTitle": "尚未配置提供程序",
+ "emptyNoProvidersBody": "要使用 AgentBridge,首先连接至少一个提供者。它将是 IDE 请求路由的目标。",
+ "emptyGoToProviders": "前往提供者",
+ "wizardTitle": "设置向导",
+ "wizardSubtitle": "3步设置",
+ "wizardStep1Label": "验证",
+ "wizardStep2Label": "DNS",
+ "wizardStep3Label": "映射",
+ "wizardStep1Desc": "确认服务器正在运行并且证书已安装。",
+ "wizardStep2Desc": "以下条目将被添加到 /etc/hosts 以通过 AgentBridge 重定向流量:",
+ "wizardStep3Desc": "您现在可以在代理卡中配置模型映射。重启 IDE 以应用更改。",
+ "wizardStep3Success": "代理已配置!",
+ "wizardServerCheck": "AgentBridge 服务器",
+ "wizardRunning": "运行中",
+ "wizardNotRunning": "未运行",
+ "wizardCertCheck": "证书",
+ "wizardTrusted": "可信的",
+ "wizardNotTrusted": "尚未信任 — 使用信任证书按钮",
+ "wizardTutorialTitle": "设置说明:",
+ "wizardEnableDns": "添加 /etc/hosts 条目",
+ "wizardDnsAlreadyEnabled": "此代理已启用 DNS",
+ "enablingDns": "启用中…",
+ "modelSelectorTitle": "选择目标模型",
+ "modelSelectorSearch": "搜索模型…",
+ "noModelsFound": "未找到模型",
+ "quickLinks": "快速链接",
+ "quickLinkProviders": "配置提供程序",
+ "quickLinkInspector": "在流量检查器中查看流量",
+ "save": "保存",
+ "saving": "保存中…",
+ "cancel": "取消",
+ "back": "返回",
+ "next": "下一个",
+ "done": "完成",
+ "loading": "加载中…",
+ "riskNoticeTitle": "风险确认",
+ "riskNoticeBody": "AgentBridge 将通过 DNS 重定向其 API 主机来拦截来自此代理的 HTTPS 流量。仅在您接受遵守代理的服务条款和任何适用的网络政策的责任时启用。",
+ "pageMoved": {
+ "goNow": "现在去",
+ "message": "MITM Proxy 现在归 AgentBridge 所有。",
+ "title": "此页面已移动"
+ }
+ },
+ "trafficInspector": {
+ "title": "流量检查员",
+ "subtitle": "监控 LLM 调用并调试任何应用程序的 HTTPS 流量",
+ "captureModesTitle": "捕获模式",
+ "agentBridgeMode": "AgentBridge",
+ "agentBridgeModeDesc": "捕获来自所有连接的 IDE 代理的流量",
+ "customHostsMode": "自定义主机",
+ "customHostsModeDesc": "添加特定主机以进行拦截",
+ "httpProxyMode": "HTTP 代理",
+ "httpProxyModeDesc": "使用 HTTP_PROXY 环境变量",
+ "systemWideMode": "系统范围内",
+ "systemWideModeDesc": "拦截所有系统流量(高级)",
+ "filterBarTitle": "过滤器",
+ "profileLlmOnly": "仅限 LLM",
+ "profileCustom": "自定义",
+ "profileAll": "全部",
+ "filterHost": "过滤主机…",
+ "filterAgent": "代理人",
+ "filterStatus": "状态",
+ "pauseBtn": "暂停",
+ "resumeBtn": "简历",
+ "clearBtn": "清除",
+ "exportHar": "导出 .har",
+ "recordSession": "REC",
+ "stopSession": "停止",
+ "liveBadge": "直播",
+ "offlineBadge": "离线",
+ "noRequests": "尚未捕获任何请求。",
+ "noRequestsDesc": "确保 AgentBridge 正在运行或启用其他捕获模式。",
+ "selectRequest": "选择一个请求以进行检查。",
+ "tabConversation": "对话",
+ "tabHeaders": "标题",
+ "tabRequest": "请求",
+ "tabResponse": "响应",
+ "tabTiming": "计时",
+ "tabLlm": "LLM",
+ "tabStats": "统计信息",
+ "requestHeaders": "请求头部",
+ "responseHeaders": "响应头部",
+ "rawEvents": "原始事件",
+ "mergedView": "合并视图",
+ "noBody": "没有主体。",
+ "streaming": "流媒体…",
+ "manageHosts": "管理主机",
+ "copySnippet": "复制代理代码片段",
+ "addHost": "添加",
+ "hostPlaceholder": "api.openai.com",
+ "noHostsYet": "尚未添加自定义主机。",
+ "noSessionsYet": "还没有会话",
+ "allTraffic": "所有流量(无会话)",
+ "sessionsDropdown": "会话",
+ "annotationPlaceholder": "添加备注…",
+ "contextFingerprint": "上下文指纹",
+ "llmProvider": "检测到的提供者",
+ "llmApiKind": "API 类型",
+ "llmModel": "模型",
+ "llmMessages": "消息",
+ "llmStream": "流媒体",
+ "llmMappedTo": "映射到",
+ "llmCostEstimate": "成本估算",
+ "systemProxyExitWarning": "系统范围的代理仍然处于活动状态 — 仍然离开页面吗?",
+ "customHostsTitle": "自定义主机",
+ "loading": "加载中…",
+ "copied": "已复制!",
+ "copy": "复制",
+ "httpProxyTitle": "HTTP 代理代码片段 — 端口 {port}",
+ "notRecording": "未录制",
+ "anyStatus": "任何状态",
+ "viewingRecordedSession": "查看录制的会话",
+ "backToLive": "返回直播",
+ "untitledSession": "未命名会话",
+ "contextHistory": "上下文历史",
+ "modelResponse": "模型响应",
+ "conversationNoMessages": "在此请求中未找到消息。",
+ "conversationNotAvailable": "对话数据不可用。这可能不是 LLM 请求,或者主体无法解析。",
+ "loadingCharts": "加载图表…",
+ "statsErrors": "错误",
+ "statsLatency": "延迟(最近 50 个请求)",
+ "statsNoData": "尚未有请求。开始会话录制以捕获统计数据。",
+ "statsStatusDistribution": "状态分布",
+ "statsSuccessful": "成功",
+ "statsTotalRequests": "总请求数",
+ "timingProxyOverhead": "代理开销",
+ "timingUpstreamResponse": "上游响应",
+ "timingNoData": "没有可用的时间数据。",
+ "timingTotalLatency": "总延迟",
+ "timingTimestamp": "时间戳",
+ "timingMethod": "方法",
+ "timingStatus": "状态",
+ "timingRequestSize": "请求大小",
+ "timingResponseSize": "响应大小",
+ "pausedNewBadge": "{count} 新的",
+ "clearContextFilter": "清除"
+ },
+ "cliCommon": {
+ "concept": {
+ "code": {
+ "title": "CLI 代码的",
+ "phrase": "指向 OmniRoute 的代码工具",
+ "flow": "你 → CLI 代码 → OmniRoute → 提供者",
+ "seeOther": "查看 →"
+ },
+ "agent": {
+ "title": "CLI 代理",
+ "phrase": "通用自主CLI代理,您可以指向OmniRoute",
+ "flow": "您 → CLI 代理 → OmniRoute → 提供者",
+ "seeOther": "查看 →"
+ },
+ "acp": {
+ "title": "ACP 代理",
+ "phrase": "OmniRoute 作为执行后端(反向流)生成的 CLI",
+ "flow": "客户端 → OmniRoute → 生成 CLI (stdio/ACP) → 响应",
+ "seeOther": "查看 →"
+ }
+ },
+ "comparison": {
+ "title": "了解 OmniRoute 中的 3 种 CLI 类型",
+ "thisPage": "[此页面 ✓]",
+ "code": {
+ "title": "代码工具",
+ "desc": "指向 Omni",
+ "flow": "你 → CLI → Omni → 提供者",
+ "examples": "例如:claude,codex"
+ },
+ "agent": {
+ "title": "广泛自主代理",
+ "desc": "指向 Omni",
+ "flow": "你 → 代理 → Omni",
+ "examples": "例如:hermes,goose"
+ },
+ "acp": {
+ "title": "Omni 使用的后端 CLI",
+ "desc": "反向执行",
+ "flow": "Omni → spawn CLI → resp",
+ "examples": "例如:claude,codex (ACP)"
+ }
+ },
+ "card": {
+ "detected": "检测到",
+ "notDetected": "未检测到",
+ "configured": "已配置",
+ "notConfigured": "未配置",
+ "configure": "配置 →",
+ "howToInstall": "如何安装 →",
+ "manualConfig": "手动配置",
+ "installGuide": "安装指南",
+ "endpointLabel": "端点",
+ "baseUrlPartial": "部分基础 URL",
+ "refreshDetection": "刷新检测",
+ "alsoAcp": "也 ACP"
+ },
+ "detail": {
+ "back": "返回",
+ "apply": "保存",
+ "reset": "清除",
+ "manualConfig": "手动配置",
+ "vendor": "供应商",
+ "category": "类型",
+ "detectionStatus": "检测",
+ "configStatus": "配置",
+ "baseUrlLabel": "基础 URL",
+ "apiKeyLabel": "API 密钥",
+ "modelMappingLabel": "模型映射",
+ "noActiveProviders": "没有活动的提供者。",
+ "noActiveProvidersDesc": "请前往 Providers 连接至少 1 个提供者,然后再配置 CLI。",
+ "openProviders": "打开提供者 →"
+ }
+ },
+ "cliCode": {
+ "pageTitle": "CLI 代码的",
+ "pageSubtitle": "指向 OmniRoute 的代码工具",
+ "searchPlaceholder": "搜索 CLI…",
+ "filterDetectionLabel": "检测",
+ "filterBaseUrlLabel": "基础 URL",
+ "detectionAll": "所有",
+ "detectionInstalled": "已安装",
+ "detectionNotFound": "未找到",
+ "baseUrlAll": "所有",
+ "baseUrlFull": "完整",
+ "baseUrlPartial": "部分"
+ },
+ "cliAgents": {
+ "pageTitle": "CLI 代理",
+ "pageSubtitle": "通用自主CLI代理",
+ "refreshDetection": "刷新检测",
+ "searchPlaceholder": "搜索代理…",
+ "detectionFilterLabel": "检测",
+ "detectionAll": "全部",
+ "detectionInstalled": "已安装",
+ "detectionNotInstalled": "未安装",
+ "visibleCount": "{count} 可见",
+ "emptyState": "未找到符合当前筛选条件的 CLI 代理。"
+ },
+ "acpAgents": {
+ "pageTitle": "ACP 代理",
+ "pageSubtitle": "OmniRoute 作为执行后端生成的 CLI",
+ "scanning": "正在检测代理…",
+ "refresh": "刷新",
+ "setupGuideTitle": "设置指南",
+ "setupGuideDetectCliTitle": "检测 CLI",
+ "setupGuideDetectCliDesc": "代理通过在 PATH 中运行 --version 命令来识别。",
+ "setupGuideCustomAgentTitle": "添加自定义代理",
+ "setupGuideCustomAgentDesc": "填写下面的表格以注册自定义 CLI 代理。",
+ "setupGuideCommandMissingTitle": "找不到命令",
+ "setupGuideCommandMissingDesc": "检查二进制文件是否在 PATH 中。",
+ "fingerprintSettingsHint": "在中配置路由和指纹",
+ "settingsRoutingLink": "设置 → 路由",
+ "installed": "已安装",
+ "notFound": "未找到",
+ "builtIn": "内置",
+ "custom": "自定义",
+ "agentUseCaseHint": "通过 ACP 可用以生成。",
+ "remove": "移除",
+ "addCustomAgent": "添加自定义代理",
+ "addCustomAgentDesc": "通过 ACP 注册一个自定义 CLI 代理。",
+ "addAgent": "添加代理",
+ "agentName": "名称",
+ "agentNamePlaceholder": "我的代理",
+ "binaryName": "二进制",
+ "binaryNamePlaceholder": "例如:myagent",
+ "versionCommand": "版本命令",
+ "versionCommandPlaceholder": "e.g.: myagent --version",
+ "spawnArgs": "生成参数",
+ "spawnArgsPlaceholder": "例如:--quiet,--json",
+ "cliCodeRedirectCta": "打开 CLI 代码的"
+ },
+ "agentSkills": {
+ "pageTitle": "特工技能",
+ "pageSubtitle": "教你的代理操作 OmniRoute — 22 个 API 区域 + 20 个 CLI 家族",
+ "conceptCard": {
+ "agent": {
+ "title": "代理技能 — 外呼",
+ "description": "代理技能是机器可读的 SKILL.md 文档,外部 AI 代理(Claude Code、Cursor、Copilot 等)从 GitHub 获取这些文档,以了解如何通过 REST 或 CLI 操作 OmniRoute。它们由代理读取,而不是由 OmniRoute 执行。",
+ "crossLinkLabel": "了解区别 →"
+ },
+ "omni": {
+ "title": "全能技能 — 入站",
+ "description": "Omni Skills 是 OmniRoute 在每个请求中注入到模型上下文中的沙盒工具。它们由 OmniRoute 执行,而不是由代理读取。",
+ "crossLinkLabel": "了解差异 →"
+ },
+ "comparison": {
+ "colAgent": "特工技能",
+ "colOmni": "全能技能",
+ "whatIs": {
+ "label": "它是什么",
+ "agent": "机器可读的 SKILL.md,教外部代理如何操作 OmniRoute",
+ "omni": "OmniRoute 注入到 LLM 请求中的可执行工具"
+ },
+ "direction": {
+ "label": "方向",
+ "agent": "外部 — 外部代理学习控制 OmniRoute",
+ "omni": "入站 — OmniRoute 为经过它的模型提供工具"
+ },
+ "executor": {
+ "label": "执行者",
+ "agent": "外部代理(读取 markdown → 通过 API/CLI 执行)",
+ "omni": "OmniRoute 本身(拦截 tool_calls,Docker 沙箱)"
+ },
+ "storage": {
+ "label": "存储",
+ "agent": "动态目录 (/api/agent-skills) → GitHub 上的 SKILL.md",
+ "omni": "SQLite (SkillsMP / skills.sh / local)"
+ },
+ "tagline": {
+ "label": "标语",
+ "agent": "教你的代理使用 OmniRoute",
+ "omni": "为 OmniRoute 模型提供可执行工具"
+ }
+ }
+ },
+ "filters": {
+ "category": "类别",
+ "area": "区域",
+ "searchPlaceholder": "搜索技能…"
+ },
+ "categoryApi": "API",
+ "categoryCli": "命令行界面",
+ "filterAll": "所有",
+ "coverageLabel": "覆盖率",
+ "mcpUrl": "MCP URL",
+ "a2aLink": "A2A",
+ "copyUrl": "复制 URL",
+ "viewOnGithub": "在 GitHub 上查看",
+ "previewLoading": "加载技能文档…",
+ "previewError": "加载技能文档失败。",
+ "previewEmpty": "选择一个技能以预览其文档。",
+ "generateButton": "生成缺失的技能",
+ "coverageBar": {
+ "complete": "完成",
+ "partial": "部分"
+ },
+ "noSkillsFound": "未找到与您的筛选条件匹配的技能。",
+ "regenerateConfirm": "这将重新生成所有缺失的 SKILL.md 文件。继续吗?",
+ "regenerateRunning": "正在重新生成技能…",
+ "regenerateSuccess": "技能成功重生。",
+ "regenerateError": "无法重新生成技能。"
}
}