Internationalisation (i18n) avec Laravel
Pourquoi Internationalisation (i18n) avec Laravel ?
L'Internationalisation (ou i18n en anglais) est un processus essentiel pour les développeurs qui travaillent sur des applications multilingues. En fait, dans un monde où la diversité culturelle et linguistique est omniprésente, le support d'une seule langue peut être une limitation majeure pour votre application.
Un cas d'usage concret serait l'e-commerce. Imaginez que vous runiez un site e-commerce à succès en France mais qui vise maintenant les États-Unis et le Royaume-Uni. Votre produit est populaire, mais vos clients dans ces pays ne comprennent pas la langue française. Ainsi, une application multilingue serait nécessaire pour offrir une expérience utilisateur fluide et compréhensible.
Prerequis
Pour suivre ce tutoriel, vous devrez avoir les éléments suivants :
- Connaissance de base de Laravel
- Un environnement de développement local (XAMPP, MAMP ou Docker)
- PHP 7.4 ou plus tard
- Composer installé sur votre système
Installation des outils :
composer require laravel/laravel
Concepts fondamentaux
1. Langues et locales dans Laravel
Laravel utilise les termes "locale" et "langue" pour désigner un ensemble de traductions.
- Locale (locale): C'est le terme utilisé par Laravel pour décrire une langue spécifique, comme
frpour le français ouenpour l'anglais. - Langue (language): Il s'agit du nom complet d'une langue, comme "French" pour le français.
2. Structure de traduction
Laravel utilise des fichiers de traduction situés dans le répertoire resources/lang. Chaque locale a son propre dossier. Par exemple :
resources/
└── lang/
├── en/
│ └── messages.php
└── fr/
└── messages.php
3. Définition des traductions
Les fichiers de traduction contiennent des tableaux associatifs avec les clés et les valeurs traduites.
// resources/lang/fr/messages.php
return [
'welcome' => 'Bienvenue',
];
4. Affichage des traductions
Vous pouvez afficher une traduction en utilisant la fonction __ :
<p>__('messages.welcome')</p>
5. Langue par défaut et locale actuelle
Laravel détermine automatiquement la langue de l'utilisateur à partir de son navigateur. Vous pouvez également le définir manuellement dans le fichier .env.
APP_LOCALE=fr
Mise en pratique : projet fil rouge
1. Création du projet
Créeons un petit gestionnaire de tâches multilingue.
composer create-project --prefer-dist laravel/laravel task-manager
cd task-manager
php artisan serve
2. Configuration des locales
Ajoutez les langues supportées dans config/app.php :
'locales' => ['en', 'fr'],
Et définissez la langue par défaut.
'default_locale' => 'fr',
3. Création des fichiers de traduction
Créez les fichiers de traduction pour chaque locale :
touch resources/lang/en/tasks.php
touch resources/lang/fr/tasks.php
Ajoutez quelques traductions :
resources/lang/en/tasks.php
return [
'create' => 'Create Task',
'edit' => 'Edit Task',
];
resources/lang/fr/tasks.php
return [
'create' => 'Créer une tâche',
'edit' => 'Modifier la tâche',
];
4. Création des routes
Ajoutez les routes pour afficher et modifier les tâches :
routes/web.php
Route::get('/', function () {
return view('tasks.index');
});
Route::resource('tasks', TaskController::class);
5. Création du contrôleur
Créez le contrôleur TaskController :
php artisan make:controller TaskController
app/Http/Controllers/TaskController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Task;
class TaskController extends Controller
{
public function index()
{
$tasks = Task::all();
return view('tasks.index', compact('tasks'));
}
public function create()
{
return view('tasks.create');
}
public function store(Request $request)
{
Task::create($request->all());
return redirect()->route('tasks.index')->with('success', __('messages.task_created'));
}
public function edit(Task $task)
{
return view('tasks.edit', compact('task'));
}
public function update(Request $request, Task $task)
{
$task->update($request->all());
return redirect()->route('tasks.index')->with('success', __('messages.task_updated'));
}
}
6. Création des vues
Créez les vues pour afficher et modifier les tâches.
resources/views/tasks/index.blade.php
@extends('layouts.app')
@section('content')
<h1>__('messages.tasks')</h1>
<a href="route('tasks.create')">__('messages.create_task')</a>
<ul>
@foreach ($tasks as $task)
<li>$task->name - $task->description</li>
@endforeach
</ul>
@endsection
resources/views/tasks/create.blade.php
@extends('layouts.app')
@section('content')
<h1>__('messages.create_task')</h1>
<form action="route('tasks.store')" method="POST">
@csrf
<input type="text" name="name" placeholder="__('messages.name')">
<textarea name="description">__('messages.description')</textarea>
<button type="submit">__('messages.create')</button>
</form>
@endsection
resources/views/tasks/edit.blade.php
@extends('layouts.app')
@section('content')
<h1>__('messages.edit_task')</h1>
<form action="route('tasks.update', $task->id)" method="POST">
@csrf
@method('PUT')
<input type="text" name="name" value="$task->name">
<textarea name="description">$task->description</textarea>
<button type="submit">__('messages.update')</button>
</form>
@endsection
Erreurs frequentes et debugging
1. Erreur : Traduction non trouvée
Message d'erreur :
translation.key_not_found
Code incorrect :
echo __('tasks.non_existent_key');
Code correct :
echo __('tasks.create', [], 'en'); // Spécifiez une locale par défaut
2. Erreur : Traduction mal formée
Message d'erreur :
syntax error, unexpected token
Code incorrect :
return [
'welcome' => Bienvenue,
];
Code correct :
return [
'welcome' => 'Bienvenue',
];
3. Erreur : Traduction non mise à jour
Message d'erreur :
translation.missing
Code incorrect :
echo __('messages.welcome');
// messages.php n'est pas mis à jour avec la nouvelle traduction
Code correct :
echo __('messages.welcome', [], 'fr'); // Utilisez une locale spécifique
Pour aller plus loin
1. Gestion des paramètres de langue dans le navigateur
Vous pouvez permettre à l'utilisateur de choisir sa propre langue en utilisant un middleware.
app/Http/Middleware/SetLocale.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
class SetLocale
{
public function handle($request, Closure $next)
{
if ($lang = $request->cookie('locale')) {
App::setLocale($lang);
}
return $next($request);
}
}
Ajoutez ce middleware dans le fichier app/Http/Kernel.php :
protected $middlewareGroups = [
'web' => [
// ...
\App\Http\Middleware\SetLocale::class,
],
];
2. Utilisation de packages de traduction tierces
Laravel a des intégrations avec des packages tiers comme laravel-lang.
Installation :
composer require laravel-lang/lang
Ajoutez les locales dans config/app.php :
'locales' => ['en', 'fr'],
3. Gestion de la traduction dynamique
Vous pouvez utiliser des callbacks pour générer des traductions dynamiques.
resources/lang/fr/messages.php
return [
'greeting' => function ($name) {
return "Bonjour, $name!";
},
];
Utilisez-la dans votre vue :
<p>__('messages.greeting', ['name' => Auth::user()->name])</p>
Défi pratique
Créez une application de blog multilingue avec Laravel. Ajoutez des articles, des commentaires et la possibilité de changer de langue via un menu déroulant.
Points à considérer :
- Utilisation du système de traduction de Laravel
- Gestion de l'état utilisateur pour sauvegarder sa préférence de langue
- Création d'articles et de commentaires
Ce tutoriel vous a montré comment mettre en œuvre la internationalisation (i18n) dans un projet Laravel. En suivant les étapes ci-dessus, vous pouvez créer une application multilingue qui répond aux besoins des utilisateurs à travers le monde. N'oubliez pas de tester votre application en changeant régulièrement de langue pour vous assurer que tout fonctionne correctement.