Como crear una web en diferentes idiomas ( multi-idioma) con PHP Laravel

¡Hola Geek!

En esta ocasión aprenderemos a crear una aplicación multi idioma con Laravel 7. Sin duda es una funcionalidad muy util y sobre todo facil de implementar. En esta ocasión solo estaremos haciendo uso de los recursos que Laravel nos proporciona para una aplicación multi-lenguaje. Acompañame en este pequeño ejemplo y verás que es super sencillo.

Manos a la obra

Definir lenguajes a utlizar
Primero debemos definir, que lenguajes vamos a utlizar para nuestra aplicación. Aunque regularmente suele ser español e inglés. En este ejemplo crearemos 3 traducciones: En Ingles, Español e Italiano.


Creando directorios para lenguajes

Ahora crearemos nuestro directorio de traducciones, para ello crearemos 3 carpetas en nuestro directorio /resources/lang/ (Si requieres más lenguajes deberás crear nuevas carpetas de los lenguajes a utlizar)
 

La primera se llamará "en", la segunda "es" y la tercera "ita". Es probable que la carpeta "en" y "es" ya se encuentren creadas, por lo que solo debemos crear la carpeta "ita"
 

Creando traducciones para español

Crearemos un nuevo archivo en /resources/lang/es el cuál llamaremos multi-leng.php Este archivo contendrá todas las traducciones en el lenguaje español. Cada traducción está asociada a un "alias" por el cuál será llamado en nuestras blades.

Recomendación: Los nombres de los archivos de traducción deben corresponder a un módulo/vista especifica , esto para no perder el orden de nuestro diccionario y no llenar un solo archivo con todas las traducciones.

Nuestro archivo multi-leng.php queda de la siguiente manera: 
 

<?php
return [
    'title-application' => 'Aplicación multi-lenguaje',
    'subTitle-application' => '¡Hola mundo!',
];

Creando traducciones para inglés

Crearemos una copia del el archivo /resources/lang/es/multi-leng.php en /resources/lang/en/. Nuestro nuevo archivo conservará las mismas "alias" y el mismo nombre, sólo cambiará el valor de la traducción a Inglés:

<?php
return [
    'title-application' => 'Multi-language application',
    'subTitle-application' => ¡'Hello world!',
];

Creando traducciones para italiano
 Crearemos una copia del el archivo /resources/lang/es/multi-leng.php en /resources/lang/ita/. Nuestro nuevo archivo conservará las mismas "alias" y el mismo nombre, sólo cambiará el valor de la traducción a italiano:

<?php
return [
    'title-application' => 'Applicazione multilingue',
    'subTitle-application' => ¡'Ciao mondo!',
];

Mostrando traducciones en nuestra blade

Ahora que tenemos definidos nuestros lenguajes podemos mostrarlos, el lenguaje predeterminado depende de la confuguración establecida en app/config/app.php. (Este valor también puede ser cambiado en tiempo de ejecución).

'locale' => 'es',

Dicho esto, la llamada en nuestra blade(home.blade.php) se hace con una función llamada trans('') esta función recibe algunos parametros: 

trans(['archivo_de_traduccion'].['alias'])

Por lo tanto nuestra llamada queda de la siguiente forma:

<a class="navbar-brand" href="#">{{trans('multi-leng.title-application') }}</a>

Cambiando de idiomas en tiempo de ejecución.

Cuando un usuario clickea sobre nuestro menú de idiomas, es necesario que nuestra web se traduzca de inmediatamente en el lenguaje seleccionado, por lo que debemos cambiar el idioma en tiempo de ejecución. Para ello Laravel cuenta con una función:

App::setLocale('es');

Esta función recibe como parametro el lenguaje el cual se usará para nuestra aplicación (es,en,ita). 
Lo que haremos ahora es cuando se seleccione un idioma, guardaremos el lenguaje en una variable de sesión y mediante un middleware verificaremos en que lenguaje se encuentra nuestra aplicación y cambiarla en tiempo de ejecución en caso de que sea requerido.
Nuestra ruta en /routes/web.php para el cambio de lenguaje quedaría de la siguiente forma: 

Route::get('/lang/{language}', function ($language) {
    Session::put('language',$language);
    return redirect()->back();
})->name('language');

En home.blade.php la llamada a esta ruta quedaría de la siguiente manera: 

<div class="dropdown-menu" aria-labelledby="navbarDropdown">
                <a class="dropdown-item" href="{{route('language','es')}}">ES</a>
                <div class="dropdown-divider"></div>
                <a class="dropdown-item" href="{{route('language','en')}}">ENG</a>
                <div class="dropdown-divider"></div>
                <a class="dropdown-item" href="{{route('language','ita')}}">ITA</a>
</div>

Middleware para detectar idioma y traducir automaticamente

Ahora crearemos un middleware para detectar el lenguaje actual y verificar si este ha cambiado. Escribimos en nuestra consola:

php artisan make:middleware CheckLanguage

Registraremos nuestro nuevo middleware en /app/Http/kernel.php a $middlewareGroups

\App\Http\Middleware\CheckLanguage::class,

y en $routeMiddleware:

'translate' => \App\Http\Middleware\CheckLanguage::class,

La función handle() de nuestro nuevo middleware (/app/Http/Middleware/CheckLanguage.php) contendrá:

    public function handle($request, Closure $next)
    {
        if (Session::has('language')) {
            if (App::getLocale()!= Session::get('language')) {
             App::setLocale(Session::get('language'));
            }
          }else {
             Session::put('language', 'es');
             App::setLocale('es');
         }
          return $next($request);
    }

No olvides agregar:

use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\App;

Y todas nuestras rutas deberán contener nuestro middleware, para que esta pueda ser traducida automaticamente:

Route::get('/', function () {
    return view('home');
})->middleware('translate');

y ¡Listo!


Codigo fuente
Puedes descargar el código fuente de este ejemplo en 

https://github.com/IglesiasJavier/Multi-languageApplication.git



Gracias por leer este pequeño ejemplo. Si tienes alguna pregunta o sugerencia, no dudes en dejarla en los comentarios, me gustaría saber tu opinión.


SOBRE EL AUTOR
Javi Zamora
Javi Zamora

Hola soy Javier creador de Visión Código con la intención de ayudar a los nuevos jovenes programadores con pequeños tutoriales que te salvan la vida.