diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index fbc8bc5..a602b38 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,6 +1,7 @@ import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom' import Navbar from './components/Navbar' import { AuthProvider, useAuth } from './context/AuthContext' +import { I18nProvider, useI18n } from './context/I18nContext' import CreateTemplatePage from './pages/CreateTemplatePage' import DocumentDetailPage from './pages/DocumentDetailPage' import DocumentsPage from './pages/DocumentsPage' @@ -18,7 +19,8 @@ import LogsPage from './pages/LogsPage' function ProtectedRoute({ children }: { children: React.ReactNode }) { const { user, loading } = useAuth() - if (loading) return

Loading...

+ const { t } = useI18n() + if (loading) return

{t('common.loading')}

if (!user) return return <>{children} } @@ -53,9 +55,11 @@ function AppRoutes() { export default function App() { return ( - - - + + + + + ) } diff --git a/frontend/src/components/AuthShell.tsx b/frontend/src/components/AuthShell.tsx new file mode 100644 index 0000000..b7b028e --- /dev/null +++ b/frontend/src/components/AuthShell.tsx @@ -0,0 +1,13 @@ +import type { ReactNode } from 'react' +import LanguageSwitcher from './LanguageSwitcher' + +export default function AuthShell({ children }: { children: ReactNode }) { + return ( +
+
+ +
+ {children} +
+ ) +} diff --git a/frontend/src/components/ConfirmDialog.tsx b/frontend/src/components/ConfirmDialog.tsx index 5bbd18f..eff6aaa 100644 --- a/frontend/src/components/ConfirmDialog.tsx +++ b/frontend/src/components/ConfirmDialog.tsx @@ -1,3 +1,5 @@ +import { useI18n } from '../context/I18nContext' + interface ConfirmDialogProps { open: boolean title: string @@ -13,12 +15,14 @@ export default function ConfirmDialog({ open, title, message, - confirmLabel = 'Confirm', - cancelLabel = 'Cancel', + confirmLabel, + cancelLabel, danger = false, onConfirm, onCancel, }: ConfirmDialogProps) { + const { t } = useI18n() + if (!open) return null return ( @@ -36,14 +40,14 @@ export default function ConfirmDialog({

{message}

diff --git a/frontend/src/components/LanguageSwitcher.tsx b/frontend/src/components/LanguageSwitcher.tsx new file mode 100644 index 0000000..acea7b8 --- /dev/null +++ b/frontend/src/components/LanguageSwitcher.tsx @@ -0,0 +1,27 @@ +import { useI18n } from '../context/I18nContext' +import { LOCALES } from '../i18n' + +interface LanguageSwitcherProps { + compact?: boolean +} + +export default function LanguageSwitcher({ compact = false }: LanguageSwitcherProps) { + const { locale, setLocale, t } = useI18n() + + return ( + + ) +} diff --git a/frontend/src/components/Navbar.tsx b/frontend/src/components/Navbar.tsx index cc70194..cfdf431 100644 --- a/frontend/src/components/Navbar.tsx +++ b/frontend/src/components/Navbar.tsx @@ -1,8 +1,11 @@ import { Link, useLocation } from 'react-router-dom' +import LanguageSwitcher from './LanguageSwitcher' import { useAuth } from '../context/AuthContext' +import { useI18n } from '../context/I18nContext' export default function Navbar() { const { user, logout } = useAuth() + const { t } = useI18n() const location = useLocation() const isActive = (path: string) => @@ -11,33 +14,34 @@ export default function Navbar() { return (