Middleware to Verify the es/en language prefix

The next development that we are going to carry out is to use a middleware to detect the language configured by the user and establish it using the translation text strings that we defined before, in addition, we also define the acronym or language label in the URL to return the translation accordingly. ; for it:

$ php artisan make:middleware LanguagePrefixMiddleware

Which will have the following content:

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

With the above code, it is only redirected when language tags are not available in the URL, then the corresponding language is set.

And we use the middleware in the routes:

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

For example, in our application:

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

As you can see, we created a routeBlog() function to group the routes to which we want to verify the use of the language, in this example, those of the blog, so that it can be consumed through locale:

es/blog/*

en/blog/*

And without the locale, and in this case, it is redirected to the Spanish language according to the redirection defined in the middleware:

blog/*

I agree to receive announcements of interest about this Blog.

The next development that we are going to carry out is to use a middleware to detect the language configured by the user and establish it through the translation text strings, in addition, we also define the acronyms or language tag in the URL to return the corresponding translation.

- Andrés Cruz

En español

)