From 91ffe46863524dd93afde88c2afe49e75e591117 Mon Sep 17 00:00:00 2001 From: Doh Date: Sun, 18 May 2025 09:00:48 -0400 Subject: [PATCH] Added i18n support (#129) --- CHANGELOG.md | 7 + README.md | 1 + app/layout.tsx | 35 +- app/settings/page.tsx | 84 +++-- components/AboutModal.tsx | 10 +- components/AddEditHabitModal.tsx | 30 +- components/AddEditWishlistItemModal.tsx | 30 +- components/CoinBalance.tsx | 4 +- components/CoinsManager.tsx | 61 ++-- components/CompletionCountBadge.tsx | 6 +- components/ConfirmDialog.tsx | 13 +- components/DailyOverview.tsx | 42 +-- components/Dashboard.tsx | 6 +- components/HabitCalendar.tsx | 18 +- components/HabitContextMenuItems.tsx | 20 +- components/HabitItem.tsx | 26 +- components/HabitList.tsx | 38 +-- components/HabitStreak.tsx | 15 +- components/Navigation.tsx | 28 +- components/NotificationBell.tsx | 4 +- components/NotificationDropdown.tsx | 53 ++- components/PasswordEntryForm.tsx | 16 +- components/PermissionSelector.tsx | 25 +- components/PomodoroTimer.tsx | 121 ++++--- components/Profile.tsx | 26 +- components/TodayEarnedCoins.tsx | 4 +- components/TransactionNoteEditor.tsx | 24 +- components/UserForm.tsx | 45 +-- components/UserSelectModal.tsx | 31 +- components/ViewToggle.tsx | 9 +- components/WishlistItem.tsx | 31 +- components/WishlistManager.tsx | 22 +- hooks/useCoins.tsx | 36 ++- hooks/useHabits.tsx | 85 ++--- hooks/useWishlist.tsx | 40 +-- i18n/request.ts | 13 + lib/types.ts | 2 + messages/de.json | 407 ++++++++++++++++++++++++ messages/en.json | 407 ++++++++++++++++++++++++ messages/es.json | 407 ++++++++++++++++++++++++ messages/fr.json | 407 ++++++++++++++++++++++++ messages/ja.json | 407 ++++++++++++++++++++++++ messages/ru.json | 407 ++++++++++++++++++++++++ messages/zh.json | 407 ++++++++++++++++++++++++ next.config.ts | 4 +- package-lock.json | 141 +++++++- package.json | 3 +- 47 files changed, 3603 insertions(+), 455 deletions(-) create mode 100644 i18n/request.ts create mode 100644 messages/de.json create mode 100644 messages/en.json create mode 100644 messages/es.json create mode 100644 messages/fr.json create mode 100644 messages/ja.json create mode 100644 messages/ru.json create mode 100644 messages/zh.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b9353e..90852a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## Version 0.2.12 + +### Added + +* 🌍 Added multi-language support! Users can now select their preferred language in settings. +* Supported languages: English, Español (Spanish), Deutsch (German), Français (French), Русский (Russian), 简体中文 (Simplified Chinese) and 日本語 (Japanese). + ## Version 0.2.11 ### Added diff --git a/README.md b/README.md index 602f016..ecd0cc1 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ Want to try HabitTrove before installing? Visit the public [demo instance](https - 💰 Create a wishlist of rewards to redeem with earned coins - 📊 View your habit completion streaks and statistics - 📅 Calendar heatmap to visualize your progress (WIP) +- 🌍 Multi-language support (English, Español, Deutsch, Français, Русский, 简体中文, 日本語) - 🌙 Dark mode support - 📲 Progressive Web App (PWA) support - 💾 Automatic daily backups with rotation diff --git a/app/layout.tsx b/app/layout.tsx index 169bb47..d7bdd52 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -9,6 +9,8 @@ import Layout from '@/components/Layout' import { Toaster } from '@/components/ui/toaster' import { ThemeProvider } from "@/components/theme-provider" import { SessionProvider } from 'next-auth/react' +import { NextIntlClientProvider } from 'next-intl'; +import { getLocale, getMessages } from 'next-intl/server'; // Inter (clean, modern, excellent readability) @@ -37,6 +39,11 @@ export default async function RootLayout({ }: { children: React.ReactNode }) { + const locale = await getLocale(); + // Providing all messages to the client + // side is the easiest way to get started + const messages = await getMessages(); + const [initialSettings, initialHabits, initialCoins, initialWishlist, initialUsers, initialServerSettings] = await Promise.all([ loadSettings(), loadHabitsData(), @@ -48,7 +55,7 @@ export default async function RootLayout({ return ( // set suppressHydrationWarning to true to prevent hydration errors when using ThemeProvider (https://ui.shadcn.com/docs/dark-mode/next) - +