Lang selector

This commit is contained in:
2023-09-01 13:35:07 +01:00
parent 5a90164922
commit 0c06f88a2d
4 changed files with 81 additions and 7 deletions

33
src/hooks/lang.ts Normal file
View File

@ -0,0 +1,33 @@
import { ExternalStore } from "@snort/shared";
import { useSyncExternalStore } from "react";
export const DefaultLocale = "en";
class LangStore extends ExternalStore<string> {
setLang(lang: string) {
localStorage.setItem("lang", lang);
this.notifyChange();
}
takeSnapshot(): string {
return localStorage.getItem("lang") ?? getLocale();
}
}
const LangSelector = new LangStore();
export function useLang() {
const store = useSyncExternalStore(
c => LangSelector.hook(c),
() => LangSelector.snapshot()
);
return {
lang: store,
setLang: (l: string) => LangSelector.setLang(l),
};
}
export const getLocale = () => {
return (navigator.languages && navigator.languages[0]) ?? navigator.language ?? DefaultLocale;
};