La gestione della lingua è un problema molto comune quando si sviluppa un sito web o un’applicazione. Laravel viene in nostro aiuto con il suo modulo localization che non ci pentiamo di definire semplice e versatile.

Traduzioni in Laravel: ecco come gestirle al meglio

Le varie traduzioni per i testi, messaggi di conferma o di errore, finestre di dialogo, ecc … sono contenuti e organizzati per lingua nella cartella /resources/lang, come mostrato di seguito:

/resources    
  /lang        
    /en
      messages.php
      users.php
    /it
      messages.php
      users.php

Ogni file .php contenuto nella cartella restituirà un array associativo contenente le traduzioni come mostrato di seguito:

// Contenuto del file /resources/lang/en/messages.php
return [
    'welcome' => 'Welcome to our application',
    'hello' => 'Hello'
]

// Contenuto del file /resources/lang/it/messages.php
return [
    'welcome' => 'Benvenuto nella nostra applicazione',
    'hello' => 'Ciao'
]

Perciò questi file conterranno le traduzioni di ogni testo contenuto nell’applicazione.

Apriamo ora il file config/app.php. Questo file contiene tutti i settaggi generali dell’applicazione e tra questi la lingua di default:

'locale' => 'en',

Questa impostazione sostanzialmente indica la lingua in cui l’applicazione verrà eseguita salvo diversa indicazione. Nota che il valore di questa impostazione è uguale al nome della cartella in cui sono contenuti i relativi file di traduzione.
Un altro imporante valore in questo file è quello di fallback_locale:

'fallback_locale' => 'en',

Questo attributo sostanzialmente determina la lingua di default in cui cercare la traduzione se questa non viene trovata nella lingua corrente.

Ok, ma come fare per cambiare la lingua corrente?

Per definire la lingua è possibile utilizzare il metodo setLocale() della facade App di Laravel. E’ possibile utilizzare questo metodo in un middleware, in un controller, o dove meglio ritenete. Questo è un esempio di utilizzo (molto teorico) preso dalla documentazione ufficiale:

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

Per ottenere il valore della lingua corrente useremo invece il metodo App::getLocale().
Per mostrare un testo possiamo utilizzare l’helper Laravel __() oppure l’helper @lang() di blade come mostrato di seguito:

echo __('messages.welcome');
{{ __('messages.welcome') }}
@lang('messages.welcome')

Supponiamo adesso di voler aggiungere una variabile in mezzo alla traduzione. E’ molto semplice: nel file di traduzione diamo un’etichetta al valore che vogliamo includere all’interno del testo e quando utilizziamo l’helper per recuperare la traduzione, passiamo il valore tramite un array associativo.

// file di traduzione /lang/it/messages.php
'points' => 'Hai a disposizione :points punti',
// utilizzo dell'helper per mostrare la traduzione
// supponendo che la variabile $pointsAmount contenga il numero 
// di punti da mostrare
{{ __('messages.points', ['points' => $pointsAmount]) }}

Pluralizzazione

Altro importante tool è quello della pluralizzazione. E’ possibile indicare le varianti per singolare / plurale:

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

O addirittura indicare dei range precisi:

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

Questa volta per mostrare la traduzione dobbiamo usare l’helper trans_choice indicando il numero di elementi:

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