Posted in

Forzar el canvio de idioma en Laravel

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);

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *


The reCAPTCHA verification period has expired. Please reload the page.