articuli

Guida passo-passo per la localizzazione di Laravel, tutoriale con esempi

Cumu localizà un prughjettu Laravel, cumu sviluppà un prughjettu in Laravel è rende usable in parechje lingue. In questu articulu vedemu cumu travaglià cù i schedarii di traduzzione, creà un selettore di lingua è più cù esempi.

Laravel hè una applicazione pensata per esse lucale, per adattà à diverse lingue è culture. A localizazione adatta l'applicazioni internaziunali à una lingua specifica per mezu di a traduzzione.

Prerequisites

  • In questu articulu avemu da riferite Laravel versione 8.x;
  • Per seguità stu tutoriale currettamente, duvete avè a cunniscenza necessaria di a lingua di prugrammazione PHP è u framework Laravel.
  • U vostru duminiu hè localhost. Se no, rimpiazzà localhost cù u vostru nome di duminiu o indirizzu IP (secondu a vostra installazione).

U travagliu cù i schedarii di traduzzione

In Laravel, cum'è in parechji altri frameworks, pudemu almacenà traduzioni per diverse lingue in schedari separati. Ci hè dui modi per urganizà i schedarii di traduzzione Laravel:

  • Un vechju approcciu chì implica l'almacenamiento di fugliali in u locu seguente: resources/lang/{en,fr,ru}/{myfile.php};
  • Un novu approcciu chì implica l'almacenamiento di fugliali in u locu seguente: resources/lang/{fr.json, ru.json};

Per e lingue chì sò diffirenti per u territoriu, duvete nome directory/file di a lingua sicondu ISO 15897. Per esempiu, per l'inglese britannicu avete aduprà en_GB una volta per tutte en-gb. In questu articulu, avemu da fucalizza nantu à u sicondu approcciu, ma u stessu passa per u primu (cù l'eccezzioni di cumu i chjavi di traduzzione sò chjamati è recuperati). 

Traduzioni simplici

Avà, andemu à resources/views/welcome.blade.phpfile è rimpiazzà u cuntenutu di u bodytaggate cù u nostru, cusì:

<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>

Cuminciaremu per preparà u nostru missaghju di benvenuta per a localizazione, chì hè veramente faciule in Laravel. Tuttu ciò chì duvete fà hè di rimpiazzà u testu "Benvenutu à u nostru situ web" cù u seguente codice: {{ __('Welcome to our website') }}. Questu hà urdinatu à Laravel per vede "Benvenutu à u nostru situ web" per difettudefinita è cercate traduzzioni di sta stringa se una lingua altru ch'è l'inglese hè stabilita (avemu da esse più tardi). L'inglese serà stabilitu cum'è a lingua predeterminatadefinite di a nostra app, dunque per difettudefinita vi simpricimenti mustrà u testu "Benvenuti à u nostru situ". Se u locale hè diversu, pruveremu di circà a traduzzione currispundente chì serà creata in un mumentu.

Localizazione di Laravel

Ma cumu Laravel sapi quale hè a lingua attuale o chì lingue sò dispunibili in l'applicazione? Face questu fighjendu a cunfigurazione lucale in l'app config/app.php. Aprite stu schedariu è cercate sti dui chjavi di array associative:

/*
|--------------------------------------------------------------------------
| 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',

A descrizzione mostrata sopra à e chjave deve esse auto-esplicativa, ma in corta, a chjave locale cuntene a stanza di predefinite di a vostra applicazione (almenu, se nisun altru locale hè statu stabilitu in u codice). È u fallback_locale hè attivatu se avemu stabilitu una stanza inesistente in a nostra applicazione.

Mentre avemu stu schedariu apertu, aghjustemu una nova chjave per a nostra comodità elencu tutti i locali chì a nostra applicazione supporterà. Utilizemu questu dopu quandu aghjunghjemu un switcher locale. Tuttavia, questu hè un compitu facultativu postu chì Laravel ùn ci hè micca bisognu di fà.

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

Avà a nostra applicazione supporta trè lingue: inglese, talianu è francese.

File di traduzzione

Avà chì avemu stabilitu tutti i locali cù quale avemu da travaglià, pudemu andà avanti è passà à traduzzione di u nostru messagiu di pre benvenutudefinotte.

Cuminciamu per aghjunghje novi schedarii di localizazione à u cartulare resources/lang. Prima, crea un schedariu resources/lang/it.json è aghjunghje e traduzzioni currispundenti, cum'è seguente:

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

Dopu, crea un schedariu resources/lang/fr.json:

{

"Benvenuti à u nostru situ web": "Benvenuti à u nostru situ"

}

Comu pudete vede, avemu sempre riferitu à u messagiu predefinite chì avemu aghjustatu in u schedariu welcome.blade.php (chì era {{ __('Welcome to our website') }}). U mutivu perchè ùn avemu micca da creà un en.json Hè perchè Laravel sà digià quali missaghji passemu da pre-settingdefifinitu cù a funzione __() sò per i nostri pre lucalidefinitu fr.

Cambia di locale in Laravel

À questu puntu, Laravel ùn sapi micca cumu cambià u locu, cusì per avà facemu e traduzioni direttamente in u percorsu. Edite u percorsu pre benvenutudefifinitu cum'è mostra quì sottu:

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

Avà pudemu visità u nostru situ web, specificendu qualsiasi di e lingue dispunibili cum'è u primu segmentu di strada: per esempiu, localhost/rulocalhost/fr. Duvete vede u cuntenutu localizatu. In casu chì specificate un locale micca supportatu o ùn specificate micca un locale in tuttu, Laravel aduprà enper paràmetru predeterminatudefinita.

Middleware

Cambia u locale per ogni ligame di u situ ùn pò micca esse ciò chì vulete è ùn pò micca vede cusì pulitu esteticu. Hè per quessa chì eseguiremu u paràmetru di a lingua per mezu di un cambiatore di lingua speciale è aduprà a sessione d'utilizatore per vede u cuntenutu traduttu. Dunque, crea un novu middleware in u app/Http/Middleware/Localization.phpfile o in esecuzione 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);
    }
}

Stu middleware indicà à Laravel per utilizà a locale scelta da l'utilizatore se sta selezzione hè presente in a sessione.

Siccomu avemu bisognu di sta operazione per esse realizatu nantu à ogni dumanda, avemu ancu bisognu di aghjunghje à a pila di pre middlewaredefifinitu in app/http/Kernel.phpper il webgruppu middleware:

* 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 */
  ],

Cambia corsu

In seguitu, avemu bisognu di aghjunghje una strada per cambià u locale. Utilizemu una strada di chjude, ma pudete aduprà esattamente u listessu codice in u vostru controller se vulete:

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

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

Inoltre, ùn vi scurdate di caccià u toggle locale aghjuntu prima in u nostru percorsu di pre benvenutudefinotte:

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

Una volta questu hè fattu, l'unicu modu per l'utilizatore per cambià a lingua attualmente stabilita hè di entre localhost/language/{locale}. U localeA selezzione serà almacenata in a sessione è redirigerà l'utilizatori da induve venenu (verificate u Localizationmiddleware). Per pruvà, andate à localhost/language/ru(sempre chì a vostra cookie di sessione hè presente in u vostru navigatore) è vi vede u cuntenutu traduttu. Pudete spustà liberamente in u situ web o pruvate à rinfriscà a pagina è vede chì a lingua scelta hè cunservata.

U commutatore

Avà avemu bisognu di creà qualcosa chì l'utilizatore pò cliccà per cambià a lingua invece di inserisce manualmente i codici locali in l'URL. Per fà questu, aghjustemu un cuntrollu di lingua assai simplice. Dunque, creanu un novu resources/views/partials/language_switcher.blade.phpschedariu cù u codice seguente:

<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>

Includite u cambiatore di novu creatu in a vista "benvenuta":

<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>

Aprite u app/Providers/AppServiceProvider.phpfile è aghjunghje u codice per sparte quandu u nostru cambiatore di lingua hè cumpostu. In particulare, sparteremu i paràmetri locali attuali chì ponu accede cum'è un schedariu {{ $current_locale }}.

Newsletter di l'innovazione
Ùn mancate micca e nutizie più impurtanti nantu à l'innuvazione. Iscriviti per riceveli per email.

Opzioni di traduzzione avanzata in PHP Laravel

Avemu da travaglià principalmente cun resources/views/welcome.blade.php, cusì tuttu deve accade in a nostra vista di benvenuta, salvu chì altrimenti specificatu.

Parametri in strings di traduzzione

Per esempiu, salutemu u nostru utilizatore imaginariu (Amanda) invece di vede solu un missaghju genericu:

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

Per piacè nutate chì avemu usatu u nome cù a prima lettera minuscule, ma u placeholder cù a prima lettera maiuscola. In questu modu, Laravel pò aiutà à capitalizà automaticamente a parolla attuale. Questu succede se u placeholder principia cù una lettera maiuscola, per esempiu, :Nameproduce "Caroline" o una parola pienamente capitalizzata,  :NAME, produce "CAROLINE".

Avemu ancu aghjurnà i nostri schedarii di traduzzione resources/lang/fr.jsonresources/lang/it.json , cum'è per u mumentu, vedemu solu a versione inglese in ogni locu postu chì e chjave di traduzzione ùn currispondenu micca à e traduzzioni.

Francese:

{

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

}

Talianu:

{

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

}

Pluralizazione

Per vede a pluralizazione in azzione, aghjunghje un novu paràgrafu di testu. 

Per fà a pluralizazione, avete bisognu di utilizà a funzione trans_choice una volta per tutte __(), per esempiu:

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

Comu pudete vede, i formi plurali sò separati da a |.

Avà, chì si avemu bisognu di più forme plurali ? 

Questu hè ancu pussibule:

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

In questu casu, permettenu numeri 01, è da 219, è infine da 20 in poi. Di sicuru, pudete aghjunghje tante regule quantu avete bisognu.

Allora, chì s'è no vulemu placeholders in i nostri formi plurali ? 

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

Pudemu ancu aduprà u cuntu passatu in `trans_choice` se ne necessariu usendu un placeholder :count spiciali:

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

Infine, ùn vi scurdate di aghjurnà i vostri fugliali di traduzzione cù qualsiasi cambiamenti chì avete fattu à a traduzzione di basa.

Talianu:

{
  "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"
}

Francese:

{    
  "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"
}

U travagliu cù e date localizzate in Laravel

Per truvà e date, avemu da sfruttà u putere di Carbon , chì vene cun Laravel per difettudefinita. Scuprite u Documentation carbone ; pudete fà assai cose interessanti. Per esempiu, pudemu stabilisce a nostra localizazione cù e regule di data è ora.

Per u nostru esempiu simplice, mustraremu a data attuale localizzata per a lingua scelta. In u nostru routes/web.php, aghjurnà u percorsu di a pagina di benvenuta è passemu u missaghju di data localizzata à a nostra view Benvenuti:

<?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
    ]);
});

Aghjurnemu resources/views/welcome.blade.php aghjunghjendu a visualizazione di a data, cum'è questu:

{{ __('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 }}

Pruvate di cambià a lingua in a pagina iniziale di localhost, videremu chì e date sò avà localizzate, per esempiu:

Formate numeri è valute cù NumberFormatter

In parechji paesi, a ghjente usa diversi formati per rapprisintà numeri, per esempiu:

  • Stati Uniti → 123.123,12
  • Francia → 123 123,12

Dunque, per riflette queste differenzi in a vostra app Laravel, pudete aduprà NumberFormatter in u modu seguenti:

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

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

Pudete ancu scrive u numeru in una lingua particulare è vede qualcosa cum'è "centu vinti trè mila, centu vinti trè punti unu dui":

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

Inoltre, NumberFormatter permette di localizà facilmente e valute, per esempiu:

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

Allora per fr vi vede Euro, mentri per en_US a valuta serà in dollari americani.

Ercole Palmeri

Newsletter di l'innovazione
Ùn mancate micca e nutizie più impurtanti nantu à l'innuvazione. Iscriviti per riceveli per email.

Articuli recenti

I benefici di e pagine di culore per i zitelli - un mondu di magia per tutte l'età

Sviluppà e cumpetenze di u mutore fine attraversu u culore prepara i zitelli per e cumpetenze più cumplesse cum'è a scrittura. Per culori…

2 May 2024

U futuru hè quì: cumu l'industria di a spedizione rivoluziona l'economia glubale

U settore navale hè un veru putere ecunomicu glubale, chì hà navigatu versu un mercatu di 150 miliardi ...

1 May 2024

L'editori è l'OpenAI firmanu accordi per regulà u flussu di l'infurmazioni trattati da l'Intelligenza Artificiale

Lunedì, u Financial Times hà annunziatu un accordu cù OpenAI. FT licenze u so ghjurnalismu mundiale ...

30 April 2024

Pagamenti in linea: Eccu cumu i servizii di streaming vi facenu pagà per sempre

Milioni di persone paganu per i servizii di streaming, paghendu tariffi di abbonamentu mensili. Hè una opinione cumuna chì voi ...

29 April 2024