diff --git a/src/app/(dashboard)/dashboard/a2a/page.tsx b/src/app/(dashboard)/dashboard/a2a/page.tsx index 89b163f3e7..3190bd99a9 100644 --- a/src/app/(dashboard)/dashboard/a2a/page.tsx +++ b/src/app/(dashboard)/dashboard/a2a/page.tsx @@ -1,6 +1,7 @@ "use client"; import { useState, useEffect, useCallback } from "react"; +import { useTranslations } from "next-intl"; import { Card } from "@/shared/components"; import A2ADashboardPage from "../endpoint/components/A2ADashboard"; @@ -118,6 +119,7 @@ function DisabledPanel() { } export default function A2APage() { + const t = useTranslations("a2aDashboard"); const [a2aStatus, setA2aStatus] = useState({ online: false, loading: true }); const [a2aEnabled, setA2aEnabled] = useState(false); const [a2aToggling, setA2aToggling] = useState(false); @@ -192,19 +194,19 @@ export default function A2APage() { Discover the agent card at /.well-known/agent.json.
  • - Send JSON-RPC to POST /a2a using{" "} - message/send or{" "} - message/stream. + Send JSON-RPC to {t("rpcEndpoint")} using{" "} + {t("rpcMethodSend")} or{" "} + {t("rpcMethodStream")}.
  • - Track and cancel tasks with tasks/get and{" "} - tasks/cancel. + Track and cancel tasks with {t("rpcMethodGet")} and{" "} + {t("rpcMethodCancel")}.
  • void toggleA2a()} diff --git a/src/app/(dashboard)/dashboard/agent-skills/page.tsx b/src/app/(dashboard)/dashboard/agent-skills/page.tsx index 6eeab3f8aa..ece2554e0c 100644 --- a/src/app/(dashboard)/dashboard/agent-skills/page.tsx +++ b/src/app/(dashboard)/dashboard/agent-skills/page.tsx @@ -1,5 +1,6 @@ "use client"; +import { useTranslations } from "next-intl"; import { AGENT_SKILLS, AGENT_SKILLS_REPO_URL, @@ -10,6 +11,7 @@ import { import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard"; function CopyButton({ url }: { url: string }) { + const t = useTranslations("agents"); const { copied, copy } = useCopyToClipboard(); const isCopied = copied === url; @@ -21,17 +23,18 @@ function CopyButton({ url }: { url: string }) { ? "bg-emerald-500/10 text-emerald-700 dark:text-emerald-400" : "bg-bg-subtle text-text-muted hover:text-text-main" }`} - title="Copy raw URL to clipboard" + title={t("copyRawUrlTitle")} > {isCopied ? "check" : "content_copy"} - {isCopied ? "Copied!" : "Copy URL"} + {isCopied ? t("copied") : t("copyUrl")} ); } function SkillRow({ skill }: { skill: AgentSkill }) { + const t = useTranslations("agents"); const rawUrl = getAgentSkillRawUrl(skill.id); const blobUrl = getAgentSkillBlobUrl(skill.id); @@ -46,12 +49,12 @@ function SkillRow({ skill }: { skill: AgentSkill }) { {skill.name} {skill.isEntry && ( - Start Here + {t("startHere")} )} {skill.isNew && ( - New + {t("badgeNew")} )} {skill.endpoint && ( @@ -69,7 +72,7 @@ function SkillRow({ skill }: { skill: AgentSkill }) { target="_blank" rel="noopener noreferrer" className="flex items-center gap-1 rounded px-2 py-1 text-xs font-medium text-text-muted transition-colors hover:bg-bg-subtle hover:text-text-main" - title="View on GitHub" + title={t("viewOnGithub")} > open_in_new @@ -109,6 +112,7 @@ function SkillSection({ } export default function AgentSkillsPage() { + const t = useTranslations("agents"); const apiSkills = AGENT_SKILLS.filter((s) => s.category === "api"); const cliSkills = AGENT_SKILLS.filter((s) => s.category === "cli"); @@ -118,12 +122,12 @@ export default function AgentSkillsPage() {
    info - How to use + {t("howToUse")}
    1. - 1. Click Copy URL on the skill you want your - agent to know about. + 1. Click {t("copyUrl")} on the skill you + want your agent to know about.
    2. 2. In your AI agent (Claude, Cursor, Cline…), say: @@ -144,20 +148,20 @@ export default function AgentSkillsPage() { className="mt-3 inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline" > open_in_new - Browse all skills on GitHub + {t("browseAllSkillsOnGithub")}
    {/* Two-column grid: API Skills | CLI Skills */}
    auto_awesome
    -

    Total Auto Requests

    +

    {t("autoRoutingTotalAutoRequests")}

    {stats.totalRequests.toLocaleString()}

    @@ -71,7 +71,7 @@ export default function AutoRoutingAnalyticsTab() { target
    -

    Avg Selection Score

    +

    {t("autoRoutingAvgSelectionScore")}

    {(stats.avgSelectionScore * 100).toFixed(1)}%

    @@ -83,7 +83,7 @@ export default function AutoRoutingAnalyticsTab() { explore
    -

    Exploration Rate

    +

    {t("autoRoutingExplorationRate")}

    {(stats.explorationRate * 100).toFixed(1)}%

    @@ -95,7 +95,7 @@ export default function AutoRoutingAnalyticsTab() { history
    -

    LKGP Hit Rate

    +

    {t("autoRoutingLkgpHitRate")}

    {(stats.lkgpHitRate * 100).toFixed(1)}%

    @@ -104,7 +104,7 @@ export default function AutoRoutingAnalyticsTab() { {/* Variant Breakdown */} -

    Requests by Variant

    +

    {t("autoRoutingRequestsByVariant")}

    {Object.entries(stats.variantBreakdown).map(([variant, count]) => { const percentage = stats.totalRequests > 0 ? (count / stats.totalRequests) * 100 : 0; @@ -128,7 +128,7 @@ export default function AutoRoutingAnalyticsTab() { {/* Top Providers */} -

    Top Routed Providers

    +

    {t("autoRoutingTopRoutedProviders")}

    diff --git a/src/app/(dashboard)/dashboard/api-manager/ApiManagerPageClient.tsx b/src/app/(dashboard)/dashboard/api-manager/ApiManagerPageClient.tsx index 6227c3ad9a..280991bbc8 100644 --- a/src/app/(dashboard)/dashboard/api-manager/ApiManagerPageClient.tsx +++ b/src/app/(dashboard)/dashboard/api-manager/ApiManagerPageClient.tsx @@ -1302,10 +1302,10 @@ const PermissionsModal = memo(function PermissionsModal({
    -

    Custom Rate Limits

    -

    - Override global default limits. Leave empty to use defaults. +

    + {t("apiManagerCustomRateLimits")}

    +

    {t("apiManagerCustomRateLimitsDesc")}

    @@ -1454,7 +1456,7 @@ const PermissionsModal = memo(function PermissionsModal({ type="text" value={scheduleTz} onChange={(e) => setScheduleTz(e.target.value)} - placeholder="America/Sao_Paulo" + placeholder={t("apiManagerTimezonePlaceholder")} className="w-full px-2 py-1.5 text-sm border border-border rounded-md bg-background text-text-main font-mono" />

    {t("scheduleTimezoneHint")}

    diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.tsx index a79ed8cff4..605537a188 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.tsx @@ -193,7 +193,7 @@ export default function CopilotToolCard({
    info
    -

    GitHub Copilot Config Generator

    +

    {t("copilotConfigGenerator")}

    Generates the{" "} @@ -226,7 +226,7 @@ export default function CopilotToolCard({ > 1

    - API Key + {t("copilotApiKey")}
    - + setToolCalling(e.target.checked)} className="rounded border-border accent-[#1F6FEB]" /> - Tool Calling + {t("copilotToolCalling")}
    - - - + + + diff --git a/src/app/(dashboard)/dashboard/settings/components/AppearanceTab.tsx b/src/app/(dashboard)/dashboard/settings/components/AppearanceTab.tsx index 73a78060b6..2b38ddbf79 100644 --- a/src/app/(dashboard)/dashboard/settings/components/AppearanceTab.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/AppearanceTab.tsx @@ -492,7 +492,7 @@ export default function AppearanceTab() { {(settings.customLogoUrl || settings.customLogoBase64) && ( Logo preview { e.currentTarget.style.display = "none"; @@ -562,7 +562,7 @@ export default function AppearanceTab() {

    {t("logoPreview")}

    Logo preview @@ -586,7 +586,7 @@ export default function AppearanceTab() { {(settings.customFaviconUrl || settings.customFaviconBase64) && ( Favicon preview { e.currentTarget.style.display = "none"; @@ -658,7 +658,7 @@ export default function AppearanceTab() {

    {t("faviconPreview")}

    Favicon preview diff --git a/src/app/(dashboard)/dashboard/settings/components/OneproxyTab.tsx b/src/app/(dashboard)/dashboard/settings/components/OneproxyTab.tsx index c313af7dbf..5ae3a7b8dc 100644 --- a/src/app/(dashboard)/dashboard/settings/components/OneproxyTab.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/OneproxyTab.tsx @@ -187,9 +187,11 @@ export default function OneproxyTab() {
    - {status?.lastSyncAt ? new Date(status.lastSyncAt).toLocaleTimeString() : "Never"} + {status?.lastSyncAt + ? new Date(status.lastSyncAt).toLocaleTimeString() + : t("oneproxyNever")}
    -
    Last Sync
    +
    {t("oneproxyLastSync")}
    )} @@ -201,7 +203,7 @@ export default function OneproxyTab() { onChange={(e) => setFilterProtocol(e.target.value)} className="px-3 py-2 rounded-lg bg-black/5 dark:bg-white/5 text-text-main text-sm border border-border" > - + @@ -209,14 +211,14 @@ export default function OneproxyTab() { setFilterCountry(e.target.value)} className="px-3 py-2 rounded-lg bg-black/5 dark:bg-white/5 text-text-main text-sm border border-border w-40" /> setMinQuality(e.target.value)} className="px-3 py-2 rounded-lg bg-black/5 dark:bg-white/5 text-text-main text-sm border border-border w-32" @@ -226,7 +228,7 @@ export default function OneproxyTab() { {loading ? ( -
    Loading proxies...
    +
    {t("oneproxyLoadingProxies")}
    ) : proxies.length === 0 ? (
    No 1proxy proxies found. Click "Sync Now" to fetch free proxies. @@ -300,25 +302,27 @@ export default function OneproxyTab() { {status && ( -

    Sync Status

    +

    + {t("oneproxySyncStatusTitle")} +

    - Last sync: + {t("oneproxyLastSyncLabel")} - {status.lastSyncSuccess ? "Success" : "Failed"} + {status.lastSyncSuccess ? t("oneproxySuccess") : t("oneproxyFailed")}
    - Proxies fetched: + {t("oneproxyProxiesFetched")} {status.lastSyncCount}
    - Consecutive failures: + {t("oneproxyConsecutiveFailures")} {status.consecutiveFailures}
    {status.lastSyncError && (
    - Error: + {t("oneproxyErrorLabel")} {status.lastSyncError}
    )} diff --git a/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx b/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx index ab9434e51e..4223600f5a 100644 --- a/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx @@ -416,7 +416,7 @@ function ConnectionCooldownCard({

    @@ -427,27 +427,27 @@ function ConnectionCooldownCard({ ) : ( <>
    - Base cooldown + {t("resilienceBaseCooldownLabel")} {formatMs(current.baseCooldownMs)}
    - Use upstream retry hints + {t("resilienceUseUpstreamRetryHintsLabel")} - {current.useUpstreamRetryHints ? "Yes" : "No"} + {current.useUpstreamRetryHints ? t("resilienceYes") : t("resilienceNo")}
    - Use upstream 429 hints (breaker) + {t("resilienceUseUpstream429BreakerLabel")} {current.useUpstream429BreakerHints === true - ? "Yes" + ? t("resilienceYes") : current.useUpstream429BreakerHints === false - ? "No" - : "Default"} + ? t("resilienceNo") + : t("resilienceDefault")}
    - Max backoff steps + {t("resilienceMaxBackoffStepsLabel")} {current.maxBackoffSteps}
    @@ -462,7 +462,7 @@ function ConnectionCooldownCard({
    timer_off -

    Connection Cooldown

    +

    {t("resilienceConnectionCooldownTitle")}

    Promise; saving: boolean; }) { + const t = useTranslations("settings"); const [editing, setEditing] = useState(false); const [draft, setDraft] = useState(value); @@ -540,7 +541,7 @@ function ProviderBreakerCard({ {editing ? ( <> @@ -548,7 +549,7 @@ function ProviderBreakerCard({ } />
    - Failure threshold + {t("resilienceFailureThresholdLabel")} {current.failureThreshold}
    - Reset timeout + {t("resilienceResetTimeoutLabel")} {formatMs(current.resetTimeoutMs)}
    @@ -581,7 +582,7 @@ function ProviderBreakerCard({ electrical_services -

    Circuit Breaker per Provider

    +

    {t("resilienceProviderBreakerTitle")}

    -

    Antigravity Signature Cache Mode

    +

    {t("routingAntigravitySignatureTitle")}

    Control whether OmniRoute reuses only stored Gemini thought signatures or accepts validated client-provided signatures in Antigravity-compatible tool-call flows. @@ -1070,7 +1070,7 @@ export default function RoutingTab() {

    -

    Header fingerprint (per provider)

    +

    {t("routingHeaderFingerprintTitle")}

    {t("cliFingerprintEnabled", { count: cliCompatProviderSet.size })}

    @@ -1230,7 +1230,7 @@ export default function RoutingTab() { role="alert" className="mb-3 rounded border border-red-500/40 bg-red-500/10 p-2 text-xs text-red-300" > - ⚠ Server rejected save:{" "} + {t("routingServerRejectedSave")}{" "} {providerSaveErrors[providerId]}

    Your local edits are kept. Fix the field above and the next change will @@ -1301,7 +1301,7 @@ export default function RoutingTab() { {/* Add op row */}

    updateSetting({ visionBridgeModel: settings.visionBridgeModel.trim() })} className="w-full rounded-lg border border-border bg-surface px-3 py-2 text-sm" - placeholder="openai/gpt-4o-mini" + placeholder={t("visionBridgeModelPlaceholder")} />

    Any OmniRoute model ID that supports vision can be used here. @@ -105,7 +107,7 @@ export default function VisionBridgeSettingsTab() {

    - +
    API KeyXP (1h)Z-Score{t("apiKey")}{t("xpLastHour")}{t("zScore")} Status