Sélectionner une page

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/