story-research-zapwall/features/language-preference-settings.md
Nicolas Cantu f5d9033183 Refactor to use cache-first architecture with background sync
**Motivations:**
- total_sponsoring should be calculated from cache, not stored in tags
- Author searches should use cache first, not query Nostr directly
- All elements should be read/written from/to database
- Background sync should scan all notes with service='zapwall.fr' tag and update cache
- Sync should run at startup and resume on each page navigation

**Root causes:**
- total_sponsoring was stored in tags which required updates on every sponsoring payment
- Author queries were querying Nostr directly instead of using cache
- No background sync service to keep cache up to date with new notes

**Correctifs:**
- Removed totalSponsoring from AuthorTags interface and buildAuthorTags
- Modified getAuthorSponsoring to calculate from cache (sponsoring queries) instead of tags
- Modified parsePresentationEvent to set totalSponsoring to 0 (calculated on demand from cache)
- Modified fetchAuthorByHashId and fetchAuthorPresentationFromPool to use cache first and calculate totalSponsoring from cache
- Created platformSyncService that scans all notes with service='zapwall.fr' tag and caches them
- Modified _app.tsx to start continuous sync on mount and resume on page navigation
- All author presentations now calculate totalSponsoring from cache when loaded

**Evolutions:**
- Cache-first architecture: all queries check cache before querying Nostr
- Background sync service keeps cache up to date automatically
- totalSponsoring is always calculated from actual sponsoring data in cache
- Better performance: cache queries are faster than Nostr queries
- Non-blocking sync: background sync doesn't block UI

**Pages affectées:**
- lib/nostrTagSystemTypes.ts
- lib/nostrTagSystemBuild.ts
- lib/articlePublisherHelpersPresentation.ts
- lib/sponsoring.ts
- lib/authorQueries.ts
- lib/platformSync.ts (new)
- pages/_app.tsx
2026-01-06 15:04:14 +01:00

77 lines
3.4 KiB
Markdown

# Language preference selector in settings
## Date
2025-01-27
## Objectif
Permettre aux utilisateurs de configurer leur langue de préférence (fr/en) dans la page des paramètres, avec chargement automatique au démarrage de l'application depuis localStorage.
## Motivations
- Centraliser la gestion de la langue dans la page des paramètres
- Permettre aux utilisateurs de changer facilement leur langue préférée
- Charger automatiquement la préférence de langue au démarrage pour configurer l'application
- Utiliser localStorage pour un accès plus rapide et synchrone
## Impacts
- **Utilisateurs** : Peuvent maintenant configurer leur langue préférée dans les paramètres
- **Performance** : Chargement synchrone depuis localStorage au démarrage (plus rapide qu'IndexedDB)
- **Cohérence** : Tous les composants utilisent maintenant localStorage pour la langue
## Modifications
### Fichiers créés
- **`components/LanguageSettingsManager.tsx`** : Composant de gestion de la langue dans les paramètres avec sélection fr/en
### Fichiers modifiés
- **`pages/settings.tsx`** : Ajout du composant LanguageSettingsManager en première position
- **`pages/_app.tsx`** : Modification pour charger la langue depuis localStorage de manière synchrone au démarrage
- **`hooks/useI18n.ts`** : Migration de IndexedDB vers localStorage pour la langue
- **`components/LanguageSelector.tsx`** : Migration de IndexedDB vers localStorage pour la cohérence
- **`locales/fr.txt`** : Ajout des traductions pour les paramètres de langue
- **`locales/en.txt`** : Ajout des traductions pour les paramètres de langue
### Fonctionnalités implémentées
#### Composant LanguageSettingsManager
- Affichage de la langue actuelle
- Boutons pour sélectionner français ou anglais
- Sauvegarde automatique dans localStorage
- Rechargement de la page après changement pour appliquer les traductions
#### Chargement au démarrage
- Lecture synchrone depuis localStorage dans `_app.tsx`
- Détection de la langue du navigateur en fallback
- Configuration de la locale avant le chargement des traductions
#### Migration vers localStorage
- Remplacement de IndexedDB par localStorage pour la langue
- Accès synchrone plus rapide
- Compatibilité avec tous les navigateurs
## Traductions ajoutées
### Français (fr.txt)
- `settings.language.title` : Langue de préférence
- `settings.language.description` : Choisissez votre langue préférée pour l'interface
- `settings.language.loading` : Chargement...
- `settings.language.french` : Français
- `settings.language.english` : Anglais
### Anglais (en.txt)
- `settings.language.title` : Preferred Language
- `settings.language.description` : Choose your preferred language for the interface
- `settings.language.loading` : Loading...
- `settings.language.french` : French
- `settings.language.english` : English
## Modalités de déploiement
1. Les modifications sont rétrocompatibles
2. Les utilisateurs existants avec une préférence dans IndexedDB devront la reconfigurer (migration automatique possible si nécessaire)
3. Aucune action spéciale requise, déploiement standard
## Modalités d'analyse
- Vérifier que la langue est bien chargée au démarrage dans localStorage
- Tester le changement de langue depuis les paramètres
- Vérifier que le sélecteur dans le header fonctionne toujours correctement
- Confirmer que les traductions sont appliquées après changement de langue