chore(i18n): finalize round-6 keys for batch/cache/endpoint/usage

Adds the remaining keys produced by parallel agents A4, A6, A8, A9:
- common: batch-related labels (BatchDetailModal, BatchListTab,
  FileDetailModal, FilesListTab, page) + profile/leaderboard
- cache: hit rate, latency, retry, avg chars
- endpoint: token saver, API endpoints, copy URL, cloud/local labels
- usage: noSpend, activeSessions, quotaAlerts, budget timing
- skills: install/marketplace/filter
- proxyRegistry/quotaShare/mcpDashboard: misc labels

Hardcoded total: 60 → 48. Real missing keys: 0 (modePack remaining is a
false positive — combos.modePack exists but the audit can't resolve it
since IntelligentComboPanel receives t as a prop).
This commit is contained in:
diegosouzapw
2026-05-19 23:52:34 -03:00
parent 6e1105e2c2
commit 8a44ed57d7
8 changed files with 30 additions and 16 deletions

View File

@@ -131,7 +131,7 @@ export default function FilesListTab({
<div className="flex flex-wrap gap-3 p-4 rounded-xl bg-[var(--color-surface)] border border-[var(--color-border)]">
<input
type="text"
placeholder="Search by ID or filename…"
placeholder={t("batchFilesListSearchPlaceholder")}
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
className="flex-1 min-w-[200px] px-3 py-2 rounded-lg text-sm bg-[var(--color-bg)] border border-[var(--color-border)] text-[var(--color-text-main)] placeholder:text-[var(--color-text-muted)] focus:outline-2 focus:outline-[var(--color-accent)]"
@@ -151,7 +151,7 @@ export default function FilesListTab({
{/* Table */}
<div className="overflow-x-auto overflow-y-hidden rounded-xl border border-[var(--color-border)]">
<table className="w-full text-sm" role="table" aria-label="Files">
<table className="w-full text-sm" role="table" aria-label={t("batchFilesListFilesTable")}>
<thead>
<tr className="bg-[var(--color-bg-alt)] border-b border-[var(--color-border)]">
<th className="text-left px-4 py-3 font-medium text-[var(--color-text-muted)] uppercase text-xs tracking-wider">

View File

@@ -1,12 +1,14 @@
"use client";
import { useState, useEffect, useCallback, useRef } from "react";
import { useTranslations } from "next-intl";
import BatchListTab from "./BatchListTab";
import { FileRecord } from "@/lib/db/files";
import { BatchRecord } from "@/lib/db/batches";
import { mapBatchApiToRecord, mapFileApiToRecord } from "./batch-utils";
export default function BatchPage() {
const t = useTranslations("common");
const [batches, setBatches] = useState<BatchRecord[]>([]);
const [files, setFiles] = useState<FileRecord[]>([]);
const [batchesTotal, setBatchesTotal] = useState(0);
@@ -174,7 +176,7 @@ export default function BatchPage() {
onRefresh={() => fetchData(false)}
/>
{loadingMore && batchesCount > 0 && (
<div className="text-center text-sm">Loading more</div>
<div className="text-center text-sm">{t("batchPageLoadingMore")}</div>
)}
<div ref={bottomRefBatches} className="h-10" />
</div>

View File

@@ -62,7 +62,7 @@ export default function IdempotencyLayer({
<button
onClick={onRetry}
className="self-start text-sm px-3 py-1 rounded bg-surface/50 hover:bg-surface/80 transition-colors"
aria-label="Retry"
aria-label={t("retry")}
>
Retry
</button>

View File

@@ -336,7 +336,7 @@ export default function ReasoningCacheTab() {
<tr className="border-b border-border/20 text-left text-[11px] uppercase tracking-[0.12em] text-text-muted">
<th className="px-4 py-3">Model</th>
<th className="px-4 py-3">{t("reasoningEntries")}</th>
<th className="px-4 py-3">Avg Chars</th>
<th className="px-4 py-3">{t("reasoningAvgChars")}</th>
<th className="px-4 py-3">{t("reasoningChars")}</th>
</tr>
</thead>

View File

@@ -1335,7 +1335,7 @@ export default function APIPageClient({ machineId }: Readonly<APIPageClientProps
cloud
</span>
<div className="flex-1 min-w-0">
<span className="text-sm font-medium">Cloud OmniRoute</span>
<span className="text-sm font-medium">{t("cloudOmniroute")}</span>
</div>
<span
className={`inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium border shrink-0 ${
@@ -2387,7 +2387,7 @@ function EndpointCard({
<button
onClick={() => void copy(fullUrl, copyId)}
className="shrink-0 flex items-center justify-center size-6 rounded hover:bg-sidebar transition-colors"
title="Copy URL"
title={t("copyUrl")}
>
<span className="material-symbols-outlined text-[12px] text-text-muted">
{copied === copyId ? "check" : "content_copy"}

View File

@@ -849,7 +849,7 @@ export default function ProxyRegistryManager() {
onClose={() => {
if (!bulkSaving) setBulkOpen(false);
}}
title="Bulk Proxy Assignment"
title={t("bulkProxyAssignment")}
maxWidth="lg"
>
<div className="flex flex-col gap-3">

View File

@@ -960,7 +960,7 @@ function BudgetRowExpanded({
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-3 items-end">
<div>
<label className="text-[11px] text-text-muted block mb-1">Reset interval</label>
<label className="text-[11px] text-text-muted block mb-1">{t("resetInterval")}</label>
<select
value={form.resetInterval}
onChange={(e) =>
@@ -974,7 +974,7 @@ function BudgetRowExpanded({
</select>
</div>
<Input
label="Reset time (UTC)"
label={t("resetTimeUtc")}
type="time"
value={form.resetTime}
onChange={(e) => setForm({ ...form, resetTime: e.target.value })}

View File

@@ -702,7 +702,10 @@
"leaderboardLoading": "Loading leaderboard...",
"batchFileDetailCopyId": "Copy ID",
"batchFileDetailClose": "Close",
"batchFileDetailFailedToLoad": "Failed to load file contents"
"batchFileDetailFailedToLoad": "Failed to load file contents",
"batchFilesListSearchPlaceholder": "Search by ID or filename…",
"batchFilesListFilesTable": "Files",
"batchPageLoadingMore": "Loading more…"
},
"sidebar": {
"home": "Home",
@@ -2505,7 +2508,10 @@
"apiEndpointsCatalogUnavailable": "API catalog unavailable",
"apiEndpointsSearchPlaceholder": "Search endpoints...",
"apiEndpointsRequiresAuth": "Requires auth",
"apiEndpointsNoMatch": "No endpoints match your filter"
"apiEndpointsNoMatch": "No endpoints match your filter",
"localServer": "Local Server",
"cloudOmniroute": "Cloud OmniRoute",
"copyUrl": "Copy URL"
},
"endpoints": {
"tabProxy": "Endpoint Proxy",
@@ -2724,7 +2730,8 @@
"q": "Q",
"filterSkillsPlaceholder": "Filter skills by name, description, or tag",
"allModes": "All modes",
"skillsMarketplace": "Skills Marketplace"
"skillsMarketplace": "Skills Marketplace",
"installSkill": "Install Skill"
},
"health": {
"title": "System Health",
@@ -5150,7 +5157,8 @@
"budgetMonthlyDollar": "Monthly $",
"budgetWarnAtPct": "Warn at %",
"quotaAlerts": "Quota alerts",
"quotaTableRefreshing": "⟳ Refreshing..."
"quotaTableRefreshing": "⟳ Refreshing...",
"noSpendLast30Days": "No spend in last 30 days"
},
"modals": {
"waitingAuth": "Waiting for Authorization",
@@ -5914,7 +5922,10 @@
"reasoningNoData": "No reasoning entries cached yet. Entries appear when thinking models use tool calling.",
"cachePerformanceRetry": "Retry",
"cachePerformanceHitRate": "Hit Rate",
"cachePerformanceAvgLatency": "Avg Latency (ms)"
"cachePerformanceAvgLatency": "Avg Latency (ms)",
"cachePerformanceP95Latency": "p95 Latency (ms)",
"retry": "Retry",
"reasoningAvgChars": "Avg Chars"
},
"proxyConfigModal": {
"levelGlobal": "Global",
@@ -6095,7 +6106,8 @@
"bulkImportErrorInvalidPort": "Invalid PORT (must be 1-65535)",
"bulkImportErrorInvalidType": "Invalid TYPE (use http, https, or socks5)",
"bulkImportErrorInvalidStatus": "Invalid STATUS (use active or inactive)",
"clearAssignment": "(clear assignment)"
"clearAssignment": "(clear assignment)",
"bulkProxyAssignment": "Bulk Proxy Assignment"
},
"playground": {
"title": "Model Playground",