aboutsummaryrefslogtreecommitdiffstats
path: root/excalidraw-app/app-language
diff options
context:
space:
mode:
Diffstat (limited to 'excalidraw-app/app-language')
-rw-r--r--excalidraw-app/app-language/LanguageList.tsx25
-rw-r--r--excalidraw-app/app-language/language-detector.ts25
-rw-r--r--excalidraw-app/app-language/language-state.ts15
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;
+};