-
-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathLanguageSwitcher.tsx
More file actions
121 lines (113 loc) · 3.07 KB
/
LanguageSwitcher.tsx
File metadata and controls
121 lines (113 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { type JSX, memo, useMemo } from "react";
import { useTranslation } from "react-i18next";
import PopoverDropdown from "../components/PopoverDropdown.js";
import bg from "./flags/bg.png";
import ca from "./flags/ca.png";
import chs from "./flags/cn.png";
import cs from "./flags/cz.png";
import da from "./flags/da.png";
import de from "./flags/de.png";
import es from "./flags/es.png";
import eu from "./flags/eu.png";
import fi from "./flags/fi.png";
import fr from "./flags/fr.png";
import hu from "./flags/hu.png";
import it from "./flags/it.png";
import ko from "./flags/kr.png";
import missing from "./flags/missing-locale.png";
import nl from "./flags/nl.png";
import no from "./flags/no.png";
import pl from "./flags/pl.png";
import ptbr from "./flags/ptbr.png";
import ru from "./flags/ru.png";
import sv from "./flags/sv.png";
import tr from "./flags/tr.png";
import zh from "./flags/tw.png";
import ua from "./flags/ua.png";
import en from "./flags/uk.png";
const LOCALES_MAP = {
bg,
ca,
"zh-CN": chs,
cs,
da,
de,
es,
eu,
fi,
fr,
hu,
it,
ko,
nl,
no,
pl,
ptbr,
ru,
sv,
tr,
zh,
ua,
en,
};
const LOCALES_NAMES_MAP = {
bg: "Български",
ca: "Català",
"zh-CN": "简体中文",
cs: "Česky",
da: "Dansk",
de: "Deutsch",
es: "Español",
eu: "Euskera",
fi: "Suomi",
fr: "Français",
hu: "Magyar",
it: "Italiano",
ko: "한국어",
nl: "Nederlands",
no: "Norsk",
pl: "Polski",
ptbr: "Brazilian Portuguese",
ru: "Русский",
sv: "Svenska",
tr: "Türkçe",
zh: "繁體中文",
ua: "Українська",
en: "English",
};
const LanguageSwitcher = memo(() => {
const { i18n } = useTranslation("localeNames");
const currentLanguage = useMemo(() => (LOCALES_MAP[i18n.language] ? i18n.language : i18n.language.split("-")[0]), [i18n.language]);
const children = useMemo(() => {
const languages: JSX.Element[] = [];
for (const language in i18n.options.resources ?? []) {
languages.push(
<li
key={language}
onClick={async () => await i18n.changeLanguage(language)}
onKeyUp={async (e) => {
if (e.key === "enter") {
await i18n.changeLanguage(language);
}
}}
>
<span className="btn btn-block btn-ghost">{LOCALES_NAMES_MAP[language]}</span>
</li>,
);
}
return languages;
}, [i18n.changeLanguage, i18n.options.resources]);
return (
<PopoverDropdown
name="locale-picker"
buttonChildren={
<img src={LOCALES_MAP[currentLanguage] ?? missing} alt={LOCALES_NAMES_MAP[currentLanguage]} style={{ maxWidth: "80%" }} />
}
buttonStyle="mx-1"
dropdownStyle="dropdown-end"
>
{children}
</PopoverDropdown>
);
});
export default LanguageSwitcher;