diff --git a/client/src/Components/I18nLoader/index.jsx b/client/src/Components/I18nLoader/index.jsx new file mode 100644 index 000000000..7c3cbfb85 --- /dev/null +++ b/client/src/Components/I18nLoader/index.jsx @@ -0,0 +1,16 @@ +import i18n from "../../Utils/i18n"; +import { useSelector } from "react-redux"; +import { useEffect } from "react"; +const I18nLoader = () => { + const language = useSelector((state) => state.ui.language); + + useEffect(() => { + if (language && i18n.language !== language) { + i18n.changeLanguage(language); + } + }, [language]); + + return null; +}; + +export default I18nLoader; diff --git a/client/src/Components/Inputs/Select/index.jsx b/client/src/Components/Inputs/Select/index.jsx index 4eae2b057..119898fa3 100644 --- a/client/src/Components/Inputs/Select/index.jsx +++ b/client/src/Components/Inputs/Select/index.jsx @@ -164,7 +164,9 @@ Select.propTypes = { value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]).isRequired, items: PropTypes.arrayOf( PropTypes.shape({ - _id: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]).isRequired, + _id: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]) + .isRequired, + name: PropTypes.string.isRequired, }) ).isRequired, diff --git a/client/src/Components/LanguageSelector.jsx b/client/src/Components/LanguageSelector.jsx index 66faf78ac..284d0db05 100644 --- a/client/src/Components/LanguageSelector.jsx +++ b/client/src/Components/LanguageSelector.jsx @@ -3,15 +3,17 @@ import { Box, MenuItem, Select, Stack } from "@mui/material"; import { useTheme } from "@emotion/react"; import "flag-icons/css/flag-icons.min.css"; import { useSelector } from "react-redux"; +import { useDispatch } from "react-redux"; +import { setLanguage } from "../Features/UI/uiSlice"; const LanguageSelector = () => { const { i18n } = useTranslation(); const theme = useTheme(); const { language } = useSelector((state) => state.ui); - + const dispatch = useDispatch(); const handleChange = (event) => { const newLang = event.target.value; - i18n.changeLanguage(newLang); + dispatch(setLanguage(newLang)); }; const languages = Object.keys(i18n.options.resources || {}); @@ -32,7 +34,6 @@ const LanguageSelector = () => { } if (parsedLang.includes("-")) { parsedLang = parsedLang.split("-")[1].toLowerCase(); - console.log("parsedLang", parsedLang); } const flag = parsedLang ? `fi fi-${parsedLang}` : null; diff --git a/client/src/Features/Settings/settingsSlice.js b/client/src/Features/Settings/settingsSlice.js index 02724af02..d0725627a 100644 --- a/client/src/Features/Settings/settingsSlice.js +++ b/client/src/Features/Settings/settingsSlice.js @@ -5,7 +5,6 @@ const initialState = { isLoading: false, apiBaseUrl: "", logLevel: "debug", - language: "gb", pagespeedApiKey: "", }; diff --git a/client/src/Features/UI/uiSlice.js b/client/src/Features/UI/uiSlice.js index bd6e92804..3addfbb7a 100644 --- a/client/src/Features/UI/uiSlice.js +++ b/client/src/Features/UI/uiSlice.js @@ -24,7 +24,7 @@ const initialState = { greeting: { index: 0, lastUpdate: null }, timezone: "America/Toronto", distributedUptimeEnabled: false, - language: "gb", + language: "en", starPromptOpen: true, }; @@ -57,7 +57,7 @@ const uiSlice = createSlice({ setTimezone(state, action) { state.timezone = action.payload.timezone; }, - setLanguage(state, action) { + setLanguage: (state, action) => { state.language = action.payload; }, setStarPromptOpen: (state, action) => { diff --git a/client/src/Pages/Settings/SettingsURL.jsx b/client/src/Pages/Settings/SettingsURL.jsx index 168f223fe..1f0b28bd9 100644 --- a/client/src/Pages/Settings/SettingsURL.jsx +++ b/client/src/Pages/Settings/SettingsURL.jsx @@ -22,7 +22,7 @@ const SettingsURL = ({ HEADING_SX, handleChange, showURL = false }) => {