@@ -175,7 +177,7 @@ export function ImportC2HistoryModal({
|
- {task.completed ? 'Yes' : 'No'}
+ {task.completed ? t('common.yes') : t('common.no')}
|
{task.created_at}
@@ -195,10 +197,10 @@ export function ImportC2HistoryModal({
onClick={() => setPage((p) => Math.max(1, p - 1))}
disabled={page <= 1}
>
- Prev
+ {t('c2.modal.import.prev')}
- Page {page} of {totalPages}
+ {t('c2.modal.import.page')} {page} {t('c2.modal.import.of')} {totalPages}
{checkedIds.size > 0 && (
- {checkedIds.size} selected
+ {checkedIds.size} {t('c2.modal.import.selected')}
)}
@@ -235,7 +237,7 @@ export function ImportC2HistoryModal({
onClick={onImport}
disabled={!canImport || importMutation.isPending}
>
- {importMutation.isPending ? 'Importing…' : 'Import selected'}
+ {importMutation.isPending ? t('c2.modal.import.btn.importing') : t('c2.modal.import.btn.import')}
diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx
index 2d14a51..554be2e 100644
--- a/frontend/src/components/Layout.tsx
+++ b/frontend/src/components/Layout.tsx
@@ -1,5 +1,6 @@
import { Link, NavLink, Outlet, useNavigate } from 'react-router-dom';
import { Moon, Sun, Monitor } from 'lucide-react';
+import { useTranslation } from 'react-i18next';
import { useAuth } from '@/hooks/useAuth';
import { useTheme } from '@/hooks/useTheme';
import type { Theme } from '@/hooks/useTheme';
@@ -20,6 +21,7 @@ export function Layout(): JSX.Element {
const { user, isAdmin, isRedteam, logout } = useAuth();
const navigate = useNavigate();
const { theme, cycleTheme } = useTheme();
+ const { t } = useTranslation();
const handleLogout = async () => {
await logout();
@@ -41,7 +43,7 @@ export function Layout(): JSX.Element {
) : null}
@@ -62,7 +64,7 @@ export function Layout(): JSX.Element {
{/* nav-bar-top — fixed dark slab, never inverts (same visual family as utility-strip + footer) */}
-
+
Mimic
@@ -78,7 +80,7 @@ export function Layout(): JSX.Element {
}`
}
>
- Engagements
+ {t('nav.engagements')}
{isAdmin || isRedteam ? (
- Templates
+ {t('nav.templates')}
) : null}
{isAdmin ? (
@@ -105,7 +107,7 @@ export function Layout(): JSX.Element {
}`
}
>
- Users
+ {t('nav.users')}
) : null}
@@ -122,7 +124,7 @@ export function Layout(): JSX.Element {
{/* footer — fixed dark slab, never inverts */}
diff --git a/frontend/src/components/MitreMatrixModal.tsx b/frontend/src/components/MitreMatrixModal.tsx
index e37a49e..2f23873 100644
--- a/frontend/src/components/MitreMatrixModal.tsx
+++ b/frontend/src/components/MitreMatrixModal.tsx
@@ -1,4 +1,5 @@
import { useEffect, useRef, useState } from 'react';
+import { useTranslation } from 'react-i18next';
import { LoadingState } from './LoadingState';
import { ErrorState } from './ErrorState';
import { extractApiError } from '@/api/client';
@@ -41,6 +42,7 @@ export function MitreMatrixModal({
onApply,
onCancel,
}: MitreMatrixModalProps): JSX.Element | null {
+ const { t } = useTranslation();
const { data: matrix, isLoading, isError, error } = useMitreMatrix(isOpen);
const [selectedTechMap, setSelectedTechMap] = useState |