Detección de idioma dinámica (I). Laravel

Tanto el proyecto WADC como en el repositorio de Macros, se han realizado inicialmente en dos idiomas que son el español y el inglés. Para esto ha sido necesario en primer lugar, preparar la estructura en las aplicaciones y posteriormente decidir el método de selección de idioma.

Como se puede ver en la imagen siguiente, cualquier petición que realizamos en el navegador incluye el idioma de forma que el sitio que la recibe puede actuar en consecuencia.

Petición HTTP capturada en la herramientas para desarrolladores.

Para ambos proyectos se ha optado por la selección automática del idioma a través de las cabeceras en las peticiones. También se ha establecido como idioma por defecto el inglés en caso de que se trate de un idioma diferente a los incluidos.

Repositorio de Macros

En este proyecto se utiliza la versión 6 del framework de PHP Laravel. Para incluir diferentes idiomas, tendremos que incluir los ficheros de idiomas en los directorios (el nombre del directorio del idioma se establece siguiendo la ISO 15897) /resources/lang/en y /resource/lang/es, los cuales tendrán un contenido similar al de la imagen de la derecha y se podrán usar utilizando la sintaxis __('fichero.variable'). Una posibilidad utilizando las imágenes de ejemplo sería: __('main.privacy') que nos devolvería la palabra «Privacidad».

Estructura idioma
Fragmento del fichero main.php

Para seleccionar el idioma por defecto hay que editar el fichero /app/config/app.php donde utilizando la variable locale y fallback_locale.

Fragmento fichero app.php

Ya solo queda activar la lectura automática de las cabeceras, para ello se creará el archivo LangAuto.php, que es un middleware que actuará en las rutas que se indiquen y estará almacenado en /app/Http/Middleware

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Session\Session;
use Illuminate\Http\Request;

class LangAuto
{
 
    const SESSION_KEY = 'locale';
    const LOCALES = ['en', 'es'];

    public function handle($request, Closure $next)
    {

        $session = $request->getSession();
        if (!$session->has(self::SESSION_KEY)) {
          $session->put(self::SESSION_KEY, $request->getPreferredLanguage(self::LOCALES));
        }
        app()->setLocale($session->get(self::SESSION_KEY));
      

        return $next($request);
    }
}

Recuerda que es necesario registrar los middleware para su funcionamiento, para ello en /app/Http/Kernel.php añadiremos la siguiente línea \App\Http\Middleware\LangAuto::class , como se muestra en la imagen siguiente:

Línea añadida para fichero Kernel.php en el apartado middlewareGroups

Para finalizar se añade el middleware a las rutas en las que vaya a ser necesario, en este caso en todas las que utilicen los ficheros .blade. En el caso de que se utilicen muchas rutas se pueden agrupar como se muestra a continuación:

Route::middleware([LangAuto::class])->group(function () {

Route::get('/', function () {
return view('welcome');
});

Route::get('/login', function () {
return view('login');
});

Route::get('/register', function () {
return view('register');
});


});

En el siguiente post se mostrará como se ha creado esta misma funcionalidad para el proyecto WADC que está implementado con Ruby y el framework RubyOnRails.

2 thoughts on “Detección de idioma dinámica (I). Laravel

Leave a Reply

Your email address will not be published.Required fields are marked *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.