diff --git a/web/public/locales/en/common.json b/web/public/locales/en/common.json index 0676d3e26..6083c7950 100644 --- a/web/public/locales/en/common.json +++ b/web/public/locales/en/common.json @@ -108,7 +108,33 @@ "languages": "Languages", "language": { "en": "English", + "es": "Español (Spanish)", "zhCN": "简体中文 (Simplified Chinese)", + "hi": "हिन्दी (Hindi)", + "fr": "Français (French)", + "ar": "العربية (Arabic)", + "pt": "Português (Portuguese)", + "ru": "Русский (Russian)", + "de": "Deutsch (German)", + "ja": "日本語 (Japanese)", + "tr": "Türkçe (Turkish)", + "it": "Italiano (Italian)", + "nl": "Nederlands (Dutch)", + "sv": "Svenska (Swedish)", + "cs": "Čeština (Czech)", + "nb": "Norsk Bokmål (Norwegian Bokmål)", + "ko": "한국어 (Korean)", + "vi": "Tiếng Việt (Vietnamese)", + "fa": "فارسی (Persian)", + "pl": "Polski (Polish)", + "uk": "Українська (Ukrainian)", + "he": "עברית (Hebrew)", + "el": "Ελληνικά (Greek)", + "ro": "Română (Romanian)", + "hu": "Magyar (Hungarian)", + "fi": "Suomi (Finnish)", + "da": "Dansk (Danish)", + "sk": "Slovenčina (Slovak)", "withSystem": { "label": "Use the system settings for language" } diff --git a/web/src/components/menu/GeneralSettings.tsx b/web/src/components/menu/GeneralSettings.tsx index f844b74ef..b769e75e8 100644 --- a/web/src/components/menu/GeneralSettings.tsx +++ b/web/src/components/menu/GeneralSettings.tsx @@ -331,6 +331,24 @@ export default function GeneralSettings({ className }: GeneralSettingsProps) { {t("menu.language.en")} )} + setLanguage("es")} + > + {language === "es" ? ( + <> + + {t("menu.language.es")} + + ) : ( + {t("menu.language.es")} + )} + )} + setLanguage("tr")} + > + {language === "tr" ? ( + <> + + {t("menu.language.tr")} + + ) : ( + {t("menu.language.tr")} + )} + diff --git a/web/src/components/ui/calendar.tsx b/web/src/components/ui/calendar.tsx index 34e4eac08..bddde6711 100644 --- a/web/src/components/ui/calendar.tsx +++ b/web/src/components/ui/calendar.tsx @@ -1,23 +1,43 @@ -import * as React from "react"; +import { useState, useEffect } from "react"; import { ChevronLeft, ChevronRight } from "lucide-react"; import { DayPicker } from "react-day-picker"; -import { enUS, Locale, zhCN } from "date-fns/locale"; +import { Locale, enUS } from "date-fns/locale"; import { cn } from "@/lib/utils"; import { buttonVariants } from "@/components/ui/button"; import i18n from "@/utils/i18n"; export type CalendarProps = React.ComponentProps; - -let locale: Locale; -switch(i18n.language) { - case "zh-CN": - locale = zhCN; - break; - default: - locale = enUS; - break; -} +// Map of locale codes to dynamic import functions +const localeMap: Record Promise> = { + "zh-CN": () => import("date-fns/locale/zh-CN").then((module) => module.zhCN), + es: () => import("date-fns/locale/es").then((module) => module.es), + hi: () => import("date-fns/locale/hi").then((module) => module.hi), + fr: () => import("date-fns/locale/fr").then((module) => module.fr), + ar: () => import("date-fns/locale/ar").then((module) => module.ar), + pt: () => import("date-fns/locale/pt").then((module) => module.pt), + ru: () => import("date-fns/locale/ru").then((module) => module.ru), + de: () => import("date-fns/locale/de").then((module) => module.de), + ja: () => import("date-fns/locale/ja").then((module) => module.ja), + tr: () => import("date-fns/locale/tr").then((module) => module.tr), + it: () => import("date-fns/locale/it").then((module) => module.it), + nl: () => import("date-fns/locale/nl").then((module) => module.nl), + sv: () => import("date-fns/locale/sv").then((module) => module.sv), + cs: () => import("date-fns/locale/cs").then((module) => module.cs), + nb: () => import("date-fns/locale/nb").then((module) => module.nb), + ko: () => import("date-fns/locale/ko").then((module) => module.ko), + vi: () => import("date-fns/locale/vi").then((module) => module.vi), + fa: () => import("date-fns/locale/fa-IR").then((module) => module.faIR), + pl: () => import("date-fns/locale/pl").then((module) => module.pl), + uk: () => import("date-fns/locale/uk").then((module) => module.uk), + he: () => import("date-fns/locale/he").then((module) => module.he), + el: () => import("date-fns/locale/el").then((module) => module.el), + ro: () => import("date-fns/locale/ro").then((module) => module.ro), + hu: () => import("date-fns/locale/hu").then((module) => module.hu), + fi: () => import("date-fns/locale/fi").then((module) => module.fi), + da: () => import("date-fns/locale/da").then((module) => module.da), + sk: () => import("date-fns/locale/sk").then((module) => module.sk), +}; function Calendar({ className, @@ -25,6 +45,26 @@ function Calendar({ showOutsideDays = true, ...props }: CalendarProps) { + const [locale, setLocale] = useState(enUS); + + useEffect(() => { + const loadLocale = async () => { + if (i18n.language === "en") { + setLocale(enUS); + return; + } + + const localeLoader = localeMap[i18n.language]; + if (localeLoader) { + const loadedLocale = await localeLoader(); + setLocale(loadedLocale); + } else { + setLocale(enUS); + } + }; + loadLocale(); + }, [i18n.language]); + return (