mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-04 06:12:10 +03:00
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:
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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 })}
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user