en Programación web

Multilenguaje en Laravel

Crear un middleware llamado por ejemplo «SetLocaleUrl»:

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;
use DB;
use Carbon\Carbon;

class SetLocaleUrl
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $locale = $request->segment(1);
        $languages = config('app.locales');
        if ( !in_array($locale, $languages)) {
            $locale = config('app.fallback_locale');
        }
        app()->setLocale($locale);
        Carbon::setLocale($locale);
        switch($locale) {
            case 'ca':
                Carbon::setUtf8(false);
                setlocale(LC_ALL, 'ca_ES.UTF-8', 'Catalan_Spain', 'Catalan');
                DB::statement("SET lc_time_names = 'ca_ES'");
            break;
            case 'es':
                Carbon::setUtf8(false);
                setlocale(LC_ALL, 'es_ES.UTF-8', 'Spanish_Spain', 'Spanish');
                DB::statement("SET lc_time_names = 'es_ES'");
            break;
        }
        URL::defaults(['locale' => app()->getLocale()]);

        return $next($request);
    }
}

el «lc_time_names» es para las fechas en mysql, etc…

Registrar el middleware en el kernel.php

    protected $routeMiddleware = [
        ...
        'SetLocaleUrl' => \App\Http\Middleware\SetLocaleUrl::class,

    ];

Modificar las rutas, añadiendo una para redirigir al lenguaje por defecto:

Route::get('/', function () {
    return redirect(app()->getLocale());
});

Y el grupo de las rutas con lenguaje

Route::group([
    'prefix' => '{locale}',
    'where' => ['locale' => '[a-zA-Z]{2}'],
    'middleware' => 'SetLocaleUrl'
], function() {
    //localized routes
        ...

});

Si usamos autentificación, modificamos la ruta del middleware Authenticate:

        ...
return route('login', app()->getLocale());
        ...

});

Y también añadiremos la ruta para redirigir después de un login válido. Para ello debemos modificar el fichero Login del directorio «Auth». En mi caso sacaremos el idioma de la base de datos, del campo (añadido) «locale» del usuario:

    public function redirectTo()  {
        $idioma = Auth::user()->locale;
        return $idioma.'/admin';
    }