Middleware para Verificar el prefijo del idioma es/en

El siguiente desarrollo que vamos a realizar, es mediante un middleware detectar el idioma configurado por el usuario y establecerlo mediante las cadenas de textos de traducciones que definimos antes, además, también definimeros las siglas o etiqueta del lenguaje en la URL para devolver la traducción acorde; para ello:

$ php artisan make:middleware LanguagePrefixMiddleware

Que tendrá el siguiente contenido:

app\Http\Middleware\LanguagePrefixMiddleware.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class LanguagePrefixMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {

        $language = $request->segment(1);
        
        if(!in_array($language,['es','en'])){
            return redirect('/es/blog');
        }

        app()->setLocale($language);

        return $next($request);
    }
}

Con el código anterior, solamente se redirecciona cuando las etiquetas de idioma no están disponibles en la URL, luego, se establece el lenguaje correspondiente.

Y usamos el middleware en las rutas:

Route::get('/{lang}/mi-ruta', 'MiControlador@miMetodo');

Por ejemplo, en nuestra aplicación:

function routeBlog() {
    Route::get('', [BlogController::class, 'index'])->name('blog.index');
    Route::get('detail/{id}', [BlogController::class, 'show'])->name('blog.show');
}

Route::group(['prefix' => '{locale}/blog','middleware' => LanguagePrefixMiddleware::class], function () {
    routeBlog();
});

Route::group(['prefix' => 'blog','middleware' => LanguagePrefixMiddleware::class], function () {
function () {
    routeBlog();
});

Como puedes apreciar, creamos una función routeBlog() para agrupar las rutas a la cuales queremos verificar el uso del lenguaje, en este ejemplo, las del blog, para que se pueda consumir mediante el locale:

es/blog/*

en/blog/*

Y sin el locale, y en este caso, se redirecciona al idioma español según la redirección definida en el middleware:

blog/*

- Andrés Cruz

In english

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.