I have a select with 2 options (en, no), which switches the language onChange.
I store selected language to localStorage
. Because I’m using Remix I cannot simply access localStorage, because of the server-side rendering, so I’m using:
JavaScript
x
4
1
if (typeof window !== 'undefined') {
2
const localLanguage = localStorage.getItem('language');
3
}
4
Select component:
JavaScript
1
14
14
1
<select
2
name="language"
3
id="language-select"
4
defaultValue={language}
5
onChange={e => changeLanguageHandler(e.target.value)}
6
>
7
<option value="no" label="NO">
8
Norwegian
9
</option>
10
<option value="en" label="EN">
11
English
12
</option>
13
</select>
14
Translation function:
JavaScript
1
44
44
1
export function useLocalTranslation() {
2
const [language, setLanguage] = React.useState(() => {
3
// react lazy initial state
4
// ( i think i should be using lazy initial state, because of the serverside rendering
5
if (typeof window !== 'undefined') {
6
const initialState = localStorage.getItem('language') ?? 'no';
7
return initialState;
8
}
9
});
10
const no = useNoTranslations();
11
12
React.useEffect(() => {
13
const savedLanguage = localStorage.getItem('language');
14
if (savedLanguage) {
15
setLanguage(savedLanguage);
16
}
17
}, []);
18
19
const t = React.useCallback(
20
(key: TKey) => {
21
if (key === '0') return '0';
22
23
if (typeof window !== 'undefined') {
24
const currentLanguage = localStorage.getItem('language');
25
26
if (currentLanguage === 'no') {
27
// console.log(currentLanguage);
28
return no?.[key as string] ?? en[key as TranslationsKeys] ?? key;
29
}
30
// console.log(currentLanguage);
31
}
32
return en[key as TranslationsKeys] ?? key;
33
},
34
[no],
35
);
36
37
function changeLanguageHandler(lang: string) {
38
setLanguage(lang);
39
localStorage.setItem('language', lang);
40
}
41
42
return { t, language, changeLanguageHandler };
43
}
44
My goal is to have selected option saved and persistent on page refresh, now when I refresh the page, it gets reseted to NO (Norwegian)
Advertisement
Answer
I guess you can solve this by giving value attribute instead of defaultValue.