Dans les parties 01 et 02, nous avons exploré les bases de l'internationalisation dans Laravel, en utilisant d'abord les fonctionnalités natives, puis en simplifiant le processus avec des packages comme Laravel Lang et Laravel Langman. Dans cette partie 03, nous allons aller plus loin en abordant des techniques avancées pour gérer les traductions, notamment :
- Gestion des traductions dynamiques en base de données.
- Intégration avec des services de traduction externes.
- Optimisation des performances pour les applications multilingues.
1. Gestion des Traductions Dynamiques en Base de Données
Dans certains cas, les fichiers de langue statiques ne suffisent pas, surtout si vous avez besoin de permettre aux administrateurs de modifier les traductions sans déployer de nouveau code. Pour cela, vous pouvez stocker les traductions en base de données.
1.1. Création de la Structure de Base de Données
Créez une table translations pour stocker les traductions :
1php artisan make:migration create_translations_table1php artisan make:migration create_translations_table
Dans le fichier de migration :
1public function up()2{3 Schema::create('translations', function (Blueprint $table) {4 $table->id();5 $table->string('locale'); // Langue (ex: 'en', 'fr')6 $table->string('group'); // Groupe (ex: 'messages', 'validation')7 $table->string('key'); // Clé de traduction (ex: 'welcome')8 $table->text('value'); // Valeur traduite9 $table->timestamps();10 });11}1public function up()2{3 Schema::create('translations', function (Blueprint $table) {4 $table->id();5 $table->string('locale'); // Langue (ex: 'en', 'fr')6 $table->string('group'); // Groupe (ex: 'messages', 'validation')7 $table->string('key'); // Clé de traduction (ex: 'welcome')8 $table->text('value'); // Valeur traduite9 $table->timestamps();10 });11}
Exécutez la migration :
1php artisan migrate1php artisan migrate
1.2. Modèle et Repository
Créez un modèle Translation et un repository pour interagir avec la table :
1php artisan make:model Translation1php artisan make:model Translation
Dans le modèle Translation :
1namespace App\Models;23use Illuminate\Database\Eloquent\Model;45class Translation extends Model6{7 protected $fillable = ['locale', 'group', 'key', 'value'];8}1namespace App\Models;23use Illuminate\Database\Eloquent\Model;45class Translation extends Model6{7 protected $fillable = ['locale', 'group', 'key', 'value'];8}
Dans un repository TranslationRepository :
1namespace App\Repositories;23use App\Models\Translation;45class TranslationRepository6{7 public function getTranslation($locale, $group, $key)8 {9 return Translation::where('locale', $locale)10 ->where('group', $group)11 ->where('key', $key)12 ->value('value');13 }1415 public function updateOrCreateTranslation($locale, $group, $key, $value)16 {17 return Translation::updateOrCreate(18 ['locale' => $locale, 'group' => $group, 'key' => $key],19 ['value' => $value]20 );21 }22}1namespace App\Repositories;23use App\Models\Translation;45class TranslationRepository6{7 public function getTranslation($locale, $group, $key)8 {9 return Translation::where('locale', $locale)10 ->where('group', $group)11 ->where('key', $key)12 ->value('value');13 }1415 public function updateOrCreateTranslation($locale, $group, $key, $value)16 {17 return Translation::updateOrCreate(18 ['locale' => $locale, 'group' => $group, 'key' => $key],19 ['value' => $value]20 );21 }22}
1.3. Utilisation dans l'Application
Pour utiliser les traductions dynamiques, vous pouvez créer un helper personnalisé :
1if (!function_exists('trans_db')) {2 function trans_db($key, $replace = [], $locale = null)3 {4 $locale = $locale ?? app()->getLocale();5 $group = 'messages'; // Par défaut67 // Récupérer la traduction depuis la base de données8 $translation = app(TranslationRepository::class)->getTranslation($locale, $group, $key);910 return $translation ?? $key; // Retourner la clé si la traduction n'existe pas11 }12}1if (!function_exists('trans_db')) {2 function trans_db($key, $replace = [], $locale = null)3 {4 $locale = $locale ?? app()->getLocale();5 $group = 'messages'; // Par défaut67 // Récupérer la traduction depuis la base de données8 $translation = app(TranslationRepository::class)->getTranslation($locale, $group, $key);910 return $translation ?? $key; // Retourner la clé si la traduction n'existe pas11 }12}
Exemple d'utilisation :
1echo trans_db('welcome'); // Affiche la traduction depuis la base de données1echo trans_db('welcome'); // Affiche la traduction depuis la base de données
2. Intégration avec des Services de Traduction Externes
Pour les applications nécessitant des traductions automatiques ou multilingues à grande échelle, vous pouvez intégrer des services de traduction externes comme Google Translate ou DeepL.
2.1. Installation d'un Package d'Intégration
Utilisez un package comme google/cloud-translate pour intégrer Google Translate :
1composer require google/cloud-translate1composer require google/cloud-translate
2.2. Configuration
Ajoutez vos clés d'API dans le fichier .env :
1GOOGLE_TRANSLATE_API_KEY=votre_clé_api1GOOGLE_TRANSLATE_API_KEY=votre_clé_api
2.3. Utilisation du Service
Créez un service pour gérer les traductions :
1namespace App\Services;23use Google\Cloud\Translate\V2\TranslateClient;45class TranslationService6{7 protected $translate;89 public function __construct()10 {11 $this->translate = new TranslateClient([12 'key' => env('GOOGLE_TRANSLATE_API_KEY'),13 ]);14 }1516 public function translateText($text, $targetLanguage)17 {18 $result = $this->translate->translate($text, [19 'target' => $targetLanguage,20 ]);2122 return $result['text'];23 }24}1namespace App\Services;23use Google\Cloud\Translate\V2\TranslateClient;45class TranslationService6{7 protected $translate;89 public function __construct()10 {11 $this->translate = new TranslateClient([12 'key' => env('GOOGLE_TRANSLATE_API_KEY'),13 ]);14 }1516 public function translateText($text, $targetLanguage)17 {18 $result = $this->translate->translate($text, [19 'target' => $targetLanguage,20 ]);2122 return $result['text'];23 }24}
Exemple d'utilisation :
1$translationService = new TranslationService();2$translatedText = $translationService->translateText('Welcome', 'fr');3echo $translatedText; // Affiche "Bienvenue"1$translationService = new TranslationService();2$translatedText = $translationService->translateText('Welcome', 'fr');3echo $translatedText; // Affiche "Bienvenue"
3. Optimisation des Performances pour les Applications Multilingues
3.1. Cache des Traductions
Laravel propose un système de cache pour les traductions. Activez-le dans config/app.php :
1'locale' => 'fr',2'fallback_locale' => 'en',3'cache_translations' => true, // Activer le cache des traductions1'locale' => 'fr',2'fallback_locale' => 'en',3'cache_translations' => true, // Activer le cache des traductions
Utilisez la commande suivante pour vider le cache des traductions :
1php artisan config:cache1php artisan config:cache
3.2. Chargement Différé des Fichiers de Langue
Pour les applications avec de nombreuses langues, chargez uniquement les fichiers de langue nécessaires :
1if (!function_exists('load_locale')) {2 function load_locale($locale)3 {4 $path = resource_path("lang/{$locale}");5 if (file_exists($path)) {6 app('translator')->addNamespace('custom', $path);7 }8 }9}1if (!function_exists('load_locale')) {2 function load_locale($locale)3 {4 $path = resource_path("lang/{$locale}");5 if (file_exists($path)) {6 app('translator')->addNamespace('custom', $path);7 }8 }9}
4. Conclusion
Dans cette partie 03, nous avons exploré des techniques avancées pour gérer les traductions dans Laravel :
- Traductions dynamiques en base de données pour une gestion flexible.
- Intégration avec des services externes comme Google Translate pour des traductions automatiques.
- Optimisation des performances avec le cache et le chargement différé.
Ces techniques vous permettent de créer des applications multilingues robustes et performantes, adaptées à des projets de grande envergure. Avec ces outils, vous êtes prêt à relever les défis de l'internationalisation dans Laravel ! 🌍