feat(i18n): Complete internationalization with timezone fixes and language switching

Completes full internationalization coverage for the webmail application with enhanced language support:

- Replace all remaining hardcoded English strings with translation keys
- Add timezone auto-detection to prevent hydration mismatches
- Enable instant client-side language switching without page reload
- Add 60+ new translation keys in English and French locales
- Improve language switcher component with proper state management
- Add health check endpoint for container orchestration

All user-facing text now supports English and French with no hardcoded fallbacks, providing a fully localized experience.
This commit is contained in:
Matthieu MALVACHE
2026-01-08 04:29:19 +01:00
committed by Matthieu MALVACHE
parent b2b479359f
commit 0d68851b63
20 changed files with 638 additions and 192 deletions
+7
View File
@@ -9,6 +9,9 @@ interface UIState {
activeView: ActiveView;
sidebarOpen: boolean;
// Tablet list visibility (auto-hide when email selected)
tabletListVisible: boolean;
// Device detection (hydrated client-side)
isMobile: boolean;
isTablet: boolean;
@@ -18,6 +21,7 @@ interface UIState {
setActiveView: (view: ActiveView) => void;
setSidebarOpen: (open: boolean) => void;
toggleSidebar: () => void;
setTabletListVisible: (visible: boolean) => void;
setDeviceType: (isMobile: boolean, isTablet: boolean, isDesktop: boolean) => void;
// Navigation helpers
@@ -30,6 +34,7 @@ export const useUIStore = create<UIState>((set, get) => ({
// Initial state (SSR-safe defaults)
activeView: "list",
sidebarOpen: false,
tabletListVisible: true,
isMobile: false,
isTablet: false,
isDesktop: true,
@@ -41,6 +46,8 @@ export const useUIStore = create<UIState>((set, get) => ({
toggleSidebar: () => set((state) => ({ sidebarOpen: !state.sidebarOpen })),
setTabletListVisible: (visible) => set({ tabletListVisible: visible }),
setDeviceType: (isMobile, isTablet, isDesktop) =>
set({ isMobile, isTablet, isDesktop }),