Ir al contenido principal

Laravel 8 desde cero Parte II - Creando middleware para Idiomas

 Laravel 8 desde cero Parte II - Creando middleware para Idiomas

En el archivo: config\app.php, buscamos 'locale' y ponemos el idioma de nuestra preferencia.

'locale' => 'es',

Carpetas de idiomas
Resources\Lang\es, Resources\Lang\en, y así por idioma.


Nota: sin el middleware con el handle aquí descrito: solo responderá a español e ingles.


Para crear el middleware ejecutamos:

    php artisan make:middleware Language

Con el comando anterior se crea el archivo: 

    app\http\Middleware\Language.php

Agregamos:       

use Illuminate\Support\Facades\App;

Y en handle:

        $locale = substr($request->server('HTTP_ACCEPT_LANGUAGE'), 0, 2);
        if ($locale != 'en' && $locale != 'es'){
            $locale = 'en';
        }
        App::setLocale($locale);
        return $next($request);

Lo que le indica que si no es español o ingles muestra en ingles por defecto.
Igualmente podemos crear if anidados para diversos idiomas.

Archivos de idioma creados por defecto por Laravel

En la carpeta Resources\Lang\en, encontramos los archivos:
auth.phppagination.phppasswords.phpvalidation.php.

Todos en ingles, para las etiquetas o palabras adicionales en multilenguaje, creamos el archivo main.php, en la misma carpeta para el ingles.

Y así para cada idioma, creamos los mismos archivos, pero con datos según el idioma correspondiente, como por ejemplo en la carpeta

Resources\Lang\es

Tendremos los mismos archivos mencionados anteriormente, pero en español.
Para mayor comprensión, veamos el archivo auth.php, en ingles contiene en un array return:

    'failed' => 'These credentials do not match our records.',
    'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',

Así pues para el español el archivo quedaría así:

    'failed' => 'Sus datos no coinciden con nuestros registros.',
    'throttle' => 'Demasiados intentos. Por favor intente mas tarde en :seconds segundos.',

Para facilitar la adición de los lenguajes español e ingles, dejo el enlace de descarga de la carpeta Resources\Lang.

Como usar las etiquetas de idioma en las plantillas

Para el ejemplo veamos el archivo Resources\Views\Auth\login.blade.php
Veamos la siguiente linea del archivo ( Se observa un texto en ingles ):

    <div class="card-header">{{ __('Login') }}</div>

Para que el idioma cambie se reemplaza la linea por:

    <div class="card-header">@lang('main.lblin')</div>

Especificando en el archivo main.php de cada idioma para español:

'lblin' => 'Ingresar',

Y para ingles:

'lblin' => 'Login',

Notamos claramente como en @lang('main.lblin'), se indica el nombre del archivo que contiene la etiqueta de idioma main.php, y la etiqueta lblin, que se debe encontrar en dicho archivo en las diferentes carpetas de idiomas que creemos.

Cuya notación es: @lang('archivo.etiqueta').

Dejo el link para facilitar el proceso de modificación de las plantillas de la carpeta Views\Auth.

(Incluye otras vistas adicionales).

Quedan de cuenta propia modificar las vistas home.blade.php, welcome.blade.php y el layout app.blade.php.

Personalmente prefiero crear un diseño propio, usar bienvenido.blade.php, y recrear home.blade.php según los objetivos.

Modificación del correo adaptado a idiomas

Para ello vamos al archivo:

vendor\laravel\framework\src\Illuminate\Notifications\resources\views\email.blade.php

Y remplazamos con el siguiente contenido que ya esta adaptado a idiomas:

@component('mail::message')
{{-- Greeting --}}
@if (! empty($greeting))
# {{ $greeting }}
@else
@if ($level === 'error')
# @lang('main.lblmailvrfyW')
@else
# @lang('main.lblmailvrfyHola')
@endif
@endif
{{-- Intro Lines --}}
@lang('main.lblmailnuno')
{{-- Action Button --}}
@isset($actionText)
<?php
    switch ($level) {
        case 'success':
        case 'error':
            $color = $level;
            break;
        default:
            $color = 'primary';
    }
?>
@component('mail::button', ['url' => $actionUrl, 'color' => $color])
@lang('main.lblmailvrfbtn')
@endcomponent
@endisset
{{-- Outro Lines --}}
@lang('main.lblmailndos')
{{-- Salutation --}}
@if (! empty($salutation))
{{ $salutation }}
@else
@lang('main.lblmailvrfySlds'),<br>
{{ config('app.name') }}
@endif
{{-- Subcopy --}}
@isset($actionText)
@slot('subcopy')
    @lang('main.lblmailstone') @lang($actionText) @lang('main.lblmailsttwo')
<span class="break-all">[{{ $displayableActionUrl }}]({{ $actionUrl }})</span>
@endslot
@endisset
@endcomponent

Y voila!!!
Ya esta nuestro correo adaptado a los dos idiomas aquí ilustrados.
Para otros idiomas se duplican los archivos y se modifica el contenido de cada label, por el correspondiente para cada idioma.

En la siguiente sección veremos las vistas.

Comentarios