feat(i18n): add language picker to settings and sync i18n with persisted preference

- Add language picker (English/Deutsch) to settings page using pill-toggle pattern
- Import useLanguage hook and i18n instance in settings
- Language change persists via updateSetting and calls i18n.changeLanguage
- Add useEffect in RootLayout to sync i18n language with DB setting on load
- Language labels use native names (English, Deutsch) for identification

Phase 34, Plan 04
This commit is contained in:
2026-04-13 18:21:30 +02:00
parent f759dd0fde
commit 46715cc793
2 changed files with 49 additions and 1 deletions

View File

@@ -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(