diff --git a/my-app/src/App.tsx b/my-app/src/App.tsx index 109c2e6..e99b34a 100644 --- a/my-app/src/App.tsx +++ b/my-app/src/App.tsx @@ -27,6 +27,8 @@ import CssBaseline from '@mui/material/CssBaseline'; import Header from './components/header'; import { ColorModeContext } from './utils/color-toggle'; import { useTranslation } from 'react-i18next'; +import { I18nextProvider } from 'react-i18next'; +import i18n from './utils/i18n'; // Assuming you have a separate i18n config file import "./utils/i18n"; import Project from './pages/projects'; @@ -60,6 +62,7 @@ function App() return ( //
+
@@ -82,7 +85,7 @@ function App() {/* */} - +
//
); diff --git a/my-app/src/components/header.tsx b/my-app/src/components/header.tsx index 29ed0d2..657aa36 100644 --- a/my-app/src/components/header.tsx +++ b/my-app/src/components/header.tsx @@ -1,147 +1,83 @@ -import MenuSimple from './language'; -import MaterialUISwitch from './switch' -import { useTheme, ThemeProvider, createTheme } from '@mui/material/styles'; -import React, { useState, useContext} from "react"; -import { useEffect } from "react"; +import React, { useState, useContext, useEffect } from "react"; +import { useTranslation } from 'react-i18next'; +import { ColorModeContext } from '../utils/color-toggle'; +import ReactCountryFlag from "react-country-flag"; +import { Box, MenuItem, Select, SelectChangeEvent } from '@mui/material'; +import MaterialUISwitch from './switch'; import logo from '../img/logo.png'; -import { ColorModeContext } from '../utils/color-toggle'; -import { useTranslation } from 'react-i18next'; - -import ReactCountryFlag from "react-country-flag" -import { FormControl } from 'react-bootstrap'; -import { Box, InputLabel, MenuItem} from '@mui/material'; -import Select, { SelectChangeEvent } from '@mui/material/Select'; - -import Menu from '@mui/material/Menu'; -// import MenuItem from '@mui/material/MenuItem'; -import PopupState, { bindHover, bindMenu } from 'material-ui-popup-state'; -import Button from '@mui/material/Button'; - -function Header() -{ +function Header() { const { i18n, t } = useTranslation(); const { changeMode } = useContext(ColorModeContext); - const [language, setLanguage] = useState(1); - const [mode, setMode] = useState("dark"); - // const [checked, setChecked] = useState(1); - const [checked, setChecked] = React.useState(true); + + // Read language from localStorage or default to 'en' + const storedLanguage = localStorage.getItem('language') || 'en'; + + const [language, setLanguage] = useState(storedLanguage); + const [checked, setChecked] = useState(localStorage.getItem('mode') === 'light' ? false : true); useEffect(() => { - if (!localStorage.getItem('language')) - localStorage.setItem('language', 'en'); - else - { - let current = localStorage.getItem('language') - if (current == 'en') - { - setLanguage(current ? 0 : 1) - i18n.changeLanguage(current) + i18n.changeLanguage(language); // Apply saved language + localStorage.setItem('language', language); // Persist on reload + }, [language, i18n]); // Re-run effect if language changes + + useEffect(() => { + if (localStorage.getItem('mode') === 'light') { + changeMode(); + setChecked(false); } - } + }, [changeMode]); - if (!localStorage.getItem('mode')) - localStorage.setItem('mode', 'dark'); - else - { - let current = localStorage.getItem('mode') - if (current == "light") - { - changeMode() - setChecked(false) - } - } - - - }, []); - - function handleChange() { - i18n.changeLanguage(language ? 'en' : 'fr') - localStorage.setItem('language', language ? 'en' : 'fr'); - setLanguage(language ? 0 : 1) + function handleLanguageChange(event: SelectChangeEvent) { + const newLang = event.target.value; + setLanguage(newLang); // Update state } - function handleMode() { - let current = localStorage.getItem('mode') - localStorage.setItem('mode', current == 'light' ? 'dark' : 'light'); - changeMode() - setChecked(checked ? false : true) + function handleModeToggle() { + const newMode = checked ? 'dark' : 'light'; + localStorage.setItem('mode', newMode); + changeMode(); + setChecked(!checked); } return (
-
- - Logo - +
+ + Logo + - - - - {/* - {(popupState) => ( - - - - Profile - My account - Logout - - - )} - */} - - - - - - -
-
- {t("page2")} + -
- {t("page4")} + +
+ + + +
- - {/* */} -
- - - -
- {/* */} - - {/* */} - {/* Age */} - - {/* */} - - - -
- ) + ); } export default Header; - -// function useEffect(arg0: () => void, arg1: number[]) { -// throw new Error('Function not implemented.'); -// } diff --git a/my-app/src/pages/contact.tsx b/my-app/src/pages/contact.tsx index 249d2e7..1d9da0f 100644 --- a/my-app/src/pages/contact.tsx +++ b/my-app/src/pages/contact.tsx @@ -1,13 +1,17 @@ import { useTranslation } from "react-i18next"; +import React, { useEffect } from 'react'; function Contact() { const { i18n, t } = useTranslation(); + useEffect(() => { + i18n.changeLanguage(i18n.language); + }, [i18n.language]); return (
{t("contact_me")}
- +
06.52.40.38.30 diff --git a/my-app/src/pages/home.tsx b/my-app/src/pages/home.tsx index 49b755a..859a042 100644 --- a/my-app/src/pages/home.tsx +++ b/my-app/src/pages/home.tsx @@ -5,14 +5,18 @@ import { FaArrowRightLong } from "react-icons/fa6"; import { useTranslation } from 'react-i18next'; import Button from '@mui/material/Button'; +import React, { useEffect } from 'react'; + function Home() { - const { i18n, t } = useTranslation(); + useEffect(() => { + i18n.changeLanguage(i18n.language); + }, [i18n.language]); + return(
- {/*
*/}
@@ -22,11 +26,6 @@ function Home() Je suis ouvert à de nombreuses propositions en rapport avec mes études et suis prêt à discuter de mon parcours plus amplement lors d’un entretien.
*/}
{t("description")}
- {/*
*/}
{t("project")}
@@ -52,7 +51,6 @@ function Home()
-
) } diff --git a/my-app/src/pages/projects.tsx b/my-app/src/pages/projects.tsx index fd005f9..8436019 100644 --- a/my-app/src/pages/projects.tsx +++ b/my-app/src/pages/projects.tsx @@ -2,9 +2,15 @@ import { useTranslation } from 'react-i18next'; import img from '../img/pong.webp'; import { FaArrowRightLong } from "react-icons/fa6"; +import React, { useEffect } from 'react'; + function Project() { const { i18n, t } = useTranslation(); + useEffect(() => { + i18n.changeLanguage(i18n.language); + }, [i18n.language]); + return (
{t("project")}
diff --git a/my-app/src/pages/projects/cloud_1.tsx b/my-app/src/pages/projects/cloud_1.tsx index 9c6ada4..8a64c37 100644 --- a/my-app/src/pages/projects/cloud_1.tsx +++ b/my-app/src/pages/projects/cloud_1.tsx @@ -1,9 +1,13 @@ import { useTranslation } from 'react-i18next'; import img from '../../img/ansible.webp'; +import React, { useEffect } from 'react'; function Cloud_1() { const { i18n, t } = useTranslation(); + useEffect(() => { + i18n.changeLanguage(i18n.language); + }, [i18n.language]); return (
diff --git a/my-app/src/pages/projects/cube3d.tsx b/my-app/src/pages/projects/cube3d.tsx index 10807d4..a67a346 100644 --- a/my-app/src/pages/projects/cube3d.tsx +++ b/my-app/src/pages/projects/cube3d.tsx @@ -1,9 +1,13 @@ import { useTranslation } from 'react-i18next'; import img from '../../img/cube3d_2.png'; +import React, { useEffect } from 'react'; function Cube3d() { const { i18n, t } = useTranslation(); + useEffect(() => { + i18n.changeLanguage(i18n.language); + }, [i18n.language]); return (
diff --git a/my-app/src/pages/projects/ft_transcendence.tsx b/my-app/src/pages/projects/ft_transcendence.tsx index b913d94..dd63536 100644 --- a/my-app/src/pages/projects/ft_transcendence.tsx +++ b/my-app/src/pages/projects/ft_transcendence.tsx @@ -1,9 +1,13 @@ import { useTranslation } from 'react-i18next'; import img from '../../img/pong.webp'; +import React, { useEffect } from 'react'; function Ft_transcendence() { const { i18n, t } = useTranslation(); + useEffect(() => { + i18n.changeLanguage(i18n.language); + }, [i18n.language]); return (
diff --git a/my-app/src/pages/projects/minishell.tsx b/my-app/src/pages/projects/minishell.tsx index 19518b9..899f2ec 100644 --- a/my-app/src/pages/projects/minishell.tsx +++ b/my-app/src/pages/projects/minishell.tsx @@ -1,9 +1,13 @@ import { useTranslation } from 'react-i18next'; import img from '../../img/bash.png'; +import React, { useEffect } from 'react'; function Minishell() { const { i18n, t } = useTranslation(); + useEffect(() => { + i18n.changeLanguage(i18n.language); + }, [i18n.language]); return (
diff --git a/my-app/src/pages/projects/nas.tsx b/my-app/src/pages/projects/nas.tsx index a7b2bd4..cf27f42 100644 --- a/my-app/src/pages/projects/nas.tsx +++ b/my-app/src/pages/projects/nas.tsx @@ -1,9 +1,13 @@ import { useTranslation } from 'react-i18next'; import img from '../../img/omv_dashboard.png'; +import React, { useEffect } from 'react'; function Nas() { const { i18n, t } = useTranslation(); + useEffect(() => { + i18n.changeLanguage(i18n.language); + }, [i18n.language]); return (
diff --git a/my-app/src/utils/i18n.tsx b/my-app/src/utils/i18n.tsx index 7d418bb..b64ec0d 100644 --- a/my-app/src/utils/i18n.tsx +++ b/my-app/src/utils/i18n.tsx @@ -16,6 +16,11 @@ i18n .use(initReactI18next) // passes i18n down to react-i18next .init({ fallbackLng: "fr", + supportedLngs: ['en', 'fr'], + detection: { + order: ['localStorage', 'cookie', 'navigator'], // Prioritize storage + caches: ['localStorage', 'cookie'], // Persist language setting + }, // lng: getCurrentLang(), interpolation: { escapeValue: false,