my way
app/config/app.php
'languages' => ['ar','en','fr']
app/Jobs/ChangeLocale.php
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Contracts\Bus\SelfHandling;
class ChangeLocale extends Job implements SelfHandling
{
protected $lang;
public function __construct($lang)
{
$this->lang = $lang;
}
public function handle()
{
session()->put('locale',$this->lang);
}
}
app/Jobs/SetLocale.php
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Contracts\Bus\SelfHandling;
class setLocale extends Job implements SelfHandling
{
protected $languages;
public function __construct()
{
$this->languages = config('app.languages');
}
public function handle()
{
if(!session()->has('locale'))
{
session()->put('locale', \Request::getPreferredLanguage($this->languages));
}
app()->setLocale(session('locale'));
}
}
app/Http/Middleware/Localization.php
<?php
namespace App\Http\Middleware;
use Closure;
use App\Jobs\SetLocale;
use Illuminate\Bus\Dispatcher as BusDispatcher;
class Localization
{
protected $bus;
protected $setLocale;
public function __construct(BusDispatcher $bus,SetLocale $setLocale)
{
$this->bus = $bus;
$this->setLocale = $setLocale;
}
public function handle($request, Closure $next)
{
$this->bus->dispatch($this->setLocale);
return $next($request);
}
}
app/Http/Kernel.php
protected $middleware = [
\App\Http\Middleware\Localization::class,
...
];
app/Http/Controllers/HomeController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Jobs\ChangeLocale;
class HomeController extends Controller
{
public function language(Request $request)
{
$changeLocale = new ChangeLocale($request->input('lang'));
$this->dispatch($changeLocale);
return redirect()->back();
}
}
app/Http/routes.php
Route::get('language','HomeController@language');
app/resources/views/_nav.blade.php
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
Languages
<span class="caret"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
@foreach(config('app.languages') as $lang)
<li class="{{ session('locale') == $lang ? 'active' : '' }}">
<a href="/language?lang={{ $lang }}" >{{ $lang }}</a>
</li>
@endforeach
</ul>
</div>