- Generate a ready-to-use{" "}
-
- opencode.json
- {" "}
- with your OmniRoute base URL and all available models — drop it in your project root
- and run{" "}
-
- opencode
-
- .
+ {t("opencodeDesc", {
+ configFile: "opencode.json",
+ command: "opencode",
+ })}
diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json
index d0fdb59742..5f618fb1e4 100644
--- a/src/i18n/messages/ar.json
+++ b/src/i18n/messages/ar.json
@@ -103,7 +103,9 @@
"endpoints": "نقاط النهاية",
"playground": "ملعب النماذج",
"agents": "وكلاء",
- "cliToolsShort": "أدوات"
+ "cliToolsShort": "أدوات",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "المواضيع",
@@ -268,7 +270,28 @@
"permissionsTitle": "الأذونات: {name}",
"allowAllDesc": "يمكن لهذا المفتاح الوصول إلى كافة الموديلات المتاحة.",
"restrictDesc": "يمكن لهذا المفتاح الوصول إلى {selectedCount} من طرازات {totalModels}.",
- "selectedCount": "تم تحديد {count}"
+ "selectedCount": "تم تحديد {count}",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "سجل التدقيق",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "المجموعات",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "إرسال طلبات JSON - RPC إلى@@ PH0 @@ باستخدام @@PH1 @@ أو `message/stream`.",
"a2aQuickStartStep3": "تتبع المهام والتحكم فيها باستخدام `tasks/get` و `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "جارٍ تحميل لوحة تحكم MCP...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "الإعدادات",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "أو قم بإزالة حقل كلمة المرور",
"restartServerWithNewPassword": "أعد تشغيل الخادم وسيتم استخدام كلمة المرور الجديدة",
"backToLogin": "العودة إلى تسجيل الدخول",
- "forgotPassword": "هل نسيت كلمة المرور؟"
+ "forgotPassword": "هل نسيت كلمة المرور؟",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "بالنسبة لنماذج عائلة GitHub Codex، احتفظ بالنموذج كـ gh/codex-model; يقوم جهاز التوجيه بتحديد/الاستجابات تلقائيًا.",
"troubleshootingTestConnection": "استخدم لوحة المعلومات > الموفرون > اختبار الاتصال قبل الاختبار من بيئات تطوير متكاملة أو عملاء خارجيين.",
"troubleshootingCircuitBreaker": "إذا أظهر مقدم الخدمة أن قاطع الدائرة مفتوح، فانتظر حتى فترة التهدئة أو راجع صفحة الصحة للحصول على التفاصيل.",
- "troubleshootingOAuth": "بالنسبة لموفري OAuth، قم بإعادة المصادقة إذا انتهت صلاحية الرموز المميزة. تحقق من مؤشر حالة بطاقة المزود."
+ "troubleshootingOAuth": "بالنسبة لموفري OAuth، قم بإعادة المصادقة إذا انتهت صلاحية الرموز المميزة. تحقق من مؤشر حالة بطاقة المزود.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "سياسة الخصوصية",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json
index 0d493333b0..44df774682 100644
--- a/src/i18n/messages/bg.json
+++ b/src/i18n/messages/bg.json
@@ -103,7 +103,9 @@
"endpoints": "Крайни точки",
"playground": "Площадка",
"agents": "Агенти",
- "cliToolsShort": "Инструменти"
+ "cliToolsShort": "Инструменти",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Теми",
@@ -268,7 +270,28 @@
"permissionsTitle": "Разрешения: {name}",
"allowAllDesc": "Този ключ има достъп до всички налични модели.",
"restrictDesc": "Този ключ има достъп до {selectedCount} от {totalModels} модели.",
- "selectedCount": "{count} избран"
+ "selectedCount": "{count} избран",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Дневник за одит",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Комбота",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Изпратете JSON - RPC заявки до@@ PH0 @@, като използвате @@ PH1 @@ или @@ PH2 @@.",
"a2aQuickStartStep3": "Проследяване и контрол на задачите с помощта на @@ PH0 @@ и @@ PH1 @@.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Зареждане на таблото за управление на MCP...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Настройки",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "или премахнете полето passwordHash",
"restartServerWithNewPassword": "Рестартирайте сървъра - той ще използва новата парола",
"backToLogin": "Назад към Вход",
- "forgotPassword": "Забравена парола?"
+ "forgotPassword": "Забравена парола?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "За модели от семейството на GitHub Codex, запазете модела като gh/codex-model; рутерът избира /отговаря автоматично.",
"troubleshootingTestConnection": "Използвайте Табло > Доставчици > Тестване на връзката, преди да тествате от IDE или външни клиенти.",
"troubleshootingCircuitBreaker": "Ако доставчикът покаже отворен прекъсвач, изчакайте охлаждането или проверете страницата Health за подробности.",
- "troubleshootingOAuth": "За доставчици на OAuth, повторно удостоверяване, ако токените изтекат. Проверете индикатора за състояние на картата на доставчика."
+ "troubleshootingOAuth": "За доставчици на OAuth, повторно удостоверяване, ако токените изтекат. Проверете индикатора за състояние на картата на доставчика.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Политика за поверителност",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json
index 346d1e18b3..309b8e2130 100644
--- a/src/i18n/messages/cs.json
+++ b/src/i18n/messages/cs.json
@@ -2599,7 +2599,13 @@
"binaryName": "Binární název",
"versionCommand": "Příkaz verze",
"spawnArgs": "Spawn Arguments",
- "addAgent": "Přidat agenta"
+ "addAgent": "Přidat agenta",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Kombo Engine",
diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json
index 497997f656..c4b2b9c7aa 100644
--- a/src/i18n/messages/da.json
+++ b/src/i18n/messages/da.json
@@ -103,7 +103,9 @@
"endpoints": "Endpoints",
"playground": "Legeplads",
"agents": "Agenter",
- "cliToolsShort": "Værktøjer"
+ "cliToolsShort": "Værktøjer",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Temaer",
@@ -268,7 +270,28 @@
"permissionsTitle": "Tilladelser: {name}",
"allowAllDesc": "Denne nøgle kan få adgang til alle tilgængelige modeller.",
"restrictDesc": "Denne nøgle kan få adgang til {selectedCount} af {totalModels} modeller.",
- "selectedCount": "{count} valgt"
+ "selectedCount": "{count} valgt",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Revisionslog",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combos",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC-anmodninger til`POST /a2a`vedhjælp af `message/send` eller `message/stream`.",
"a2aQuickStartStep3": "Spor og kontroller opgaver ved hjælp af `tasks/get` og `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Indlæser MCP-dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Indstillinger",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "eller fjern feltet passwordHash",
"restartServerWithNewPassword": "Genstart serveren - den vil bruge den nye adgangskode",
"backToLogin": "Tilbage til Login",
- "forgotPassword": "Glemt adgangskode?"
+ "forgotPassword": "Glemt adgangskode?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "For GitHub Codex-familiemodeller skal du beholde modellen som gh/codex-model; routeren vælger /svar automatisk.",
"troubleshootingTestConnection": "Brug Dashboard > Udbydere > Test forbindelse, før du tester fra IDE'er eller eksterne klienter.",
"troubleshootingCircuitBreaker": "Hvis en udbyder viser en afbryder åben, skal du vente på nedkøling eller tjekke Health-siden for detaljer.",
- "troubleshootingOAuth": "For OAuth-udbydere skal du godkende igen, hvis tokens udløber. Tjek udbyderkortets statusindikator."
+ "troubleshootingOAuth": "For OAuth-udbydere skal du godkende igen, hvis tokens udløber. Tjek udbyderkortets statusindikator.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Privatlivspolitik",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json
index b7709032ff..a4eeb0d1c2 100644
--- a/src/i18n/messages/de.json
+++ b/src/i18n/messages/de.json
@@ -103,7 +103,9 @@
"endpoints": "Endpunkte",
"playground": "Spielwiese",
"agents": "Agenten",
- "cliToolsShort": "Werkzeuge"
+ "cliToolsShort": "Werkzeuge",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themen",
@@ -268,7 +270,28 @@
"permissionsTitle": "Berechtigungen: {name}",
"allowAllDesc": "Mit diesem Schlüssel kann auf alle verfügbaren Modelle zugegriffen werden.",
"restrictDesc": "Dieser Schlüssel kann auf {selectedCount} von {totalModels} Modellen zugreifen.",
- "selectedCount": "{count} ausgewählt"
+ "selectedCount": "{count} ausgewählt",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Audit-Protokoll",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Kombinationen",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Senden Sie JSON-RPC-Anfragen an `POST /a2a` mit `message/send` oder `message/stream`.",
"a2aQuickStartStep3": "Verfolgen und steuern Sie Aufgaben mit `tasks/get` und `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "MCP-Dashboard wird geladen...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Einstellungen",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "oder entfernen Sie das Feld „passwordHash“.",
"restartServerWithNewPassword": "Starten Sie den Server neu – er verwendet das neue Passwort",
"backToLogin": "Zurück zum Anmelden",
- "forgotPassword": "Passwort vergessen?"
+ "forgotPassword": "Passwort vergessen?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Behalten Sie für Modelle der GitHub Codex-Familie das Modell bei gh/codex-model; Der Router wählt /responses automatisch aus.",
"troubleshootingTestConnection": "Verwenden Sie Dashboard > Anbieter > Verbindung testen, bevor Sie Tests mit IDEs oder externen Clients durchführen.",
"troubleshootingCircuitBreaker": "Wenn ein Anbieter anzeigt, dass der Leistungsschalter geöffnet ist, warten Sie auf die Abklingzeit oder schauen Sie auf der Seite „Zustand“ nach, um Einzelheiten zu erfahren.",
- "troubleshootingOAuth": "Führen Sie bei OAuth-Anbietern eine erneute Authentifizierung durch, wenn die Token ablaufen. Überprüfen Sie die Statusanzeige der Anbieterkarte."
+ "troubleshootingOAuth": "Führen Sie bei OAuth-Anbietern eine erneute Authentifizierung durch, wenn die Token ablaufen. Überprüfen Sie die Statusanzeige der Anbieterkarte.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Datenschutzrichtlinie",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json
index 295e794f90..847ed15f69 100644
--- a/src/i18n/messages/en.json
+++ b/src/i18n/messages/en.json
@@ -2599,7 +2599,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json
index 42cb2216c6..58d677e7ee 100644
--- a/src/i18n/messages/es.json
+++ b/src/i18n/messages/es.json
@@ -103,7 +103,9 @@
"endpoints": "Endpoints",
"playground": "Playground",
"agents": "Agentes",
- "cliToolsShort": "Herramientas"
+ "cliToolsShort": "Herramientas",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Temas",
@@ -268,7 +270,28 @@
"permissionsTitle": "Permisos: {name}",
"allowAllDesc": "Esta clave puede acceder a todos los modelos disponibles.",
"restrictDesc": "Esta clave puede acceder a {selectedCount} de {totalModels} modelos.",
- "selectedCount": "{count} seleccionado"
+ "selectedCount": "{count} seleccionado",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Registro de auditoría",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "combos",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Envíe solicitudes JSON-RPC a `POST /a2a` usando `message/send` o `message/stream`.",
"a2aQuickStartStep3": "Realice un seguimiento y controle las tareas utilizando `tasks/get` y `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Cargando el panel de MCP...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Configuración",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "o eliminar el campo contraseñaHash",
"restartServerWithNewPassword": "Reinicia el servidor; usará la nueva contraseña",
"backToLogin": "Volver a iniciar sesión",
- "forgotPassword": "¿Olvidaste tu contraseña?"
+ "forgotPassword": "¿Olvidaste tu contraseña?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRuta",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Para los modelos de la familia GitHub Codex, mantenga el modelo como gh/codex-model; El enrutador selecciona/respuestas automáticamente.",
"troubleshootingTestConnection": "Utilice Panel > Proveedores > Probar conexión antes de realizar pruebas desde IDE o clientes externos.",
"troubleshootingCircuitBreaker": "Si un proveedor muestra el disyuntor abierto, espere el tiempo de reutilización o consulte la página de Salud para obtener más detalles.",
- "troubleshootingOAuth": "Para los proveedores de OAuth, vuelva a autenticarse si los tokens caducan. Verifique el indicador de estado de la tarjeta del proveedor."
+ "troubleshootingOAuth": "Para los proveedores de OAuth, vuelva a autenticarse si los tokens caducan. Verifique el indicador de estado de la tarjeta del proveedor.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Política de privacidad",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json
index b57e522741..ef05674765 100644
--- a/src/i18n/messages/fi.json
+++ b/src/i18n/messages/fi.json
@@ -103,7 +103,9 @@
"endpoints": "Päätepisteet",
"playground": "Leikkipaikka",
"agents": "Agentit",
- "cliToolsShort": "Työkalut"
+ "cliToolsShort": "Työkalut",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Teemat",
@@ -268,7 +270,28 @@
"permissionsTitle": "Luvat: {name}",
"allowAllDesc": "Tällä avaimella pääsee kaikkiin saatavilla oleviin malleihin.",
"restrictDesc": "Tällä avaimella voi käyttää {selectedCount}/{totalModels} mallia.",
- "selectedCount": "{count} valittu"
+ "selectedCount": "{count} valittu",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Tarkastusloki",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Yhdistelmät",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Lähetä JSON-RPC-pyynnöt osoitteeseen `POST /a2a` käyttämällä `message/send` tai `message/stream`.",
"a2aQuickStartStep3": "Seuraa ja ohjaa tehtäviä käyttämällä `tasks/get` ja `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Ladataan MCP-hallintapaneelia...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Asetukset",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "tai poista salasanaHash-kenttä",
"restartServerWithNewPassword": "Käynnistä palvelin uudelleen - se käyttää uutta salasanaa",
"backToLogin": "Takaisin kirjautumiseen",
- "forgotPassword": "Unohditko salasanan?"
+ "forgotPassword": "Unohditko salasanan?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Säilytä GitHub Codex -perheen mallien mallina muodossa gh/codex-model; reititin valitsee / vastaa automaattisesti.",
"troubleshootingTestConnection": "Käytä Dashboard > Providers > Test Connection ennen testaamista IDE:istä tai ulkoisista asiakkaista.",
"troubleshootingCircuitBreaker": "Jos palveluntarjoaja näyttää katkaisijan auki, odota jäähtymistä tai katso lisätietoja Terveys-sivulta.",
- "troubleshootingOAuth": "OAuth-palveluntarjoajat todenna uudelleen, jos tunnukset vanhenevat. Tarkista palveluntarjoajan kortin tilailmaisin."
+ "troubleshootingOAuth": "OAuth-palveluntarjoajat todenna uudelleen, jos tunnukset vanhenevat. Tarkista palveluntarjoajan kortin tilailmaisin.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Tietosuojakäytäntö",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json
index eaf867675e..269be20455 100644
--- a/src/i18n/messages/fr.json
+++ b/src/i18n/messages/fr.json
@@ -103,7 +103,9 @@
"endpoints": "Points d'accès",
"playground": "Playground",
"agents": "Agents",
- "cliToolsShort": "Outils"
+ "cliToolsShort": "Outils",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Thèmes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Autorisations : {name}",
"allowAllDesc": "Cette clé peut accéder à tous les modèles disponibles.",
"restrictDesc": "Cette clé peut accéder à {selectedCount} des modèles {totalModels}.",
- "selectedCount": "{count} sélectionné"
+ "selectedCount": "{count} sélectionné",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Journal d'audit",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combinaisons",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Envoyez des requêtes JSON-RPC à `POST /a2a` en utilisant `message/send` ou `message/stream`.",
"a2aQuickStartStep3": "Suivez et contrôlez les tâches à l’aide de `tasks/get` et `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Chargement du tableau de bord MCP...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Paramètres",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "ou supprimez le champ passwordHash",
"restartServerWithNewPassword": "Redémarrez le serveur - il utilisera le nouveau mot de passe",
"backToLogin": "Retour à la connexion",
- "forgotPassword": "Mot de passe oublié ?"
+ "forgotPassword": "Mot de passe oublié ?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Pour les modèles de la famille GitHub Codex, conservez le modèle sous la forme gh/codex-model ; Le routeur sélectionne /réponses automatiquement.",
"troubleshootingTestConnection": "Utilisez Tableau de bord > Fournisseurs > Tester la connexion avant de tester à partir d'IDE ou de clients externes.",
"troubleshootingCircuitBreaker": "Si un fournisseur indique que le disjoncteur est ouvert, attendez le temps de recharge ou consultez la page Santé pour plus de détails.",
- "troubleshootingOAuth": "Pour les fournisseurs OAuth, réauthentifiez-vous si les jetons expirent. Vérifiez l'indicateur d'état de la carte du fournisseur."
+ "troubleshootingOAuth": "Pour les fournisseurs OAuth, réauthentifiez-vous si les jetons expirent. Vérifiez l'indicateur d'état de la carte du fournisseur.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Politique de confidentialité",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/he.json b/src/i18n/messages/he.json
index 45cbe90c10..ae38073ee7 100644
--- a/src/i18n/messages/he.json
+++ b/src/i18n/messages/he.json
@@ -103,7 +103,9 @@
"endpoints": "נקודות קצה",
"playground": "Playground",
"agents": "סוכנים",
- "cliToolsShort": "כלים"
+ "cliToolsShort": "כלים",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "הרשאות: {name}",
"allowAllDesc": "מפתח זה יכול לגשת לכל הדגמים הזמינים.",
"restrictDesc": "מפתח זה יכול לגשת ל-{selectedCount} מתוך דגמי {totalModels}.",
- "selectedCount": "{count} נבחר"
+ "selectedCount": "{count} נבחר",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "יומן ביקורת",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "שילובים",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "הגדרות",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "או הסר את שדה passwordHash",
"restartServerWithNewPassword": "הפעל מחדש את השרת - הוא ישתמש בסיסמה החדשה",
"backToLogin": "חזרה לכניסה",
- "forgotPassword": "שכחת סיסמה?"
+ "forgotPassword": "שכחת סיסמה?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "עבור מודלים של משפחת GitHub Codex, שמור את הדגם בתור gh/codex-model; הנתב בוחר / תגובות באופן אוטומטי.",
"troubleshootingTestConnection": "השתמש בלוח מחוונים > ספקים > בדוק חיבור לפני בדיקה מ-IDEs או לקוחות חיצוניים.",
"troubleshootingCircuitBreaker": "אם ספק מציג מפסק פתוח, המתן להתקררות או בדוק את דף הבריאות לפרטים.",
- "troubleshootingOAuth": "עבור ספקי OAuth, בצע אימות מחדש אם פג תוקפם של אסימונים. בדוק את מחוון מצב כרטיס הספק."
+ "troubleshootingOAuth": "עבור ספקי OAuth, בצע אימות מחדש אם פג תוקפם של אסימונים. בדוק את מחוון מצב כרטיס הספק.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "מדיניות פרטיות",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/hu.json b/src/i18n/messages/hu.json
index dc08051941..e418f262c5 100644
--- a/src/i18n/messages/hu.json
+++ b/src/i18n/messages/hu.json
@@ -103,7 +103,9 @@
"endpoints": "Végpontok",
"playground": "Játszótér",
"agents": "Ügynökök",
- "cliToolsShort": "Eszközök"
+ "cliToolsShort": "Eszközök",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Témák",
@@ -268,7 +270,28 @@
"permissionsTitle": "Engedélyek: {name}",
"allowAllDesc": "Ezzel a gombbal minden elérhető modell elérhető.",
"restrictDesc": "Ezzel a kulccsal {selectedCount}/{totalModels} modell érhető el.",
- "selectedCount": "{count} kiválasztva"
+ "selectedCount": "{count} kiválasztva",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Ellenőrzési napló",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Kombók",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Kövesse nyomon és vezérelje a feladatokat a `tasks/get` és `tasks/cancel` használatával.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Beállítások elemre",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "vagy távolítsa el a passwordHash mezőt",
"restartServerWithNewPassword": "Indítsa újra a szervert - az új jelszót fogja használni",
"backToLogin": "Vissza a Bejelentkezéshez",
- "forgotPassword": "Elfelejtetted a jelszavad?"
+ "forgotPassword": "Elfelejtetted a jelszavad?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "A GitHub Codex-családhoz tartozó modelleknél tartsa a modellt gh/codex-model; a router automatikusan kiválasztja a /válaszokat.",
"troubleshootingTestConnection": "Az IDE-kből vagy külső kliensekből történő tesztelés előtt használja az Irányítópult > Szolgáltatók > Kapcsolat tesztelése menüpontot.",
"troubleshootingCircuitBreaker": "Ha a szolgáltató azt mutatja, hogy az áramkör megszakítója nyitva van, várja meg a lehűlést, vagy nézze meg az Egészség oldalt a részletekért.",
- "troubleshootingOAuth": "OAuth-szolgáltatók esetén hitelesítse újra, ha a tokenek lejárnak. Ellenőrizze a szolgáltatói kártya állapotjelzőjét."
+ "troubleshootingOAuth": "OAuth-szolgáltatók esetén hitelesítse újra, ha a tokenek lejárnak. Ellenőrizze a szolgáltatói kártya állapotjelzőjét.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Adatvédelmi szabályzat",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/id.json b/src/i18n/messages/id.json
index 9f9662687c..8e8553bddb 100644
--- a/src/i18n/messages/id.json
+++ b/src/i18n/messages/id.json
@@ -103,7 +103,9 @@
"endpoints": "Endpoint",
"playground": "Playground",
"agents": "Agen",
- "cliToolsShort": "Alat"
+ "cliToolsShort": "Alat",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Izin: {name}",
"allowAllDesc": "Kunci ini dapat mengakses semua model yang tersedia.",
"restrictDesc": "Kunci ini dapat mengakses {selectedCount} dari {totalModels} model.",
- "selectedCount": "{count} dipilih"
+ "selectedCount": "{count} dipilih",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Catatan Audit",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "kombo",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Pengaturan",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "atau hapus bidang passwordHash",
"restartServerWithNewPassword": "Mulai ulang server - server akan menggunakan kata sandi baru",
"backToLogin": "Kembali ke Masuk",
- "forgotPassword": "Lupa kata sandi?"
+ "forgotPassword": "Lupa kata sandi?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2512,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2536,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/in.json b/src/i18n/messages/in.json
index b84392ea80..9ab1e09507 100644
--- a/src/i18n/messages/in.json
+++ b/src/i18n/messages/in.json
@@ -103,7 +103,9 @@
"endpoints": "Endpoint",
"playground": "Playground",
"agents": "एजेंट",
- "cliToolsShort": "उपकरण"
+ "cliToolsShort": "उपकरण",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "अनुमतियाँ: {name}",
"allowAllDesc": "यह कुंजी सभी उपलब्ध मॉडलों तक पहुंच सकती है.",
"restrictDesc": "यह कुंजी {totalModels} मॉडलों में से {selectedCount} तक पहुंच सकती है।",
- "selectedCount": "{count} चयनित"
+ "selectedCount": "{count} चयनित",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "ऑडिट लॉग",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "संयोजन",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "सेटिंग्स",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "या पासवर्डहैश फ़ील्ड हटा दें",
"restartServerWithNewPassword": "सर्वर को पुनरारंभ करें - यह नए पासवर्ड का उपयोग करेगा",
"backToLogin": "लॉगइन पर वापस जाएँ",
- "forgotPassword": "पासवर्ड भूल गए?"
+ "forgotPassword": "पासवर्ड भूल गए?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "ओम्निरूट",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "GitHub कोडेक्स-फ़ैमिली मॉडल के लिए, मॉडल को gh/codex-model के रूप में रखें; राउटर स्वचालित रूप से/प्रतिक्रियाओं का चयन करता है।",
"troubleshootingTestConnection": "आईडीई या बाहरी क्लाइंट से परीक्षण करने से पहले डैशबोर्ड > प्रदाता > परीक्षण कनेक्शन का उपयोग करें।",
"troubleshootingCircuitBreaker": "यदि कोई प्रदाता सर्किट ब्रेकर खुला दिखाता है, तो कूलडाउन की प्रतीक्षा करें या विवरण के लिए स्वास्थ्य पृष्ठ देखें।",
- "troubleshootingOAuth": "OAuth प्रदाताओं के लिए, यदि टोकन समाप्त हो जाते हैं तो पुनः प्रमाणित करें। प्रदाता कार्ड स्थिति संकेतक की जाँच करें।"
+ "troubleshootingOAuth": "OAuth प्रदाताओं के लिए, यदि टोकन समाप्त हो जाते हैं तो पुनः प्रमाणित करें। प्रदाता कार्ड स्थिति संकेतक की जाँच करें।",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "गोपनीयता नीति",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json
index e0f86bdbc1..b056341ec5 100644
--- a/src/i18n/messages/it.json
+++ b/src/i18n/messages/it.json
@@ -103,7 +103,9 @@
"endpoints": "Endpoint",
"playground": "Playground",
"agents": "Agenti",
- "cliToolsShort": "Strumenti"
+ "cliToolsShort": "Strumenti",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Autorizzazioni: {name}",
"allowAllDesc": "Questa chiave può accedere a tutti i modelli disponibili.",
"restrictDesc": "Questa chiave può accedere a {selectedCount} di {totalModels} modelli.",
- "selectedCount": "{count} selezionato"
+ "selectedCount": "{count} selezionato",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Registro di controllo",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combinazioni",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Impostazioni",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "o rimuovere il campo passwordHash",
"restartServerWithNewPassword": "Riavvia il server: utilizzerà la nuova password",
"backToLogin": "Torna all'accesso",
- "forgotPassword": "Ha dimenticato la password?"
+ "forgotPassword": "Ha dimenticato la password?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Per i modelli della famiglia GitHub Codex, mantieni il modello come gh/codex-model; il router seleziona/risponde automaticamente.",
"troubleshootingTestConnection": "Utilizza Dashboard > Provider > Verifica connessione prima di effettuare test da IDE o client esterni.",
"troubleshootingCircuitBreaker": "Se un fornitore mostra l'interruttore aperto, attendi il raffreddamento o controlla la pagina Salute per i dettagli.",
- "troubleshootingOAuth": "Per i provider OAuth, eseguire nuovamente l'autenticazione se i token scadono. Controlla l'indicatore di stato della carta del fornitore."
+ "troubleshootingOAuth": "Per i provider OAuth, eseguire nuovamente l'autenticazione se i token scadono. Controlla l'indicatore di stato della carta del fornitore.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "politica sulla riservatezza",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json
index e1a2c2482d..e4b4b2053d 100644
--- a/src/i18n/messages/ja.json
+++ b/src/i18n/messages/ja.json
@@ -103,7 +103,9 @@
"endpoints": "エンドポイント",
"playground": "プレイグラウンド",
"agents": "エージェント",
- "cliToolsShort": "ツール"
+ "cliToolsShort": "ツール",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "権限: {name}",
"allowAllDesc": "このキーは、利用可能なすべてのモデルにアクセスできます。",
"restrictDesc": "このキーは、{totalModels} モデルの {selectedCount} にアクセスできます。",
- "selectedCount": "{count} が選択されました"
+ "selectedCount": "{count} が選択されました",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "監査ログ",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "コンボ",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "設定",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "または、passwordHash フィールドを削除します",
"restartServerWithNewPassword": "サーバーを再起動すると新しいパスワードが適用されます",
"backToLogin": "ログインに戻る",
- "forgotPassword": "パスワードをお忘れですか?"
+ "forgotPassword": "パスワードをお忘れですか?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "オムニルート",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "GitHub Codex ファミリ モデルの場合、モデルを gh/codex-model として保持します。ルーターは自動的に選択/応答します。",
"troubleshootingTestConnection": "IDE または外部クライアントからテストする前に、[ダッシュボード] > [プロバイダー] > [接続のテスト] を使用します。",
"troubleshootingCircuitBreaker": "プロバイダーがサーキット ブレーカーが開いていることを示している場合は、クールダウンするまで待つか、詳細について [ヘルス] ページを確認してください。",
- "troubleshootingOAuth": "OAuth プロバイダーの場合、トークンの有効期限が切れた場合は再認証します。プロバイダー カードのステータス インジケーターを確認します。"
+ "troubleshootingOAuth": "OAuth プロバイダーの場合、トークンの有効期限が切れた場合は再認証します。プロバイダー カードのステータス インジケーターを確認します。",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "プライバシーポリシー",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json
index f07a712221..d3cf2b3713 100644
--- a/src/i18n/messages/ko.json
+++ b/src/i18n/messages/ko.json
@@ -103,7 +103,9 @@
"endpoints": "엔드포인트",
"playground": "플레이그라운드",
"agents": "에이전트",
- "cliToolsShort": "도구"
+ "cliToolsShort": "도구",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "권한: {name}",
"allowAllDesc": "이 키는 사용 가능한 모든 모델에 액세스할 수 있습니다.",
"restrictDesc": "이 키는 {totalModels} 모델 중 {selectedCount}에 액세스할 수 있습니다.",
- "selectedCount": "{count} 선택됨"
+ "selectedCount": "{count} 선택됨",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "감사 로그",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "콤보",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "설정",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "또는 PasswordHash 필드를 제거하세요.",
"restartServerWithNewPassword": "서버를 다시 시작하세요. 새 비밀번호가 사용됩니다.",
"backToLogin": "로그인으로 돌아가기",
- "forgotPassword": "비밀번호를 잊으셨나요?"
+ "forgotPassword": "비밀번호를 잊으셨나요?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "옴니루트",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "GitHub Codex 계열 모델의 경우 모델을 gh/codex-model로 유지합니다. 라우터는 /responses를 자동으로 선택합니다.",
"troubleshootingTestConnection": "IDE 또는 외부 클라이언트에서 테스트하기 전에 대시보드 > 공급자 > 연결 테스트를 사용하세요.",
"troubleshootingCircuitBreaker": "공급자가 회로 차단기를 열었다고 표시하는 경우 대기 시간을 기다리거나 상태 페이지에서 자세한 내용을 확인하세요.",
- "troubleshootingOAuth": "OAuth 공급자의 경우 토큰이 만료되면 다시 인증하세요. 공급자 카드 상태 표시기를 확인하십시오."
+ "troubleshootingOAuth": "OAuth 공급자의 경우 토큰이 만료되면 다시 인증하세요. 공급자 카드 상태 표시기를 확인하십시오.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "개인 정보 보호 정책",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json
index 1b3e9b1d56..0ed22aa522 100644
--- a/src/i18n/messages/ms.json
+++ b/src/i18n/messages/ms.json
@@ -103,7 +103,9 @@
"endpoints": "Titik Akhir",
"playground": "Playground",
"agents": "Ejen",
- "cliToolsShort": "Alat"
+ "cliToolsShort": "Alat",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Kebenaran: {name}",
"allowAllDesc": "Kunci ini boleh mengakses semua model yang tersedia.",
"restrictDesc": "Kunci ini boleh mengakses {selectedCount} daripada {totalModels} model.",
- "selectedCount": "{count} dipilih"
+ "selectedCount": "{count} dipilih",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Log Audit",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Kombo",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Hantar permintaan JSON-RPC ke `POST /a2a` menggunakan `message/send` atau `message/stream`.",
"a2aQuickStartStep3": "Jejak dan kawal tugas menggunakan `tasks/get` dan `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "tetapan",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "atau alih keluar medan passwordHash",
"restartServerWithNewPassword": "Mulakan semula pelayan - ia akan menggunakan kata laluan baharu",
"backToLogin": "Kembali ke Log Masuk",
- "forgotPassword": "Lupa kata laluan?"
+ "forgotPassword": "Lupa kata laluan?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Untuk model keluarga Codex GitHub, kekalkan model sebagai gh/codex-model; penghala memilih /membalas secara automatik.",
"troubleshootingTestConnection": "Gunakan Papan Pemuka > Pembekal > Uji Sambungan sebelum menguji daripada IDE atau pelanggan luaran.",
"troubleshootingCircuitBreaker": "Jika pembekal menunjukkan pemutus litar terbuka, tunggu masa bertenang atau semak halaman Kesihatan untuk mendapatkan butiran.",
- "troubleshootingOAuth": "Untuk pembekal OAuth, sahkan semula jika token tamat tempoh. Semak penunjuk status kad pembekal."
+ "troubleshootingOAuth": "Untuk pembekal OAuth, sahkan semula jika token tamat tempoh. Semak penunjuk status kad pembekal.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Dasar Privasi",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json
index 9aa06411bb..50f72579d0 100644
--- a/src/i18n/messages/nl.json
+++ b/src/i18n/messages/nl.json
@@ -103,7 +103,9 @@
"endpoints": "Eindpunten",
"playground": "Speeltuin",
"agents": "Agenten",
- "cliToolsShort": "Gereedschap"
+ "cliToolsShort": "Gereedschap",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Machtigingen: {name}",
"allowAllDesc": "Met deze sleutel heeft u toegang tot alle beschikbare modellen.",
"restrictDesc": "Deze sleutel heeft toegang tot {selectedCount} van {totalModels} modellen.",
- "selectedCount": "{count} geselecteerd"
+ "selectedCount": "{count} geselecteerd",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Auditlogboek",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combo's",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Instellingen",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "of verwijder het wachtwoordHash-veld",
"restartServerWithNewPassword": "Start de server opnieuw op. Deze gebruikt het nieuwe wachtwoord",
"backToLogin": "Terug naar Inloggen",
- "forgotPassword": "Wachtwoord vergeten?"
+ "forgotPassword": "Wachtwoord vergeten?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Voor modellen uit de GitHub Codex-familie behoudt u het model als gh/codex-model; router selecteert /responses automatisch.",
"troubleshootingTestConnection": "Gebruik Dashboard > Providers > Verbinding testen voordat u gaat testen vanaf IDE's of externe clients.",
"troubleshootingCircuitBreaker": "Als een provider aangeeft dat de stroomonderbreker open is, wacht dan op de cooldown of kijk op de Gezondheidspagina voor meer informatie.",
- "troubleshootingOAuth": "Voor OAuth-providers geldt dat u opnieuw moet verifiëren als tokens verlopen. Controleer de statusindicator van de providerkaart."
+ "troubleshootingOAuth": "Voor OAuth-providers geldt dat u opnieuw moet verifiëren als tokens verlopen. Controleer de statusindicator van de providerkaart.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Privacybeleid",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json
index 224328acd6..c21510004f 100644
--- a/src/i18n/messages/no.json
+++ b/src/i18n/messages/no.json
@@ -103,7 +103,9 @@
"endpoints": "Endepunkter",
"playground": "Lekeplass",
"agents": "Agenter",
- "cliToolsShort": "Verktøy"
+ "cliToolsShort": "Verktøy",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Tillatelser: {name}",
"allowAllDesc": "Denne nøkkelen har tilgang til alle tilgjengelige modeller.",
"restrictDesc": "Denne nøkkelen har tilgang til {selectedCount} av {totalModels}-modeller.",
- "selectedCount": "{count} valgt"
+ "selectedCount": "{count} valgt",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Revisjonslogg",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combos",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC-forespørsler til `POST /a2a` ved å bruke `message/send` eller `message/stream`.",
"a2aQuickStartStep3": "Spor og kontroller oppgaver ved å bruke `tasks/get` og `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Laster inn MCP-dashbordet ...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Innstillinger",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "eller fjern passordHash-feltet",
"restartServerWithNewPassword": "Start serveren på nytt - den vil bruke det nye passordet",
"backToLogin": "Tilbake til pålogging",
- "forgotPassword": "Glemt passord?"
+ "forgotPassword": "Glemt passord?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "For GitHub Codex-familiemodeller, behold modellen som gh/codex-model; ruteren velger /responser automatisk.",
"troubleshootingTestConnection": "Bruk Dashboard > Leverandører > Test tilkobling før du tester fra IDE-er eller eksterne klienter.",
"troubleshootingCircuitBreaker": "Hvis en leverandør viser at strømbryteren er åpen, vent på nedkjøling eller sjekk helsesiden for detaljer.",
- "troubleshootingOAuth": "For OAuth-leverandører, autentiser på nytt hvis tokens utløper. Sjekk leverandørkortets statusindikator."
+ "troubleshootingOAuth": "For OAuth-leverandører, autentiser på nytt hvis tokens utløper. Sjekk leverandørkortets statusindikator.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Personvernerklæring",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json
index 06dc1f799d..3d894decea 100644
--- a/src/i18n/messages/phi.json
+++ b/src/i18n/messages/phi.json
@@ -103,7 +103,9 @@
"endpoints": "Mga Endpoint",
"playground": "Playground",
"agents": "Mga Agent",
- "cliToolsShort": "Mga Tool"
+ "cliToolsShort": "Mga Tool",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Mga Pahintulot: {name}",
"allowAllDesc": "Maa-access ng key na ito ang lahat ng available na modelo.",
"restrictDesc": "Maa-access ng key na ito ang {selectedCount} ng {totalModels} na mga modelo.",
- "selectedCount": "{count} ang napili"
+ "selectedCount": "{count} ang napili",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Log ng Audit",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Mga combo",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Subaybayan at kontrolin ang mga gawain gamit ang `tasks/get` at `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Nilo-load ang MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Mga setting",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "o alisin ang field ng passwordHash",
"restartServerWithNewPassword": "I-restart ang server - gagamitin nito ang bagong password",
"backToLogin": "Bumalik sa Login",
- "forgotPassword": "Nakalimutan ang password?"
+ "forgotPassword": "Nakalimutan ang password?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Para sa mga modelo ng pamilya ng GitHub Codex, panatilihing gh/codex-model ang modelo; awtomatikong pinipili /tugon ng router.",
"troubleshootingTestConnection": "Gamitin ang Dashboard > Mga Provider > Subukan ang Koneksyon bago subukan mula sa mga IDE o external na kliyente.",
"troubleshootingCircuitBreaker": "Kung ipinapakita ng provider na bukas ang circuit breaker, hintayin ang cooldown o tingnan ang page ng Health para sa mga detalye.",
- "troubleshootingOAuth": "Para sa mga provider ng OAuth, muling i-authenticate kung mag-e-expire ang mga token. Suriin ang tagapagpahiwatig ng katayuan ng provider card."
+ "troubleshootingOAuth": "Para sa mga provider ng OAuth, muling i-authenticate kung mag-e-expire ang mga token. Suriin ang tagapagpahiwatig ng katayuan ng provider card.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Patakaran sa Privacy",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json
index f485f1a602..e8bb32036b 100644
--- a/src/i18n/messages/pl.json
+++ b/src/i18n/messages/pl.json
@@ -103,7 +103,9 @@
"endpoints": "Punkty końcowe",
"playground": "Plac zabaw",
"agents": "Agenci",
- "cliToolsShort": "Narzędzia"
+ "cliToolsShort": "Narzędzia",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Uprawnienia: {name}",
"allowAllDesc": "Ten klucz umożliwia dostęp do wszystkich dostępnych modeli.",
"restrictDesc": "Ten klucz umożliwia dostęp do {selectedCount} z {totalModels} modeli.",
- "selectedCount": "Wybrano {count}"
+ "selectedCount": "Wybrano {count}",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Dziennik audytu",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Kombinacje",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Ustawienia",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "lub usuń pole hasłoHash",
"restartServerWithNewPassword": "Zrestartuj serwer - będzie używał nowego hasła",
"backToLogin": "Powrót do logowania",
- "forgotPassword": "Zapomniałeś hasła?"
+ "forgotPassword": "Zapomniałeś hasła?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "W przypadku modeli z rodziny GitHub Codex zachowaj model jako gh/codex-model; router wybiera opcję /odpowiada automatycznie.",
"troubleshootingTestConnection": "Użyj Panelu sterowania > Dostawcy > Testuj połączenie przed testowaniem z IDE lub klientów zewnętrznych.",
"troubleshootingCircuitBreaker": "Jeśli dostawca pokazuje, że wyłącznik jest otwarty, poczekaj na ochłodzenie lub sprawdź stronę Zdrowie, aby uzyskać szczegółowe informacje.",
- "troubleshootingOAuth": "W przypadku dostawców OAuth należy ponownie uwierzytelnić, jeśli tokeny wygasną. Sprawdź wskaźnik stanu karty dostawcy."
+ "troubleshootingOAuth": "W przypadku dostawców OAuth należy ponownie uwierzytelnić, jeśli tokeny wygasną. Sprawdź wskaźnik stanu karty dostawcy.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Polityka prywatności",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json
index 4b5e0fd6b6..5342a6bfd4 100644
--- a/src/i18n/messages/pt-BR.json
+++ b/src/i18n/messages/pt-BR.json
@@ -104,7 +104,8 @@
"endpoints": "Endpoints",
"playground": "Playground",
"agents": "Agentes",
- "cliToolsShort": "Ferramentas"
+ "cliToolsShort": "Ferramentas",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -289,7 +290,8 @@
"permissionsTitle": "Permissões: {name}",
"allowAllDesc": "Esta chave pode acessar todos os modelos disponíveis.",
"restrictDesc": "Esta chave pode acessar {selectedCount} de {totalModels} modelos.",
- "selectedCount": "{count} selecionados"
+ "selectedCount": "{count} selecionados",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Log de Auditoria",
@@ -569,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combos",
@@ -897,7 +904,12 @@
"a2aQuickStartStep2": "Envie requisições JSON-RPC para `POST /a2a` usando `message/send` ou `message/stream`.",
"a2aQuickStartStep3": "Acompanhe e controle tarefas com `tasks/get` e `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Carregando painel MCP...",
@@ -1429,7 +1441,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Configurações",
@@ -2249,7 +2278,8 @@
"orRemovePasswordHashField": "ou remova o campo passwordHash",
"restartServerWithNewPassword": "Reinicie o servidor - ele usará a nova senha",
"backToLogin": "Voltar para o Login",
- "forgotPassword": "Esqueceu a senha?"
+ "forgotPassword": "Esqueceu a senha?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2447,7 +2477,16 @@
"troubleshootingCodexFamily": "Para modelos da família GitHub Codex, mantenha o modelo como gh/codex-model; o roteador seleciona /responses automaticamente.",
"troubleshootingTestConnection": "Use Painel > Provedores > Testar Conexão antes de testar por IDEs ou clientes externos.",
"troubleshootingCircuitBreaker": "Se um provedor mostrar circuit breaker aberto, aguarde o cooldown ou verifique a página Health para detalhes.",
- "troubleshootingOAuth": "Para provedores OAuth, autentique novamente se os tokens expirarem. Verifique o indicador de status no card do provedor."
+ "troubleshootingOAuth": "Para provedores OAuth, autentique novamente se os tokens expirarem. Verifique o indicador de status no card do provedor.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Política de Privacidade",
@@ -2536,7 +2575,13 @@
"binaryName": "Nome do Binário",
"versionCommand": "Comando de Versão",
"spawnArgs": "Argumentos",
- "addAgent": "Adicionar Agente"
+ "addAgent": "Adicionar Agente",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2560,5 +2605,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json
index aaff5045d8..08db574d9c 100644
--- a/src/i18n/messages/pt.json
+++ b/src/i18n/messages/pt.json
@@ -103,7 +103,9 @@
"themeCyan": "Ciano",
"playground": "Playground",
"agents": "Agentes",
- "cliToolsShort": "Ferramentas"
+ "cliToolsShort": "Ferramentas",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Permissões: {name}",
"allowAllDesc": "Esta chave pode acessar todos os modelos disponíveis.",
"restrictDesc": "Esta chave pode acessar {selectedCount} de modelos {totalModels}.",
- "selectedCount": "{count} selecionado"
+ "selectedCount": "{count} selecionado",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Registro de auditoria",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combos",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"endpoints": {
"tabProxy": "Endpoint Proxy",
@@ -1408,7 +1441,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Configurações",
@@ -2228,7 +2278,8 @@
"orRemovePasswordHashField": "ou remova o campo passwordHash",
"restartServerWithNewPassword": "Reinicie o servidor - ele usará a nova senha",
"backToLogin": "Voltar ao login",
- "forgotPassword": "Esqueceu a senha?"
+ "forgotPassword": "Esqueceu a senha?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2426,7 +2477,16 @@
"troubleshootingCodexFamily": "Para modelos da família GitHub Codex, mantenha o modelo como gh/codex-model; roteador seleciona /respostas automaticamente.",
"troubleshootingTestConnection": "Use Painel > Provedores > Testar conexão antes de testar em IDEs ou clientes externos.",
"troubleshootingCircuitBreaker": "Se um provedor mostrar o disjuntor aberto, aguarde o resfriamento ou verifique a página de integridade para obter detalhes.",
- "troubleshootingOAuth": "Para provedores OAuth, autentique novamente se os tokens expirarem. Verifique o indicador de status do cartão do provedor."
+ "troubleshootingOAuth": "Para provedores OAuth, autentique novamente se os tokens expirarem. Verifique o indicador de status do cartão do provedor.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Política de Privacidade",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json
index 20ee34fbd4..496bc2b56e 100644
--- a/src/i18n/messages/ro.json
+++ b/src/i18n/messages/ro.json
@@ -103,7 +103,9 @@
"endpoints": "Puncte finale",
"playground": "Playground",
"agents": "Agenți",
- "cliToolsShort": "Instrumente"
+ "cliToolsShort": "Instrumente",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Permisiuni: {name}",
"allowAllDesc": "Această cheie poate accesa toate modelele disponibile.",
"restrictDesc": "Această cheie poate accesa {selectedCount} din {totalModels} modele.",
- "selectedCount": "{count} selectat"
+ "selectedCount": "{count} selectat",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Jurnal de audit",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combo-uri",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Setări",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "sau eliminați câmpul passwordHash",
"restartServerWithNewPassword": "Reporniți serverul - va folosi noua parolă",
"backToLogin": "Înapoi la Logare",
- "forgotPassword": "Ai uitat parola?"
+ "forgotPassword": "Ai uitat parola?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Pentru modelele din familia GitHub Codex, păstrați modelul ca gh/codex-model; routerul selectează/răspunde automat.",
"troubleshootingTestConnection": "Utilizați Tabloul de bord > Furnizori > Testați conexiunea înainte de a testa de la IDE-uri sau clienți externi.",
"troubleshootingCircuitBreaker": "Dacă un furnizor arată întrerupătorul deschis, așteptați răcirea sau verificați pagina Sănătate pentru detalii.",
- "troubleshootingOAuth": "Pentru furnizorii OAuth, re-autentificați-vă dacă tokenurile expiră. Verificați indicatorul de stare a cardului furnizorului."
+ "troubleshootingOAuth": "Pentru furnizorii OAuth, re-autentificați-vă dacă tokenurile expiră. Verificați indicatorul de stare a cardului furnizorului.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Politica de confidențialitate",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json
index 2ad3e3f8fb..b78821c10f 100644
--- a/src/i18n/messages/ru.json
+++ b/src/i18n/messages/ru.json
@@ -103,7 +103,9 @@
"endpoints": "Конечные точки",
"playground": "Площадка",
"agents": "Агенты",
- "cliToolsShort": "Инструменты"
+ "cliToolsShort": "Инструменты",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Темы",
@@ -268,7 +270,28 @@
"permissionsTitle": "Разрешения: {name}",
"allowAllDesc": "Этот ключ дает доступ ко всем доступным моделям.",
"restrictDesc": "Этот ключ может получить доступ к {selectedCount} из моделей {totalModels}.",
- "selectedCount": "{count} выбрано"
+ "selectedCount": "{count} выбрано",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Журнал аудита",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Комбо",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Настройки",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "или удалите поле пароляHash",
"restartServerWithNewPassword": "Перезагрузите сервер - он будет использовать новый пароль.",
"backToLogin": "Вернуться к входу",
- "forgotPassword": "Забыли пароль?"
+ "forgotPassword": "Забыли пароль?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "ОмниРоут",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Для моделей семейства GitHub Codex сохраните модель как gh/codex-model; Маршрутизатор выбирает / отвечает автоматически.",
"troubleshootingTestConnection": "Используйте «Панель мониторинга» > «Поставщики» > «Проверить соединение» перед тестированием из IDE или внешних клиентов.",
"troubleshootingCircuitBreaker": "Если поставщик услуг показывает, что автоматический выключатель разомкнут, дождитесь охлаждения или посетите страницу «Здоровье» для получения подробной информации.",
- "troubleshootingOAuth": "Для поставщиков OAuth выполните повторную аутентификацию, если срок действия токенов истечет. Проверьте индикатор состояния карты провайдера."
+ "troubleshootingOAuth": "Для поставщиков OAuth выполните повторную аутентификацию, если срок действия токенов истечет. Проверьте индикатор состояния карты провайдера.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Политика конфиденциальности",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json
index aa204cd67d..c4e765dadf 100644
--- a/src/i18n/messages/sk.json
+++ b/src/i18n/messages/sk.json
@@ -103,7 +103,9 @@
"endpoints": "Koncové body",
"playground": "Ihrisko",
"agents": "Agenti",
- "cliToolsShort": "Nástroje"
+ "cliToolsShort": "Nástroje",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Povolenia: {name}",
"allowAllDesc": "Tento kľúč umožňuje prístup ku všetkým dostupným modelom.",
"restrictDesc": "Tento kľúč má prístup k {selectedCount} z {totalModels} modelov.",
- "selectedCount": "{count} vybraté"
+ "selectedCount": "{count} vybraté",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Audit Log",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "kombá",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Nastavenia",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "alebo odstráňte pole passwordHash",
"restartServerWithNewPassword": "Reštartujte server - použije nové heslo",
"backToLogin": "Späť na Prihlásenie",
- "forgotPassword": "Zabudli ste heslo?"
+ "forgotPassword": "Zabudli ste heslo?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Pre modely rodiny GitHub Codex ponechajte model ako gh/codex-model; router vyberá / odpovedá automaticky.",
"troubleshootingTestConnection": "Pred testovaním z IDE alebo externých klientov použite Dashboard > Providers > Test Connection.",
"troubleshootingCircuitBreaker": "Ak poskytovateľ zobrazí istič otvorený, počkajte na vychladnutie alebo skontrolujte stránku Zdravie, kde nájdete podrobnosti.",
- "troubleshootingOAuth": "V prípade poskytovateľov OAuth znova overte, ak platnosť tokenov vyprší. Skontrolujte indikátor stavu karty poskytovateľa."
+ "troubleshootingOAuth": "V prípade poskytovateľov OAuth znova overte, ak platnosť tokenov vyprší. Skontrolujte indikátor stavu karty poskytovateľa.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Zásady ochrany osobných údajov",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json
index d5701b370c..3365e88d01 100644
--- a/src/i18n/messages/sv.json
+++ b/src/i18n/messages/sv.json
@@ -103,7 +103,9 @@
"endpoints": "Ändpunkter",
"playground": "Lekplats",
"agents": "Agenter",
- "cliToolsShort": "Verktyg"
+ "cliToolsShort": "Verktyg",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Behörigheter: {name}",
"allowAllDesc": "Denna nyckel kan komma åt alla tillgängliga modeller.",
"restrictDesc": "Denna nyckel kan komma åt {selectedCount} av {totalModels} modeller.",
- "selectedCount": "{count} har valts"
+ "selectedCount": "{count} har valts",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Revisionslogg",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combos",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Inställningar",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "eller ta bort fältet passwordHash",
"restartServerWithNewPassword": "Starta om servern - den kommer att använda det nya lösenordet",
"backToLogin": "Tillbaka till inloggning",
- "forgotPassword": "Glömt lösenordet?"
+ "forgotPassword": "Glömt lösenordet?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "För GitHub Codex-familjens modeller, behåll modellen som gh/codex-model; routern väljer /svarar automatiskt.",
"troubleshootingTestConnection": "Använd Dashboard > Leverantörer > Testa anslutning innan du testar från IDE:er eller externa klienter.",
"troubleshootingCircuitBreaker": "Om en leverantör visar att strömbrytaren är öppen, vänta på nedkylning eller kolla Health-sidan för detaljer.",
- "troubleshootingOAuth": "För OAuth-leverantörer, autentisera på nytt om tokens löper ut. Kontrollera leverantörskortets statusindikator."
+ "troubleshootingOAuth": "För OAuth-leverantörer, autentisera på nytt om tokens löper ut. Kontrollera leverantörskortets statusindikator.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Sekretesspolicy",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/th.json b/src/i18n/messages/th.json
index 300963fd57..d9ac5da94a 100644
--- a/src/i18n/messages/th.json
+++ b/src/i18n/messages/th.json
@@ -103,7 +103,9 @@
"endpoints": "จุดปลายทาง",
"playground": "Playground",
"agents": "เอเจนต์",
- "cliToolsShort": "เครื่องมือ"
+ "cliToolsShort": "เครื่องมือ",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "ธีมส์",
@@ -268,7 +270,28 @@
"permissionsTitle": "สิทธิ์: {name}",
"allowAllDesc": "กุญแจนี้เข้าได้ทุกรุ่น",
"restrictDesc": "คีย์นี้สามารถเข้าถึงโมเดล {selectedCount} จาก {totalModels}",
- "selectedCount": "{count} เลือกแล้ว"
+ "selectedCount": "{count} เลือกแล้ว",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "บันทึกการตรวจสอบ",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "คอมโบ",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "การตั้งค่า",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "หรือลบฟิลด์รหัสผ่านแฮช",
"restartServerWithNewPassword": "รีสตาร์ทเซิร์ฟเวอร์ - จะใช้รหัสผ่านใหม่",
"backToLogin": "กลับไปที่เข้าสู่ระบบ",
- "forgotPassword": "ลืมรหัสผ่าน?"
+ "forgotPassword": "ลืมรหัสผ่าน?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "สำหรับโมเดลตระกูล GitHub Codex ให้เก็บโมเดลเป็น gh/codex-model; เราเตอร์เลือก / ตอบสนองโดยอัตโนมัติ",
"troubleshootingTestConnection": "ใช้แดชบอร์ด > ผู้ให้บริการ > ทดสอบการเชื่อมต่อ ก่อนการทดสอบจาก IDE หรือไคลเอนต์ภายนอก",
"troubleshootingCircuitBreaker": "หากผู้ให้บริการแสดงเซอร์กิตเบรกเกอร์เปิดอยู่ ให้รอคูลดาวน์หรือตรวจสอบหน้าสุขภาพเพื่อดูรายละเอียด",
- "troubleshootingOAuth": "สำหรับผู้ให้บริการ OAuth ให้ตรวจสอบสิทธิ์อีกครั้งหากโทเค็นหมดอายุ ตรวจสอบตัวบ่งชี้สถานะบัตรผู้ให้บริการ"
+ "troubleshootingOAuth": "สำหรับผู้ให้บริการ OAuth ให้ตรวจสอบสิทธิ์อีกครั้งหากโทเค็นหมดอายุ ตรวจสอบตัวบ่งชี้สถานะบัตรผู้ให้บริการ",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "นโยบายความเป็นส่วนตัว",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json
index a52b8b5cd8..ab74d9b816 100644
--- a/src/i18n/messages/uk-UA.json
+++ b/src/i18n/messages/uk-UA.json
@@ -103,7 +103,9 @@
"endpoints": "Кінцеві точки",
"playground": "Playground",
"agents": "Агенти",
- "cliToolsShort": "Інструменти"
+ "cliToolsShort": "Інструменти",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Дозволи: {name}",
"allowAllDesc": "Цей ключ може отримати доступ до всіх доступних моделей.",
"restrictDesc": "Цей ключ має доступ до {selectedCount} з {totalModels} моделей.",
- "selectedCount": "Вибрано {count}"
+ "selectedCount": "Вибрано {count}",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Журнал аудиту",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Комбо",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Налаштування",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "або видаліть поле passwordHash",
"restartServerWithNewPassword": "Перезапустіть сервер - він використовуватиме новий пароль",
"backToLogin": "Назад до входу",
- "forgotPassword": "Забули пароль?"
+ "forgotPassword": "Забули пароль?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Для моделей сімейства GitHub Codex збережіть модель як gh/codex-model; маршрутизатор вибирає /відповідає автоматично.",
"troubleshootingTestConnection": "Перед тестуванням із IDE або зовнішніх клієнтів скористайтеся інструментальною панеллю > Постачальники > Перевірити з’єднання.",
"troubleshootingCircuitBreaker": "Якщо постачальник показує, що автоматичний вимикач розімкнуто, дочекайтеся охолодження або подробиці перевірте на сторінці «Стан».",
- "troubleshootingOAuth": "Для постачальників OAuth повторна автентифікація, якщо термін дії маркерів закінчився. Перевірте індикатор стану картки провайдера."
+ "troubleshootingOAuth": "Для постачальників OAuth повторна автентифікація, якщо термін дії маркерів закінчився. Перевірте індикатор стану картки провайдера.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Політика конфіденційності",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json
index b9dbafcbc3..5951323418 100644
--- a/src/i18n/messages/vi.json
+++ b/src/i18n/messages/vi.json
@@ -103,7 +103,9 @@
"endpoints": "Điểm cuối",
"playground": "Playground",
"agents": "Tác nhân",
- "cliToolsShort": "Công cụ"
+ "cliToolsShort": "Công cụ",
+ "autoCombo": "Auto Combo",
+ "searchTools": "Search Tools"
},
"themesPage": {
"title": "Themes",
@@ -268,7 +270,28 @@
"permissionsTitle": "Quyền: {name}",
"allowAllDesc": "Chìa khóa này có thể truy cập vào tất cả các mô hình có sẵn.",
"restrictDesc": "Khóa này có thể truy cập {selectedCount} trong số {totalModels} mô hình.",
- "selectedCount": "{count} đã chọn"
+ "selectedCount": "{count} đã chọn",
+ "autoResolve": "Auto-Resolve",
+ "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
+ "keyActive": "Key Active",
+ "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
+ "accessSchedule": "Access Schedule",
+ "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
+ "scheduleFrom": "From",
+ "scheduleUntil": "Until",
+ "scheduleDays": "Days",
+ "scheduleTimezone": "Timezone",
+ "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
+ "scheduleActive": "Schedule",
+ "disabled": "Disabled",
+ "daySun": "Sun",
+ "dayMon": "Mon",
+ "dayTue": "Tue",
+ "dayWed": "Wed",
+ "dayThu": "Thu",
+ "dayFri": "Fri",
+ "daySat": "Sat",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "Nhật ký kiểm tra",
@@ -548,7 +571,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "Combo",
@@ -864,7 +892,12 @@
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
+ "categorySearch": "Search & Discovery",
+ "webSearch": "Web Search",
+ "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
+ "searchProvider": "Search Provider",
+ "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1396,7 +1429,24 @@
"chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
"modelsPathLabel": "Models Endpoint Path",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Custom models path for validation (e.g. /v4/models)",
+ "builtInModels": "Built-in models",
+ "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
+ "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
+ "compatAdjustmentsTitle": "Compatibility",
+ "compatButtonLabel": "Compatibility",
+ "compatToolIdShort": "Tool ID 9",
+ "compatDeveloperShort": "Developer role",
+ "compatDoNotPreserveDeveloper": "Do not preserve developer role",
+ "compatBadgeNoPreserve": "No preserve",
+ "compatProtocolLabel": "Client request protocol",
+ "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "compatProtocolOpenAI": "OpenAI Chat Completions",
+ "compatProtocolOpenAIResponses": "OpenAI Responses API",
+ "compatProtocolClaude": "Anthropic Messages",
+ "tokenRefreshed": "Token refreshed successfully",
+ "tokenRefreshFailed": "Token refresh failed"
},
"settings": {
"title": "Cài đặt",
@@ -2216,7 +2266,8 @@
"orRemovePasswordHashField": "hoặc xóa trường mật khẩuHash",
"restartServerWithNewPassword": "Khởi động lại máy chủ - nó sẽ sử dụng mật khẩu mới",
"backToLogin": "Quay lại đăng nhập",
- "forgotPassword": "Quên mật khẩu?"
+ "forgotPassword": "Quên mật khẩu?",
+ "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
},
"landing": {
"brandName": "OmniRoute",
@@ -2414,7 +2465,16 @@
"troubleshootingCodexFamily": "Đối với các mô hình dòng GitHub Codex, hãy giữ mô hình là gh/codex-model; bộ định tuyến chọn/phản hồi tự động.",
"troubleshootingTestConnection": "Sử dụng Trang tổng quan > Nhà cung cấp > Kiểm tra kết nối trước khi thử nghiệm từ IDE hoặc ứng dụng khách bên ngoài.",
"troubleshootingCircuitBreaker": "Nếu nhà cung cấp hiển thị cầu dao đang mở, hãy đợi thời gian hồi chiêu hoặc kiểm tra trang Sức khỏe để biết chi tiết.",
- "troubleshootingOAuth": "Đối với nhà cung cấp OAuth, hãy xác thực lại nếu mã thông báo hết hạn. Kiểm tra chỉ báo trạng thái thẻ nhà cung cấp."
+ "troubleshootingOAuth": "Đối với nhà cung cấp OAuth, hãy xác thực lại nếu mã thông báo hết hạn. Kiểm tra chỉ báo trạng thái thẻ nhà cung cấp.",
+ "managementApiReference": "Management API Reference",
+ "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
+ "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
+ "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
+ "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
+ "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
+ "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
},
"legal": {
"privacyPolicy": "Chính sách bảo mật",
@@ -2503,7 +2563,13 @@
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
- "addAgent": "Add Agent"
+ "addAgent": "Add Agent",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "Auto-Combo Engine",
@@ -2527,5 +2593,41 @@
"modePackCostSaver": "Cost Saver",
"modePackQualityFirst": "Quality First",
"modePackOfflineFriendly": "Offline Friendly"
+ },
+ "search": {
+ "searchQuery": "Search Query",
+ "searchResults": "Search Results",
+ "cachedResult": "Cached",
+ "searchCost": "Cost",
+ "searchTools": "Search Tools",
+ "searchToolsDesc": "Advanced search testing with provider comparison",
+ "compareProviders": "Compare Providers",
+ "rerankResults": "Rerank Results",
+ "searchHistory": "Search History",
+ "urlOverlap": "URL Overlap",
+ "noSearchProviders": "No search providers configured. Add providers in Settings.",
+ "noRerankModels": "No rerank model available",
+ "webSearch": "Web Search",
+ "provider": "Provider",
+ "searchType": "Search Type",
+ "maxResults": "Max Results",
+ "filters": "Filters",
+ "country": "Country",
+ "language": "Language",
+ "timeRange": "Time Range",
+ "includeDomains": "Include Domains",
+ "excludeDomains": "Exclude Domains",
+ "safeSearch": "Safe Search",
+ "formatted": "Formatted",
+ "rawJson": "JSON",
+ "cacheMiss": "cache miss",
+ "cacheHit": "cache hit",
+ "latency": "Latency",
+ "cost": "Cost",
+ "results": "Results",
+ "rerank": "Rerank",
+ "rerankModel": "Rerank Model",
+ "positionDelta": "Position Change",
+ "emptyState": "Send a search query to see results"
}
}
diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json
index 41a92ff06e..6218245122 100644
--- a/src/i18n/messages/zh-CN.json
+++ b/src/i18n/messages/zh-CN.json
@@ -290,7 +290,8 @@
"permissionsTitle": "权限:{name}",
"allowAllDesc": "该密钥可访问所有可用模型。",
"restrictDesc": "该密钥可访问 {totalModels} 个模型中的 {selectedCount} 个。",
- "selectedCount": "已选择 {count} 个"
+ "selectedCount": "已选择 {count} 个",
+ "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key"
},
"auditLog": {
"title": "审核日志",
@@ -606,7 +607,12 @@
}
}
}
- }
+ },
+ "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
+ "mitmStep2Prefix": "2. Add",
+ "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "mitmStep3": "3. Open {toolName} and requests will be proxied."
},
"combos": {
"title": "组合",
@@ -2593,7 +2599,13 @@
"binaryName": "可执行文件名",
"versionCommand": "版本命令",
"spawnArgs": "启动参数",
- "addAgent": "添加智能体"
+ "addAgent": "添加智能体",
+ "scanning": "Scanning system for CLI agents...",
+ "opencodeIntegration": "OpenCode Integration",
+ "opencodeDetected": "opencode {version} detected",
+ "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
+ "downloadConfig": "Download {file}",
+ "downloaded": "Downloaded!"
},
"autoCombo": {
"title": "自动组合引擎",