Localización
- Introducción
- Definiendo Cadenas de Traducción
- Recuperando Cadenas de Traducción
- Sobrescribiendo los Archivos de Idioma del Paquete
Introducción
[!NOTE] Por defecto, el esqueleto de la aplicación Laravel no incluye el directorio
lang
. Si deseas personalizar los archivos de idioma de Laravel, puedes publicarlos a través del comando Artisanlang:publish
. Las características de localización de Laravel ofrecen una forma conveniente de recuperar cadenas en varios idiomas, lo que te permite soportar fácilmente múltiples idiomas dentro de tu aplicación. Laravel ofrece dos formas de gestionar cadenas de traducción. Primero, las cadenas de idioma pueden almacenarse en archivos dentro del directoriolang
de la aplicación. Dentro de este directorio, puede haber subdirectorios para cada idioma soportado por la aplicación. Este es el enfoque que utiliza Laravel para gestionar cadenas de traducción para características integradas de Laravel, como los mensajes de error de validación: O bien, las cadenas de traducción pueden definirse dentro de archivos JSON que se colocan en el directoriolang
. Al adoptar este enfoque, cada idioma admitido por tu aplicación tendría un archivo JSON correspondiente dentro de este directorio. Este enfoque se recomienda para aplicaciones que tienen un gran número de cadenas traducibles:
/lang en.json es.json
Discutiremos cada enfoque para gestionar las cadenas de traducción dentro de esta documentación.
Publicando los Archivos de Idioma
Por defecto, el esqueleto de la aplicación Laravel no incluye el directorio lang
. Si deseas personalizar los archivos de idioma de Laravel o crear los tuyos, debes crear el directorio lang
a través del comando Artisan lang:publish
. El comando lang:publish
creará el directorio lang
en tu aplicación y publicará el conjunto de archivos de idioma predeterminados utilizados por Laravel:
php artisan lang:publish
Configurando la Localización
El idioma predeterminado para tu aplicación se almacena en la opción de configuración locale
del archivo de configuración config/app.php
, que generalmente se establece utilizando la variable de entorno APP_LOCALE
. Puedes modificar este valor para adaptarlo a las necesidades de tu aplicación.
También puedes configurar un "idioma de respaldo", que se utilizará cuando el idioma predeterminado no contenga una cadena de traducción dada. Al igual que el idioma predeterminado, el idioma de respaldo también se configura en el archivo de configuración config/app.php
, y su valor suele establecerse utilizando la variable de entorno APP_FALLBACK_LOCALE
.
Puedes modificar el idioma predeterminado para una sola solicitud HTTP en tiempo de ejecución utilizando el método setLocale
proporcionado por la fachada App
:
use Illuminate\Support\Facades\App; Route::get('/greeting/{locale}', function (string $locale) { if (! in_array($locale, ['en', 'es', 'fr'])) { abort(400); } App::setLocale($locale); // ...});
Determinando la Localización Actual
Puedes usar los métodos currentLocale
e isLocale
en la fachada App
para determinar la localidad actual o verificar si la localidad es un valor dado:
use Illuminate\Support\Facades\App; $locale = App::currentLocale(); if (App::isLocale('en')) { // ...}
Lenguaje de Pluralización
Puedes instruir al "pluralizador" de Laravel, que es utilizado por Eloquent y otras partes del framework para convertir cadenas en singular a cadenas en plural, para que use un idioma que no sea el inglés. Esto se puede lograr invocando el método useLanguage
dentro del método boot
de uno de los proveedores de servicios de tu aplicación. Los idiomas actualmente soportados por el pluralizador son: french
, norwegian-bokmal
, portuguese
, spanish
, y turkish
:
use Illuminate\Support\Pluralizer; /** * Bootstrap any application services. */public function boot(): void{ Pluralizer::useLanguage('spanish'); // ...}
[!WARNING] Si personalizas el idioma del pluralizador, debes definir explícitamente los nombres de las tablas de tu modelo Eloquent.
Definiendo Cadenas de Traducción
Usando Teclas de Método Abreviado
Típicamente, las cadenas de traducción se almacenan en archivos dentro del directorio lang
. Dentro de este directorio, debe haber un subdirectorio para cada idioma soportado por tu aplicación. Este es el enfoque que utiliza Laravel para gestionar las cadenas de traducción para características integradas de Laravel, como los mensajes de error de validación:
/lang /en messages.php /es messages.php
Todos los archivos de idioma devuelven un array de cadenas con clave. Por ejemplo:
<?php // lang/en/messages.php return [ 'welcome' => 'Welcome to our application!',];
[!WARNING] Para los idiomas que difieren por territorio, debes nombrar los directorios de idioma según la ISO 15897. Por ejemplo, se debe usar "en_GB" para inglés británico en lugar de "en-gb".
Usando Cadenas de Traducción como Claves
Para aplicaciones con un gran número de cadenas traducibles, definir cada cadena con una "clave corta" puede volverse confuso al hacer referencia a las claves en tus vistas y es engorroso tener que crear constantemente claves para cada cadena de traducción admitida por tu aplicación.
Por esta razón, Laravel también ofrece soporte para definir cadenas de traducción utilizando la "traducción predeterminada" de la cadena como clave. Los archivos de idioma que usan cadenas de traducción como claves se almacenan como archivos JSON en el directorio lang
. Por ejemplo, si tu aplicación tiene una traducción al español, deberías crear un archivo lang/es.json
:
{ "I love programming.": "Me encanta programar."}
Conflictos de Clave / Archivo
No debes definir claves de cadenas de traducción que entren en conflicto con otros nombres de archivo de traducción. Por ejemplo, traducir __('Action')
para la localidad "NL" mientras existe un archivo nl/action.php
pero no existe un archivo nl.json
resultará en que el traductor devuelva todo el contenido de nl/action.php
.
Recuperando Cadenas de Traducción
Puedes recuperar cadenas de traducción de tus archivos de idioma utilizando la función auxiliar __
. Si estás utilizando "claves cortas" para definir tus cadenas de traducción, debes pasar el archivo que contiene la clave y la clave misma a la función __
usando la sintaxis de "punto". Por ejemplo, recuperemos la cadena de traducción welcome
del archivo de idioma lang/en/messages.php
:
echo __('messages.welcome');
Si la cadena de traducción especificada no existe, la función __
devolverá la clave de la cadena de traducción. Así que, utilizando el ejemplo anterior, la función __
devolvería messages.welcome
si la cadena de traducción no existe.
Si estás utilizando tus cadenas de traducción predeterminadas como tus claves de traducción, debes pasar la traducción predeterminada de tu cadena a la función __
;
echo __('I love programming.');
Nuevamente, si la cadena de traducción no existe, la función __
devolverá la clave de la cadena de traducción que se le dio.
Si estás utilizando el motor de plantillas Blade, puedes usar la sintaxis de eco {{ }}
para mostrar la cadena de traducción:
{{ __('messages.welcome') }}
Reemplazando Parámetros en Cadenas de Traducción
Si lo deseas, puedes definir marcadores de posición en tus cadenas de traducción. Todos los marcadores de posición están precedidos por un :
. Por ejemplo, puedes definir un mensaje de bienvenida con un nombre de marcador de posición:
'welcome' => 'Welcome, :name',
Para reemplazar los marcadores de posición al recuperar una cadena de traducción, puedes pasar un array de reemplazos como segundo argumento a la función __
:
echo __('messages.welcome', ['name' => 'dayle']);
Si tu marcador de posición contiene todas las letras en mayúscula, o solo tiene su primera letra en mayúscula, el valor traducido se capitalizará en consecuencia:
'welcome' => 'Welcome, :NAME', // Welcome, DAYLE'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle
Formato de Reemplazo de Objetos
Si intentas proporcionar un objeto como un marcador de posición de traducción, se invocará el método __toString
del objeto. El método __toString
es uno de los "métodos mágicos" integrados de PHP. Sin embargo, a veces es posible que no tengas control sobre el método __toString
de una clase dada, como cuando la clase con la que estás interactuando pertenece a una biblioteca de terceros.
En estos casos, Laravel te permite registrar un manejador de formato personalizado para ese tipo particular de objeto. Para lograr esto, debes invocar el método stringable
del traductor. El método stringable
acepta una función anónima, que debe especificar el tipo de objeto para el que es responsable del formato. Típicamente, el método stringable
debe ser invocado dentro del método boot
de la clase AppServiceProvider
de tu aplicación:
use Illuminate\Support\Facades\Lang;use Money\Money; /** * Bootstrap any application services. */public function boot(): void{ Lang::stringable(function (Money $money) { return $money->formatTo('en_GB'); });}
Pluralización
La pluralización es un problema complejo, ya que diferentes idiomas tienen una variedad de reglas complejas para la pluralización; sin embargo, Laravel puede ayudarte a traducir cadenas de manera diferente según las reglas de pluralización que definas. Usando un carácter |
, puedes distinguir entre formas singulares y plurales de una cadena:
'apples' => 'There is one apple|There are many apples',
Por supuesto, también se admite la pluralización al utilizar cadenas de traducción como claves:
{ "There is one apple|There are many apples": "Hay una manzana|Hay muchas manzanas"}
Puedes incluso crear reglas de pluralización más complejas que especifiquen cadenas de traducción para múltiples rangos de valores:
'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',
Después de definir una cadena de traducción que tiene opciones de pluralización, puedes usar la función trans_choice
para recuperar la línea para un "conteo" dado. En este ejemplo, como el conteo es mayor que uno, se devuelve la forma plural de la cadena de traducción:
echo trans_choice('messages.apples', 10);
También puedes definir atributos de marcador de posición en las cadenas de pluralización. Estos marcadores de posición pueden ser reemplazados pasando un array como tercer argumento a la función trans_choice
:
'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago', echo trans_choice('time.minutes_ago', 5, ['value' => 5]);
Si deseas mostrar el valor entero que se pasó a la función trans_choice
, puedes usar el marcador de posición :count
incorporado:
'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',
Sobreescribiendo Archivos de Idioma de Paquete
Algunos paquetes pueden incluir sus propios archivos de idioma. En lugar de cambiar los archivos centrales del paquete para modificar estas líneas, puedes sobreescribirlas colocando archivos en el directorio lang/vendor/{package}/{locale}
.
Entonces, por ejemplo, si necesitas anular las cadenas de traducción en inglés en messages.php
para un paquete llamado skyrim/hearthfire
, debes colocar un archivo de idioma en: lang/vendor/hearthfire/en/messages.php
. Dentro de este archivo, solo debes definir las cadenas de traducción que deseas anular. Cualquier cadena de traducción que no anules seguirá cargándose desde los archivos de idioma originales del paquete.