Files
Checkmate/client/src/Components/LanguageSelector.jsx
T

74 lines
1.7 KiB
React
Raw Normal View History

2025-02-07 01:59:54 +03:00
import { useTranslation } from "react-i18next";
import { Box, MenuItem, Select, Stack } from "@mui/material";
import { useTheme } from "@emotion/react";
2025-02-09 07:52:31 -08:00
import "flag-icons/css/flag-icons.min.css";
import { useSelector } from "react-redux";
2025-05-30 15:03:32 -07:00
import { useDispatch } from "react-redux";
import { setLanguage } from "../Features/UI/uiSlice";
2025-02-07 01:59:54 +03:00
const LanguageSelector = () => {
const { i18n } = useTranslation();
const theme = useTheme();
const { language } = useSelector((state) => state.ui);
2025-05-30 15:03:32 -07:00
const dispatch = useDispatch();
2025-02-07 01:59:54 +03:00
const handleChange = (event) => {
const newLang = event.target.value;
2025-05-30 15:03:32 -07:00
dispatch(setLanguage(newLang));
2025-02-07 01:59:54 +03:00
};
const languages = Object.keys(i18n.options.resources || {});
return (
<Select
value={language}
onChange={handleChange}
size="small"
2025-05-27 10:09:12 -07:00
sx={{ minWidth: 80 }}
2025-02-07 01:59:54 +03:00
>
{languages.map((lang) => {
let parsedLang = lang === "en" ? "gb" : lang;
// Fix for Czech
if (parsedLang === "cs") {
parsedLang = "cz";
}
if (parsedLang.includes("-")) {
parsedLang = parsedLang.split("-")[1].toLowerCase();
}
const flag = parsedLang ? `fi fi-${parsedLang}` : null;
return (
<MenuItem
key={lang}
value={lang}
>
<Stack
direction="row"
2025-05-27 10:09:12 -07:00
spacing={theme.spacing(2)}
alignItems="center"
2025-02-07 01:59:54 +03:00
>
<Box
component="span"
sx={{
display: "flex",
alignItems: "center",
}}
>
{flag && <span className={flag} />}
</Box>
<Box
component="span"
2025-05-27 10:09:12 -07:00
sx={{ textTransform: "uppercase" }}
>
{lang}
</Box>
</Stack>
</MenuItem>
);
})}
2025-02-07 01:59:54 +03:00
</Select>
);
};
export default LanguageSelector;