1. Accueil
  2. Articles
4 min de lecture
199 vues

Internationalisation et Traduction dans Laravel : Partie 03 - Techniques Avancées

Image d'illustration pour Internationalisation et Traduction dans Laravel : Partie 03 - Techniques Avancées

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 :

  1. Gestion des traductions dynamiques en base de données.
  2. Intégration avec des services de traduction externes.
  3. 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_table
1php 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 traduite
9 $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 traduite
9 $table->timestamps();
10 });
11}

Exécutez la migration :

1php artisan migrate
1php 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 Translation
1php artisan make:model Translation

Dans le modèle Translation :

1namespace App\Models;
2 
3use Illuminate\Database\Eloquent\Model;
4 
5class Translation extends Model
6{
7 protected $fillable = ['locale', 'group', 'key', 'value'];
8}
1namespace App\Models;
2 
3use Illuminate\Database\Eloquent\Model;
4 
5class Translation extends Model
6{
7 protected $fillable = ['locale', 'group', 'key', 'value'];
8}

Dans un repository TranslationRepository :

1namespace App\Repositories;
2 
3use App\Models\Translation;
4 
5class TranslationRepository
6{
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 }
14 
15 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;
2 
3use App\Models\Translation;
4 
5class TranslationRepository
6{
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 }
14 
15 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éfaut
6 
7 // Récupérer la traduction depuis la base de données
8 $translation = app(TranslationRepository::class)->getTranslation($locale, $group, $key);
9 
10 return $translation ?? $key; // Retourner la clé si la traduction n'existe pas
11 }
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éfaut
6 
7 // Récupérer la traduction depuis la base de données
8 $translation = app(TranslationRepository::class)->getTranslation($locale, $group, $key);
9 
10 return $translation ?? $key; // Retourner la clé si la traduction n'existe pas
11 }
12}

Exemple d'utilisation :

1echo trans_db('welcome'); // Affiche la traduction depuis la base de données
1echo 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-translate
1composer require google/cloud-translate

2.2. Configuration

Ajoutez vos clés d'API dans le fichier .env :

1GOOGLE_TRANSLATE_API_KEY=votre_clé_api
1GOOGLE_TRANSLATE_API_KEY=votre_clé_api

2.3. Utilisation du Service

Créez un service pour gérer les traductions :

1namespace App\Services;
2 
3use Google\Cloud\Translate\V2\TranslateClient;
4 
5class TranslationService
6{
7 protected $translate;
8 
9 public function __construct()
10 {
11 $this->translate = new TranslateClient([
12 'key' => env('GOOGLE_TRANSLATE_API_KEY'),
13 ]);
14 }
15 
16 public function translateText($text, $targetLanguage)
17 {
18 $result = $this->translate->translate($text, [
19 'target' => $targetLanguage,
20 ]);
21 
22 return $result['text'];
23 }
24}
1namespace App\Services;
2 
3use Google\Cloud\Translate\V2\TranslateClient;
4 
5class TranslationService
6{
7 protected $translate;
8 
9 public function __construct()
10 {
11 $this->translate = new TranslateClient([
12 'key' => env('GOOGLE_TRANSLATE_API_KEY'),
13 ]);
14 }
15 
16 public function translateText($text, $targetLanguage)
17 {
18 $result = $this->translate->translate($text, [
19 'target' => $targetLanguage,
20 ]);
21 
22 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 traductions
1'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:cache
1php 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 ! 🌍