Middleware para Verificar el prefijo del idioma es/en en Laravel

Video thumbnail

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 (antes vimos como utilizar las las Colas y Trabajos), además, también definiremos 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/*

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, además, también definimeros las siglas o etiqueta del lenguaje en la URL para devolver la traducción acorde.

Acepto recibir anuncios de interes sobre este Blog.

Andrés Cruz

EN In english
<script> window.addEventListener('scroll', function() { if (window.scriptsLoaded) return; loadThirdPartyScripts(); }, { once: true }); window.addEventListener('mousemove', function() { if (window.scriptsLoaded) return; loadThirdPartyScripts(); }, { once: true }); window.addEventListener('touchstart', function() { if (window.scriptsLoaded) return; loadThirdPartyScripts(); }, { once: true }); // Fallback if no interaction window.addEventListener('load', function() { setTimeout(function() { if (!window.scriptsLoaded) loadThirdPartyScripts(); }, 8000); }); function loadThirdPartyScripts() { if (window.scriptsLoaded) return; window.scriptsLoaded = true; console.log('Loading third party scripts...'); // Google Analytics var gtagScript = document.createElement('script'); gtagScript.src = 'https://www.googletagmanager.com/gtag/js?id=G-F22688T9RL'; gtagScript.async = true; document.head.appendChild(gtagScript); gtagScript.onload = function() { window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'G-F22688T9RL'); }; // Google ADS const adScript = document.createElement('script'); adScript.src = "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"; adScript.setAttribute('data-ad-client', 'ca-pub-5280469223132298'); adScript.async = true; document.head.appendChild(adScript); // Facebook Pixel (function(f, b, e, v, n, t, s) { if (f.fbq) return; n = f.fbq = function() { n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments) }; if (!f._fbq) f._fbq = n; n.push = n; n.loaded = !0; n.version = '2.0'; n.queue = []; t = b.createElement(e); t.async = !0; t.src = v; s = b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t, s); })(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '1643487712945352'); fbq('track', 'PageView'); } </script> <noscript> <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1643487712945352&ev=PageView&noscript=1" /> </noscript>