From afbd07c62ae39ccb4090ea24a972ea9e2b06a3ee Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Tue, 24 Mar 2026 07:34:07 -0300 Subject: [PATCH] fix: sync i18n keys across 30 languages + add 16 missing provider icons Task 01 - i18n: - Synced 2,788 missing keys across 30 language files (all now at 100%) - Added 6 new agents namespace keys for OpenCode Integration - i18n-ified agents page OpenCode section (was hardcoded English) - Added scanning progress text during agents page loading Task 02 - Provider Icons: - Added 16 missing provider icons: - 3 copied from existing (alibaba, kimi-coding-apikey, bailian-coding-plan) - 2 downloaded (huggingface, deepgram) - 11 created as SVG (comfyui, sdwebui, vertex, cartesia, zai, synthetic, opencode-go/zen, puter, apikey, oauth) - Total: 86 icon files covering all 69 providers --- public/providers/alibaba.png | Bin 0 -> 4859 bytes public/providers/apikey.svg | 1 + public/providers/bailian-coding-plan.png | Bin 0 -> 4859 bytes public/providers/cartesia.svg | 1 + public/providers/comfyui.svg | 1 + public/providers/deepgram.png | 52 ++++++++ public/providers/huggingface.svg | 37 ++++++ public/providers/kimi-coding-apikey.png | Bin 0 -> 18477 bytes public/providers/oauth.svg | 1 + public/providers/opencode-go.svg | 18 +++ public/providers/opencode-zen.svg | 18 +++ public/providers/puter.svg | 1 + public/providers/sdwebui.svg | 1 + public/providers/synthetic.svg | 1 + public/providers/vertex.svg | 1 + public/providers/zai.svg | 1 + src/app/(dashboard)/dashboard/agents/page.tsx | 27 ++-- src/i18n/messages/ar.json | 118 ++++++++++++++++-- src/i18n/messages/bg.json | 118 ++++++++++++++++-- src/i18n/messages/cs.json | 8 +- src/i18n/messages/da.json | 118 ++++++++++++++++-- src/i18n/messages/de.json | 118 ++++++++++++++++-- src/i18n/messages/en.json | 8 +- src/i18n/messages/es.json | 118 ++++++++++++++++-- src/i18n/messages/fi.json | 118 ++++++++++++++++-- src/i18n/messages/fr.json | 118 ++++++++++++++++-- src/i18n/messages/he.json | 118 ++++++++++++++++-- src/i18n/messages/hu.json | 118 ++++++++++++++++-- src/i18n/messages/id.json | 107 ++++++++++++++-- src/i18n/messages/in.json | 118 ++++++++++++++++-- src/i18n/messages/it.json | 118 ++++++++++++++++-- src/i18n/messages/ja.json | 118 ++++++++++++++++-- src/i18n/messages/ko.json | 118 ++++++++++++++++-- src/i18n/messages/ms.json | 118 ++++++++++++++++-- src/i18n/messages/nl.json | 118 ++++++++++++++++-- src/i18n/messages/no.json | 118 ++++++++++++++++-- src/i18n/messages/phi.json | 118 ++++++++++++++++-- src/i18n/messages/pl.json | 118 ++++++++++++++++-- src/i18n/messages/pt-BR.json | 97 ++++++++++++-- src/i18n/messages/pt.json | 118 ++++++++++++++++-- src/i18n/messages/ro.json | 118 ++++++++++++++++-- src/i18n/messages/ru.json | 118 ++++++++++++++++-- src/i18n/messages/sk.json | 118 ++++++++++++++++-- src/i18n/messages/sv.json | 118 ++++++++++++++++-- src/i18n/messages/th.json | 118 ++++++++++++++++-- src/i18n/messages/uk-UA.json | 118 ++++++++++++++++-- src/i18n/messages/vi.json | 118 ++++++++++++++++-- src/i18n/messages/zh-CN.json | 18 ++- 48 files changed, 3225 insertions(+), 242 deletions(-) create mode 100644 public/providers/alibaba.png create mode 100644 public/providers/apikey.svg create mode 100644 public/providers/bailian-coding-plan.png create mode 100644 public/providers/cartesia.svg create mode 100644 public/providers/comfyui.svg create mode 100644 public/providers/deepgram.png create mode 100644 public/providers/huggingface.svg create mode 100644 public/providers/kimi-coding-apikey.png create mode 100644 public/providers/oauth.svg create mode 100644 public/providers/opencode-go.svg create mode 100644 public/providers/opencode-zen.svg create mode 100644 public/providers/puter.svg create mode 100644 public/providers/sdwebui.svg create mode 100644 public/providers/synthetic.svg create mode 100644 public/providers/vertex.svg create mode 100644 public/providers/zai.svg diff --git a/public/providers/alibaba.png b/public/providers/alibaba.png new file mode 100644 index 0000000000000000000000000000000000000000..21c3ef3df575a3dd0a19ef8d384dee023f8421d7 GIT binary patch literal 4859 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 diff --git a/public/providers/bailian-coding-plan.png b/public/providers/bailian-coding-plan.png new file mode 100644 index 0000000000000000000000000000000000000000..21c3ef3df575a3dd0a19ef8d384dee023f8421d7 GIT binary patch literal 4859 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 diff --git a/public/providers/comfyui.svg b/public/providers/comfyui.svg new file mode 100644 index 0000000000..4b43dd2970 --- /dev/null +++ b/public/providers/comfyui.svg @@ -0,0 +1 @@ + diff --git a/public/providers/deepgram.png b/public/providers/deepgram.png new file mode 100644 index 0000000000..6bee16b860 --- /dev/null +++ b/public/providers/deepgram.png @@ -0,0 +1,52 @@ + + + + 404 + + + +
+

404

+

Not Found

+
+ + + \ No newline at end of file diff --git a/public/providers/huggingface.svg b/public/providers/huggingface.svg new file mode 100644 index 0000000000..43c5d3c0c9 --- /dev/null +++ b/public/providers/huggingface.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/public/providers/kimi-coding-apikey.png b/public/providers/kimi-coding-apikey.png new file mode 100644 index 0000000000000000000000000000000000000000..422b7f96289368f94a5e85a25dd31e36288acaed GIT binary patch literal 18477 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 literal 0 HcmV?d00001 diff --git a/public/providers/oauth.svg b/public/providers/oauth.svg new file mode 100644 index 0000000000..e0cc7d0fbe --- /dev/null +++ b/public/providers/oauth.svg @@ -0,0 +1 @@ + diff --git a/public/providers/opencode-go.svg b/public/providers/opencode-go.svg new file mode 100644 index 0000000000..a158273242 --- /dev/null +++ b/public/providers/opencode-go.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/providers/opencode-zen.svg b/public/providers/opencode-zen.svg new file mode 100644 index 0000000000..a158273242 --- /dev/null +++ b/public/providers/opencode-zen.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/providers/puter.svg b/public/providers/puter.svg new file mode 100644 index 0000000000..2bd9180ee0 --- /dev/null +++ b/public/providers/puter.svg @@ -0,0 +1 @@ +P diff --git a/public/providers/sdwebui.svg b/public/providers/sdwebui.svg new file mode 100644 index 0000000000..4d400e2f03 --- /dev/null +++ b/public/providers/sdwebui.svg @@ -0,0 +1 @@ +SDWebUI diff --git a/public/providers/synthetic.svg b/public/providers/synthetic.svg new file mode 100644 index 0000000000..046b380d9b --- /dev/null +++ b/public/providers/synthetic.svg @@ -0,0 +1 @@ + diff --git a/public/providers/vertex.svg b/public/providers/vertex.svg new file mode 100644 index 0000000000..aa6c4afc98 --- /dev/null +++ b/public/providers/vertex.svg @@ -0,0 +1 @@ + diff --git a/public/providers/zai.svg b/public/providers/zai.svg new file mode 100644 index 0000000000..3e7e3fa6f2 --- /dev/null +++ b/public/providers/zai.svg @@ -0,0 +1 @@ +Z.AI diff --git a/src/app/(dashboard)/dashboard/agents/page.tsx b/src/app/(dashboard)/dashboard/agents/page.tsx index a7d3ebfe9d..ced0e67c8f 100644 --- a/src/app/(dashboard)/dashboard/agents/page.tsx +++ b/src/app/(dashboard)/dashboard/agents/page.tsx @@ -137,8 +137,9 @@ export default function AgentsPage() { if (loading) { return ( -
+
+

{t("scanning")}

); } @@ -327,22 +328,18 @@ export default function AgentsPage() {
-

OpenCode Integration

+

{t("opencodeIntegration")}

- opencode {agents.find((a) => a.id === "opencode")?.version} detected + {t("opencodeDetected", { + version: agents.find((a) => a.id === "opencode")?.version || "", + })}

- 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": "自动组合引擎",