¡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:
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:
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.