diff --git a/src/client/routes/__root.tsx b/src/client/routes/__root.tsx index be51c63..d9c69ad 100644 --- a/src/client/routes/__root.tsx +++ b/src/client/routes/__root.tsx @@ -7,7 +7,7 @@ import { useNavigate, useRouter, } from "@tanstack/react-router"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Toaster } from "sonner"; import "../app.css"; @@ -23,6 +23,7 @@ import { OnboardingFlow } from "../components/onboarding/OnboardingFlow"; import { TopNav } from "../components/TopNav"; import { useAuth } from "../hooks/useAuth"; import { useDeleteCandidate } from "../hooks/useCandidates"; +import { useLanguage } from "../hooks/useLanguage"; import { useOnboardingComplete } from "../hooks/useSettings"; import { useResolveThread, useThread } from "../hooks/useThreads"; import { useUIStore } from "../stores/uiStore"; @@ -82,6 +83,15 @@ function RootLayout() { const location = useLocation(); const { data: auth, isLoading: authLoading } = useAuth(); const isAuthenticated = !!auth?.user; + const language = useLanguage(); + const { i18n } = useTranslation(); + + // Sync i18n language with persisted setting + useEffect(() => { + if (language && i18n.language !== language) { + i18n.changeLanguage(language); + } + }, [language, i18n]); // Candidate delete state const confirmDeleteCandidateId = useUIStore( diff --git a/src/client/routes/settings.tsx b/src/client/routes/settings.tsx index 80fe245..c6d610c 100644 --- a/src/client/routes/settings.tsx +++ b/src/client/routes/settings.tsx @@ -9,9 +9,16 @@ import { } from "../hooks/useAuth"; import { useCurrency } from "../hooks/useCurrency"; import { useExportItems, useImportItems } from "../hooks/useItems"; +import { useLanguage } from "../hooks/useLanguage"; import { useUpdateSetting } from "../hooks/useSettings"; import { useWeightUnit } from "../hooks/useWeightUnit"; import type { Currency, WeightUnit } from "../lib/formatters"; +import i18n from "../lib/i18n"; + +const LANGUAGES = [ + { value: "en", label: "English" }, + { value: "de", label: "Deutsch" }, +]; const UNITS: WeightUnit[] = ["g", "oz", "lb", "kg"]; const CURRENCIES: { value: Currency; label: string }[] = [ @@ -231,6 +238,7 @@ function getSuggestedCurrency(): Currency | null { function SettingsPage() { const { t } = useTranslation("settings"); const unit = useWeightUnit(); + const language = useLanguage(); const { currency, showConversions } = useCurrency(); const updateSetting = useUpdateSetting(); const { data: auth } = useAuth(); @@ -279,6 +287,36 @@ function SettingsPage() { )}
+ {t("language.description")} +
+