Il est relativement facile de créer un site multilingue sous Laravel 5.4. La solution que je vous propose en terme d’internationalisation n’est pas la seule, mais elle conviendra à la plupart. Pour mettre en place la localization, il est comme vous allez le voir pas nécessaire de modifier beaucoup de fichiers. Notre but est de gérer les choix, faire un choix de langue par défaut et afficher la possibilité de choisir la langue.
Nous commençons par définir la langue par défaut et les langues disponibles dans le fichier config.app. Nous définissons ici que la langue par défaut est le français.
'locale' => 'fr',
'languages' => [
'fr' => 'Français',
'de' => 'Deutsch',
'en' => 'English'
],
'fallback_locale' => 'fr',
Lorsque l’on modifie le fichier config/app.php, il faut exécuter la commande suivante pour que les système prenne en compte les changement:
php artisan cache:clear
Nous créons ensuite un Middleware qui permettra de toujours avoir une langue définie. Nous créons donc le fichier app\Http\Middleware\Language.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Session;
class Language
{
public function handle($request, Closure $next)
{
$segment_1 = $request->segment(1);
$arr_languages = config('app.languages');
//la page d'accueil sans choix de langue
if(is_null($segment_1) && is_null(Session::get('applocale')) ){
//Comme aucune langue n'est definie on prend celle par défault
$fallback_locale = config('app.fallback_locale');
Session::put('applocale', $fallback_locale);
Session::put('lang_name', $arr_languages[$fallback_locale]);
}
//Le segment correspond a une des langues que l'on a
if(isset($arr_languages[$segment_1])){
//Si la langue de l'url n'est pas celle de la session, on la change
if($segment_1 !=Session::get('applocale')){
Session::put('applocale', $segment_1);
Session::put('lang_name', $arr_languages[$segment_1]);
}
}
//si c'est la home, on redirige avec la langue a la fin
if(is_null($segment_1)){
return redirect(url('/')."/".Session::get('applocale')."/");
}
//On set la langue pour les fichier de trad
App::setLocale(Session::get('applocale'));
return $next($request);
}
}
Nous modifions ensuite le fichier app\Http\Kernel.php pour ajouter notre middleware à la fin:
protected $middlewareGroups = [
'web' => [
...
\App\Http\Middleware\Language::class,
],
];
Nous créons la route qui gère les langues de la page d’accueil dans le fichier routes/web.php
Route::get('/{lang?}', function () {
return view('welcome');
})->where('lang', implode('|', array_flip(config('app.languages'))));
Nous créons ensuite la zone qui permet à l’utilisateur de changer la langue en modifiant le fichier welcome.
@if (Route::has('login'))
<div class="top-right links">
<a href="{ { url('/login') } }">Login</a>
<a href="{ { url('/register') } }">Register</a>
@foreach ( config('app.languages') as $local_code => $local_string)
@if($local_string !== config('app.lang_name'))
<?php
$style = 'padding:0';
if ($local_code == session('applocale')){
$style = 'padding:0;border-bottom:2px solid red;';
}
?>
<a style='<?php echo $style;?>' href="{!! url('/') !!}/{ { $local_code } }/"><img width="32" height="22" alt="{ { $local_string } }" title="{ { $local_string } }" src="{!! asset('img/' . $local_code . '-flag.png') !!}"></a>
@endif
@endforeach
Et finalement nous créons nos fichiers de langue dans le répertoire resources/ lang. Dans mon cas je vais créer de/customlang.php,fr/customlang.php, en/customlang.php, … qui contiendront le tableau de mes traductions sous la forme suivant:
return [
'test' => 'Es klappt',
];
Pour afficher mes traduction il me suffira d’écrire les ligne suivantes (nom_du_fichier.indice_du_tableau):
{{ trans('customlang.test') }} //avec blade
@lang('customlang.test') //avec blade
Il faudra maintenant tenir compte de la langue dans le fichier de routage. Vous pouvez le faire de la façon suivante:
Route::get('{lang}/contact', 'Frontend\ContactController@index');
Comme nous utilisons les sessions Laravel, il est utile de savoir que vous pouvez supprimer toutes les sessions en supprimant tous les fichiers présent dans storage/framework/sessions/