Guide du Système de Cache des Traductions
Version : 1.0 Date : 2026-01-25 Story : Epic 5, Story 5.1
Vue d'ensemble
Le système de cache des traductions améliore les performances de l'application en mettant en cache les traductions JSON (interface) et les traductions BDD (modèles traduisibles). Le cache est automatiquement invalidé lors des modifications des modèles traduisibles.
1. Configuration
Activation du cache
Le cache est activé par défaut. Vous pouvez le configurer dans config/translations.php ou via les variables d'environnement :
Fichier : .env
Activer/désactiver le cache
TRANSLATIONS_CACHE_ENABLED=trueDurée de vie du cache en secondes (défaut: 86400 = 24 heures)
TRANSLATIONS_CACHE_TTL=86400Store de cache à utiliser (optionnel, utilise le store par défaut si null)
TRANSLATIONS_CACHE_STORE=null
Fichier : config/translations.php
'cache' => [
'enabled' => env('TRANSLATIONS_CACHE_ENABLED', true),
'ttl' => env('TRANSLATIONS_CACHE_TTL', 86400),
'store' => env('TRANSLATIONS_CACHE_STORE', null),
],
2. Fonctionnement
Cache des traductions JSON (interface)
Les fichiers JSON de traduction (lang/*.json) sont automatiquement mis en cache lors de leur première lecture. Le cache est utilisé pour toutes les lectures suivantes jusqu'à expiration ou invalidation.
Clé de cache : translations.json.{locale}
Exemple : translations.json.fr, translations.json.es
Cache des traductions BDD (modèles)
Les traductions des modèles utilisant le trait ConditionallyTranslatable sont automatiquement mises en cache lors de l'appel à getTranslation(). Le cache est utilisé pour toutes les lectures suivantes jusqu'à expiration ou invalidation.
Clé de cache : translations.db.{ModelName}.{modelId}.{field}.{locale}
Exemple : translations.db.Post.123.title.fr
Invalidation automatique
Le cache est automatiquement invalidé lors des événements suivants sur les modèles traduisibles :
- Création : Le cache est invalidé (bien que le modèle n'ait pas encore d'ID, donc pas de cache à invalider)
- Mise à jour : Le cache du modèle est invalidé
- Suppression : Le cache du modèle est invalidé
- Restauration : Le cache du modèle est invalidé
L'invalidation est gérée par l'observer TranslatableModelObserver qui est automatiquement enregistré pour tous les modèles traduisibles.
3. Utilisation
Utilisation automatique
Le cache fonctionne automatiquement. Aucune modification de code n'est nécessaire. Les traductions sont mises en cache et récupérées depuis le cache de manière transparente.
Exemple :
use App\Models\Page;$page = Page::find(1);
// Première lecture : mise en cache
$titleFr = $page->getTranslation('title', 'fr');
// Deuxième lecture : depuis le cache
$titleFr = $page->getTranslation('title', 'fr'); // Plus rapide !
Service de cache
Si vous avez besoin d'accéder directement au service de cache :
use App\Services\TranslationCacheService;$cacheService = app(TranslationCacheService::class);
// Récupérer les traductions JSON
$jsonTranslations = $cacheService->getJsonTranslations('fr');
// Invalider le cache JSON pour une locale
$cacheService->invalidateJsonCache('fr');
// Invalider le cache JSON pour toutes les locales
$cacheService->invalidateJsonCache();
// Invalider le cache BDD pour un modèle
$cacheService->invalidateModelCache(Page::class, $pageId);
// Vider tout le cache
$cacheService->clearAll();
4. Commande Artisan
Vider le cache
Vider tout le cache des traductions
php artisan translate:clear-cacheVider uniquement le cache JSON
php artisan translate:clear-cache --jsonVider uniquement le cache BDD
php artisan translate:clear-cache --dbVider le cache pour une locale spécifique
php artisan translate:clear-cache --locale=fr
Options disponibles
--json : Vide uniquement le cache des traductions JSON--db : Vide uniquement le cache des traductions BDD--locale=LOCALE : Vide le cache pour une locale spécifique5. Drivers de cache supportés
Le système de cache fonctionne avec tous les drivers de cache Laravel :
Note : Pour les drivers qui supportent les tags (Redis, Memcached), l'invalidation est plus précise. Pour les autres drivers (database, file), l'invalidation peut vider tout le cache.
6. Cas d'usage
Cas 1 : Cache activé (par défaut)
TRANSLATIONS_CACHE_ENABLED=true
Comportement :
Cas 2 : Cache désactivé
TRANSLATIONS_CACHE_ENABLED=false
Comportement :
Cas 3 : TTL personnalisé
TRANSLATIONS_CACHE_TTL=3600 # 1 heure
Comportement :
7. Performance
Amélioration attendue
Le cache améliore significativement les performances, surtout pour :
Tests de performance
Des tests de performance sont disponibles dans tests/Feature/TranslationCachePerformanceTest.php. Pour les exécuter :
Exécuter les tests de performance (marqués avec ->skip() par défaut)
php artisan test --filter="TranslationCachePerformanceTest"
8. Dépannage
Le cache ne se met pas à jour après modification
Problème : Les modifications d'un modèle ne sont pas reflétées dans le cache.
Solution :
TRANSLATIONS_CACHE_ENABLED=trueAppServiceProviderphp artisan translate:clear-cacheLe cache est trop volumineux
Problème : Le cache prend trop de place.
Solution :
TRANSLATIONS_CACHE_TTL=3600php artisan translate:clear-cacheLe cache ne fonctionne pas avec certains drivers
Problème : L'invalidation ne fonctionne pas correctement avec certains drivers.
Solution :
database et file ne supportent pas l'invalidation par pattern. Dans ce cas, tout le cache est vidé lors de l'invalidation.9. Architecture technique
Composants
app/Services/TranslationCacheService.php)app/Observers/TranslatableModelObserver.php)created, updated, deleted, restored, forceDeletedapp/Specifics/Shares/Models/Concerns/ConditionallyTranslatable.php)getTranslation() pour utiliser le cache
- Utilise Cache::remember() pour gérer automatiquement le cacheapp/Console/Commands/TranslateClearCacheCommand.php)Flux de données
┌─────────────────┐
│ getTranslation │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Cache activé ? │───Non───► Lecture directe depuis BDD
└────────┬────────┘
│ Oui
▼
┌─────────────────┐
│ Clé en cache ? │───Oui───► Retour depuis cache
└────────┬────────┘
│ Non
▼
┌─────────────────┐
│ Lecture BDD │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Mise en cache │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Retour valeur │
└─────────────────┘
10. Exemples de code
Exemple 1 : Utilisation basique
use App\Models\Page;$page = Page::find(1);
// Le cache est utilisé automatiquement
$titleFr = $page->getTranslation('title', 'fr');
$titleEs = $page->getTranslation('title', 'es');
Exemple 2 : Invalidation manuelle
use App\Services\TranslationCacheService;$cacheService = app(TranslationCacheService::class);
// Invalider le cache pour une page spécifique
$cacheService->invalidateModelCache(Page::class, 1);
// Invalider le cache JSON pour le français
$cacheService->invalidateJsonCache('fr');
Exemple 3 : Vider le cache via commande
Dans un script de déploiement
php artisan translate:clear-cacheOu via code
Artisan::call('translate:clear-cache');
11. FAQ
Q : Le cache est-il activé par défaut ?
R : Oui, le cache est activé par défaut. Vous pouvez le désactiver avec TRANSLATIONS_CACHE_ENABLED=false.
Q : Comment vider le cache manuellement ?
R : Utilisez la commande php artisan translate:clear-cache ou appelez Cache::flush() (vide tout le cache Laravel).
Q : Le cache est-il invalidé automatiquement ?
R : Oui, le cache est automatiquement invalidé lors de la création, mise à jour, suppression ou restauration d'un modèle traduisible.
Q : Puis-je désactiver le cache pour certains modèles ?
R : Non, le cache est global. Si vous devez désactiver le cache, désactivez-le pour toute l'application via TRANSLATIONS_CACHE_ENABLED=false.
Q : Le cache fonctionne-t-il avec tous les drivers de cache Laravel ?
R : Oui, mais l'invalidation est plus précise avec Redis et Memcached qui supportent les tags. Avec les autres drivers, l'invalidation peut vider tout le cache.
Q : Comment mesurer l'amélioration de performance ?
R : Utilisez les tests de performance dans tests/Feature/TranslationCachePerformanceTest.php ou mesurez manuellement avec microtime(true).
12. Tests
Des tests complets sont disponibles dans :
tests/Feature/TranslationCacheTest.php (19 tests)tests/Feature/TranslationCachePerformanceTest.php (3 tests)Pour exécuter les tests :
Tous les tests de cache
php artisan test --filter="TranslationCache"Tests fonctionnels uniquement
php artisan test tests/Feature/TranslationCacheTest.phpTests de performance (marqués avec ->skip() par défaut)
php artisan test tests/Feature/TranslationCachePerformanceTest.php
13. Support et ressources
app/Services/TranslationCacheService.phpapp/Observers/TranslatableModelObserver.phpapp/Console/Commands/TranslateClearCacheCommand.phpconfig/translations.phpdocs/prd/epic-5-optimizations-and-extensions.mdDernière mise à jour : 25 janvier 2026