From e97d6983876f0641d12f4c121ba48699b7fa6ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Veikko=20Lintuj=C3=A4rvi?= Date: Thu, 28 May 2026 21:50:04 +0300 Subject: [PATCH] Make English a default language on feedback page --- ui/src/app.tsx | 20 +++++++++++++++----- ui/src/i18n.ts | 2 ++ ui/src/routes/feedback.tsx | 18 +++++++++++++++++- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/ui/src/app.tsx b/ui/src/app.tsx index 1da3191..8a0f977 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -1,4 +1,4 @@ -import { BrowserRouter, Navigate, Route, Routes } from "react-router-dom"; +import { BrowserRouter, Navigate, Route, Routes, useLocation } from "react-router-dom"; import { useEffect } from "react"; import { useRecoilValue, useSetRecoilState } from "recoil"; import Nav from "~/components/Nav"; @@ -10,19 +10,29 @@ import Management from "~/routes/management"; import NotFound from "~/routes/[...404]"; import Toasts from "~/components/Toasts"; import { APP_ROLES, hasAnyRole } from "~/auth/roles"; -import { initializeLanguage, useLanguage } from "~/i18n"; -import { sessionAtom } from "~/state/appState"; +import { LANGUAGE_STORAGE_KEY, normalizeLanguage, useLanguage } from "~/i18n"; +import { languageAtom, sessionAtom } from "~/state/appState"; import "./app.css"; function AppShell() { + const location = useLocation(); const { language, setLanguage } = useLanguage(); const session = useRecoilValue(sessionAtom); const setSession = useSetRecoilState(sessionAtom); + const setLanguageAtom = useSetRecoilState(languageAtom); useEffect(() => { + // Feedback page manages its own language default + if (location.pathname === "/feedback") return; const storedPreferredLanguage = localStorage.getItem("session-preferred-language"); - initializeLanguage(setLanguage, storedPreferredLanguage === "en" || storedPreferredLanguage === "sk" ? storedPreferredLanguage : "fi"); - }, [setLanguage]); + const fallback = normalizeLanguage(storedPreferredLanguage === "en" || storedPreferredLanguage === "sk" ? storedPreferredLanguage : "fi"); + const stored = localStorage.getItem(LANGUAGE_STORAGE_KEY); + if (stored !== null) { + setLanguage(normalizeLanguage(stored)); // explicit prior choice — keep it saved + } else { + setLanguageAtom(fallback); // just set the atom, don't persist the default + } + }, [location.pathname, setLanguage, setLanguageAtom]); useEffect(() => { const storedUsername = localStorage.getItem("session-username"); diff --git a/ui/src/i18n.ts b/ui/src/i18n.ts index 4a8a0ab..e12c20c 100644 --- a/ui/src/i18n.ts +++ b/ui/src/i18n.ts @@ -4,6 +4,8 @@ import { languageAtom, type Language } from "~/state/appState"; const STORAGE_KEY = "ui-language"; +export { STORAGE_KEY as LANGUAGE_STORAGE_KEY }; + const translations = { en: { "nav.home": "Home", diff --git a/ui/src/routes/feedback.tsx b/ui/src/routes/feedback.tsx index 29a24c4..3aa3ccd 100644 --- a/ui/src/routes/feedback.tsx +++ b/ui/src/routes/feedback.tsx @@ -1,13 +1,29 @@ import { FormEvent, useEffect, useState } from "react"; +import { useSetRecoilState } from "recoil"; import { submitFeedback } from "~/api"; -import { useT } from "~/i18n"; +import { LANGUAGE_STORAGE_KEY, useT } from "~/i18n"; +import { languageAtom } from "~/state/appState"; export default function Feedback() { const t = useT(); + const setLanguageAtom = useSetRecoilState(languageAtom); const [message, setMessage] = useState(""); const [status, setStatus] = useState<"idle" | "sending" | "success" | "error">("idle"); const [validationError, setValidationError] = useState(""); + useEffect(() => { + // Default to English on the feedback page only when no language has been explicitly chosen + if (localStorage.getItem(LANGUAGE_STORAGE_KEY) === null) { + setLanguageAtom("en"); + } + return () => { + // Restore Finnish default when leaving, if the user still hasn't made an explicit choice + if (localStorage.getItem(LANGUAGE_STORAGE_KEY) === null) { + setLanguageAtom("fi"); + } + }; + }, [setLanguageAtom]); + useEffect(() => { document.title = t("feedback.title"); }, [t]);