From ae1a0f411b7f2e96c81faae7a018d90659c597a2 Mon Sep 17 00:00:00 2001 From: oyi77 Date: Tue, 31 Mar 2026 00:53:18 +0700 Subject: [PATCH 1/3] feat(cache): fix cache page to display prompt cache metrics and trend data Closes #813 --- src/app/(dashboard)/dashboard/cache/page.tsx | 195 ++++++++++++++++++- src/app/api/cache/route.ts | 24 +-- src/i18n/messages/en.json | 15 +- src/lib/db/settings.ts | 59 +++++- 4 files changed, 270 insertions(+), 23 deletions(-) diff --git a/src/app/(dashboard)/dashboard/cache/page.tsx b/src/app/(dashboard)/dashboard/cache/page.tsx index eaa51e4ad6..34007450e2 100644 --- a/src/app/(dashboard)/dashboard/cache/page.tsx +++ b/src/app/(dashboard)/dashboard/cache/page.tsx @@ -16,13 +16,44 @@ interface SemanticCacheStats { tokensSaved: number; } +interface PromptCacheProviderStats { + requests: number; + inputTokens: number; + cachedTokens: number; + cacheCreationTokens: number; +} + +interface PromptCacheMetrics { + totalRequests: number; + requestsWithCacheControl: number; + totalInputTokens: number; + totalCachedTokens: number; + totalCacheCreationTokens: number; + tokensSaved: number; + estimatedCostSaved: number; + byProvider: Record; + byStrategy: Record; + lastUpdated: string; +} + interface IdempotencyStats { activeKeys: number; windowMs: number; } +interface CacheTrendPoint { + timestamp: string; + requests: number; + cachedRequests: number; + inputTokens: number; + cachedTokens: number; + cacheCreationTokens: number; +} + interface CacheStats { semanticCache: SemanticCacheStats; + promptCache: PromptCacheMetrics | null; + trend: CacheTrendPoint[]; idempotency: IdempotencyStats; } @@ -136,27 +167,32 @@ export default function CachePage() { const res = await fetch("/api/cache", { method: "DELETE" }); if (res.ok) { const data = await res.json(); - notify.add({ - type: "success", - message: t("clearSuccess", { count: data.expiredRemoved ?? 0 }), - }); + notify.success(t("clearSuccess", { count: data.expiredRemoved ?? 0 })); await fetchStats(); } else { - notify.add({ type: "error", message: t("clearError") }); + notify.error(t("clearError")); } } catch (error) { console.error("[CachePage] Failed to clear cache:", error); - notify.add({ type: "error", message: t("clearError") }); + notify.error(t("clearError")); } finally { setClearing(false); } }; const sc = stats?.semanticCache; + const pc = stats?.promptCache; + const trend = stats?.trend ?? []; const idp = stats?.idempotency; const hitRate = sc ? parseFloat(sc.hitRate) : 0; const totalRequests = sc ? sc.hits + sc.misses : 0; + const promptCacheHitRate = + pc && pc.totalRequests > 0 ? (pc.requestsWithCacheControl / pc.totalRequests) * 100 : 0; + const providerEntries = pc ? Object.entries(pc.byProvider) : []; + + const maxTrendRequests = Math.max(1, ...trend.map((p) => p.requests)); + return (
{/* Header */} @@ -278,6 +314,153 @@ export default function CachePage() {
+ {/* Prompt Cache Stats */} + {pc && ( + +
+
+ +

{t("promptCache")}

+
+ +
+
+
+ {pc.requestsWithCacheControl.toLocaleString()} +
+
{t("cachedRequests")}
+
+
+
+ {promptCacheHitRate.toFixed(1)}% +
+
{t("cacheHitRate")}
+
+
+
+ {pc.totalCachedTokens.toLocaleString()} +
+
{t("cachedTokens")}
+
+
+
+ {pc.totalCacheCreationTokens.toLocaleString()} +
+
{t("cacheCreationTokens")}
+
+
+ + {providerEntries.length > 0 && ( +
+

{t("byProvider")}

+
+ + + + + + + + + + + + {providerEntries.map(([provider, data]) => ( + + + + + + + + ))} + +
{t("provider")}{t("requests")}{t("inputTokens")}{t("cachedTokensCol")}{t("cacheCreation")}
{provider} + {data.requests.toLocaleString()} + + {data.inputTokens.toLocaleString()} + + {data.cachedTokens.toLocaleString()} + + {data.cacheCreationTokens.toLocaleString()} +
+
+
+ )} +
+
+ )} + + {/* Cache Trend (24h) */} + {trend.length > 0 && ( + +
+
+ +

{t("trend24h")}

+
+
+ {trend.map((point) => { + const height = Math.max(4, (point.requests / maxTrendRequests) * 100); + const cachedHeight = + point.requests > 0 + ? Math.max(2, (point.cachedRequests / point.requests) * height) + : 0; + const hour = new Date(point.timestamp).toLocaleTimeString([], { + hour: "2-digit", + minute: "2-digit", + hour12: false, + }); + return ( +
+
+ {hour}: {point.requests} {t("requests").toLowerCase()},{" "} + {point.cachedRequests} {t("cached").toLowerCase()} +
+
+
+
+
+ + {hour.split(":")[0]} + +
+ ); + })} +
+
+
+
+ {t("total")} +
+
+
+ {t("cached")} +
+
+
+ + )} + {/* Cache behavior */}
diff --git a/src/app/api/cache/route.ts b/src/app/api/cache/route.ts index ebb02dc2f4..d1bca53891 100644 --- a/src/app/api/cache/route.ts +++ b/src/app/api/cache/route.ts @@ -8,21 +8,26 @@ import { invalidateStale, } from "@/lib/semanticCache"; import { getIdempotencyStats } from "@/lib/idempotencyLayer"; +import { getCacheMetrics, getCacheTrend } from "@/lib/db/settings"; function errorMessage(error: unknown): string { return error instanceof Error ? error.message : String(error); } -/** - * GET /api/cache — Cache statistics - */ -export async function GET() { +export async function GET(req: NextRequest) { try { + const { searchParams } = new URL(req.url); + const trendHours = parseInt(searchParams.get("trendHours") || "24", 10); + const cacheStats = getCacheStats(); const idempotencyStats = getIdempotencyStats(); + const promptCacheMetrics = await getCacheMetrics(); + const trend = await getCacheTrend(trendHours); return NextResponse.json({ semanticCache: cacheStats, + promptCache: promptCacheMetrics, + trend, idempotency: idempotencyStats, }); } catch (error) { @@ -30,17 +35,6 @@ export async function GET() { } } -/** - * DELETE /api/cache — Clear all caches or targeted invalidation. - * - * Exactly one optional query parameter may be provided: - * ?model= — invalidate all entries for a specific model - * ?signature= — invalidate a single entry by its SHA-256 signature - * ?staleMs= — invalidate entries older than N milliseconds - * (no params) — clear all cache entries - * - * Providing more than one parameter returns 400 Bad Request. - */ export async function DELETE(req: NextRequest) { try { const { searchParams } = new URL(req.url); diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 3b1dc587c8..abca0616d0 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -2916,6 +2916,19 @@ "clearSuccess": "Cache cleared. {count} expired entries removed.", "clearError": "Failed to clear cache.", "unavailable": "Cache unavailable", - "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running." + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached" } } diff --git a/src/lib/db/settings.ts b/src/lib/db/settings.ts index 00224a353a..333d71379f 100644 --- a/src/lib/db/settings.ts +++ b/src/lib/db/settings.ts @@ -577,9 +577,14 @@ export async function getCacheMetrics() { cacheCreationTokens: number | null; }>; - // Calculate tokens saved (cached tokens are reused, not charged at full price) const tokensSaved = totalsRow?.totalCachedTokens || 0; + const AVG_INPUT_PRICE_PER_MILLION = 3; + const CACHE_DISCOUNT = 0.9; + const estimatedCostSaved = + Math.round((tokensSaved / 1_000_000) * AVG_INPUT_PRICE_PER_MILLION * CACHE_DISCOUNT * 100) / + 100; + // Build byProvider object const byProvider: Record< string, @@ -653,6 +658,58 @@ export async function updateCacheMetrics(_metrics: Record) { return getCacheMetrics(); } +export interface CacheTrendPoint { + timestamp: string; + requests: number; + cachedRequests: number; + inputTokens: number; + cachedTokens: number; + cacheCreationTokens: number; +} + +export async function getCacheTrend(hours = 24): Promise { + const db = getDbInstance(); + + try { + const rows = db + .prepare( + ` + SELECT + strftime('%Y-%m-%dT%H:00:00Z', timestamp) as hour, + COUNT(*) as requests, + SUM(CASE WHEN tokens_cache_read > 0 OR tokens_cache_creation > 0 THEN 1 ELSE 0 END) as cachedRequests, + SUM(tokens_input) as inputTokens, + SUM(tokens_cache_read) as cachedTokens, + SUM(tokens_cache_creation) as cacheCreationTokens + FROM usage_history + WHERE timestamp >= datetime('now', ?) + GROUP BY hour + ORDER BY hour ASC + ` + ) + .all(`-${hours} hours`) as Array<{ + hour: string; + requests: number; + cachedRequests: number; + inputTokens: number | null; + cachedTokens: number | null; + cacheCreationTokens: number | null; + }>; + + return rows.map((r) => ({ + timestamp: r.hour, + requests: r.requests, + cachedRequests: r.cachedRequests, + inputTokens: r.inputTokens || 0, + cachedTokens: r.cachedTokens || 0, + cacheCreationTokens: r.cacheCreationTokens || 0, + })); + } catch (error) { + console.error("Failed to fetch cache trend:", error); + return []; + } +} + export async function resetCacheMetrics() { // No-op: cannot delete historical usage data // Cache metrics are computed from usage_history, so they reflect actual request history From fec585e44bc160d69d0181c5d693297cbb8f4d38 Mon Sep 17 00:00:00 2001 From: oyi77 Date: Tue, 31 Mar 2026 02:41:30 +0700 Subject: [PATCH 2/3] feat(cache): persistent metrics, cache entry browser, settings UI, MCP tools, prefix analyzer Implements remaining features from #813: Phase 1 - Persistent Metrics: - Add cache_metrics table for persistent hit/miss tracking - Semantic cache stats now survive server restarts Phase 2 - Cache Entry Browser: - /api/cache/entries endpoint with search, pagination, delete - CacheEntriesTab component for browsing cached entries Phase 3 - Settings UI: - CacheSettingsTab for semantic/prompt cache configuration - /api/settings/cache-config endpoint Phase 4 - Prefix Analyzer: - src/lib/promptCache/prefixAnalyzer.ts for intelligent caching - Analyzes message arrays to find stable prefixes Phase 5 - Provider Support: - Added deepseek to CACHING_PROVIDERS Phase 6 - MCP Tools: - omniroute_cache_stats tool - omniroute_cache_flush tool Phase 7 - Retention: - cleanOldMetrics() for auto-purge of old entries Closes #813 --- open-sse/mcp-server/schemas/index.ts | 6 + open-sse/mcp-server/schemas/tools.ts | 67 +- open-sse/utils/cacheControlPolicy.ts | 7 +- .../cache/components/CacheEntriesTab.tsx | 174 +++++ src/app/(dashboard)/dashboard/cache/page.tsx | 598 ++++++++++-------- .../settings/components/CacheSettingsTab.tsx | 191 ++++++ .../(dashboard)/dashboard/settings/page.tsx | 2 + src/app/api/cache/entries/route.ts | 95 +++ src/app/api/settings/cache-config/route.ts | 73 +++ src/i18n/messages/en.json | 24 +- src/lib/promptCache/index.ts | 1 + src/lib/promptCache/prefixAnalyzer.ts | 77 +++ src/lib/semanticCache.ts | 85 ++- 13 files changed, 1094 insertions(+), 306 deletions(-) create mode 100644 src/app/(dashboard)/dashboard/cache/components/CacheEntriesTab.tsx create mode 100644 src/app/(dashboard)/dashboard/settings/components/CacheSettingsTab.tsx create mode 100644 src/app/api/cache/entries/route.ts create mode 100644 src/app/api/settings/cache-config/route.ts create mode 100644 src/lib/promptCache/index.ts create mode 100644 src/lib/promptCache/prefixAnalyzer.ts diff --git a/open-sse/mcp-server/schemas/index.ts b/open-sse/mcp-server/schemas/index.ts index 99a947f3ff..ed1a5c9ba6 100644 --- a/open-sse/mcp-server/schemas/index.ts +++ b/open-sse/mcp-server/schemas/index.ts @@ -60,6 +60,12 @@ export { getSessionSnapshotInput, getSessionSnapshotOutput, getSessionSnapshotTool, + cacheStatsInput, + cacheStatsOutput, + cacheStatsTool, + cacheFlushInput, + cacheFlushOutput, + cacheFlushTool, } from "./tools.ts"; // A2A schemas diff --git a/open-sse/mcp-server/schemas/tools.ts b/open-sse/mcp-server/schemas/tools.ts index 1557c0a136..46d03f325a 100644 --- a/open-sse/mcp-server/schemas/tools.ts +++ b/open-sse/mcp-server/schemas/tools.ts @@ -806,11 +806,73 @@ export const syncPricingTool: McpToolDefinition = { + name: "omniroute_cache_stats", + description: + "Returns cache statistics including semantic cache hit rate, prompt cache metrics by provider, and idempotency layer stats.", + inputSchema: cacheStatsInput, + outputSchema: cacheStatsOutput, + scopes: ["read:cache"], + auditLevel: "basic", + phase: 2, + sourceEndpoints: ["/api/cache"], +}; + +export const cacheFlushInput = z.object({ + signature: z.string().optional().describe("Specific cache signature to invalidate"), + model: z.string().optional().describe("Invalidate all entries for a specific model"), +}); + +export const cacheFlushOutput = z.object({ + ok: z.boolean(), + invalidated: z.number().optional(), + scope: z.string().optional(), +}); + +export const cacheFlushTool: McpToolDefinition = { + name: "omniroute_cache_flush", + description: + "Flush cache entries. Provide signature to invalidate a single entry, model to invalidate all entries for a model, or omit both to clear all.", + inputSchema: cacheFlushInput, + outputSchema: cacheFlushOutput, + scopes: ["write:cache"], + auditLevel: "full", + phase: 2, + sourceEndpoints: ["/api/cache"], +}; + // ============ Tool Registry ============ /** All MCP tool definitions, ordered by phase then name */ export const MCP_TOOLS = [ - // Phase 1: Essential getHealthTool, listCombosTool, getComboMetricsTool, @@ -819,7 +881,6 @@ export const MCP_TOOLS = [ routeRequestTool, costReportTool, listModelsCatalogTool, - // Phase 2: Advanced simulateRouteTool, setBudgetGuardTool, setRoutingStrategyTool, @@ -830,6 +891,8 @@ export const MCP_TOOLS = [ explainRouteTool, getSessionSnapshotTool, syncPricingTool, + cacheStatsTool, + cacheFlushTool, ] as const; /** Essential tools only (Phase 1) */ diff --git a/open-sse/utils/cacheControlPolicy.ts b/open-sse/utils/cacheControlPolicy.ts index af501d7495..3f18e2cf6d 100644 --- a/open-sse/utils/cacheControlPolicy.ts +++ b/open-sse/utils/cacheControlPolicy.ts @@ -72,12 +72,7 @@ const DETERMINISTIC_STRATEGIES: Set = new Set(["priority", /** * Providers that support prompt caching */ -const CACHING_PROVIDERS = new Set([ - "claude", - "anthropic", - "zai", - "qwen", // Alibaba Qwen Coding Plan International -]); +const CACHING_PROVIDERS = new Set(["claude", "anthropic", "zai", "qwen", "deepseek"]); /** * Detect if the client is Claude Code or another caching-aware client diff --git a/src/app/(dashboard)/dashboard/cache/components/CacheEntriesTab.tsx b/src/app/(dashboard)/dashboard/cache/components/CacheEntriesTab.tsx new file mode 100644 index 0000000000..66792dcbfa --- /dev/null +++ b/src/app/(dashboard)/dashboard/cache/components/CacheEntriesTab.tsx @@ -0,0 +1,174 @@ +"use client"; + +import { useState, useEffect, useCallback } from "react"; +import { Button } from "@/shared/components"; +import { useTranslations } from "next-intl"; + +interface CacheEntry { + id: string; + signature: string; + model: string; + hit_count: number; + tokens_saved: number; + created_at: string; + expires_at: string; +} + +interface Pagination { + page: number; + limit: number; + total: number; + totalPages: number; +} + +export default function CacheEntriesTab() { + const t = useTranslations("cache"); + const [entries, setEntries] = useState([]); + const [pagination, setPagination] = useState({ + page: 1, + limit: 20, + total: 0, + totalPages: 0, + }); + const [loading, setLoading] = useState(true); + const [search, setSearch] = useState(""); + const [deleting, setDeleting] = useState(null); + + const fetchEntries = useCallback( + async (page = 1) => { + setLoading(true); + try { + const params = new URLSearchParams({ page: String(page), limit: String(pagination.limit) }); + if (search) params.set("search", search); + + const res = await fetch(`/api/cache/entries?${params}`); + if (res.ok) { + const data = await res.json(); + setEntries(data.entries); + setPagination(data.pagination); + } + } catch { + // ignore + } finally { + setLoading(false); + } + }, + [search, pagination.limit] + ); + + useEffect(() => { + fetchEntries(); + }, [fetchEntries]); + + const handleDelete = async (signature: string) => { + setDeleting(signature); + try { + await fetch(`/api/cache/entries?signature=${encodeURIComponent(signature)}`, { + method: "DELETE", + }); + await fetchEntries(pagination.page); + } finally { + setDeleting(null); + } + }; + + const formatDate = (dateStr: string) => { + return new Date(dateStr).toLocaleString(); + }; + + return ( +
+
+ setSearch(e.target.value)} + onKeyDown={(e) => e.key === "Enter" && fetchEntries()} + className="flex-1 px-3 py-2 text-sm rounded-lg border border-border bg-surface text-text-main placeholder:text-text-muted" + /> + +
+ + {loading ? ( +
{t("loading")}
+ ) : entries.length === 0 ? ( +
{t("noEntries")}
+ ) : ( + <> +
+ + + + + + + + + + + + + + {entries.map((entry) => ( + + + + + + + + + + ))} + +
{t("signature")}{t("model")}{t("hits")}{t("tokensSaved")}{t("created")}{t("expires")}{t("actions")}
+ {entry.signature.slice(0, 12)}... + {entry.model}{entry.hit_count} + {entry.tokens_saved.toLocaleString()} + + {formatDate(entry.created_at)} + + {formatDate(entry.expires_at)} + + +
+
+ + {/* Pagination */} + {pagination.totalPages > 1 && ( +
+ + + {pagination.page} / {pagination.totalPages} + + +
+ )} + + )} +
+ ); +} diff --git a/src/app/(dashboard)/dashboard/cache/page.tsx b/src/app/(dashboard)/dashboard/cache/page.tsx index 34007450e2..24064e8403 100644 --- a/src/app/(dashboard)/dashboard/cache/page.tsx +++ b/src/app/(dashboard)/dashboard/cache/page.tsx @@ -4,6 +4,7 @@ import { useState, useEffect, useCallback } from "react"; import { Card, Button, EmptyState } from "@/shared/components"; import { useNotificationStore } from "@/store/notificationStore"; import { useTranslations } from "next-intl"; +import CacheEntriesTab from "./components/CacheEntriesTab"; // ─── Types ─────────────────────────────────────────────────────────────────── @@ -138,6 +139,7 @@ export default function CachePage() { const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [clearing, setClearing] = useState(false); + const [activeTab, setActiveTab] = useState<"overview" | "entries">("overview"); const notify = useNotificationStore(); const fetchStats = useCallback(async () => { @@ -226,296 +228,334 @@ export default function CachePage() {
- {/* Loading skeleton */} - {loading && ( -
+ + +
- {/* Error / empty state */} - {!loading && !stats && ( - void fetchStats()} - /> - )} + {/* Entries tab */} + {activeTab === "entries" && } - {/* Main content */} - {!loading && stats && ( + {/* Overview tab content */} + {activeTab === "overview" && ( <> - {/* Stats grid */} -
- - - - -
- - {/* Hit rate + breakdown */} - -
-
-

{t("performance")}

- - {t("autoRefresh", { seconds: REFRESH_INTERVAL_SECONDS })} - -
- -
-
-
- {sc?.hits ?? 0} -
-
{t("hits")}
-
-
-
- {sc?.misses ?? 0} -
-
{t("misses")}
-
-
-
{totalRequests}
-
{t("total")}
-
-
+ {/* Loading skeleton */} + {loading && ( +
+ {Array.from({ length: 4 }).map((_, i) => ( +
+ ))}
- - - {/* Prompt Cache Stats */} - {pc && ( - -
-
- -

{t("promptCache")}

-
- -
-
-
- {pc.requestsWithCacheControl.toLocaleString()} -
-
{t("cachedRequests")}
-
-
-
- {promptCacheHitRate.toFixed(1)}% -
-
{t("cacheHitRate")}
-
-
-
- {pc.totalCachedTokens.toLocaleString()} -
-
{t("cachedTokens")}
-
-
-
- {pc.totalCacheCreationTokens.toLocaleString()} -
-
{t("cacheCreationTokens")}
-
-
- - {providerEntries.length > 0 && ( -
-

{t("byProvider")}

-
- - - - - - - - - - - - {providerEntries.map(([provider, data]) => ( - - - - - - - - ))} - -
{t("provider")}{t("requests")}{t("inputTokens")}{t("cachedTokensCol")}{t("cacheCreation")}
{provider} - {data.requests.toLocaleString()} - - {data.inputTokens.toLocaleString()} - - {data.cachedTokens.toLocaleString()} - - {data.cacheCreationTokens.toLocaleString()} -
-
-
- )} -
-
)} - {/* Cache Trend (24h) */} - {trend.length > 0 && ( - -
-
- -

{t("trend24h")}

-
-
- {trend.map((point) => { - const height = Math.max(4, (point.requests / maxTrendRequests) * 100); - const cachedHeight = - point.requests > 0 - ? Math.max(2, (point.cachedRequests / point.requests) * height) - : 0; - const hour = new Date(point.timestamp).toLocaleTimeString([], { - hour: "2-digit", - minute: "2-digit", - hour12: false, - }); - return ( -
-
- {hour}: {point.requests} {t("requests").toLowerCase()},{" "} - {point.cachedRequests} {t("cached").toLowerCase()} -
-
-
-
-
- - {hour.split(":")[0]} - + {/* Error / empty state */} + {!loading && !stats && ( + void fetchStats()} + /> + )} + + {/* Main content */} + {!loading && stats && ( + <> + {/* Stats grid */} +
+ + + + +
+ + {/* Hit rate + breakdown */} + +
+
+

{t("performance")}

+ + {t("autoRefresh", { seconds: REFRESH_INTERVAL_SECONDS })} + +
+ +
+
+
+ {sc?.hits ?? 0}
- ); - })} -
-
-
-
- {t("total")} -
-
-
- {t("cached")} +
{t("hits")}
+
+
+
+ {sc?.misses ?? 0} +
+
{t("misses")}
+
+
+
{totalRequests}
+
{t("total")}
+
-
- + + + {/* Prompt Cache Stats */} + {pc && ( + +
+
+ +

{t("promptCache")}

+
+ +
+
+
+ {pc.requestsWithCacheControl.toLocaleString()} +
+
{t("cachedRequests")}
+
+
+
+ {promptCacheHitRate.toFixed(1)}% +
+
{t("cacheHitRate")}
+
+
+
+ {pc.totalCachedTokens.toLocaleString()} +
+
{t("cachedTokens")}
+
+
+
+ {pc.totalCacheCreationTokens.toLocaleString()} +
+
+ {t("cacheCreationTokens")} +
+
+
+ + {providerEntries.length > 0 && ( +
+

+ {t("byProvider")} +

+
+ + + + + + + + + + + + {providerEntries.map(([provider, data]) => ( + + + + + + + + ))} + +
{t("provider")}{t("requests")}{t("inputTokens")}{t("cachedTokensCol")}{t("cacheCreation")}
{provider} + {data.requests.toLocaleString()} + + {data.inputTokens.toLocaleString()} + + {data.cachedTokens.toLocaleString()} + + {data.cacheCreationTokens.toLocaleString()} +
+
+
+ )} +
+
+ )} + + {/* Cache Trend (24h) */} + {trend.length > 0 && ( + +
+
+ +

{t("trend24h")}

+
+
+ {trend.map((point) => { + const height = Math.max(4, (point.requests / maxTrendRequests) * 100); + const cachedHeight = + point.requests > 0 + ? Math.max(2, (point.cachedRequests / point.requests) * height) + : 0; + const hour = new Date(point.timestamp).toLocaleTimeString([], { + hour: "2-digit", + minute: "2-digit", + hour12: false, + }); + return ( +
+
+ {hour}: {point.requests} {t("requests").toLowerCase()},{" "} + {point.cachedRequests} {t("cached").toLowerCase()} +
+
+
+
+
+ + {hour.split(":")[0]} + +
+ ); + })} +
+
+
+
+ {t("total")} +
+
+
+ {t("cached")} +
+
+
+ + )} + + {/* Cache behavior */} + +
+

{t("behavior")}

+
+ {t("behaviorDeterministic")} + + {t.rich("behaviorBypass", { + header: () => ( + + X-OmniRoute-No-Cache: true + + ), + })} + + {t("behaviorTwoTier")} + + {t.rich("behaviorTtl", { + envVar: () => ( + + SEMANTIC_CACHE_TTL_MS + + ), + })} + +
+
+
+ + {/* Idempotency */} + +
+
+ +

{t("idempotency")}

+
+
+
+
+ {idp?.activeKeys ?? 0} +
+
{t("activeDedupKeys")}
+
+
+
+ {idp ? `${(idp.windowMs / 1000).toFixed(0)}s` : "—"} +
+
{t("dedupWindow")}
+
+
+
+
+ )} - - {/* Cache behavior */} - -
-

{t("behavior")}

-
- {t("behaviorDeterministic")} - - {t.rich("behaviorBypass", { - header: () => ( - - X-OmniRoute-No-Cache: true - - ), - })} - - {t("behaviorTwoTier")} - - {t.rich("behaviorTtl", { - envVar: () => ( - - SEMANTIC_CACHE_TTL_MS - - ), - })} - -
-
-
- - {/* Idempotency */} - -
-
- -

{t("idempotency")}

-
-
-
-
{idp?.activeKeys ?? 0}
-
{t("activeDedupKeys")}
-
-
-
- {idp ? `${(idp.windowMs / 1000).toFixed(0)}s` : "—"} -
-
{t("dedupWindow")}
-
-
-
-
)}
diff --git a/src/app/(dashboard)/dashboard/settings/components/CacheSettingsTab.tsx b/src/app/(dashboard)/dashboard/settings/components/CacheSettingsTab.tsx new file mode 100644 index 0000000000..633592a462 --- /dev/null +++ b/src/app/(dashboard)/dashboard/settings/components/CacheSettingsTab.tsx @@ -0,0 +1,191 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { Card, Button } from "@/shared/components"; +import { useTranslations } from "next-intl"; + +interface CacheConfig { + semanticCacheEnabled: boolean; + semanticCacheMaxSize: number; + semanticCacheTTL: number; + promptCacheEnabled: boolean; + promptCacheStrategy: "auto" | "system-only" | "manual"; + alwaysPreserveClientCache: "auto" | "always" | "never"; +} + +export default function CacheSettingsTab() { + const t = useTranslations("settings"); + const [config, setConfig] = useState({ + semanticCacheEnabled: true, + semanticCacheMaxSize: 100, + semanticCacheTTL: 1800000, + promptCacheEnabled: true, + promptCacheStrategy: "auto", + alwaysPreserveClientCache: "auto", + }); + const [saving, setSaving] = useState(false); + const [loading, setLoading] = useState(true); + + useEffect(() => { + fetch("/api/settings/cache-config") + .then((r) => (r.ok ? r.json() : null)) + .then((data) => { + if (data) setConfig(data); + }) + .catch(() => {}) + .finally(() => setLoading(false)); + }, []); + + const handleSave = async () => { + setSaving(true); + try { + await fetch("/api/settings/cache-config", { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(config), + }); + } finally { + setSaving(false); + } + }; + + if (loading) { + return ( + +

{t("loading")}

+
+ ); + } + + return ( + +

+ cached + {t("cacheSettings")} +

+ +
+ {/* Semantic Cache */} +
+

{t("semanticCache")}

+ + + + + + +
+ + {/* Prompt Cache */} +
+

{t("promptCache")}

+ + + + + + +
+ + {/* Save */} +
+ +
+
+
+ ); +} diff --git a/src/app/(dashboard)/dashboard/settings/page.tsx b/src/app/(dashboard)/dashboard/settings/page.tsx index 7aa69f112c..9d0b261022 100644 --- a/src/app/(dashboard)/dashboard/settings/page.tsx +++ b/src/app/(dashboard)/dashboard/settings/page.tsx @@ -18,6 +18,7 @@ import ModelAliasesTab from "./components/ModelAliasesTab"; import BackgroundDegradationTab from "./components/BackgroundDegradationTab"; import CacheStatsCard from "./components/CacheStatsCard"; +import CacheSettingsTab from "./components/CacheSettingsTab"; import ResilienceTab from "./components/ResilienceTab"; const tabs = [ @@ -89,6 +90,7 @@ export default function SettingsPage() { +
)} diff --git a/src/app/api/cache/entries/route.ts b/src/app/api/cache/entries/route.ts new file mode 100644 index 0000000000..26f30b02a9 --- /dev/null +++ b/src/app/api/cache/entries/route.ts @@ -0,0 +1,95 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getDbInstance } from "@/lib/db/core"; + +interface CacheEntry { + id: string; + signature: string; + model: string; + hit_count: number; + tokens_saved: number; + created_at: string; + expires_at: string; +} + +export async function GET(req: NextRequest) { + try { + const { searchParams } = new URL(req.url); + const page = Math.max(1, parseInt(searchParams.get("page") || "1", 10)); + const limit = Math.min(100, Math.max(1, parseInt(searchParams.get("limit") || "20", 10))); + const search = searchParams.get("search") || ""; + const model = searchParams.get("model") || ""; + const sortBy = searchParams.get("sortBy") || "created_at"; + const sortOrder = searchParams.get("sortOrder") || "desc"; + + const db = getDbInstance(); + const offset = (page - 1) * limit; + + const conditions: string[] = []; + const params: unknown[] = []; + + if (search) { + conditions.push("(signature LIKE ? OR model LIKE ?)"); + params.push(`%${search}%`, `%${search}%`); + } + + if (model) { + conditions.push("model = ?"); + params.push(model); + } + + const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : ""; + + const validSortColumns = ["created_at", "expires_at", "hit_count", "tokens_saved", "model"]; + const orderBy = validSortColumns.includes(sortBy) ? sortBy : "created_at"; + const order = sortOrder === "asc" ? "ASC" : "DESC"; + + const countRow = db + .prepare(`SELECT COUNT(*) as total FROM semantic_cache ${whereClause}`) + .get(...params) as { total: number }; + + const entries = db + .prepare( + `SELECT id, signature, model, hit_count, tokens_saved, created_at, expires_at + FROM semantic_cache ${whereClause} + ORDER BY ${orderBy} ${order} + LIMIT ? OFFSET ?` + ) + .all(...params, limit, offset) as CacheEntry[]; + + return NextResponse.json({ + entries, + pagination: { + page, + limit, + total: countRow?.total || 0, + totalPages: Math.ceil((countRow?.total || 0) / limit), + }, + }); + } catch (error) { + return NextResponse.json({ error: String(error) }, { status: 500 }); + } +} + +export async function DELETE(req: NextRequest) { + try { + const { searchParams } = new URL(req.url); + const signature = searchParams.get("signature"); + const model = searchParams.get("model"); + + const db = getDbInstance(); + + if (signature) { + db.prepare("DELETE FROM semantic_cache WHERE signature = ?").run(signature); + return NextResponse.json({ ok: true, deleted: 1 }); + } + + if (model) { + const result = db.prepare("DELETE FROM semantic_cache WHERE model = ?").run(model); + return NextResponse.json({ ok: true, deleted: result.changes }); + } + + return NextResponse.json({ error: "Provide signature or model parameter" }, { status: 400 }); + } catch (error) { + return NextResponse.json({ error: String(error) }, { status: 500 }); + } +} diff --git a/src/app/api/settings/cache-config/route.ts b/src/app/api/settings/cache-config/route.ts new file mode 100644 index 0000000000..a3fecff41f --- /dev/null +++ b/src/app/api/settings/cache-config/route.ts @@ -0,0 +1,73 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getSettings, updateSettings } from "@/lib/localDb"; +import { isAuthenticated } from "@/shared/utils/apiAuth"; + +const CACHE_CONFIG_KEYS = [ + "semanticCacheEnabled", + "semanticCacheMaxSize", + "semanticCacheTTL", + "promptCacheEnabled", + "promptCacheStrategy", + "alwaysPreserveClientCache", +] as const; + +const DEFAULTS = { + semanticCacheEnabled: true, + semanticCacheMaxSize: 100, + semanticCacheTTL: 1800000, + promptCacheEnabled: true, + promptCacheStrategy: "auto", + alwaysPreserveClientCache: "auto", +}; + +export async function GET(request: NextRequest) { + if (!(await isAuthenticated(request))) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } + + try { + const settings = await getSettings(); + const config: Record = {}; + for (const key of CACHE_CONFIG_KEYS) { + config[key] = settings[key] ?? DEFAULTS[key]; + } + return NextResponse.json(config); + } catch (error) { + return NextResponse.json({ error: String(error) }, { status: 500 }); + } +} + +export async function PUT(request: NextRequest) { + if (!(await isAuthenticated(request))) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } + + try { + const body = await request.json(); + const updates: Record = {}; + + if (typeof body.semanticCacheEnabled === "boolean") { + updates.semanticCacheEnabled = body.semanticCacheEnabled; + } + if (typeof body.semanticCacheMaxSize === "number" && body.semanticCacheMaxSize > 0) { + updates.semanticCacheMaxSize = body.semanticCacheMaxSize; + } + if (typeof body.semanticCacheTTL === "number" && body.semanticCacheTTL > 0) { + updates.semanticCacheTTL = body.semanticCacheTTL; + } + if (typeof body.promptCacheEnabled === "boolean") { + updates.promptCacheEnabled = body.promptCacheEnabled; + } + if (["auto", "system-only", "manual"].includes(body.promptCacheStrategy)) { + updates.promptCacheStrategy = body.promptCacheStrategy; + } + if (["auto", "always", "never"].includes(body.alwaysPreserveClientCache)) { + updates.alwaysPreserveClientCache = body.alwaysPreserveClientCache; + } + + await updateSettings(updates); + return NextResponse.json({ ok: true }); + } catch (error) { + return NextResponse.json({ error: String(error) }, { status: 500 }); + } +} diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index abca0616d0..fc484476bb 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -1712,6 +1712,17 @@ "cacheMisses": "Cache Misses", "hitRate": "Hit Rate", "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", "circuitBreaker": "Circuit Breaker", "retryPolicy": "Retry Policy", "maxRetries": "Max Retries", @@ -2929,6 +2940,17 @@ "cachedTokensCol": "Cached", "cacheCreation": "Creation", "trend24h": "Cache Trend (24h)", - "cached": "Cached" + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/lib/promptCache/index.ts b/src/lib/promptCache/index.ts new file mode 100644 index 0000000000..f4ee1fd501 --- /dev/null +++ b/src/lib/promptCache/index.ts @@ -0,0 +1 @@ +export { analyzePrefix, shouldInjectCacheControl } from "./prefixAnalyzer"; diff --git a/src/lib/promptCache/prefixAnalyzer.ts b/src/lib/promptCache/prefixAnalyzer.ts new file mode 100644 index 0000000000..43f622c87f --- /dev/null +++ b/src/lib/promptCache/prefixAnalyzer.ts @@ -0,0 +1,77 @@ +import crypto from "crypto"; + +interface Message { + role: string; + content: string | unknown[]; +} + +interface PrefixAnalysis { + prefixEndIdx: number; + prefixHash: string; + prefixTokens: number; + prefixType: "system_only" | "system_and_tools" | "system_tools_history"; + confidence: number; +} + +function normalizeContent(content: string | unknown[]): string { + if (typeof content === "string") return content; + return JSON.stringify(content); +} + +function estimateTokens(text: string): number { + return Math.ceil(text.length / 4); +} + +export function analyzePrefix(messages: Message[]): PrefixAnalysis { + if (!Array.isArray(messages) || messages.length === 0) { + return { + prefixEndIdx: -1, + prefixHash: "", + prefixTokens: 0, + prefixType: "system_only", + confidence: 0, + }; + } + + let prefixEndIdx = -1; + let prefixType: PrefixAnalysis["prefixType"] = "system_only"; + let confidence = 0.5; + + for (let i = 0; i < messages.length; i++) { + const msg = messages[i]; + const role = msg.role || "user"; + + if (role === "system") { + prefixEndIdx = i; + prefixType = "system_only"; + confidence = 0.9; + } else if (role === "tool" || (role === "assistant" && Array.isArray(msg.content))) { + prefixEndIdx = i; + prefixType = "system_and_tools"; + confidence = 0.8; + } else if (role === "assistant") { + prefixEndIdx = i; + prefixType = "system_tools_history"; + confidence = 0.7; + } else { + break; + } + } + + const prefixMessages = messages.slice(0, prefixEndIdx + 1); + const prefixText = prefixMessages.map((m) => normalizeContent(m.content)).join("\n"); + const prefixHash = crypto.createHash("sha256").update(prefixText).digest("hex"); + const prefixTokens = estimateTokens(prefixText); + + return { + prefixEndIdx, + prefixHash, + prefixTokens, + prefixType, + confidence, + }; +} + +export function shouldInjectCacheControl(analysis: PrefixAnalysis, minTokens = 1024): boolean { + return analysis.prefixTokens >= minTokens && analysis.confidence >= 0.7; +} diff --git a/src/lib/semanticCache.ts b/src/lib/semanticCache.ts index d20e4b560e..369d7a0d68 100644 --- a/src/lib/semanticCache.ts +++ b/src/lib/semanticCache.ts @@ -29,6 +29,45 @@ function toNumber(value: unknown, fallback = 0): number { return fallback; } +function ensureCacheMetricsTable() { + try { + const db = getDbInstance(); + db.prepare( + `CREATE TABLE IF NOT EXISTS cache_metrics ( + key TEXT PRIMARY KEY, + value INTEGER NOT NULL DEFAULT 0, + updated_at TEXT NOT NULL DEFAULT (datetime('now')) + )` + ).run(); + db.prepare( + `INSERT OR IGNORE INTO cache_metrics (key, value) VALUES ('hits', 0), ('misses', 0), ('tokens_saved', 0)` + ).run(); + } catch { + // DB not available + } +} + +function incrementMetric(metric: "hits" | "misses" | "tokens_saved", amount = 1) { + try { + const db = getDbInstance(); + db.prepare( + `UPDATE cache_metrics SET value = value + ?, updated_at = datetime('now') WHERE key = ?` + ).run(amount, metric); + } catch { + // DB not available — fall back to in-memory + } +} + +function getMetricValue(metric: string): number { + try { + const db = getDbInstance(); + const row = db.prepare(`SELECT value FROM cache_metrics WHERE key = ?`).get(metric); + return row ? toNumber(asRecord(row).value, 0) : 0; + } catch { + return 0; + } +} + function getHeaderValue( headers: { get?: (name: string) => string | null } | Record | null | undefined, name: string @@ -51,7 +90,6 @@ function getHeaderValue( // ─── Singleton ───────────────── let memoryCache: LRUCache | null = null; -let stats = { hits: 0, misses: 0, tokensSaved: 0 }; function getMemoryCache() { if (!memoryCache) { @@ -60,6 +98,7 @@ function getMemoryCache() { maxBytes: parseInt(process.env.SEMANTIC_CACHE_MAX_BYTES || String(4 * 1024 * 1024), 10), defaultTTL: parseInt(process.env.SEMANTIC_CACHE_TTL_MS || "1800000", 10), }); + ensureCacheMetricsTable(); } return memoryCache; } @@ -108,8 +147,8 @@ export function getCachedResponse(signature) { // 1. Check memory cache const memResult = getMemoryCache().get(signature); if (memResult) { - stats.hits++; - stats.tokensSaved += memResult.tokensSaved || 0; + incrementMetric("hits"); + incrementMetric("tokens_saved", memResult.tokensSaved || 0); return memResult.response; } @@ -126,7 +165,7 @@ export function getCachedResponse(signature) { const record = asRecord(row); const responsePayload = typeof record.response === "string" ? record.response : null; if (!responsePayload) { - stats.misses++; + incrementMetric("misses"); return null; } const parsed = JSON.parse(responsePayload); @@ -141,15 +180,15 @@ export function getCachedResponse(signature) { signature ); - stats.hits++; - stats.tokensSaved += tokensSaved; + incrementMetric("hits"); + incrementMetric("tokens_saved", tokensSaved); return parsed; } } catch { // DB not available — fail open } - stats.misses++; + incrementMetric("misses"); return null; } @@ -280,6 +319,17 @@ export function stopAutoCleanup(): void { } } +export function cleanOldMetrics(retentionDays = 90): number { + try { + const db = getDbInstance(); + const cutoff = new Date(Date.now() - retentionDays * 86400000).toISOString(); + const result = db.prepare("DELETE FROM semantic_cache WHERE created_at < ?").run(cutoff); + return result.changes || 0; + } catch { + return 0; + } +} + /** * Clear all cache entries. */ @@ -288,17 +338,12 @@ export function clearCache() { try { const db = getDbInstance(); db.prepare("DELETE FROM semantic_cache").run(); + db.prepare("UPDATE cache_metrics SET value = 0").run(); } catch { // DB not available } - stats = { hits: 0, misses: 0, tokensSaved: 0 }; } -// ─── Stats ───────────────── - -/** - * Get cache statistics. - */ export function getCacheStats() { const memStats = getMemoryCache().getStats(); let dbSize = 0; @@ -312,14 +357,18 @@ export function getCacheStats() { // DB not available } - const total = stats.hits + stats.misses; + const hits = getMetricValue("hits"); + const misses = getMetricValue("misses"); + const tokensSaved = getMetricValue("tokens_saved"); + const total = hits + misses; + return { memoryEntries: memStats.size, dbEntries: dbSize, - hits: stats.hits, - misses: stats.misses, - hitRate: total > 0 ? ((stats.hits / total) * 100).toFixed(1) : "0.0", - tokensSaved: stats.tokensSaved, + hits, + misses, + hitRate: total > 0 ? ((hits / total) * 100).toFixed(1) : "0.0", + tokensSaved, }; } From df38b3c62ad95bc8c3375b73e57bf085c2adb6a8 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Mon, 30 Mar 2026 17:29:44 -0300 Subject: [PATCH 3/3] docs(i18n): sync cache metrics translation keys across 30 languages --- src/i18n/messages/ar.json | 78 +++++++++++- src/i18n/messages/bg.json | 78 +++++++++++- src/i18n/messages/cs.json | 78 +++++++++++- src/i18n/messages/da.json | 78 +++++++++++- src/i18n/messages/de.json | 78 +++++++++++- src/i18n/messages/es.json | 78 +++++++++++- src/i18n/messages/fi.json | 78 +++++++++++- src/i18n/messages/fr.json | 78 +++++++++++- src/i18n/messages/he.json | 78 +++++++++++- src/i18n/messages/hi.json | 240 +++++++++++++++++++++++++++++++++-- src/i18n/messages/hu.json | 78 +++++++++++- src/i18n/messages/id.json | 78 +++++++++++- src/i18n/messages/in.json | 78 +++++++++++- src/i18n/messages/it.json | 78 +++++++++++- src/i18n/messages/ja.json | 78 +++++++++++- src/i18n/messages/ko.json | 78 +++++++++++- src/i18n/messages/ms.json | 78 +++++++++++- src/i18n/messages/nl.json | 78 +++++++++++- src/i18n/messages/no.json | 78 +++++++++++- src/i18n/messages/phi.json | 78 +++++++++++- src/i18n/messages/pl.json | 78 +++++++++++- src/i18n/messages/pt-BR.json | 70 +++++++++- src/i18n/messages/pt.json | 78 +++++++++++- src/i18n/messages/ro.json | 78 +++++++++++- src/i18n/messages/ru.json | 78 +++++++++++- src/i18n/messages/sk.json | 78 +++++++++++- src/i18n/messages/sv.json | 78 +++++++++++- src/i18n/messages/th.json | 78 +++++++++++- src/i18n/messages/tr.json | 110 +++++++++++++++- src/i18n/messages/uk-UA.json | 78 +++++++++++- src/i18n/messages/vi.json | 78 +++++++++++- src/i18n/messages/zh-CN.json | 47 ++++++- 32 files changed, 2491 insertions(+), 160 deletions(-) diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index 5bec4ce225..000e9a8d84 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "المواضيع", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "جارٍ تحميل لوحة تحكم MCP...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "فشل في تبديل المزامنة التلقائية", "allModelsAlreadyImported": "جميع النماذج مستوردة بالفعل", "noNewModelsToImport": "لا توجد نماذج جديدة للاستيراد — جميع النماذج موجودة بالفعل في السجل أو قائمة النماذج المخصصة", - "skippingExistingModels": "تخطي {count} نماذج موجودة" + "skippingExistingModels": "تخطي {count} نماذج موجودة", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "الإعدادات", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "إذا اختلف مقدمو الخدمة من حيث الجودة/التكلفة، فابدأ بـ Cost Opt للعمل في الخلفية والأقل استخدامًا للارتداء المتوازن.", "comboDefaultsGuideTitle": "كيفية ضبط إعدادات التحرير والسرد الافتراضية", "comboDefaultsGuideHint1": "اجعل عمليات إعادة المحاولة منخفضة في التدفقات ذات زمن الوصول المنخفض؛ زيادة المهلة فقط لمهام الجيل الطويل.", - "comboDefaultsGuideHint2": "استخدم تجاوزات الموفر عندما يحتاج أحد الموفرين إلى سلوك مهلة/إعادة محاولة مختلف عن الإعدادات الافتراضية العامة." + "comboDefaultsGuideHint2": "استخدم تجاوزات الموفر عندما يحتاج أحد الموفرين إلى سلوك مهلة/إعادة محاولة مختلف عن الإعدادات الافتراضية العامة.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "مترجم", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json index 80c0dc1c6e..22bf465452 100644 --- a/src/i18n/messages/bg.json +++ b/src/i18n/messages/bg.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Теми", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Зареждане на таблото за управление на MCP...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Неуспешно превключване на автоматичното синхронизиране", "allModelsAlreadyImported": "Всички модели вече са импортирани", "noNewModelsToImport": "Няма нови модели за импортиране — всички модели вече са в регистъра или списъка с персонализирани модели", - "skippingExistingModels": "Пропускане на {count} съществуващи модела" + "skippingExistingModels": "Пропускане на {count} съществуващи модела", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Настройки", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Ако доставчиците се различават по отношение на качество/цена, започнете с Cost Opt за фонова работа и Least Used за балансирано износване.", "comboDefaultsGuideTitle": "Как да настроите настройките по подразбиране на комбинацията", "comboDefaultsGuideHint1": "Поддържайте ниски повторни опити в потоци с ниска латентност; увеличете времето за изчакване само за задачи с дълго генериране.", - "comboDefaultsGuideHint2": "Използвайте замени на доставчика, когато един доставчик се нуждае от различно поведение при изчакване/повторен опит от глобалните настройки по подразбиране." + "comboDefaultsGuideHint2": "Използвайте замени на доставчика, когато един доставчик се нуждае от различно поведение при изчакване/повторен опит от глобалните настройки по подразбиране.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Преводач", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json index 1c09e6213f..6bdd0ccda1 100644 --- a/src/i18n/messages/cs.json +++ b/src/i18n/messages/cs.json @@ -187,7 +187,12 @@ "themeCyan": "Azurová", "cliToolsShort": "Nástroje", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Motivy", @@ -1062,7 +1067,26 @@ "a2aQuickStartStep2": "Odešlete požadavky JSON-RPC na `POST /a2a` pomocí `message/send` nebo `message/stream`.", "a2aQuickStartStep3": "Sledujte a ovládejte úkoly pomocí příkazů `tasks/get` a `tasks/cancel`.", "completionsLegacy": "Completions (Zastaralé)", - "completionsLegacyDesc": "Zastaralé OpenAI text completion – akceptuje oba formáty, prompt string i messages array." + "completionsLegacyDesc": "Zastaralé OpenAI text completion – akceptuje oba formáty, prompt string i messages array.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "endpoints": { "tabProxy": "Koncová Proxy", @@ -1648,7 +1672,13 @@ "autoSyncToggleFailed": "Nepodařilo se přepnout automatickou synchronizaci", "allModelsAlreadyImported": "Všechny modely jsou již importovány", "noNewModelsToImport": "Žádné nové modely k importu — všechny modely jsou již v registru nebo v seznamu vlastních modelů", - "skippingExistingModels": "Přeskakování {count} existujících modelů" + "skippingExistingModels": "Přeskakování {count} existujících modelů", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Nastavení", @@ -2057,7 +2087,21 @@ "customPricingNote": "Výchozí ceny pro konkrétní modely můžete přepsat. Vlastní přepsání má přednost před automaticky zjištěnými cenami.", "editPricing": "Upravit ceny", "viewFullDetails": "Zobrazit všechny podrobnosti", - "themeCoral": "Korál" + "themeCoral": "Korál", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Překladatel", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json index fe7df65c10..64bd7f275d 100644 --- a/src/i18n/messages/da.json +++ b/src/i18n/messages/da.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Temaer", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Indlæser MCP-dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Automatisk synkronisering kunne ikke slås til eller fra", "allModelsAlreadyImported": "Alle modeller er allerede importeret", "noNewModelsToImport": "Ingen nye modeller at importere — alle modeller findes allerede i registreret eller brugerdefineret liste", - "skippingExistingModels": "Springer {count} eksisterende modeller over" + "skippingExistingModels": "Springer {count} eksisterende modeller over", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Indstillinger", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Hvis udbydere varierer i kvalitet/omkostninger, start med Cost Opt for baggrundsarbejde og Mindst brugt for balanceret slid.", "comboDefaultsGuideTitle": "Sådan indstiller du combo-standarder", "comboDefaultsGuideHint1": "Hold lave genforsøg i flows med lav latens; øg kun timeout for lange generationsopgaver.", - "comboDefaultsGuideHint2": "Brug udbydertilsidesættelser, når en udbyder har brug for en anden timeout-/genforsøgsadfærd end globale standardindstillinger." + "comboDefaultsGuideHint2": "Brug udbydertilsidesættelser, når en udbyder har brug for en anden timeout-/genforsøgsadfærd end globale standardindstillinger.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Oversætter", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index 5f4c5fe1e4..a6ee8cf8dd 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themen", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "MCP-Dashboard wird geladen...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Auto-Sync umschalten fehlgeschlagen", "allModelsAlreadyImported": "Alle Modelle sind bereits importiert", "noNewModelsToImport": "Keine neuen Modelle zum Importieren — alle Modelle sind bereits in der Registry oder der Liste benutzerdefinierter Modelle", - "skippingExistingModels": "Überspringe {count} vorhandene Modelle" + "skippingExistingModels": "Überspringe {count} vorhandene Modelle", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Einstellungen", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Wenn sich die Qualität/Kosten der Anbieter unterscheiden, beginnen Sie mit „Cost Opt“ für Hintergrundarbeit und „Least Used“ für ausgewogene Abnutzung.", "comboDefaultsGuideTitle": "So optimieren Sie die Combo-Standardeinstellungen", "comboDefaultsGuideHint1": "Halten Sie die Wiederholungsversuche bei Datenflüssen mit geringer Latenz gering. Erhöhen Sie das Timeout nur für Aufgaben mit langer Generierung.", - "comboDefaultsGuideHint2": "Verwenden Sie Anbieterüberschreibungen, wenn ein Anbieter ein anderes Timeout-/Wiederholungsverhalten als die globalen Standardwerte benötigt." + "comboDefaultsGuideHint2": "Verwenden Sie Anbieterüberschreibungen, wenn ein Anbieter ein anderes Timeout-/Wiederholungsverhalten als die globalen Standardwerte benötigt.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Übersetzer", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json index 36af782f17..5d4768467e 100644 --- a/src/i18n/messages/es.json +++ b/src/i18n/messages/es.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Temas", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Cargando el panel de MCP...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Error al alternar sincronización automática", "allModelsAlreadyImported": "Todos los modelos ya están importados", "noNewModelsToImport": "No hay modelos nuevos para importar — todos los modelos ya están en el registro o en la lista de modelos personalizados", - "skippingExistingModels": "Omitiendo {count} modelos existentes" + "skippingExistingModels": "Omitiendo {count} modelos existentes", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Configuración", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Si los proveedores varían en calidad/costo, comience con Opción de costo para trabajo en segundo plano y Menos usado para desgaste equilibrado.", "comboDefaultsGuideTitle": "Cómo ajustar los valores predeterminados del combo", "comboDefaultsGuideHint1": "Mantenga bajos los reintentos en flujos de baja latencia; aumente el tiempo de espera solo para tareas de larga generación.", - "comboDefaultsGuideHint2": "Utilice anulaciones de proveedores cuando un proveedor necesite un comportamiento de tiempo de espera/reintento diferente al de los valores predeterminados globales." + "comboDefaultsGuideHint2": "Utilice anulaciones de proveedores cuando un proveedor necesite un comportamiento de tiempo de espera/reintento diferente al de los valores predeterminados globales.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Traductor", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json index edb20c9994..d1fe5c60da 100644 --- a/src/i18n/messages/fi.json +++ b/src/i18n/messages/fi.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Teemat", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Ladataan MCP-hallintapaneelia...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Automaattisen synkronoinnin vaihtaminen epäonnistui", "allModelsAlreadyImported": "Kaikki mallit on jo tuotu", "noNewModelsToImport": "Ei uusia malleja tuotavaksi — kaikki mallit ovat jo rekisterissä tai mukautetulla mallilistalla", - "skippingExistingModels": "Ohitetaan {count} olemassa olevaa mallia" + "skippingExistingModels": "Ohitetaan {count} olemassa olevaa mallia", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Asetukset", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Jos palveluntarjoajat vaihtelevat laadultaan/kustannuksiltaan, aloita Cost Opt -vaihtoehdolla taustatyössä ja Vähiten käytetyllä tasapainoiseen kulumiseen.", "comboDefaultsGuideTitle": "Kuinka virittää yhdistelmäoletusasetukset", "comboDefaultsGuideHint1": "Pidä uudelleenyritykset alhaisena matalan viiveen virroissa; lisää aikakatkaisua vain pitkiä sukupolvitehtäviä varten.", - "comboDefaultsGuideHint2": "Käytä palveluntarjoajan ohituksia, kun yksi palveluntarjoaja tarvitsee erilaista aikakatkaisu-/uudelleenyritystoimintaa kuin yleiset oletusasetukset." + "comboDefaultsGuideHint2": "Käytä palveluntarjoajan ohituksia, kun yksi palveluntarjoaja tarvitsee erilaista aikakatkaisu-/uudelleenyritystoimintaa kuin yleiset oletusasetukset.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Kääntäjä", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index 55cbd5c782..2269afafe7 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Thèmes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Chargement du tableau de bord MCP...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Échec de l'activation de la synchronisation automatique", "allModelsAlreadyImported": "Tous les modèles sont déjà importés", "noNewModelsToImport": "Aucun nouveau modèle à importer — tous les modèles sont déjà dans le registre ou la liste de modèles personnalisés", - "skippingExistingModels": "Ignorance de {count} modèles existants" + "skippingExistingModels": "Ignorance de {count} modèles existants", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Paramètres", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Si les prestataires varient en termes de qualité/coût, commencez par Opter pour le coût pour le travail de fond et par Moins utilisé pour une usure équilibrée.", "comboDefaultsGuideTitle": "Comment régler les paramètres par défaut du combo", "comboDefaultsGuideHint1": "Maintenez un faible nombre de tentatives dans les flux à faible latence ; augmentez le délai d'attente uniquement pour les tâches de génération longue.", - "comboDefaultsGuideHint2": "Utilisez les remplacements de fournisseur lorsqu'un fournisseur a besoin d'un comportement de délai d'attente/nouvelle tentative différent de celui des valeurs par défaut globales." + "comboDefaultsGuideHint2": "Utilisez les remplacements de fournisseur lorsqu'un fournisseur a besoin d'un comportement de délai d'attente/nouvelle tentative différent de celui des valeurs par défaut globales.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Traducteur", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/he.json b/src/i18n/messages/he.json index 29af3ce63f..70bbbad201 100644 --- a/src/i18n/messages/he.json +++ b/src/i18n/messages/he.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "החלפת הסנכרון האוטומטי נכשלה", "allModelsAlreadyImported": "כל הדגמים כבר מיובאים", "noNewModelsToImport": "אין דגמים חדשים לייבוא — כל הדגמים כבר קיימים ברישום או ברשימת הדגמים המותאמים", - "skippingExistingModels": "מדלג על {count} דגמים קיימים" + "skippingExistingModels": "מדלג על {count} דגמים קיימים", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "הגדרות", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "אם הספקים משתנים באיכות/עלות, התחל עם Cost Opt עבור עבודת רקע והפחות בשימוש עבור בלאי מאוזן.", "comboDefaultsGuideTitle": "כיצד לכוונן ברירות מחדל משולבות", "comboDefaultsGuideHint1": "שמור על ניסיונות חוזרים נמוכים בזרימות עם אחזור נמוך; להגדיל את הזמן הקצוב רק עבור משימות דור ארוך.", - "comboDefaultsGuideHint2": "השתמש בעקיפות ספק כאשר ספק אחד זקוק להתנהגות שונה של זמן קצוב/ניסיון חוזר מאשר ברירות מחדל גלובליות." + "comboDefaultsGuideHint2": "השתמש בעקיפות ספק כאשר ספק אחד זקוק להתנהגות שונה של זמן קצוב/ניסיון חוזר מאשר ברירות מחדל גלובליות.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "מתרגם", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json index 06743d95e2..d07d0dbda7 100644 --- a/src/i18n/messages/hi.json +++ b/src/i18n/messages/hi.json @@ -58,7 +58,85 @@ "free": "निःशुल्क", "skipToContent": "सामग्री पर जाएं", "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", - "maintenanceServerUnreachable": "Server is unreachable. Reconnecting..." + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP" }, "sidebar": { "home": "घर", @@ -109,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -181,7 +264,11 @@ "requestsShort": "{count} अनुरोध", "providerModelsTitle": "{provider} - मॉडल", "copiedModel": "कॉपी किया गया: {model}", - "aliasLabel": "उपनाम" + "aliasLabel": "उपनाम", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." }, "analytics": { "title": "विश्लेषिकी", @@ -539,6 +626,9 @@ "title": "मॉडल कॉन्फ़िगरेशन जोड़ें", "desc": "अपने मॉडल सरणी में निम्नलिखित कॉन्फ़िगरेशन जोड़ें:" } + }, + "notes": { + "0": "Continue uses JSON config file." } }, "opencode": { @@ -557,6 +647,10 @@ "4": { "title": "Select Model" } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." } }, "kiro": { @@ -575,6 +669,9 @@ "4": { "title": "Select Model" } + }, + "notes": { + "0": "Kiro requires Amazon account." } } }, @@ -919,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1484,7 +1600,22 @@ "compatUpstreamRemoveRow": "Remove row", "allModelsAlreadyImported": "सभी मॉडल पहले से ही आयातित हैं", "noNewModelsToImport": "आयात करने के लिए कोई नए मॉडल नहीं — सभी मॉडल पहले से ही रजिस्ट्री या कस्टम मॉडल सूची में हैं", - "skippingExistingModels": "{count} मौजूदा मॉडल छोड़े जा रहे हैं" + "skippingExistingModels": "{count} मौजूदा मॉडल छोड़े जा रहे हैं", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "सेटिंग्स", @@ -1893,7 +2024,21 @@ "routingAdvancedGuideHint2": "यदि प्रदाता गुणवत्ता/लागत में भिन्न हैं, तो पृष्ठभूमि कार्य के लिए कॉस्ट ऑप्ट और संतुलित पहनावे के लिए कम से कम उपयोग से शुरुआत करें।", "comboDefaultsGuideTitle": "कॉम्बो डिफॉल्ट्स को कैसे ट्यून करें", "comboDefaultsGuideHint1": "कम-विलंबता प्रवाह में पुनः प्रयास कम रखें; केवल लंबी पीढ़ी के कार्यों के लिए टाइमआउट बढ़ाएँ।", - "comboDefaultsGuideHint2": "जब एक प्रदाता को वैश्विक डिफ़ॉल्ट की तुलना में अलग टाइमआउट/पुनः प्रयास व्यवहार की आवश्यकता होती है तो प्रदाता ओवरराइड का उपयोग करें।" + "comboDefaultsGuideHint2": "जब एक प्रदाता को वैश्विक डिफ़ॉल्ट की तुलना में अलग टाइमआउट/पुनः प्रयास व्यवहार की आवश्यकता होती है तो प्रदाता ओवरराइड का उपयोग करें।", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "अनुवादक", @@ -2311,7 +2456,15 @@ "restartServerWithNewPassword": "सर्वर को पुनरारंभ करें - यह नए पासवर्ड का उपयोग करेगा", "backToLogin": "लॉगइन पर वापस जाएँ", "forgotPassword": "पासवर्ड भूल गए?", - "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)" + "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "waitingForAuthorization": "Waiting for authorization...", + "waitingForGoogleAuthorization": "Waiting for Google authorization...", + "waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...", + "waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...", + "waitingForIFlowAuthorization": "Waiting for iFlow authorization...", + "exchangingCodeForTokens": "Exchanging code for tokens..." }, "landing": { "brandName": "ओम्निरूट", @@ -2518,7 +2671,9 @@ "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." + "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage)." }, "legal": { "privacyPolicy": "गोपनीयता नीति", @@ -2727,6 +2882,73 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } } } diff --git a/src/i18n/messages/hu.json b/src/i18n/messages/hu.json index fac46c6f8a..b9a554e149 100644 --- a/src/i18n/messages/hu.json +++ b/src/i18n/messages/hu.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Témák", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Failed to toggle auto-sync", "allModelsAlreadyImported": "Minden modell már importálva van", "noNewModelsToImport": "Nincs új modell az importáláshoz — minden modell már a nyilvántartásban vagy az egyéni modellek listájában van", - "skippingExistingModels": "{count} meglévő modell kihagyása" + "skippingExistingModels": "{count} meglévő modell kihagyása", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Beállítások elemre", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Ha a szolgáltatók minősége/költségei eltérőek, kezdje a Cost Opt opcióval a háttérmunkához és a Least Used beállítással a kiegyensúlyozott viselet érdekében.", "comboDefaultsGuideTitle": "A kombinált alapértelmezett beállítások hangolása", "comboDefaultsGuideHint1": "Tartsa alacsonyan az újrapróbálkozásokat az alacsony késleltetésű folyamatokban; csak hosszú generációs feladatok esetén növelje az időtúllépést.", - "comboDefaultsGuideHint2": "Használja a szolgáltató felülbírálását, ha az egyik szolgáltatónak a globális alapértelmezetttől eltérő időtúllépési/újrapróbálkozási viselkedésre van szüksége." + "comboDefaultsGuideHint2": "Használja a szolgáltató felülbírálását, ha az egyik szolgáltatónak a globális alapértelmezetttől eltérő időtúllépési/újrapróbálkozási viselkedésre van szüksége.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Fordító", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/id.json b/src/i18n/messages/id.json index 514fb55920..096cbbe2bd 100644 --- a/src/i18n/messages/id.json +++ b/src/i18n/messages/id.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Gagal mengaktifkan sinkronisasi otomatis", "allModelsAlreadyImported": "Semua model sudah diimpor", "noNewModelsToImport": "Tidak ada model baru untuk diimpor — semua model sudah ada di registri atau daftar model kustom", - "skippingExistingModels": "Melewatkan {count} model yang sudah ada" + "skippingExistingModels": "Melewatkan {count} model yang sudah ada", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Pengaturan", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Jika penyedia memiliki kualitas/biaya yang berbeda-beda, mulailah dengan Cost Opt (Pilihan Biaya) untuk pekerjaan latar belakang dan Paling Sedikit Digunakan untuk pemakaian yang seimbang.", "comboDefaultsGuideTitle": "Cara menyetel default kombo", "comboDefaultsGuideHint1": "Jaga agar percobaan ulang tetap rendah dalam aliran latensi rendah; menambah waktu tunggu hanya untuk tugas-tugas generasi panjang.", - "comboDefaultsGuideHint2": "Gunakan penggantian penyedia ketika satu penyedia memerlukan perilaku batas waktu/coba lagi yang berbeda dari default global." + "comboDefaultsGuideHint2": "Gunakan penggantian penyedia ketika satu penyedia memerlukan perilaku batas waktu/coba lagi yang berbeda dari default global.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Penerjemah", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/in.json b/src/i18n/messages/in.json index 7b6562bdd9..a4f7b773dd 100644 --- a/src/i18n/messages/in.json +++ b/src/i18n/messages/in.json @@ -187,7 +187,12 @@ "themeCyan": "सियान", "cliToolsShort": "उपकरण", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "थीम्स", @@ -1062,7 +1067,26 @@ "a2aQuickStartStep2": "`message/send` या `message/stream` का उपयोग करके JSON-RPC अनुरोधों को `POST /a2a` पर भेजें।", "a2aQuickStartStep3": "`कार्य/प्राप्त करें` और `कार्य/रद्द करें` का उपयोग करके कार्यों को ट्रैक और नियंत्रित करें।", "completionsLegacy": "पूर्णताएँ (विरासत)", - "completionsLegacyDesc": "लीगेसी ओपनएआई टेक्स्ट पूर्णताएँ - शीघ्र स्ट्रिंग और संदेश सरणी प्रारूप दोनों को स्वीकार करती हैं" + "completionsLegacyDesc": "लीगेसी ओपनएआई टेक्स्ट पूर्णताएँ - शीघ्र स्ट्रिंग और संदेश सरणी प्रारूप दोनों को स्वीकार करती हैं", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "endpoints": { "tabProxy": "समापन बिंदु प्रॉक्सी", @@ -1648,7 +1672,13 @@ "modelsPathHint": "सत्यापन के लिए कस्टम मॉडल पथ (जैसे /v4/मॉडल)", "allModelsAlreadyImported": "Semua model sudah diimpor", "noNewModelsToImport": "Tidak ada model baru untuk diimpor — semua model sudah ada di registri atau daftar model kustom", - "skippingExistingModels": "Melewatkan {count} model yang sudah ada" + "skippingExistingModels": "Melewatkan {count} model yang sudah ada", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "सेटिंग्स", @@ -2057,7 +2087,21 @@ "customPricingNote": "आप विशिष्ट मॉडलों के लिए डिफ़ॉल्ट मूल्य निर्धारण को ओवरराइड कर सकते हैं। कस्टम ओवरराइड्स को स्वतः-पता लगाए गए मूल्य-निर्धारण पर प्राथमिकता दी जाती है।", "editPricing": "मूल्य निर्धारण संपादित करें", "viewFullDetails": "पूर्ण विवरण देखें", - "themeCoral": "मूंगा" + "themeCoral": "मूंगा", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "अनुवादक", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index 6289585118..bdda8b1cfd 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Impossibile attivare la sincronizzazione automatica", "allModelsAlreadyImported": "Tutti i modelli sono già importati", "noNewModelsToImport": "Nessun nuovo modello da importare — tutti i modelli sono già nel registro o nell'elenco dei modelli personalizzati", - "skippingExistingModels": "Salto {count} modelli esistenti" + "skippingExistingModels": "Salto {count} modelli esistenti", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Impostazioni", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Se i fornitori variano in termini di qualità/costo, iniziare con Opzione costo per il lavoro in background e Meno utilizzato per un consumo equilibrato.", "comboDefaultsGuideTitle": "Come ottimizzare le impostazioni predefinite della combo", "comboDefaultsGuideHint1": "Mantenere bassi i tentativi nei flussi a bassa latenza; aumentare il timeout solo per attività di generazione prolungata.", - "comboDefaultsGuideHint2": "Utilizzare le sostituzioni del provider quando un provider necessita di un comportamento di timeout/riprova diverso rispetto alle impostazioni predefinite globali." + "comboDefaultsGuideHint2": "Utilizzare le sostituzioni del provider quando un provider necessita di un comportamento di timeout/riprova diverso rispetto alle impostazioni predefinite globali.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Traduttore", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json index c11da06718..182df05c49 100644 --- a/src/i18n/messages/ja.json +++ b/src/i18n/messages/ja.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "自動同期の切り替えに失敗", "allModelsAlreadyImported": "すべてのモデルは既にインポート済みです", "noNewModelsToImport": "インポートする新しいモデルはありません — すべてのモデルは既にレジストリまたはカスタムモデルリストにあります", - "skippingExistingModels": "{count}件の既存モデルをスキップ" + "skippingExistingModels": "{count}件の既存モデルをスキップ", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "設定", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "プロバイダーによって品質/コストが異なる場合は、バックグラウンド作業についてはコスト最適化から開始し、バランスのとれた摩耗については最も使用されないようにします。", "comboDefaultsGuideTitle": "コンボのデフォルトを調整する方法", "comboDefaultsGuideHint1": "低遅延フローでは再試行を低く抑えます。長い世代のタスクの場合にのみタイムアウトを増やします。", - "comboDefaultsGuideHint2": "1 つのプロバイダーがグローバルなデフォルトとは異なるタイムアウト/再試行動作を必要とする場合は、プロバイダー オーバーライドを使用します。" + "comboDefaultsGuideHint2": "1 つのプロバイダーがグローバルなデフォルトとは異なるタイムアウト/再試行動作を必要とする場合は、プロバイダー オーバーライドを使用します。", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "翻訳者", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json index 804ce4b9dc..47be17c9da 100644 --- a/src/i18n/messages/ko.json +++ b/src/i18n/messages/ko.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "자동 동기화 전환 실패", "allModelsAlreadyImported": "모든 모델이 이미 가져왔습니다", "noNewModelsToImport": "가져올 새 모델 없음 — 모든 모델이 이미 레지스트리 또는 사용자 정의 모델 목록에 있습니다", - "skippingExistingModels": "{count}개의 기존 모델 건너뛰기" + "skippingExistingModels": "{count}개의 기존 모델 건너뛰기", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "설정", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "서비스 제공업체의 품질/비용이 다양한 경우 백그라운드 작업에는 비용 선택(Cost Opt)으로 시작하고 균형 잡힌 착용에는 최소 사용(Least Used)으로 시작하세요.", "comboDefaultsGuideTitle": "콤보 기본값을 조정하는 방법", "comboDefaultsGuideHint1": "지연 시간이 짧은 흐름에서는 재시도 횟수를 낮게 유지하세요. 긴 세대 작업에 대해서만 시간 제한을 늘립니다.", - "comboDefaultsGuideHint2": "하나의 공급자가 전역 기본값과 다른 시간 초과/재시도 동작을 필요로 하는 경우 공급자 재정의를 사용합니다." + "comboDefaultsGuideHint2": "하나의 공급자가 전역 기본값과 다른 시간 초과/재시도 동작을 필요로 하는 경우 공급자 재정의를 사용합니다.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "번역기", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json index cc7dedd3da..9effb6ec1a 100644 --- a/src/i18n/messages/ms.json +++ b/src/i18n/messages/ms.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Gagal untuk menogol autosegerak", "allModelsAlreadyImported": "Semua model sudah diimport", "noNewModelsToImport": "Tiada model baru untuk diimport — semua model sudah ada dalam registri atau senarai model tersuai", - "skippingExistingModels": "Melangkau {count} model sedia ada" + "skippingExistingModels": "Melangkau {count} model sedia ada", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "tetapan", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Jika pembekal berbeza dalam kualiti/kos, mulakan dengan Pilihan Kos untuk kerja latar belakang dan Paling Kurang Digunakan untuk pemakaian seimbang.", "comboDefaultsGuideTitle": "Bagaimana untuk menala lalai kombo", "comboDefaultsGuideHint1": "Pastikan percubaan semula rendah dalam aliran kependaman rendah; tambahkan tamat masa hanya untuk tugas generasi panjang.", - "comboDefaultsGuideHint2": "Gunakan penggantian pembekal apabila satu pembekal memerlukan gelagat tamat masa/cuba semula yang berbeza daripada lalai global." + "comboDefaultsGuideHint2": "Gunakan penggantian pembekal apabila satu pembekal memerlukan gelagat tamat masa/cuba semula yang berbeza daripada lalai global.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Penterjemah", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json index 8721cc212c..994c378249 100644 --- a/src/i18n/messages/nl.json +++ b/src/i18n/messages/nl.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Kan automatische synchronisatie niet in- of uitschakelen", "allModelsAlreadyImported": "Alle modellen zijn al geïmporteerd", "noNewModelsToImport": "Geen nieuwe modellen om te importeren — alle modellen staan al in het register of de lijst met aangepaste modellen", - "skippingExistingModels": "{count} bestaande modellen overgeslagen" + "skippingExistingModels": "{count} bestaande modellen overgeslagen", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Instellingen", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Als aanbieders variëren in kwaliteit/kosten, begin dan met Kosten Opt voor achtergrondwerk en Minst Gebruikt voor evenwichtige slijtage.", "comboDefaultsGuideTitle": "Combo-standaardinstellingen afstemmen", "comboDefaultsGuideHint1": "Houd het aantal nieuwe pogingen laag bij stromen met lage latentie; verhoog de time-out alleen voor lange generatietaken.", - "comboDefaultsGuideHint2": "Gebruik provideroverschrijvingen wanneer een provider ander time-out/opnieuw gedrag nodig heeft dan de algemene standaardwaarden." + "comboDefaultsGuideHint2": "Gebruik provideroverschrijvingen wanneer een provider ander time-out/opnieuw gedrag nodig heeft dan de algemene standaardwaarden.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Vertaler", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json index f606d70b0c..e9123c7671 100644 --- a/src/i18n/messages/no.json +++ b/src/i18n/messages/no.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Laster inn MCP-dashbordet ...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Kunne ikke slå på automatisk synkronisering", "allModelsAlreadyImported": "Alle modeller er allerede importert", "noNewModelsToImport": "Ingen nye modeller å importere — alle modeller finnes allerede i registeret eller listen over egendefinerte modeller", - "skippingExistingModels": "Hopper over {count} eksisterende modeller" + "skippingExistingModels": "Hopper over {count} eksisterende modeller", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Innstillinger", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Hvis leverandørene varierer i kvalitet/kostnad, start med Cost Opt for bakgrunnsarbeid og Minst brukt for balansert slitasje.", "comboDefaultsGuideTitle": "Hvordan justere kombinasjonsstandarder", "comboDefaultsGuideHint1": "Hold lave gjenforsøk i flyter med lav latens; øke tidsavbruddet bare for langgenerasjonsoppgaver.", - "comboDefaultsGuideHint2": "Bruk leverandøroverstyringer når en leverandør trenger annen tidsavbrudd/forsøk på nytt enn globale standardinnstillinger." + "comboDefaultsGuideHint2": "Bruk leverandøroverstyringer når en leverandør trenger annen tidsavbrudd/forsøk på nytt enn globale standardinnstillinger.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Oversetter", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json index 7460073fd4..07e017ad44 100644 --- a/src/i18n/messages/phi.json +++ b/src/i18n/messages/phi.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Nilo-load ang MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Nabigong i-toggle ang auto-sync", "allModelsAlreadyImported": "Lahat ng mga modelo ay nai-import na", "noNewModelsToImport": "Walang bagong modelo na i-import — lahat ng mga modelo ay nasa registry o custom na listahan na", - "skippingExistingModels": "Pinapalampas ang {count} na umiiral na mga modelo" + "skippingExistingModels": "Pinapalampas ang {count} na umiiral na mga modelo", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Mga setting", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Kung iba-iba ang kalidad/gastos ng mga provider, magsimula sa Cost Opt para sa background na trabaho at Least Used para sa balanseng pagsusuot.", "comboDefaultsGuideTitle": "Paano i-tune ang mga default ng combo", "comboDefaultsGuideHint1": "Panatilihing mababa ang mga muling pagsubok sa mga daloy na mababa ang latency; taasan ang timeout para lang sa mga gawaing pang-generation.", - "comboDefaultsGuideHint2": "Gumamit ng mga override ng provider kapag ang isang provider ay nangangailangan ng iba't ibang gawi sa pag-timeout/subukang muli kaysa sa mga pandaigdigang default." + "comboDefaultsGuideHint2": "Gumamit ng mga override ng provider kapag ang isang provider ay nangangailangan ng iba't ibang gawi sa pag-timeout/subukang muli kaysa sa mga pandaigdigang default.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Tagasalin", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json index a4b9633cbc..6ad25c3a3f 100644 --- a/src/i18n/messages/pl.json +++ b/src/i18n/messages/pl.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Nie udało się przełączyć automatycznej synchronizacji", "allModelsAlreadyImported": "Wszystkie modele są już zaimportowane", "noNewModelsToImport": "Brak nowych modeli do zaimportowania — wszystkie modele są już w rejestrze lub na liście modeli niestandardowych", - "skippingExistingModels": "Pomijanie {count} istniejących modeli" + "skippingExistingModels": "Pomijanie {count} istniejących modeli", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Ustawienia", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Jeśli dostawcy różnią się jakością/kosztami, zacznij od opcji Koszt w przypadku pracy w tle i opcji Najmniej używane w celu zapewnienia zrównoważonego zużycia.", "comboDefaultsGuideTitle": "Jak dostroić domyślne ustawienia kombinacji", "comboDefaultsGuideHint1": "Utrzymuj niską liczbę ponownych prób w przepływach o małych opóźnieniach; zwiększaj limit czasu tylko dla zadań o długim generowaniu.", - "comboDefaultsGuideHint2": "Użyj zastąpienia dostawcy, gdy jeden z dostawców wymaga innego zachowania związanego z przekroczeniem limitu czasu/ponownej próby niż globalne ustawienia domyślne." + "comboDefaultsGuideHint2": "Użyj zastąpienia dostawcy, gdy jeden z dostawców wymaga innego zachowania związanego z przekroczeniem limitu czasu/ponownej próby niż globalne ustawienia domyślne.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Tłumacz", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index 385ecb4ee5..33466c146f 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -187,7 +187,12 @@ "cliToolsShort": "Ferramentas", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1023,7 +1028,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Carregando painel MCP...", @@ -2012,7 +2036,21 @@ "routingAdvancedGuideHint2": "Se os fornecedores variarem em qualidade/custo, comece com Opção de custo para trabalho em segundo plano e Menos usado para desgaste equilibrado.", "comboDefaultsGuideTitle": "Como ajustar os padrões de combinação", "comboDefaultsGuideHint1": "Mantenha as tentativas baixas em fluxos de baixa latência; aumente o tempo limite apenas para tarefas de geração longa.", - "comboDefaultsGuideHint2": "Use substituições de provedor quando um provedor precisar de um comportamento de tempo limite/nova tentativa diferente dos padrões globais." + "comboDefaultsGuideHint2": "Use substituições de provedor quando um provedor precisar de um comportamento de tempo limite/nova tentativa diferente dos padrões globais.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Tradutor", @@ -2899,6 +2937,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index dc8d3018ec..e54d30ce24 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "endpoints": { "tabProxy": "Endpoint Proxy", @@ -1597,7 +1621,13 @@ "autoSyncToggleFailed": "Falha ao alternar sincronização automática", "allModelsAlreadyImported": "Todos os modelos já foram importados", "noNewModelsToImport": "Nenhum modelo novo para importar — todos os modelos já estão no registo ou na lista de modelos personalizados", - "skippingExistingModels": "A ignorar {count} modelos existentes" + "skippingExistingModels": "A ignorar {count} modelos existentes", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Configurações", @@ -2006,7 +2036,21 @@ "routingAdvancedGuideHint2": "Se os fornecedores variarem em qualidade/custo, comece com Opção de custo para trabalho em segundo plano e Menos usado para desgaste equilibrado.", "comboDefaultsGuideTitle": "Como ajustar os padrões de combinação", "comboDefaultsGuideHint1": "Mantenha as tentativas baixas em fluxos de baixa latência; aumente o tempo limite apenas para tarefas de geração longa.", - "comboDefaultsGuideHint2": "Use substituições de provedor quando um provedor precisar de um comportamento de tempo limite/nova tentativa diferente dos padrões globais." + "comboDefaultsGuideHint2": "Use substituições de provedor quando um provedor precisar de um comportamento de tempo limite/nova tentativa diferente dos padrões globais.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Tradutor", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json index 75dedc3a5e..44efeba128 100644 --- a/src/i18n/messages/ro.json +++ b/src/i18n/messages/ro.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Nu s-a putut comuta sincronizarea automată", "allModelsAlreadyImported": "Toate modelele sunt deja importate", "noNewModelsToImport": "Niciun model nou de importat — toate modelele sunt deja în registru sau în lista de modele personalizate", - "skippingExistingModels": "Se omit {count} modele existente" + "skippingExistingModels": "Se omit {count} modele existente", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Setări", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Dacă furnizorii variază în ceea ce privește calitatea/costul, începeți cu Cost Opt pentru munca de fundal și Least Used pentru uzura echilibrată.", "comboDefaultsGuideTitle": "Cum să reglați setările implicite de combo", "comboDefaultsGuideHint1": "Menține reîncercările scăzute în fluxurile cu latență scăzută; crește timpul de expirare numai pentru sarcini de generație lungă.", - "comboDefaultsGuideHint2": "Folosiți suprascrierile furnizorului atunci când un furnizor are nevoie de un comportament de timeout/reîncercare diferit față de valorile prestabilite globale." + "comboDefaultsGuideHint2": "Folosiți suprascrierile furnizorului atunci când un furnizor are nevoie de un comportament de timeout/reîncercare diferit față de valorile prestabilite globale.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Traducător", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index 1fdf01e352..de1a073e2b 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Темы", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Не удалось переключить автосинхронизацию", "allModelsAlreadyImported": "Все модели уже импортированы", "noNewModelsToImport": "Нет новых моделей для импорта — все модели уже есть в реестре или списке пользовательских моделей", - "skippingExistingModels": "Пропуск {count} существующих моделей" + "skippingExistingModels": "Пропуск {count} существующих моделей", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Настройки", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Если поставщики различаются по качеству/стоимости, начните с варианта «Стоимость» для фоновой работы и «Наименее используемый» для сбалансированного износа.", "comboDefaultsGuideTitle": "Как настроить комбо по умолчанию", "comboDefaultsGuideHint1": "Сохраняйте низкий уровень повторных попыток в потоках с малой задержкой; увеличивайте таймаут только для задач длинной генерации.", - "comboDefaultsGuideHint2": "Используйте переопределения поставщика, если одному поставщику требуется другое поведение по тайм-ауту/повторной попытке, чем глобальные значения по умолчанию." + "comboDefaultsGuideHint2": "Используйте переопределения поставщика, если одному поставщику требуется другое поведение по тайм-ауту/повторной попытке, чем глобальные значения по умолчанию.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Переводчик", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json index bc2483e353..88731fd9a5 100644 --- a/src/i18n/messages/sk.json +++ b/src/i18n/messages/sk.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Nepodarilo sa prepnúť automatickú synchronizáciu", "allModelsAlreadyImported": "Všetky modely sú už importované", "noNewModelsToImport": "Žiadne nové modely na import — všetky modely sú už v registri alebo v zozname vlastných modelov", - "skippingExistingModels": "Preskakujem {count} existujúcich modelov" + "skippingExistingModels": "Preskakujem {count} existujúcich modelov", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Nastavenia", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Ak sa poskytovatelia líšia v kvalite/nákladoch, začnite s Cost Opt pre prácu na pozadí a Najmenej používané pre vyvážené opotrebovanie.", "comboDefaultsGuideTitle": "Ako vyladiť predvolené nastavenia komba", "comboDefaultsGuideHint1": "Udržujte počet opakovaní na nízkej úrovni v tokoch s nízkou latenciou; zvýšiť časový limit iba pre úlohy s dlhým generovaním.", - "comboDefaultsGuideHint2": "Použite prepísania poskytovateľa, keď jeden poskytovateľ potrebuje iné správanie pri uplynutí časového limitu/opakovania, ako sú globálne predvolené hodnoty." + "comboDefaultsGuideHint2": "Použite prepísania poskytovateľa, keď jeden poskytovateľ potrebuje iné správanie pri uplynutí časového limitu/opakovania, ako sú globálne predvolené hodnoty.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Prekladateľ", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json index 3d72f1d0fb..3ba87972e6 100644 --- a/src/i18n/messages/sv.json +++ b/src/i18n/messages/sv.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Det gick inte att växla automatisk synkronisering", "allModelsAlreadyImported": "Alla modeller är redan importerade", "noNewModelsToImport": "Inga nya modeller att importera — alla modeller finns redan i registret eller listan över anpassade modeller", - "skippingExistingModels": "Hoppar över {count} befintliga modeller" + "skippingExistingModels": "Hoppar över {count} befintliga modeller", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Inställningar", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Om leverantörer varierar i kvalitet/kostnad, börja med Cost Opt för bakgrundsarbete och Minst Används för balanserat slitage.", "comboDefaultsGuideTitle": "Hur man ställer in kombinationsinställningar", "comboDefaultsGuideHint1": "Håll låga omförsök i flöden med låg latens; öka timeout endast för långa generationsuppgifter.", - "comboDefaultsGuideHint2": "Använd åsidosättande av leverantörer när en leverantör behöver ett annat beteende för timeout/försök igen än globala standardinställningar." + "comboDefaultsGuideHint2": "Använd åsidosättande av leverantörer när en leverantör behöver ett annat beteende för timeout/försök igen än globala standardinställningar.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Översättare", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/th.json b/src/i18n/messages/th.json index 34f3ee362f..d16a3597a4 100644 --- a/src/i18n/messages/th.json +++ b/src/i18n/messages/th.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "ธีมส์", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "ไม่สามารถสลับการซิงค์อัตโนมัติ", "allModelsAlreadyImported": "นำเข้าโมเดลทั้งหมดแล้ว", "noNewModelsToImport": "ไม่มีโมเดลใหม่ที่จะนำเข้า — โมเดลทั้งหมดมีอยู่แล้วในรีจิสทรีหรือรายการโมเดลที่กำหนดเอง", - "skippingExistingModels": "ข้าม {count} โมเดลที่มีอยู่" + "skippingExistingModels": "ข้าม {count} โมเดลที่มีอยู่", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "การตั้งค่า", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "หากผู้ให้บริการมีคุณภาพ/ต้นทุนแตกต่างกัน ให้เริ่มด้วยการเลือกต้นทุนสำหรับงานเบื้องหลังและใช้งานน้อยที่สุดสำหรับการสึกหรอที่สมดุล", "comboDefaultsGuideTitle": "วิธีปรับแต่งค่าเริ่มต้นคอมโบ", "comboDefaultsGuideHint1": "พยายามลองใหม่ให้ต่ำในกระแสเวลาแฝงต่ำ เพิ่มการหมดเวลาเฉพาะสำหรับงานที่ใช้เวลานานเท่านั้น", - "comboDefaultsGuideHint2": "ใช้การแทนที่ผู้ให้บริการเมื่อผู้ให้บริการรายหนึ่งต้องการพฤติกรรมการหมดเวลา/การลองใหม่ที่แตกต่างไปจากค่าเริ่มต้นส่วนกลาง" + "comboDefaultsGuideHint2": "ใช้การแทนที่ผู้ให้บริการเมื่อผู้ให้บริการรายหนึ่งต้องการพฤติกรรมการหมดเวลา/การลองใหม่ที่แตกต่างไปจากค่าเริ่มต้นส่วนกลาง", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "นักแปล", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/tr.json b/src/i18n/messages/tr.json index 49a74ba2f9..d2d5d33a25 100644 --- a/src/i18n/messages/tr.json +++ b/src/i18n/messages/tr.json @@ -185,7 +185,14 @@ "themeViolet": "Menekşe", "themeOrange": "Turuncu", "themeCyan": "Camgöbeği", - "cliToolsShort": "Araçlar" + "cliToolsShort": "Araçlar", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Temalar", @@ -1060,7 +1067,26 @@ "a2aQuickStartStep2": "JSON-RPC isteklerini `message/send` veya `message/stream` kullanarak `POST /a2a` adresine gönderin.", "a2aQuickStartStep3": "Görevleri `tasks/get` ve `tasks/cancel` ile izleyin ve yönetin.", "completionsLegacy": "Tamamlamalar (Eski)", - "completionsLegacyDesc": "Eski OpenAI metin tamamlamaları — hem bilgi istemi dizesini hem de mesaj dizisi biçimini kabul eder" + "completionsLegacyDesc": "Eski OpenAI metin tamamlamaları — hem bilgi istemi dizesini hem de mesaj dizisi biçimini kabul eder", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "endpoints": { "tabProxy": "Uç Nokta Proxy", @@ -1646,7 +1672,13 @@ "modelsPathHint": "Doğrulama için özel model yolu (ör. /v4/models)", "allModelsAlreadyImported": "Tüm modeller zaten içe aktarıldı", "noNewModelsToImport": "İçe aktarılacak yeni model yok — tüm modeller zaten kayıt defterinde veya özel modeller listesinde", - "skippingExistingModels": "{count} mevcut model atlanıyor" + "skippingExistingModels": "{count} mevcut model atlanıyor", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Ayarlar", @@ -2055,7 +2087,21 @@ "customPricingNote": "Belirli modeller için varsayılan fiyatlandırmayı geçersiz kılabilirsiniz. Özel geçersiz kılmalar, otomatik algılanan fiyatlandırmaya göre öncelik kazanır.", "editPricing": "Fiyatlandırmayı Düzenle", "viewFullDetails": "Tüm Ayrıntıları Görüntüle", - "themeCoral": "Mercan" + "themeCoral": "Mercan", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Çeviri", @@ -2848,5 +2894,61 @@ "userInitial": "Bir konuda yardıma ihtiyacım var.", "userFollowUp": "Bunu detaylandırabilir misiniz?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "memoryEntriesSub": "In-memory LRU", + "dbEntries": "DB Entries", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHits": "Cache Hits", + "cacheHitsSub": "of {total} total", + "tokensSaved": "Tokens Saved", + "tokensSavedSub": "Estimated from hits", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behavior": "Cache Behavior", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "idempotency": "Idempotency Layer", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json index aeb02f18f7..e5755a5c56 100644 --- a/src/i18n/messages/uk-UA.json +++ b/src/i18n/messages/uk-UA.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Не вдалося вимкнути автоматичну синхронізацію", "allModelsAlreadyImported": "Усі моделі вже імпортовано", "noNewModelsToImport": "Немає нових моделей для імпорту — усі моделі вже є в реєстрі або списку користувацьких моделей", - "skippingExistingModels": "Пропуск {count} наявних моделей" + "skippingExistingModels": "Пропуск {count} наявних моделей", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Налаштування", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Якщо постачальники відрізняються за якістю/вартістю, почніть із Cost Opt для фонової роботи та Least Used для збалансованого зносу.", "comboDefaultsGuideTitle": "Як налаштувати параметри комбо за замовчуванням", "comboDefaultsGuideHint1": "Зберігайте низькі повторні спроби в потоках із низькою затримкою; збільшити час очікування лише для завдань тривалого покоління.", - "comboDefaultsGuideHint2": "Використовуйте перевизначення постачальника, коли одному постачальнику потрібна інша поведінка тайм-ауту/повторної спроби, ніж глобальні стандартні налаштування." + "comboDefaultsGuideHint2": "Використовуйте перевизначення постачальника, коли одному постачальнику потрібна інша поведінка тайм-ауту/повторної спроби, ніж глобальні стандартні налаштування.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Перекладач", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json index 7f1f40f6f4..3418fa4940 100644 --- a/src/i18n/messages/vi.json +++ b/src/i18n/messages/vi.json @@ -187,7 +187,12 @@ "autoCombo": "Auto Combo", "searchTools": "Search Tools", "cache": "Cache", - "cacheShort": "Cache" + "cacheShort": "Cache", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help" }, "themesPage": { "title": "Themes", @@ -1011,7 +1016,26 @@ "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." + "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.", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart.", + "cloudflaredEnable": "Enable Tunnel", + "cloudflaredInstallAndEnable": "Install & Enable", + "cloudflaredDisable": "Stop Tunnel", + "cloudflaredRunning": "Running", + "cloudflaredStarting": "Starting", + "cloudflaredStoppedState": "Stopped", + "cloudflaredNotInstalled": "Not installed", + "cloudflaredUnsupported": "Unsupported", + "cloudflaredError": "Error", + "cloudflaredStarted": "Cloudflare tunnel started", + "cloudflaredStopped": "Cloudflare tunnel stopped", + "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}" }, "mcpDashboard": { "loading": "Loading MCP dashboard...", @@ -1585,7 +1609,13 @@ "autoSyncToggleFailed": "Không chuyển đổi được tính năng tự động đồng bộ hóa", "allModelsAlreadyImported": "Tất cả mô hình đã được nhập", "noNewModelsToImport": "Không có mô hình mới để nhập — tất cả mô hình đã có trong danh mục hoặc danh sách mô hình tùy chỉnh", - "skippingExistingModels": "Bỏ qua {count} mô hình hiện có" + "skippingExistingModels": "Bỏ qua {count} mô hình hiện có", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "Cài đặt", @@ -1994,7 +2024,21 @@ "routingAdvancedGuideHint2": "Nếu các nhà cung cấp khác nhau về chất lượng/chi phí, hãy bắt đầu với Cost Opt cho công việc nền và Ít được sử dụng nhất để cân bằng độ hao mòn.", "comboDefaultsGuideTitle": "Cách điều chỉnh mặc định kết hợp", "comboDefaultsGuideHint1": "Giữ số lần thử ở mức thấp trong các luồng có độ trễ thấp; chỉ tăng thời gian chờ cho các tác vụ tạo dài.", - "comboDefaultsGuideHint2": "Sử dụng ghi đè nhà cung cấp khi một nhà cung cấp cần hành vi hết thời gian chờ/thử lại khác với mặc định chung." + "comboDefaultsGuideHint2": "Sử dụng ghi đè nhà cung cấp khi một nhà cung cấp cần hành vi hết thời gian chờ/thử lại khác với mặc định chung.", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden" }, "translator": { "title": "Người phiên dịch", @@ -2881,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } } diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json index 294102a67e..2c2eabd7dc 100644 --- a/src/i18n/messages/zh-CN.json +++ b/src/i18n/messages/zh-CN.json @@ -1672,7 +1672,13 @@ "modelsPathHint": "为验证流程自定义模型路径(例如:/v4/models)", "allModelsAlreadyImported": "所有模型已导入", "noNewModelsToImport": "没有新模型可导入 — 所有模型已在注册表或自定义模型列表中", - "skippingExistingModels": "跳过 {count} 个已有模型" + "skippingExistingModels": "跳过 {count} 个已有模型", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "codexAuthAppliedLocal": "Codex auth.json applied locally", + "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", + "codexAuthExported": "Codex auth.json exported", + "codexAuthExportFailed": "Failed to export Codex auth.json" }, "settings": { "title": "设置", @@ -2084,7 +2090,18 @@ "routingAdvancedGuideHint2": "如果提供商的质量/成本各不相同,请从“成本选择”开始进行后台工作,并从“最少使用”开始进行平衡磨损。", "comboDefaultsGuideTitle": "如何调整组合默认值", "comboDefaultsGuideHint1": "在低延迟流中保持较低的重试次数;仅增加长生成任务的超时。", - "comboDefaultsGuideHint2": "当一个提供程序需要与全局默认值不同的超时/重试行为时,请使用提供程序覆盖。" + "comboDefaultsGuideHint2": "当一个提供程序需要与全局默认值不同的超时/重试行为时,请使用提供程序覆盖。", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "save": "Save" }, "translator": { "title": "翻译者", @@ -2908,6 +2925,30 @@ "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window" + "dedupWindow": "Dedup Window", + "promptCache": "Prompt Cache (Provider-Side)", + "cachedRequests": "Cached Requests", + "cacheHitRate": "Cache Hit Rate", + "cachedTokens": "Cached Tokens", + "cacheCreationTokens": "Cache Creation Tokens", + "byProvider": "Breakdown by Provider", + "provider": "Provider", + "requests": "Requests", + "inputTokens": "Input Tokens", + "cachedTokensCol": "Cached", + "cacheCreation": "Creation", + "trend24h": "Cache Trend (24h)", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "searchEntries": "Search entries...", + "search": "Search", + "loading": "Loading...", + "noEntries": "No cache entries found", + "signature": "Signature", + "model": "Model", + "created": "Created", + "expires": "Expires", + "actions": "Actions" } }