Optimización de la Gestión de Idiomas y Caching con Parámetros URL en PHP
En el proyecto landing, que gestiona nuestras páginas públicas, nos enfrentamos al desafío de optimizar la entrega de contenido multilingüe y, al mismo tiempo, asegurar que las páginas pudieran ser almacenadas en caché de manera efectiva por servicios como Cloudflare. Nuestro objetivo era permitir que diferentes versiones lingüísticas de una misma URL fueran cacheadas por separado, evitando la invalidación de la caché cuando el idioma se cambiaba únicamente mediante el encabezado Accept-Language.
Para abordar esto, hemos implementado una solución que prioriza el uso del parámetro de consulta ?lang= en las URLs para la detección del idioma. Esto significa que una URL como https:\/\/example.com\/?lang=es se trata como un recurso distinto de https:\/\/example.com\/?lang=en.
La clave de esta funcionalidad reside en un middleware SetLocale y un controlador LocaleController. El SetLocale middleware está configurado para leer el parámetro ?lang= con la máxima prioridad para las páginas públicas. Si este parámetro está presente y es un idioma válido, se establece el idioma de la aplicación en consecuencia. Si no, se recurre a otras lógicas de detección de idioma o a un idioma predeterminado.
Adicionalmente, el LocaleController juega un papel crucial. Si un usuario llega a una página sin el parámetro ?lang= explícito o con un idioma no preferido, el controlador puede redirigir al usuario a la misma URL, pero añadiendo el parámetro ?lang=XX (donde XX es el código de idioma). Esta redirección garantiza que la URL final sea explícita en cuanto al idioma.
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class SetLocale
{
public function handle(Request $request, Closure $next)
{
$langParam = $request->query('lang');
$availableLangs = ['es', 'en', 'fr']; // Ejemplo de idiomas disponibles
if ($langParam && in_array($langParam, $availableLangs)) {
App::setLocale($langParam);
} else {
// Lógica de fallback, por ejemplo, idioma del navegador o predeterminado
$preferredLang = $request->getPreferredLanguage($availableLangs);
App::setLocale($preferredLang ?: 'en'); // 'en' como predeterminado
}
return $next($request);
}
}
Este enfoque tiene un beneficio significativo para el caching. Al tener URLs únicas para cada idioma (\/, \/?lang=es, \/?lang=fr), Cloudflare puede almacenar en caché cada versión lingüística por separado. Esto previene que el sistema de caché se vea forzado a omitir la caché o a servir contenido incorrecto basado únicamente en encabezados Accept-Language, mejorando drásticamente el rendimiento y la experiencia del usuario al reducir la carga del servidor y acelerar la entrega de páginas.