Skip to content

Commit eddbc45

Browse files
committed
feat: implement LanguageSelector component and integrate language detection
1 parent 30b60ba commit eddbc45

3 files changed

Lines changed: 80 additions & 27 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import React, { useState } from "react";
2+
import { useTranslation } from "react-i18next";
3+
import { FormControl, Select, MenuItem, Box } from "@mui/material";
4+
import LanguageIcon from "@mui/icons-material/Language";
5+
6+
export default function LanguageSelector() {
7+
const { i18n } = useTranslation();
8+
const [language, setLanguage] = useState(i18n.language);
9+
10+
const handleLanguageChange = (event) => {
11+
const newLanguage = event.target.value;
12+
i18n.changeLanguage(newLanguage);
13+
setLanguage(newLanguage);
14+
};
15+
16+
return (
17+
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
18+
<LanguageIcon sx={{ color: "text.secondary" }} />
19+
<FormControl size="small" sx={{ minWidth: 120 }}>
20+
<Select
21+
value={language}
22+
onChange={handleLanguageChange}
23+
displayEmpty
24+
sx={{
25+
"& .MuiSelect-select": {
26+
display: "flex",
27+
alignItems: "center",
28+
gap: 1,
29+
},
30+
}}
31+
>
32+
<MenuItem value="es">
33+
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
34+
<span>🇪🇸</span>
35+
<span>Español</span>
36+
</Box>
37+
</MenuItem>
38+
<MenuItem value="en">
39+
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
40+
<span>🇬🇧</span>
41+
<span>English</span>
42+
</Box>
43+
</MenuItem>
44+
</Select>
45+
</FormControl>
46+
</Box>
47+
);
48+
}

DashAI/front/src/components/ResponsiveAppBar.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { Link as RouterLink, useLocation } from "react-router-dom";
1414
import { useTheme } from "@mui/material/styles";
1515
import HomeIcon from "@mui/icons-material/HomeOutlined";
1616
import { useTranslation } from "react-i18next";
17+
import LanguageSelector from "./LanguageSelector";
1718

1819
function ResponsiveAppBar() {
1920
const theme = useTheme();
@@ -124,6 +125,7 @@ function ResponsiveAppBar() {
124125
</Button>
125126
))}
126127
</Box>
128+
<LanguageSelector />
127129
</Toolbar>
128130
</Container>
129131
</AppBar>

DashAI/front/src/utils/i18n/index.js

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import i18n from "i18next";
22
import { initReactI18next } from "react-i18next";
3+
import LanguageDetector from "i18next-browser-languagedetector";
34
import configurableObjectEN from "./locales/en/configurableObject.json";
45
import configurableObjectES from "./locales/es/configurableObject.json";
56
import commonEN from "./locales/en/common.json";
@@ -71,34 +72,36 @@ const resources = {
7172
},
7273
};
7374

74-
i18n.use(initReactI18next).init({
75-
resources,
75+
i18n
76+
.use(LanguageDetector)
77+
.use(initReactI18next)
78+
.init({
79+
resources,
80+
supportedLngs: ["en", "es"],
81+
fallbackLng: "en",
7682

77-
lng: "en",
78-
fallbackLng: "en",
83+
ns: [
84+
"common",
85+
"custom",
86+
"configurableObject",
87+
"experiments",
88+
"explainers",
89+
"generative",
90+
"models",
91+
"datasets",
92+
"prediction",
93+
"home",
94+
"homeTour",
95+
"datasetsTour",
96+
"notebookTour",
97+
"modelsTour",
98+
"modelsSessionTour",
99+
],
100+
defaultNS: "common",
79101

80-
ns: [
81-
"common",
82-
"custom",
83-
"configurableObject",
84-
"experiments",
85-
"explainers",
86-
"generative",
87-
"models",
88-
"datasets",
89-
"prediction",
90-
"home",
91-
"homeTour",
92-
"datasetsTour",
93-
"notebookTour",
94-
"modelsTour",
95-
"modelsSessionTour",
96-
],
97-
defaultNS: "common",
98-
99-
interpolation: {
100-
escapeValue: false,
101-
},
102-
});
102+
interpolation: {
103+
escapeValue: false,
104+
},
105+
});
103106

104107
export default i18n;

0 commit comments

Comments
 (0)