diff --git a/src/app/(dashboard)/dashboard/BootstrapBanner.tsx b/src/app/(dashboard)/dashboard/BootstrapBanner.tsx index f0300ea364..a819d82d1d 100644 --- a/src/app/(dashboard)/dashboard/BootstrapBanner.tsx +++ b/src/app/(dashboard)/dashboard/BootstrapBanner.tsx @@ -1,12 +1,14 @@ "use client"; import { useState } from "react"; +import { useTranslations } from "next-intl"; /** * Shown when OmniRoute was started with auto-generated secrets (zero-config mode). * The banner is dismissable and persists only for the current session. */ export default function BootstrapBanner() { + const t = useTranslations("common"); const [dismissed, setDismissed] = useState(false); if (dismissed) return null; @@ -46,7 +48,7 @@ export default function BootstrapBanner() { diff --git a/src/app/(dashboard)/dashboard/TierCoverageWidget.tsx b/src/app/(dashboard)/dashboard/TierCoverageWidget.tsx index 6d08ae16b5..6ce971b063 100644 --- a/src/app/(dashboard)/dashboard/TierCoverageWidget.tsx +++ b/src/app/(dashboard)/dashboard/TierCoverageWidget.tsx @@ -65,8 +65,8 @@ export function TierCoverageWidget() {
Providers configured per fallback tier
+{t("tierCoverageSubtitle")}
Failed to load utilization data
++ {t("providerUtilizationFailedToLoad")} +
{error}
Remaining capacity
++ {t("providerUtilizationRemainingCapacity")} +
{formatTooltipTimestamp(point.timestamp, range)}
diff --git a/src/app/(dashboard)/dashboard/analytics/SearchAnalyticsTab.tsx b/src/app/(dashboard)/dashboard/analytics/SearchAnalyticsTab.tsx index 1d0e371bbc..da9ca45094 100644 --- a/src/app/(dashboard)/dashboard/analytics/SearchAnalyticsTab.tsx +++ b/src/app/(dashboard)/dashboard/analytics/SearchAnalyticsTab.tsx @@ -7,6 +7,7 @@ "use client"; +import { useTranslations } from "next-intl"; import { useEffect, useState } from "react"; interface SearchStats { @@ -76,6 +77,7 @@ function ProviderBar({ } export default function SearchAnalyticsTab() { + const t = useTranslations("analytics"); const [stats, setStats] = useStateNo searches yet
+{t("searchAnalyticsNoSearchesYet")}
Use POST /v1/search to start routing
web searches.
diff --git a/src/app/(dashboard)/dashboard/analytics/components/DiversityScoreCard.tsx b/src/app/(dashboard)/dashboard/analytics/components/DiversityScoreCard.tsx
index 3d21b80b41..fc4dce9d04 100644
--- a/src/app/(dashboard)/dashboard/analytics/components/DiversityScoreCard.tsx
+++ b/src/app/(dashboard)/dashboard/analytics/components/DiversityScoreCard.tsx
@@ -1,5 +1,6 @@
"use client";
+import { useTranslations } from "next-intl";
import { useEffect, useState } from "react";
import { Card } from "@/shared/components";
@@ -15,6 +16,7 @@ interface DiversityReport {
}
export default function DiversityScoreCard() {
+ const t = useTranslations("analytics");
const [data, setData] = useStateProvider Diversity
+ {t("diversityScoreTitle")}
— Provider concentration snapshot for the recent traffic window.
diff --git a/src/app/(dashboard)/dashboard/batch/BatchDetailModal.tsx b/src/app/(dashboard)/dashboard/batch/BatchDetailModal.tsx
index 6f5cd42768..005b931b95 100644
--- a/src/app/(dashboard)/dashboard/batch/BatchDetailModal.tsx
+++ b/src/app/(dashboard)/dashboard/batch/BatchDetailModal.tsx
@@ -1,6 +1,7 @@
"use client";
import { useEffect } from "react";
+import { useTranslations } from "next-intl";
function relativeTime(ts: number): string {
const diffMs = Date.now() - ts * 1000;
@@ -135,6 +136,7 @@ function formatTs(ts: number | null | undefined): string {
}
export default function BatchDetailModal({ batch, files, onClose }: BatchDetailModalProps) {
+ const t = useTranslations("common");
useEffect(() => {
const handler = (e: KeyboardEvent) => {
if (e.key === "Escape") onClose();
@@ -182,7 +184,7 @@ export default function BatchDetailModal({ batch, files, onClose }: BatchDetailM
navigator.clipboard.writeText(batch.id);
}}
className="text-[var(--color-text-muted)] hover:text-[var(--color-text-main)] transition-colors"
- title="Copy ID"
+ title={t("batchDetailCopyId")}
>
content_copy
@@ -191,7 +193,7 @@ export default function BatchDetailModal({ batch, files, onClose }: BatchDetailM
|
@@ -338,7 +340,7 @@ export default function BatchListTab({
onClick={(e) => handleDeleteBatch(e, batch)}
disabled={deletingId === batch.id}
className="flex items-center gap-1 px-2 py-1 text-xs rounded bg-red-500/10 border border-red-500/25 text-red-400 hover:text-red-300 transition-colors whitespace-nowrap disabled:opacity-50"
- title="Delete batch and its files"
+ title={t("batchListDeleteBatchTitle")}
>
{deletingId === batch.id ? "hourglass_empty" : "delete"}
diff --git a/src/app/(dashboard)/dashboard/batch/FileDetailModal.tsx b/src/app/(dashboard)/dashboard/batch/FileDetailModal.tsx
index 4281178a7d..0bde086453 100644
--- a/src/app/(dashboard)/dashboard/batch/FileDetailModal.tsx
+++ b/src/app/(dashboard)/dashboard/batch/FileDetailModal.tsx
@@ -1,6 +1,7 @@
"use client";
import { useEffect, useState } from "react";
+import { useTranslations } from "next-intl";
import { Button } from "@/shared/components";
function relativeTime(ts: number): string {
@@ -69,6 +70,7 @@ export default function FileDetailModal({
batches,
onClose,
}: Readonly |
|---|