+ {/* Origin hint β always visible (monitorOriginHint) */}
+
+
+ info
+
+
+ {translateOrFallback(
+ "monitorOriginHint",
+ "Eventos gerados pelo Translate ou pelo pipeline principal aparecem aqui em tempo real.",
+ )}
+
+
+
+ {/* Stat Cards β 6 cards: total, success, errors, avg latency, combo-routed, unique endpoints */}
+
+
+
+
+
+
+
+
+
+ {/* Memory note */}
+
+
memory
+
+ {t("liveMonitorMemoryNote")}{" "}
+ {t("liveMonitorMemoryCapNote")}
+
+
+
+ {/* Auto-refresh controls */}
+
+
+
+
+ {autoRefresh ? "radio_button_checked" : "radio_button_unchecked"}
+
+
+
+
+ {/* Live/Paused badge */}
+
+ {autoRefresh
+ ? translateOrFallback("live", "Live")
+ : translateOrFallback("paused", "Paused")}
+
+
+
+
+
+
+ {/* Events table */}
+
+
+
{t("recentTranslations")}
+
+ {loading ? (
+
+
+ progress_activity
+
+ {tc("loading")}
+
+ ) : events.length === 0 ? (
+ /* Empty state with CTA (new in MonitorTab) */
+
+
+
+ ) : (
+
+
+
+
+ | {t("time")} |
+
+ {translateOrFallback("routeDetails", "Route")}
+ |
+ {t("source")} |
+ {t("target")} |
+ {t("model")} |
+ {t("status")} |
+ {t("latency")} |
+
+
+
+ {events.map((event, i) => {
+ const srcMeta = FORMAT_META[event.sourceFormat as keyof typeof FORMAT_META] ?? {
+ label: event.sourceFormat ?? "?",
+ color: "gray",
+ };
+ const tgtMeta = FORMAT_META[event.targetFormat as keyof typeof FORMAT_META] ?? {
+ label: event.targetFormat ?? "?",
+ color: "gray",
+ };
+
+ return (
+
+ |
+ {event.timestamp
+ ? new Date(event.timestamp).toLocaleTimeString()
+ : notAvailable}
+ |
+
+
+
+
+ {event.routeProvider ?? event.provider ?? notAvailable}
+
+ {event.routeCombo ? (
+
+ {translateOrFallback("comboBadge", "Combo")}: {event.routeCombo}
+
+ ) : null}
+
+
+
+ {translateOrFallback("routeEndpointLabel", "Endpoint")}:{" "}
+ {event.routeEndpoint ?? event.endpoint ?? notAvailable}
+
+ {event.routeConnectionShortId ? (
+
+ {translateOrFallback("routeConnectionLabel", "Conn")}:{" "}
+ {event.routeConnectionShortId}
+
+ ) : null}
+
+
+ |
+
+
+ {srcMeta.label}
+
+ |
+
+
+ {tgtMeta.label}
+
+ |
+
+ {event.model ?? notAvailable}
+ |
+
+ {event.status === "success" ? (
+
+ {t("ok")}
+
+ ) : (
+
+ {event.statusCode ?? t("errorShort")}
+
+ )}
+ |
+
+ {event.latency ? formatLatency(event.latency) : notAvailable}
+ |
+
+ );
+ })}
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/tests/unit/translator-friendly-monitor-tab.test.tsx b/tests/unit/translator-friendly-monitor-tab.test.tsx
new file mode 100644
index 0000000000..1eb1d30285
--- /dev/null
+++ b/tests/unit/translator-friendly-monitor-tab.test.tsx
@@ -0,0 +1,477 @@
+// @vitest-environment jsdom
+import React from "react";
+import { act } from "react";
+import { createRoot } from "react-dom/client";
+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+
+// ββ i18n stub β returns fallback key so we can assert on translateOrFallback ββ
+vi.mock("next-intl", () => ({
+ useTranslations: () => (key: string) => key,
+}));
+
+// ββ Shared component stubs ββββββββββββββββββββββββββββββββββββββββββββββββββββ
+vi.mock("@/shared/components", () => ({
+ Card: ({ children, className }: { children: React.ReactNode; className?: string }) => (
+