From f8d9873e27bb31471d45e8b593d21f6da0c0de0b Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Tue, 19 May 2026 21:50:02 -0300 Subject: [PATCH] chore(i18n): replace hardcoded UI text with t() calls across dashboard (round 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Continues round 1 (commit 8d34f4c65). Round-2 subagents refactored additional dashboard pages, replacing 77 more hardcoded strings with useTranslations() lookups. Added 79 corresponding keys to en.json across the a2aDashboard, agents, analytics, apiManager, cliTools, common, and settings namespaces. Pages affected: - a2a/page (new useTranslations + 6 keys) - agent-skills/page (new useTranslations + 9 keys) - AutoRoutingAnalyticsTab (new useTranslations + 6 keys) - AppearanceTab (8 → 6 remaining) - OneproxyTab (10 → 0) - ResilienceTab (18 → 0 missing key) - RoutingTab (7 → 0 missing key) - VisionBridgeSettingsTab (new useTranslations + 6 keys) - CopilotToolCard (7 → 0 missing key) - ApiManagerPageClient (13 → 0 missing key) - gamification/admin (new useTranslations + 7 keys) Hardcoded total: 326 → 249. Real missing keys: 0 (the 6 still flagged are false positives in exampleTemplates.tsx where t is passed as a parameter — keys exist at translator.templatePayloads.*). --- src/app/(dashboard)/dashboard/a2a/page.tsx | 14 +-- .../dashboard/agent-skills/page.tsx | 26 +++-- .../analytics/AutoRoutingAnalyticsTab.tsx | 12 +-- .../api-manager/ApiManagerPageClient.tsx | 18 ++-- .../cli-tools/components/CopilotToolCard.tsx | 18 ++-- .../dashboard/gamification/admin/page.tsx | 16 +-- .../settings/components/AppearanceTab.tsx | 8 +- .../settings/components/OneproxyTab.tsx | 28 ++--- .../settings/components/ResilienceTab.tsx | 31 +++--- .../settings/components/RoutingTab.tsx | 14 +-- .../components/VisionBridgeSettingsTab.tsx | 18 ++-- src/i18n/messages/en.json | 100 ++++++++++++++++-- 12 files changed, 206 insertions(+), 97 deletions(-) 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