Articole

Ghid pas cu pas de localizare Laravel, tutorial cu exemple

Cum să localizați un proiect Laravel, cum să dezvoltați un proiect în Laravel și să îl faceți utilizabil în mai multe limbi. În acest articol vedem cum să lucrați cu fișiere de traducere, să creați un comutator de limbi și multe altele cu exemple.

Laravel este o aplicație concepută pentru a fi locală, pentru a se adapta la diverse limbi și culturi. Localizarea adaptează aplicațiile internaționalizate la o anumită limbă prin traducere.

Cerințe preliminare

  • În acest articol ne vom referi Laravel versiunea 8.x;
  • Pentru a urma cu succes acest tutorial, trebuie să aveți cunoștințele necesare despre limbajul de programare PHP și framework-ul Laravel.
  • Domeniul dvs. este localhost. Dacă nu, înlocuiți localhost cu propriul nume de domeniu sau adresa IP (în funcție de instalarea dvs.).

Lucrul cu fișiere de traducere

În Laravel, la fel ca în multe alte cadre, putem stoca traduceri pentru diferite limbi în fișiere separate. Există două moduri de a organiza fișierele de traducere Laravel:

  • O abordare mai veche care stochează fișiere în următoarea locație: resources/lang/{en,fr,ru}/{myfile.php};
  • O nouă abordare care stochează fișierele în următoarea locație: resources/lang/{fr.json, ru.json};

Pentru limbile care diferă în funcție de teritoriu, ar trebui să le denumiți directory/file a limbii conform ISO 15897. De exemplu, pentru engleza britanică ați folosi en_GB in loc de en-gb. În acest articol, ne vom concentra pe cea de-a doua abordare, dar același lucru este valabil și pentru prima (cu excepția modului în care sunt denumite și preluate cheile de traducere). 

Traduceri simple

Acum, să trecem la resources/views/welcome.blade.phpfișier și înlocuiți conținutul fișierului bodyetichetați cu ale noastre, așa:

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

Vom începe prin a pregăti mesajul nostru de bun venit pentru localizare, care este foarte ușor în Laravel. Tot ce trebuie să faceți este să înlocuiți textul „Bine ați venit pe site-ul nostru” cu următorul cod: {{ __('Welcome to our website') }}. Acest lucru va instrui Laravel să afișeze „Bine ați venit pe site-ul nostru” în mod implicitdefinite și căutați traduceri ale acestui șir dacă este setată o altă limbă decât engleza (vom ajunge la asta mai târziu). Engleza va fi setată ca limbă implicitădefifinalizarea aplicației noastre, deci prin setare implicitădefiLa sfârșit vom afișa pur și simplu textul „Bine ați venit pe site-ul nostru”. Dacă locația este diferită, vom încerca să găsim traducerea potrivită și va fi creată într-un moment.

Localizare Laravel

Dar de unde știe Laravel care este limba curentă sau ce limbi sunt disponibile în aplicație? Face acest lucru uitându-se la configurația locală din aplicație config/app.php. Deschideți acest fișier și căutați aceste două chei de matrice asociative:

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

Descrierile afișate deasupra tastelor ar trebui să se explice de la sine, dar pe scurt, cheia locale conţine pre localdefifinalizarea aplicației dvs. (cel puțin, dacă nu a fost setată nicio altă localitate în cod). Si fallback_locale este activat în cazul în care setăm un local inexistent în aplicația noastră.

În timp ce avem acest fișier deschis, să adăugăm o cheie nouă pentru confortul nostru, listând toate locațiile pe care le acceptă aplicația noastră. Vom folosi acest lucru mai târziu când adăugăm un comutator local. Cu toate acestea, aceasta este o sarcină opțională, deoarece Laravel nu ne cere să o facem.

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

Acum, aplicația noastră acceptă trei limbi: engleză, italiană și franceză.

Fișiere de traducere

Acum că am stabilit toate locațiile cu care vom lucra, putem merge mai departe și trecem la traducerea mesajului nostru prealabil de bun venitdefinoaptea.

Să începem prin a adăuga noi fișiere de localizare în folder resources/lang. Mai întâi, creați un fișier resources/lang/it.json și adăugați traducerile corespunzătoare, după cum urmează:

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

Apoi, creați un fișier resources/lang/fr.json:

{

"Bine ati venit pe site-ul nostru": „Bine ați venit pe site-ul nostru”

}

După cum puteți vedea, ne referim întotdeauna la mesajul prealabildefinito pe care l-am adăugat în fișier welcome.blade.php (care era {{ __('Welcome to our website') }}). Motivul pentru care nu trebuie să creăm un fișier en.json pentru că Laravel știe deja ce mesaje trecem prin pre-setaredefiterminat la funcţie __() sunt pentru preul nostru localdefinito en.

Schimbare locală în Laravel

În acest moment, Laravel nu știe cum să schimbe locațiile, așa că, deocamdată, să facem traducerile direct în interiorul căii. Modificați calea de bun venit înaintedefiterminat după cum se arată mai jos:

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

Acum putem vizita site-ul nostru web, specificând oricare dintre limbile disponibile ca prim segment de cale: de exemplu, localhost/rulocalhost/fr. Ar trebui să vedeți conținutul localizat. În cazul în care specificați o locație neacceptată sau nu specificați deloc o localitate, Laravel va folosi enîn mod implicitdefinita.

middleware

Schimbarea locației pentru fiecare link de site ar putea să nu fie ceea ce doriți și poate să nu arate la fel de curat din punct de vedere estetic. De aceea, vom face setarea limbii printr-un comutator special de limbă și vom folosi sesiunea utilizator pentru a afișa conținutul tradus. Prin urmare, creați un nou middleware în interiorul app/Http/Middleware/Localization.phpfișier sau rulând 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);
    }
}

Acest middleware va instrui Laravel să folosească localul selectat de utilizator dacă această selecție este prezentă în sesiune.

Deoarece trebuie să facem acest lucru la fiecare solicitare, trebuie să-l adăugăm și la stiva de pre middlewaredefiterminat în app/http/Kernel.phppentru webgrup 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 */
  ],

Schimbați cursul

Apoi, trebuie să adăugăm o cale pentru a schimba localitatea. Folosim o cale de închidere, dar puteți folosi exact același cod în interiorul controlerului, dacă doriți:

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

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

De asemenea, nu uitați să eliminați comutatorul local adăugat anterior în calea noastră de bun venitdefinoapte:

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

Odată făcut acest lucru, singura modalitate prin care utilizatorul poate schimba limba setată în prezent este introducerea localhost/language/{locale}.  localeselecția va fi stocată în cadrul sesiunii și va redirecționa utilizatorii către locul de unde au venit (bifați Localizationmiddleware). Pentru a o încerca, accesați localhost/language/ru(atâta timp cât cookie-ul dvs. de sesiune este prezent în browser) și veți vedea conținutul tradus. Vă puteți deplasa liber pe site sau puteți încerca să reîmprospătați pagina și să vedeți că limba selectată este păstrată.

Comutatorul

Acum trebuie să creăm ceva pe care utilizatorul să poată face clic pentru a schimba limba în loc să introducem manual coduri locale în adresa URL. Pentru a face acest lucru, vom adăuga un verificator de limbaj foarte simplu. Prin urmare, creați un nou resources/views/partials/language_switcher.blade.phpfisier cu urmatorul cod:

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

Includeți comutatorul nou creat în vizualizarea „bun venit”:

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

Deschide app/Providers/AppServiceProvider.phpfișier și adăugați codul de partajat când va fi compus comutatorul nostru de limbi. Mai exact, vom partaja localitatea curentă care poate fi accesată ca fișier {{ $current_locale }}.

Buletin informativ de inovare
Nu rata cele mai importante știri despre inovație. Înscrieți-vă pentru a le primi pe e-mail.

Opțiuni avansate de traducere în PHP Laravel

Vom lucra în principal cu resources/views/welcome.blade.php, așa că totul trebuie să se întâmple în viziunea noastră binevenită, dacă nu este specificat altfel.

Parametri în șirurile de traducere

De exemplu, să salutăm utilizatorul nostru imaginar (Amanda) în loc să afișăm doar un mesaj generic:

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

Rețineți că am folosit numele cu prima literă în minuscule, dar substituentul cu prima literă în majuscule. În acest fel, Laravel vă poate ajuta să scrieți automat cu majuscule cuvântul real. Acest lucru se va întâmpla dacă substituentul începe cu o literă mare, de exemplu, :Nameproduce „Caroline” sau un cuvânt cu majuscule,  :NAME, produce „CAROLINE”.

De asemenea, ne actualizăm fișierele de traducere resources/lang/fr.jsonresources/lang/it.json , deoarece în acest moment vom vedea doar versiunea în limba engleză oriunde, deoarece cheile de traducere nu se potrivesc cu traducerile.

Limba franceza:

{

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

}

Italiană:

{

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

}

Pluralizarea

Pentru a vedea pluralizarea în acțiune, să adăugăm un nou paragraf de text. 

Pentru a efectua pluralizarea, trebuie să utilizați funcția trans_choice in loc de __(), de exemplu:

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

După cum puteți vedea, formele de plural sunt separate prin a |.

Acum, ce se întâmplă dacă avem nevoie de mai multe forme de plural? 

Acest lucru este, de asemenea, posibil:

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

În acest caz, permitem numere 01, și din 219, și în final de la 20 încolo. Desigur, puteți adăuga oricâte reguli aveți nevoie.

Deci, ce se întâmplă dacă vrem substituenții în formele noastre de plural? 

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

De asemenea, putem folosi numărul transmis în `trans_choice` dacă este necesar folosind un substituent :count special:

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

În cele din urmă, nu uitați să actualizați fișierele de traducere cu orice modificări pe care le-ați făcut la traducerea de bază.

Italiană:

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

Limba franceza:

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

Lucrul cu date localizate în Laravel

Pentru a localiza datele, vom valorifica puterea Carbon , care vine cu Laravel în mod implicitdefinita. Verificați Documentație de carbon ; poți face o mulțime de lucruri interesante. De exemplu, putem seta locația noastră cu reguli de dată și oră.

Pentru exemplul nostru simplu, vom afișa data curentă localizată pentru limba selectată. În a noastră routes/web.php, actualizăm calea paginii de întâmpinare și transmitem mesajul de dată localizat către al nostru view Bine ati venit:

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

Să actualizăm resources/views/welcome.blade.php adăugarea afișării datei, așa:

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

Încercarea de a schimba limba de pe pagina de pornire a localhost, vom vedea că datele sunt acum localizate, de exemplu:

Formatarea numerelor și a monedelor cu NumberFormatter

În diferite țări, oamenii folosesc diferite formate pentru a reprezenta numere, de exemplu:

  • Statele Unite → 123.123,12
  • Franța → 123 123,12

Prin urmare, pentru a reflecta aceste diferențe în aplicația dvs. Laravel, puteți utiliza NumberFormatter in felul urmator:

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

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

De asemenea, puteți scrie numărul într-o anumită limbă și puteți afișa ceva de genul „o sută douăzeci și trei mii o sută douăzeci și trei virgulă unu doi”:

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

În plus, NumberFormatter vă permite să localizați cu ușurință monede, de exemplu:

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

Prin urmare fr vei vedea euro, in timp ce pt en_US moneda va fi în dolari americani.

Ercole Palmeri

Buletin informativ de inovare
Nu rata cele mai importante știri despre inovație. Înscrieți-vă pentru a le primi pe e-mail.

Articole recente

Plăți online: Iată cum serviciile de streaming vă fac să plătiți pentru totdeauna

Milioane de oameni plătesc pentru serviciile de streaming, plătind taxe lunare de abonament. Este o părere comună că tu...

Aprilie 29 2024

Veeam oferă cel mai complet suport pentru ransomware, de la protecție la răspuns și recuperare

Coveware de la Veeam va continua să ofere servicii de răspuns la incidente de extorcare cibernetică. Coveware va oferi capacități criminalistice și de remediere...

Aprilie 23 2024

Revoluția verde și digitală: cum întreținerea predictivă transformă industria petrolului și gazelor

Întreținerea predictivă revoluționează sectorul petrolului și gazelor, cu o abordare inovatoare și proactivă a managementului uzinelor...

Aprilie 22 2024

Autoritatea de reglementare antitrust din Marea Britanie ridică alarma BigTech cu privire la GenAI

CMA din Marea Britanie a emis un avertisment cu privire la comportamentul Big Tech pe piața inteligenței artificiale. Acolo…

Aprilie 18 2024