Hoy vamos a hacer que nuestro proyecto sea multilenguaje, es decir, que esté en varios idiomas (Español e Inglés). Aunque simplemente lo aplicaremos a los textos estáticos, no a los que se guardan en la base de datos.
Las cadenas de texto que se van a mostrar según el idioma que seleccionemos se guardan en resources/lang . Ahí veremos una carpeta en, que es donde se encuentran las traducciones en inglés. Creamos una carpeta llamada es, en mi caso, si quisieras otro idioma, simplemente, crea la carpeta con el nombre del idioma que quieras.
Una vez hecho esto, creamos tanto en la carpeta en como en la es un archivo llamado header.php y contendrán:
1 2 3 4 5 6 7 8 9 10 |
<?php return [ 'posts' => 'Posts', 'login' => 'Login', 'register' => 'Register', 'administration' => 'Administration', 'notifications' => 'Notifications', 'hascommented' => '<i>:user</i> has commented in <b>:post</b>', ]; |
1 2 3 4 5 6 7 8 9 10 |
<?php return [ 'posts' => 'Entradas', 'login' => 'Iniciar sesión', 'register' => 'Registro', 'administration' => 'Administración', 'notifications' => 'Notificaciones', 'hascommented' => '<i>:user</i> ha comentado en <b>:post</b>', ]; |
Estas serán las cadenas de texto que se traducirán en las vistas. Para acceder a estas cadenas de texto podemos hacerlo de varias maneras, yo he utilizado esta:
1 |
@lang('header.administration') |
Indicamos el nombre del archivo y después el nombre identificativo de la cadena de texto.
Modificamos el header de layouts/app.blade.php para que sea multilenguaje:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<li><a href="{{ route('posts.index') }}">@lang('header.posts')</a></li> @if (Auth::guest()) <li><a href="{{ route('login') }}">@lang('header.login')</a></li> <li><a href="{{ route('register') }}">@lang('header.register')</a></li> @else ... <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"> @lang('header.notifications') <span class="badge">{{count(Auth::user()->unreadNotifications)}}</span> </a> ... @forelse (Auth::user()->unreadNotifications as $notification) <a href="{{ route('posts.show', $notification->data['post']['id']) }}">@lang('header.hascommented', ['user' => $notification->data["user"]["name"], 'post' => $notification->data["post"]["title"]])</a> @empty ... <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"> @lang('header.administration') <span class="caret"></span> </a> ... |
Ahora vamos a crear un middleware que será el que determinará el idioma:
1 |
php artisan make:middleware SetLang |
Lo abrimos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php namespace App\Http\Middleware; use Closure; use Session; use App; use Config; class SetLang { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if (Session::has("lang")) { $lang = Session::get("lang"); } else { // check browser lang - https://learninglaravel.net/detect-and-change-language-on-the-fly-with-laravel $lang = substr($request->server('HTTP_ACCEPT_LANGUAGE'), 0, 2); if ($lang != 'es' && $lang != 'en') { $lang = 'en'; } } App::setLocale($lang); return $next($request); } } |
Este archivo lo que hace es comprobar si tenemos una sesión llamada lang con el idioma, si no la tenemos coge el idioma del navegador y lo aplica como idioma de la app.
Ahora, para aplicarlo, vamos a app/Http/Kernel.php :
1 2 3 4 5 6 7 |
protected $middlewareGroups = [ 'web' => [ ... \App\Http\Middleware\SetLang::class, ], ... ]; |
Lo único que nos falta es crear la ruta con el middleware web (anteriormente modificado):
1 2 3 4 |
Route::get('lang/{lang}', function($lang) { \Session::put('lang', $lang); return \Redirect::back(); })->middleware('web')->name('change_lang'); |
Y añadimos los enlaces para cambiar de idioma donde queramos:
1 2 |
<a href="{{ route('change_lang', ['lang' => 'es']) }}">ES</a> <a href="{{ route('change_lang', ['lang' => 'en']) }}">EN</a> |
-
Muchas gracias. Fácil de implementar.