Introducción

Las características de configuración regional de Laravel proporcionan una forma conveniente de retornar cadenas en varios idiomas, permitiéndote soportar fácilmente múltiples idiomas en tu aplicación. Las cadenas de idiomas son almacenadas en archivos dentro del directorio resources/lang. Dentro de este directorio debería haber un subdirectorio para cada idioma soportado por la aplicación:

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

Todos los archivos de idioma retornan un arreglo de cadenas con sus claves. Por ejemplo:

<?php

return [
    'welcome' => 'Welcome to our application'
];

Para idiomas que difieren por territorio, debes nombrar los directorios de idiomas según la ISO 15897. Por ejemplo, «en_GB» debe ser usado para inglés británico en lugar de «en-gb».

Configurando la configuración regional

El idioma por defecto para tu aplicación se almacena en el archivo de configuración config/app.php. Puedes modificar este valor en base a las necesidades de tu aplicación. También puedes cambiar el idioma activo en tiempo de ejecución usando el método setLocale en el facade App:

Route::get('welcome/{locale}', function ($locale) {
    App::setLocale($locale);

    //
});

Puedes configurar un «idioma alternativo», que será usado cuando el idioma activo no contenga una determinada cadena de traducción. Al igual que el idioma por defecto, el idioma alternativo también es configurado en el archivo de configuración config/app.php:

'fallback_locale' => 'en',

Determinando la configuración regional actual

Puedes usar los métodos getLocale e isLocale en el facade App para determinar la configuración regional actual o comprobar si la configuración tiene un valor dado:

$locale = App::getLocale();

if (App::isLocale('en')) {
    //
}

Definiendo cadenas de traducciones

Usando claves cortas

Típicamente, las cadenas de traducciones son almacenadas en archivos dentro del directorio resources/lang. Dentro de este directorio debería haber un subdirectorio para cada idioma soportado por la aplicación:

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

Todos los archivos de idioma retornan un arreglo de cadenas con sus claves. Por ejemplo:

<?php

// resources/lang/en/messages.php

return [
    'welcome' => 'Welcome to our application'
];

Usando cadenas de traducciones como claves

Para aplicaciones con grandes necesidades de traducción, definir cada cadena con una «clave corta» puede volverse confuso rápidamente al hacer referencia a estas en tus vistas. Por este motivo, Laravel también proporciona soporte para definir cadenas de traducciones usando la traducción «por defecto» de la cadena como clave.

Los archivos de traducción que usan cadenas de traducción como claves son almacenados como archivos JSON en el directorio resources/lang. Por ejemplo, si tu aplicación tiene una traducción en español, debes crear un archivo resources/lang/es.json:

{
    "I love programming.": "Me encanta programar."
}

Retornando cadenas de traducciones

Puedes retornar líneas desde archivos de idioma usando la función helper __. La función __ acepta el archivo y la clave de la cadena de traducción como primer argumento. Por ejemplo, vamos a retornar la cadena de traducción de welcome desde el archivo de idioma resources/lang/messages.php:

echo __('messages.welcome');

echo __('I love programming.');

Si estás usando el motor de plantillas Blade, puedes usar la sintaxis {{ }} para imprimir la cadena de traducción o usar la directiva @lang:

{{ __('messages.welcome') }}

@lang('messages.welcome')

Si la cadena de traducción especificada no existe, la función __ retornará la clave de la cadena de traducción. Así que, usando el ejemplo anterior, la función __ retornaría messages.welcome si la cadena de traducción no existe.

La directiva @lang no escapa ningún resultado. Eres totalmente responsable de escapar tu propia salida al usar esta directiva.

Reemplazando parámetros en cadenas de traducciones

Si lo deseas, puedes definir placeholders en tus cadenas de traducción. Todos los placeholders son precedidos por :. Por ejemplo, puedes definir un mensaje de bienvenida con un nombre como placeholder:

'welcome' => 'Welcome, :name',

Para reemplazar los placeholders al retornar una cadena de traducción, pasa un arreglo de reemplazos como segundo argumento de la función __:

echo __('messages.welcome', ['name' => 'dayle']);

Si tu placeholder contiene sólo letras mayúsculas o sólo tiene su primera letra en mayúscula, el valor traducido será escrito en mayúsculas de forma correcta:

'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle

Pluralización

La pluralización es un problema complejo, ya que diferentes idiomas tienen una variedad de reglas complejas de pluralización. Usando el símbolo |, puedes distinguir entre las formas singulares y plurales de una cadena:

'apples' => 'There is one apple|There are many apples',

Puedes incluso crear reglas de pluralización más complejas que especifican cadenas de traducción para múltiples rangos de números:

'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',

Luego de definir una cadena de traducción que tiene opciones de pluralización, puedes usar la función trans_choice para retornar la línea de un «conteo» dado. En este ejemplo, dado que el conteo es mayor que uno, la forma plural de la cadena de traducción es retornada:

echo trans_choice('messages.apples', 10);

También puedes definir atributos de placeholder en cadenas de pluralización. Estos placeholders pueden ser reemplazados pasando un arreglo 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 te gustaría mostrar el valor entero que fue pasado a la función trans_choice, puedes también usar el placeholder :count:

'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',

Sobrescribiendo archivos del paquete de idioma

Algunos paquetes pueden venir con sus propios archivos de idioma. En lugar de cambiar los archivos principales del paquete para modificar esas líneas, puedes sobrescribirlas colocando archivos en el directorio resources/lang/vendor/{package}/{locale}.

Así que, por ejemplo, si necesitas sobrescribir las cadenas de traducción en inglés en messages.php para un paquete llamado skyrim/hearthfire, debes colocar un archivo de idioma en: resources/lang/vendor/hearthfire/en/messages.php. Dentro de este archivo, debes sólo definir las cadenas de traducción que deseas sobrescribir. Cualquier cadena de traducción que no sobrescribas será cargada desde los archivos de idioma originales del paquete.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Plantillas Blade - Documentación de Laravel 6 Lección siguiente JavaScript y Estructuración de CSS - Documentación de Laravel 6