From c707748be8364e94dcd192de0344d3c5e97d73bc Mon Sep 17 00:00:00 2001 From: im-adithya Date: Tue, 30 Jul 2024 20:34:32 +0530 Subject: [PATCH 1/5] feat: setup i18n --- frontend/package.json | 3 ++ frontend/src/components/LocaleSwitcher.tsx | 41 ++++++++++++++++ .../src/components/layouts/SettingsLayout.tsx | 2 +- frontend/src/i18n/i18nConfig.ts | 47 +++++++++++++++++++ frontend/src/i18n/locales/en/translation.json | 21 +++++++++ frontend/src/i18n/locales/hi/translation.json | 21 +++++++++ frontend/src/screens/settings/Settings.tsx | 27 ++++++++--- frontend/yarn.lock | 41 ++++++++++++++++ 8 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 frontend/src/components/LocaleSwitcher.tsx create mode 100644 frontend/src/i18n/i18nConfig.ts create mode 100644 frontend/src/i18n/locales/en/translation.json create mode 100644 frontend/src/i18n/locales/hi/translation.json diff --git a/frontend/package.json b/frontend/package.json index 2354ae04..196d5dfb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -46,11 +46,14 @@ "dayjs": "^1.11.10", "embla-carousel-react": "^8.0.2", "gradient-avatar": "^1.0.2", + "i18next": "^23.12.2", + "i18next-browser-languagedetector": "^8.0.0", "lucide-react": "^0.363.0", "posthog-js": "^1.116.6", "react": "^18.2.0", "react-day-picker": "^8.10.1", "react-dom": "^18.2.0", + "react-i18next": "^15.0.0", "react-lottie": "^1.2.4", "react-qr-code": "^2.0.12", "react-router-dom": "^6.21.0", diff --git a/frontend/src/components/LocaleSwitcher.tsx b/frontend/src/components/LocaleSwitcher.tsx new file mode 100644 index 00000000..6d440afd --- /dev/null +++ b/frontend/src/components/LocaleSwitcher.tsx @@ -0,0 +1,41 @@ +import type { FallbackLng } from "i18next"; +import { useState } from "react"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "src/components/ui/select"; +import { toast } from "src/components/ui/use-toast"; +import i18n, { supportedLocales } from "src/i18n/i18nConfig"; + +export default function LocaleSwitcher() { + const fallbackLng = i18n.options.fallbackLng?.[0 as keyof FallbackLng]; + const [dropdownLang, setDropdownLang] = useState( + i18n.language || fallbackLng + ); + + const languageHandler = async (newLanguage: string) => { + if (dropdownLang !== newLanguage) { + setDropdownLang(newLanguage); + i18n.changeLanguage(newLanguage); + toast({ title: "Language updated." }); + } + }; + + return ( + + ); +} diff --git a/frontend/src/components/layouts/SettingsLayout.tsx b/frontend/src/components/layouts/SettingsLayout.tsx index d5cf2dfe..167f346d 100644 --- a/frontend/src/components/layouts/SettingsLayout.tsx +++ b/frontend/src/components/layouts/SettingsLayout.tsx @@ -98,7 +98,7 @@ export default function SettingsLayout() {