diff options
Diffstat (limited to 'excalidraw-app/app-language')
| -rw-r--r-- | excalidraw-app/app-language/LanguageList.tsx | 25 | ||||
| -rw-r--r-- | excalidraw-app/app-language/language-detector.ts | 25 | ||||
| -rw-r--r-- | excalidraw-app/app-language/language-state.ts | 15 |
3 files changed, 65 insertions, 0 deletions
diff --git a/excalidraw-app/app-language/LanguageList.tsx b/excalidraw-app/app-language/LanguageList.tsx new file mode 100644 index 0000000..001d4ea --- /dev/null +++ b/excalidraw-app/app-language/LanguageList.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import { useI18n, languages } from "@excalidraw/excalidraw/i18n"; +import { useSetAtom } from "../app-jotai"; +import { appLangCodeAtom } from "./language-state"; + +export const LanguageList = ({ style }: { style?: React.CSSProperties }) => { + const { t, langCode } = useI18n(); + const setLangCode = useSetAtom(appLangCodeAtom); + + return ( + <select + className="dropdown-select dropdown-select__language" + onChange={({ target }) => setLangCode(target.value)} + value={langCode} + aria-label={t("buttons.selectLanguage")} + style={style} + > + {languages.map((lang) => ( + <option key={lang.code} value={lang.code}> + {lang.label} + </option> + ))} + </select> + ); +}; diff --git a/excalidraw-app/app-language/language-detector.ts b/excalidraw-app/app-language/language-detector.ts new file mode 100644 index 0000000..52da490 --- /dev/null +++ b/excalidraw-app/app-language/language-detector.ts @@ -0,0 +1,25 @@ +import LanguageDetector from "i18next-browser-languagedetector"; +import { defaultLang, languages } from "@excalidraw/excalidraw"; + +export const languageDetector = new LanguageDetector(); + +languageDetector.init({ + languageUtils: {}, +}); + +export const getPreferredLanguage = () => { + const detectedLanguages = languageDetector.detect(); + + const detectedLanguage = Array.isArray(detectedLanguages) + ? detectedLanguages[0] + : detectedLanguages; + + const initialLanguage = + (detectedLanguage + ? // region code may not be defined if user uses generic preferred language + // (e.g. chinese vs instead of chinese-simplified) + languages.find((lang) => lang.code.startsWith(detectedLanguage))?.code + : null) || defaultLang.code; + + return initialLanguage; +}; diff --git a/excalidraw-app/app-language/language-state.ts b/excalidraw-app/app-language/language-state.ts new file mode 100644 index 0000000..f491c22 --- /dev/null +++ b/excalidraw-app/app-language/language-state.ts @@ -0,0 +1,15 @@ +import { useEffect } from "react"; +import { atom, useAtom } from "../app-jotai"; +import { getPreferredLanguage, languageDetector } from "./language-detector"; + +export const appLangCodeAtom = atom(getPreferredLanguage()); + +export const useAppLangCode = () => { + const [langCode, setLangCode] = useAtom(appLangCodeAtom); + + useEffect(() => { + languageDetector.cacheUserLanguage(langCode); + }, [langCode]); + + return [langCode, setLangCode] as const; +}; |
