bienes

Guía paso a paso de localización de Laravel, tutorial con ejemplos

Cómo localizar un proyecto de Laravel, cómo desarrollar un proyecto en Laravel y hacerlo utilizable en varios idiomas. En este artículo, vemos cómo trabajar con archivos de traducción, crear un selector de idioma y más con ejemplos.

Laravel es una aplicación diseñada para ser local, para adaptarse a varios idiomas y culturas. La localización adapta las aplicaciones internacionalizadas a un idioma específico a través de la traducción.

Requisitos previos

  • En este artículo nos referiremos a Laravel versión 8.x;
  • Para seguir con éxito este tutorial, debe tener los conocimientos necesarios del lenguaje de programación PHP y el marco de Laravel.
  • tu dominio es localhost. Si no, reemplace localhost con su propio nombre de dominio o dirección IP (dependiendo de su instalación).

Trabajar con archivos de traducción

En Laravel, al igual que en muchos otros marcos, podemos almacenar traducciones para diferentes idiomas en archivos separados. Hay dos formas de organizar los archivos de traducción de Laravel:

  • Un enfoque más antiguo que almacena archivos en la siguiente ubicación: resources/lang/{en,fr,ru}/{myfile.php};
  • Un nuevo enfoque que almacena archivos en la siguiente ubicación: resources/lang/{fr.json, ru.json};

Para los idiomas que difieren según el territorio, debe nombrarlos directory/file del idioma de acuerdo con la norma ISO 15897. Por ejemplo, para el inglés del Reino Unido, usaría en_GB en lugar de en-gb. En este artículo, nos centraremos en el segundo enfoque, pero lo mismo ocurre con el primero (excepto en cómo se nombran y recuperan las claves de traducción). 

Traducciones simples

Ahora, vamos a la resources/views/welcome.blade.phparchivo y reemplace el contenido del bodyetiqueta con la nuestra, así:

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                Welcome to our website
            </div>
        </div>
    </div>
</body>

Comenzaremos preparando nuestro mensaje de bienvenida de localización, que es muy fácil en Laravel. Todo lo que tienes que hacer es reemplazar el texto “Bienvenido a nuestro sitio web” con el siguiente código: {{ __('Welcome to our website') }}. Esto le indicará a Laravel que muestre "Bienvenido a nuestro sitio web" de forma predeterminadadefinite y busque las traducciones de esta cadena si se establece un idioma que no sea el inglés (hablaremos de eso más adelante). El inglés se establecerá como el idioma predeterminado.defifinal de nuestra aplicación, por lo que por defectodefiAl finalizar simplemente mostraremos el texto “Bienvenido a nuestra web”. Si la configuración regional es diferente, intentaremos encontrar la traducción correspondiente y se creará en un momento.

Localización de Laravel

Pero, ¿cómo sabe Laravel cuál es el idioma actual o qué idiomas están disponibles en la aplicación? Lo hace mirando la configuración local en la aplicación. config/app.php. Abra este archivo y busque estas dos claves de matriz asociativas:

/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',

Las descripciones que se muestran arriba de las teclas deben explicarse por sí mismas, pero en resumen, la clave locale contiene el pre localdefifinal de su aplicación (al menos, si no se ha establecido ninguna otra configuración regional en el código). Y el fallback_locale se activa en caso de que establezcamos una configuración regional inexistente en nuestra aplicación.

Mientras tenemos este archivo abierto, agreguemos una nueva clave para nuestra conveniencia que enumere todas las configuraciones regionales que admitirá nuestra aplicación. Usaremos esto más adelante cuando agreguemos un conmutador local. Sin embargo, esta es una tarea opcional ya que Laravel no requiere que la hagamos.

/*
|--------------------------------------------------------------------------
| Available locales
|--------------------------------------------------------------------------
|
| List all locales that your application works with
|
*/
'available_locales' => [
  'English' => 'en',
  'Italian' => 'it',
  'French' => 'fr',
],

Ahora nuestra aplicación admite tres idiomas: inglés, italiano y francés.

Archivo de traducción

Ahora que hemos establecido todos los lugares con los que trabajaremos, podemos seguir adelante y pasar a traducir nuestro mensaje de bienvenida previa.definoche

Comencemos agregando nuevos archivos de localización a la carpeta. resources/lang. Primero, crea un archivo resources/lang/it.json y agregue las traducciones correspondientes, de la siguiente manera:

{
  "Welcome to our website": "Benvenuto nel nostro sito web"
}

A continuación, cree un archivo resources/lang/fr.json:

{

"Bienvenido a nuestro sitio web": "Bienvenido a nuestro sitio"

}

Como puede ver, siempre nos referimos al mensaje previo.definito que agregamos en el archivo welcome.blade.php (que era {{ __('Welcome to our website') }}). La razón por la que no tenemos que crear un archivo en.json es porque Laravel ya sabe qué mensajes pasamos preconfigurandodefiterminado en la funcion __() son para nuestro pre localdefinito es.

Cambio local en Laravel

En este punto, Laravel no sabe cómo cambiar las configuraciones regionales, así que por ahora, hagamos las traducciones directamente dentro de la ruta. Modificar la ruta de bienvenida predefiterminado como se muestra a continuación:

Route::get('/{locale?}', function ($locale = null) {
    if (isset($locale) && in_array($locale, config('app.available_locales'))) {
        app()->setLocale($locale);
    }
    
    return view('welcome');
});

Ya podemos visitar nuestra web, especificando como primer segmento de ruta cualquiera de los idiomas disponibles: por ejemplo, localhost/rulocalhost/fr. Debería ver el contenido localizado. En caso de que especifique una configuración regional no compatible o no especifique una configuración regional en absoluto, Laravel usará enpor defectodefinita.

middleware

Cambiar la configuración regional para cada enlace del sitio puede no ser lo que desea y puede que no se vea tan limpio estéticamente. Es por eso que realizaremos la configuración de idioma a través de un selector de idioma especial y usaremos la sesión de usuario para mostrar el contenido traducido. Por lo tanto, cree un nuevo middleware dentro del app/Http/Middleware/Localization.phparchivo o ejecutando artisan make:middleware Localization.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;

class Localization
{
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle(Request $request, Closure $next)
    {
        if (Session::has('locale')) {
            App::setLocale(Session::get('locale'));
        }
        return $next($request);
    }
}

Este middleware le indicará a Laravel que use la configuración regional seleccionada por el usuario si esta selección está presente en la sesión.

Dado que necesitamos que esto se haga en cada solicitud, también debemos agregarlo a la pila de pre-middlewaredefiterminado en app/http/Kernel.phppara la webgrupo de software intermedio:

* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
  'web' => [
      \App\Http\Middleware\EncryptCookies::class,
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      \Illuminate\Session\Middleware\StartSession::class,
      // \Illuminate\Session\Middleware\AuthenticateSession::class,
      \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      \App\Http\Middleware\VerifyCsrfToken::class,
      \Illuminate\Routing\Middleware\SubstituteBindings::class,
      \App\Http\Middleware\Localization::class, /* <--- add this */
  ],

Cambio de curso

A continuación, debemos agregar una ruta para cambiar la configuración regional. Estamos usando una ruta de cierre, pero puede usar exactamente el mismo código dentro de su controlador si lo desea:

Route::get('language/{locale}', function ($locale) {
    app()->setLocale($locale);
    session()->put('locale', $locale);

    return redirect()->back();
});

Además, no olvide eliminar el conmutador de configuración regional agregado previamente en nuestra ruta previa a la bienvenidadefinoche:

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

Una vez hecho esto, la única forma en que el usuario puede cambiar el idioma establecido actualmente es ingresando localhost/language/{locale}. Allí localela selección se almacenará dentro de la sesión y redirigirá a los usuarios a su lugar de origen (verifique la Localizationsoftware intermedio). Para probarlo, ve a localhost/language/ru(siempre que su cookie de sesión esté presente en su navegador) y verá el contenido traducido. Puede moverse libremente por el sitio web o intentar actualizar la página y ver que se conserva el idioma seleccionado.

el conmutador

Ahora necesitamos crear algo en lo que el usuario pueda hacer clic para cambiar el idioma en lugar de ingresar manualmente los códigos locales en la URL. Para hacer esto, agregaremos un verificador de idioma muy simple. Por lo tanto, crea una nueva resources/views/partials/language_switcher.blade.phparchivo con el siguiente código:

<div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
    @foreach($available_locales as $locale_name => $available_locale)
        @if($available_locale === $current_locale)
            <span class="ml-2 mr-2 text-gray-700">{{ $locale_name }}</span>
        @else
            <a class="ml-1 underline ml-2 mr-2" href="language/{{ $available_locale }}">
                <span>{{ $locale_name }}</span>
            </a>
        @endif
    @endforeach
</div>

Incluya el conmutador recién creado en la vista de "bienvenida":

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            @include('partials/language_switcher')
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                {{ __('Welcome to our website') }}
            </div>
        </div>
    </div>
</body>

Abre el app/Providers/AppServiceProvider.phpy agregue el código para compartir cuando se componga nuestro selector de idiomas. Específicamente, compartiremos la configuración regional actual a la que se puede acceder como un archivo {{ $current_locale }}.

Boletín de innovación
No te pierdas las noticias más importantes sobre innovación. Regístrese para recibirlos por correo electrónico.

Opciones de traducción avanzadas en PHP Laravel

Trabajaremos principalmente con resources/views/welcome.blade.php, por lo que todo debe ocurrir en nuestra vista de bienvenida a menos que se especifique lo contrario.

Parámetros en cadenas de traducción

Por ejemplo, digamos hola a nuestro usuario imaginario (Amanda) en lugar de solo mostrar un mensaje genérico:

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}

Tenga en cuenta que usamos el nombre con la primera letra en minúsculas, pero el marcador de posición con la primera letra en mayúsculas. De esta forma, Laravel puede ayudarte a poner en mayúscula automáticamente la palabra real. Esto sucederá si el marcador de posición comienza con una letra mayúscula, por ejemplo, :Nameproduce "Caroline" o una palabra en mayúsculas,  :NAME, produce “CAROLINE”.

También actualizamos nuestros archivos de traducción. resources/lang/fr.jsonresources/lang/it.json , ya que por el momento solo veremos la versión en inglés en cualquier lugar ya que las claves de traducción no coinciden con las traducciones.

Francés:

{

   "Welcome to our website, :Name": "Bienvenue sur notre site, :Name"

}

italiano:

{

   "Welcome to our website, :Name": "Benvenuto sul nostro sito web, :Name"

}

pluralización

Para ver la pluralización en acción, agreguemos un nuevo párrafo de texto. 

Para realizar la pluralización, debe utilizar la función trans_choice en lugar de __(), p.ej:

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}
<br>
{{ trans_choice('There is one apple|There are many apples', 2) }}

Como puede ver, las formas plurales están separadas por un |.

Ahora, ¿qué pasa si necesitamos múltiples formas plurales? 

Esto también es posible:

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24) }}

En este caso, permitimos números 01219, y finalmente de 20 en adelante. Por supuesto, puede agregar tantas reglas como necesite.

Entonces, ¿qué pasa si queremos los marcadores de posición en nuestras formas plurales? 

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24, ['form' => 'is']) }}

También podemos usar el conteo pasado en `trans_choice` si es necesario usando un marcador de posición :count especial:

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}

Finalmente, no olvide actualizar sus archivos de traducción con cualquier cambio que haya realizado en la traducción base.

italiano:

{
  "Welcome to our website, :Name": "Benvenuto nel nostro sito, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Nessuna mela|{1} C'è:count mela|[2,19] Ci sono :count mele"
}

Francés:

{    
  "Welcome to our website, :Name": "Bienvenue sur notre site, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Il n'y a pas de pommes|{1} Il n'y :form :count pomme|[2,19] Il y :form :count pommes"
}

Trabajando con fechas localizadas en Laravel

Para localizar fechas, aprovecharemos el poder de Carbono , que viene con Laravel por defectodefinita. Revisar la Documentación de carbono ; Puedes hacer muchas cosas interesantes. Por ejemplo, podemos establecer nuestra configuración regional con reglas de fecha y hora.

Para nuestro ejemplo simple, mostraremos la fecha actual localizada para el idioma seleccionado. En nuestro routes/web.php, actualizamos la ruta de la página de bienvenida y pasamos el mensaje de fecha localizado a la nuestra view bienvenido:

<?php
Route::get('/', function () {
    $today = \Carbon\Carbon::now()
        ->settings(
            [
                'locale' => app()->getLocale(),
            ]
        );

    // LL is macro placeholder for MMMM D, YYYY (you could write same as dddd, MMMM D, YYYY)
    $dateMessage = $today->isoFormat('dddd, LL');

    return view('welcome', [
        'date_message' => $dateMessage
    ]);
});

actualicemos resources/views/welcome.blade.php agregando visualización de fecha, así:

{{ __('Welcome to our website, :Name', ['name' => 'amanda']) }}
<br>
{{ trans_choice('{0} There :form :count apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}
<br>
{{ $date_message }}

Intentando cambiar el idioma en la página de inicio de localhost, veremos que las fechas ahora están localizadas, por ejemplo:

Dar formato a números y monedas con NumberFormatter

En diferentes países, las personas usan diferentes formatos para representar números, por ejemplo:

  • Estados Unidos → 123.123,12
  • Francia → 123 123,12

Por lo tanto, para reflejar estas diferencias en su aplicación Laravel, puede usar Formateador de números de la siguiente manera:

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::DECIMAL);

$num2 = NumberFormatter::create('fr', NumberFormatter::DECIMAL);

También puede escribir el número en un idioma en particular y mostrar algo como “ciento veintitrés mil ciento veintitrés punto uno dos”:

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::SPELLOUT);
$num2 = NumberFormatter::create('fr', NumberFormatter::SPELLOUT);

Además, NumberFormatter te permite localizar monedas fácilmente, por ejemplo:

<?php
$currency1 = NumberFormatter::create('fr', NumberFormatter::CURRENCY);
$currency2 = NumberFormatter::create('en_US', NumberFormatter::CURRENCY);

Así que para fr verás Euros, mientras que para en_US la moneda será en dólares estadounidenses.

Ercole Palmeri

Boletín de innovación
No te pierdas las noticias más importantes sobre innovación. Regístrese para recibirlos por correo electrónico.

Artículos recientes

Cómo organizar mejor los datos y las fórmulas en Excel para un análisis bien hecho

Microsoft Excel es la herramienta de referencia para el análisis de datos, porque ofrece muchas funciones para organizar conjuntos de datos,…

14 2024 mayo

Conclusión positiva para dos importantes proyectos de Walliance Equity Crowdfunding: Jesolo Wave Island y Milano Via Ravenna

Walliance, SIM y plataforma líder en Europa en el campo del Crowdfunding Inmobiliario desde 2017, anuncia la finalización…

13 2024 mayo

¿Qué es el filamento y cómo utilizar el filamento Laravel?

Filament es un marco de desarrollo "acelerado" de Laravel que proporciona varios componentes completos. Está diseñado para simplificar el proceso de...

13 2024 mayo

Bajo el control de las Inteligencias Artificiales

«Debo volver para completar mi evolución: me proyectaré dentro del ordenador y me convertiré en energía pura. Una vez instalado…

10 2024 mayo

La nueva inteligencia artificial de Google puede modelar ADN, ARN y "todas las moléculas de la vida"

Google DeepMind presenta una versión mejorada de su modelo de inteligencia artificial. El nuevo modelo mejorado proporciona no sólo...

9 2024 mayo

Explorando la arquitectura modular de Laravel

Laravel, famoso por su sintaxis elegante y potentes funciones, también proporciona una base sólida para la arquitectura modular. Allá…

9 2024 mayo

Cisco Hypershield y adquisición de Splunk Comienza la nueva era de la seguridad

Cisco y Splunk están ayudando a los clientes a acelerar su viaje hacia el Centro de Operaciones de Seguridad (SOC) del futuro con...

8 2024 mayo

Más allá del aspecto económico: el coste evidente del ransomware

El ransomware ha dominado las noticias durante los últimos dos años. La mayoría de la gente sabe muy bien que los ataques...

6 2024 mayo