-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlanguage.jsx
62 lines (47 loc) · 1.51 KB
/
language.jsx
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
import { useState, useEffect } from "react";
import pt from "../../public/languages/pt.json";
import en from "../../public/languages/en.json";
function useLanguage() {
const defaultLanguage = "pt";
const importedLanguages = { pt, en };
const [selectedLanguage, setSelectedLanguage] = useState(defaultLanguage);
const [language, setLanguage] = useState(importedLanguages[defaultLanguage]);
useEffect(() => {
const possibleLanguages = ["pt", "en"];
let userLanguage = (
navigator.userLanguage ||
navigator.language ||
defaultLanguage
).substring(0, 2);
if (!possibleLanguages.includes(userLanguage)) {
userLanguage = defaultLanguage;
}
if (!localStorage.getItem("language")) {
localStorage.setItem("language", userLanguage);
}
const storageLanguage = localStorage.getItem("language");
if (storageLanguage) setSelectedLanguage(storageLanguage);
}, []);
useEffect(() => {
let controller, signal;
async function fetchLanguage() {
controller = new AbortController();
signal = controller.signal;
const languageData = await fetch(
`/languages/${selectedLanguage}.json?v=6`,
{ signal }
)
.then((res) => res.json())
.catch(() => null);
if (languageData) {
setLanguage(languageData);
}
}
fetchLanguage();
return () => {
controller && controller.abort();
};
}, [selectedLanguage]);
return [language, setSelectedLanguage];
}
export default useLanguage;