Si queremos que un usuario pueda cambiar su idioma desde su perfil, haremos lo siguiente:
Crearemos un Middleware llamado Localization.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
class Localization
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if (Session::has('locale')) {
App::setLocale(Session::get('locale'));
}
return $next($request);
}
}
Dado que necesitamos que esta operación se ejecute en cada solicitud, también debemos agregarla a la pila de Middleware predeterminada en app/http/Kernel.php para el grupo de Middleware web:
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Localization::class, //<-- Añadimos esta nueva línea
],
Y en nuestro caso, para cambiar el idioma lo haremos de la siguiente manera:
$user->lang = $request->lang;
$user->save();
// Añadiremos estas dos lineas. Si no tuviesemos el Middleware creado, solo tendríamos el nuevo idioma en esta ejecución, dejaría de estar en la siguiente vista.
app()->setLocale($request->lang);
session()->put('locale', $request->lang);
