Ce système permet de changer la langue du site à partir d’un menu. Il utilise les sessions pour stocker la langue lors d’un changement. Puis un middleware modifie la langue par celle stocké dans la session grâce à la fonctionnalité « setLocal » de Laravel et à la traduction de Blade.
Création du menu :
CSS :
.flag {
width: 21px;
height: 14px;
}
HTML :
<!– locale translation –>
<li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#"><img class="flag" src="{{ url(‘images/lang/’.Session::get(‘locale’).’.png’) }}" alt="{{ Session::get(‘locale’) }}"/><b class="caret"></b></a>
<ul class="dropdown-menu flagMenu">
<li><a href="{{ url(‘lang/en’) }}"><img class="flag" src="{{ url('images/lang/en.png') }}" alt="en"/></a></li>
<li><a href="{{ url(‘lang/fr’) }}"><img class="flag" src="{{ url('images/lang/fr.png') }}" alt="fr"/></a></li>
</ul>
</li>
Création de la route qui met en session la nouvel langue :
Route::get('/lang/{locale}', function ($locale) {
Session::set('locale', $locale);
if($_SERVER['HTTP_REFERER'])
return redirect($_SERVER['HTTP_REFERER']);
else
return redirect('/');
});
Création du middleware :
Ajouter ce middleware sur toutes les routes à partir du fichier Kernel.php.
<?php
namespace App\Http\Middleware;
use Closure;
use Session;
use App;
class UserLocal
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(!Session::has('locale'))
{
Session::put('locale', App::getLocale());
}
App::setLocale(Session::get('locale'));
return $next($request);
}
}
Utilisation des traductions :
Pour traduire son site grâce à ce système, on utilise ensuite le système de traduction intégré à Blade (https://laravel.com/docs/5.4/localization).
{{ trans('app.search') }}
Améliorations possibles :
- Utiliser les cookies au lieu des sessions.
- Détection du pays de l’utilisateur.