Artikoli

Gwida pass pass tal-lokalizzazzjoni ta' Laravel, tutorja b'eżempji

Kif tiġi lokalizzata proġett Laravel, kif tiżviluppa proġett f'Laravel u tagħmilha użabbli f'diversi lingwi. F'dan l-artikolu naraw kif taħdem ma 'fajls ta' traduzzjoni, toħloq switcher tal-lingwa u aktar b'eżempji.

Laravel hija applikazzjoni mfassla biex tkun lokali, biex tadatta għal diversi lingwi u kulturi. Il-lokalizzazzjoni tfassal applikazzjonijiet internazzjonalizzati għal lingwa speċifika permezz tat-traduzzjoni.

prerekwiżiti

  • F'dan l-artikolu se nirreferu għalih Verżjoni Laravel 8.x;
  • Biex issegwi b'suċċess dan it-tutorja, jeħtieġ li jkollok l-għarfien meħtieġ tal-lingwa ta 'programmar PHP u l-qafas Laravel.
  • Id-dominju tiegħek huwa localhost. Jekk le, ibdel localhost bl-isem tad-dominju jew l-indirizz IP tiegħek stess (skond l-installazzjoni tiegħek).

Ħidma ma 'fajls ta' traduzzjoni

F'Laravel, bħal f'ħafna oqfsa oħra, nistgħu naħżnu traduzzjonijiet għal lingwi differenti f'fajls separati. Hemm żewġ modi kif torganizza l-fajls tat-traduzzjoni Laravel:

  • Approċċ antik li jaħżen fajls fil-post li ġej: resources/lang/{en,fr,ru}/{myfile.php};
  • Approċċ ġdid li jaħżen il-fajls fil-post li ġej: resources/lang/{fr.json, ru.json};

Għal lingwi li jvarjaw skont it-territorju, għandek issemmihom directory/file tal-lingwa skont ISO 15897. Pereżempju, għall-Ingliż tar-Renju Unit tuża en_GB minflok en-gb. F'dan l-artikolu, aħna ser niffukaw fuq it-tieni approċċ, iżda l-istess jgħodd għall-ewwel (ħlief għal kif iċ-ċwievet tat-traduzzjoni huma msemmija u rkuprati). 

Traduzzjonijiet sempliċi

Issa, ejja mmorru għall- resources/views/welcome.blade.phpfajl u ibdel il-kontenut tal- bodytikketta ma tagħna, bħal hekk:

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

Nibdew billi nippreparaw il-messaġġ ta' merħba tal-lokalizzazzjoni tagħna, li huwa tassew faċli f'Laravel. Kull ma trid tagħmel hu li tissostitwixxi t-test "Merħba fil-websajt tagħna" bil-kodiċi li ġej: {{ __('Welcome to our website') }}. Dan jagħti struzzjonijiet lil Laravel biex juri "Merħba fil-websajt tagħna" b'mod awtomatikudefinite u fittex traduzzjonijiet ta' din is-sekwenza jekk tkun stabbilita lingwa oħra għajr l-Ingliż (na naslu għal dan aktar tard). L-Ingliż se jkun issettjat bħala l-lingwa defaultdefinish tal-app tagħna, għalhekk b'issettjar awtomatikudefiFl-aħħar aħna sempliċement nuru t-test "Merħba fil-websajt tagħna". Jekk il-lokal huwa differenti, aħna nippruvaw insibu t-traduzzjoni li taqbel u din tinħoloq f'waqtu.

Lokalizzazzjoni Laravel

Imma Laravel kif jaf liema hija l-lingwa attwali jew liema lingwi huma disponibbli fl-applikazzjoni? Jagħmel dan billi tħares lejn il-konfigurazzjoni lokali fl-app config/app.php. Iftaħ dan il-fajl u fittex dawn iż-żewġ ċwievet ta' firxa assoċjattiva:

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

Id-deskrizzjonijiet murija fuq iċ-ċwievet għandhom jispjegaw lilhom infushom, iżda fil-qosor, iċ-ċavetta locale fih il-pre lokalidefil-applikazzjoni tiegħek (mill-inqas, jekk l-ebda lokalizzazzjoni oħra ma tkun ġiet stabbilita fil-kodiċi). U il fallback_locale huwa attivat f'każ li nissettjaw lokalità ineżistenti fl-applikazzjoni tagħna.

Filwaqt li għandna dan il-fajl miftuħ, ejja nżidu ċavetta ġdida għall-konvenjenza tagħna li telenka l-lokalijiet kollha li l-applikazzjoni tagħna se tappoġġja. Se nużaw dan aktar tard meta nżidu switcher lokali. Madankollu, dan huwa kompitu fakultattiv peress li Laravel ma jeħtieġx li nagħmluh.

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

Issa l-applikazzjoni tagħna tappoġġja tliet lingwi: Ingliż, Taljan u Franċiż.

Fajls tat-traduzzjoni

Issa li waqqafna l-lokalitajiet kollha li se nkunu qed naħdmu magħhom, nistgħu nimxu 'l quddiem u nkomplu nittraduċu l-messaġġ ta' qabel il-merħba tagħnadefilejla.

Nibdew billi nżidu fajls ta' lokalizzazzjoni ġodda mal-folder resources/lang. L-ewwel, oħloq fajl resources/lang/it.json u żid it-traduzzjonijiet korrispondenti, kif ġej:

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

Sussegwentement, oħloq fajl resources/lang/fr.json:

{

"Merħba fil-websajt tagħna": "Merħba fis-sit tagħna"

}

Kif tistgħu taraw, aħna dejjem nirreferu għall-messaġġ minn qabeldefinito li żidna fil-fajl welcome.blade.php (li kien {{ __('Welcome to our website') }}). Ir-raġuni għaliex m'għandniex għalfejn noħolqu fajl en.json huwa għaliex Laravel diġà jaf liema messaġġi ngħaddu minn pre settingdefilest fil-funzjoni __() huma għal pre lokali tagħnadefinito en.

Bidla lokali f'Laravel

F'dan il-punt, Laravel ma jafx kif ibiddel il-lokal, għalhekk għalissa, ejja nagħmlu t-traduzzjonijiet direttament ġewwa l-mogħdija. Immodifika l-mogħdija ta 'merħba minn qabeldefilest kif muri hawn taħt:

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

Issa nistgħu nżuru l-websajt tagħna, billi nispeċifikaw kwalunkwe mil-lingwi disponibbli bħala l-ewwel segment tal-passaġġ: pereżempju, localhost/rulocalhost/fr. Għandek tara l-kontenut lokalizzat. Fil-każ li tispeċifika lokalità mhux appoġġjata jew ma tispeċifikax lokalità xejn, Laravel juża enawtomatikamentdefinita.

Middleware

Li taqleb il-lokal għal kull link tas-sit jista 'ma jkunx dak li trid, u jista' ma jidhirx daqshekk nadif estetikament. Huwa għalhekk li se nagħmlu l-issettjar tal-lingwa permezz ta 'swiċċ tal-lingwa speċjali u nużaw is-sessjoni tal-utent biex nuru l-kontenut tradott. Għalhekk, toħloq middleware ġdid ġewwa l- app/Http/Middleware/Localization.phpfajl jew billi taħdem 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);
    }
}

Dan il-middleware se jagħti struzzjonijiet lil Laravel biex juża l-lokal magħżul mill-utent jekk din l-għażla tkun preżenti fis-sessjoni.

Peress li għandna bżonn li dan isir fuq kull talba, irridu wkoll inżiduha mal-munzell ta 'qabel il-middlewaredefilest fi app/http/Kernel.phpgħal webgrupp 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 */
  ],

Ibdel ir-rotta

Sussegwentement, irridu nżidu mogħdija biex nibdlu l-lokal. Qed nużaw mogħdija tal-għeluq, imma tista' tuża eżattament l-istess kodiċi ġewwa l-kontrollur tiegħek jekk tixtieq:

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

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

Barra minn hekk, tinsiex tneħħi l-toggle tal-lokal miżjud preċedentement fil-mogħdija ta' qabel il-merħba tagħnadefilejla:

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

Ladarba dan isir, l-uniku mod biex l-utent ibiddel il-lingwa stabbilita bħalissa huwa billi jidħol localhost/language/{locale}. Il localel-għażla se tinħażen fis-sessjoni u se tindirizza mill-ġdid lill-utenti lejn fejn ġew (iċċekkja l- Localizationmiddleware). Biex tipprovaha, mur fuq localhost/language/ru(sakemm il-cookie tas-sessjoni tiegħek tkun preżenti fil-browser tiegħek) u tara l-kontenut tradott. Tista 'timxi madwar il-websajt liberament jew tipprova taġġorna l-paġna u tara li l-lingwa magħżula tiġi ppreservata.

Il-kommutatur

Issa rridu noħolqu xi ħaġa li l-utent jista 'jikklikkja biex ibiddel il-lingwa minflok iddaħħal manwalment kodiċijiet lokali fil-URL. Biex tagħmel dan, aħna ser inżidu kontrollur tal-lingwa sempliċi ħafna. Għalhekk, toħloq ġdid resources/views/partials/language_switcher.blade.phpfajl bil-kodiċi li ġej:

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

Inkludi l-iswiċċ maħluq ġdid fil-veduta "merħba":

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

Iftaħ il- app/Providers/AppServiceProvider.phpfajl u żid il-kodiċi biex taqsam meta se jkun magħmul is-swiċċ tal-lingwa tagħna. Speċifikament, aħna se naqsmu l-lokal attwali li jista 'jiġi aċċessat bħala fajl {{ $current_locale }}.

Newsletter dwar l-innovazzjoni
Titlifx l-aktar aħbarijiet importanti dwar l-innovazzjoni. Irreġistra biex tirċevihom bl-email.

Għażliet ta' traduzzjoni avvanzati f'PHP Laravel

Aħna se naħdmu prinċipalment magħhom resources/views/welcome.blade.php, għalhekk kollox għandu jiġri fil-fehma tagħna merħba sakemm ma jkunx speċifikat mod ieħor.

Parametri fil-kordi tat-traduzzjoni

Pereżempju, ejja ngħidu bonjour lill-utent immaġinarju tagħna (Amanda) minflok ma nuru messaġġ ġeneriku:

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

Innota li użajna l-isem bl-ewwel ittra b'ittri żgħar, iżda l-placeholder bl-ewwel ittra f'ittri kbar. Dan il-mod, Laravel jista 'jgħinek awtomatikament tikkapitalizza l-kelma attwali. Dan jiġri jekk il-placeholder jibda b'ittra kbira, pereżempju, :Namejipproduċi "Caroline" jew kelma b'kapitalizzazzjoni sħiħa,  :NAME, tipproduċi “CAROLINE”.

Aħna naġġornaw ukoll il-fajls tat-traduzzjoni tagħna resources/lang/fr.jsonresources/lang/it.json , peress li bħalissa se naraw biss il-verżjoni bl-Ingliż kullimkien peress li ċ-ċwievet tat-traduzzjoni ma jaqblux mat-traduzzjonijiet.

Franċiż:

{

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

}

Taljan:

{

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

}

Pluralizzazzjoni

Biex tara l-pluralizzazzjoni fl-azzjoni, ejja nżidu paragrafu ġdid tat-test. 

Biex twettaq pluralizzazzjoni, trid tuża l-funzjoni trans_choice minflok __(), pereżempju:

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

Kif tistgħu taraw, il-forom tal-plural huma separati b’a |.

Issa, x'jiġri jekk neħtieġu forom multipli plurali? 

Dan huwa possibbli wkoll:

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

F'dan il-każ, inħallu n-numri 01, u minn 219, u finalment minn 20 'il quddiem. Naturalment, tista 'żżid regoli kemm għandek bżonn.

Allura x'jiġri jekk irridu l-placeholders fil-forom plurali tagħna? 

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

Nistgħu wkoll nużaw l-għadd mgħoddi f'`trans_choice` jekk meħtieġ billi tuża placeholder :count speċjali:

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

Fl-aħħarnett, tinsiex taġġorna l-fajls tat-traduzzjoni tiegħek bi kwalunkwe tibdil li għamilt fit-traduzzjoni bażi.

Taljan:

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

Franċiż:

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

Ħidma ma 'dati lokalizzati f'Laravel

Biex issib dati, aħna se jisfruttaw il-qawwa ta Karbonju , li jiġi ma 'Laravel awtomatikamentdefinita. Iċċekkja l- Dokumentazzjoni tal-karbonju ; tista' tagħmel ħafna affarijiet interessanti. Pereżempju, nistgħu nissettjaw il-lokal tagħna bir-regoli tad-data u l-ħin.

Għall-eżempju sempliċi tagħna, aħna ser nuru d-data kurrenti lokalizzata għall-lingwa magħżula. Fil tagħna routes/web.php, aħna naġġornaw il-mogħdija tal-paġna ta’ merħba u ngħaddu l-messaġġ tad-data lokalizzat lil tagħna view merħba:

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

Ejja naġġornaw resources/views/welcome.blade.php iż-żieda tad-data, bħal hekk:

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

Jipprova tbiddel il-lingwa fuq il-paġna ewlenija ta' localhost, se naraw li d-dati issa huma lokalizzati, pereżempju:

L-ifformattjar ta' numri u muniti ma' NumberFormatter

F'pajjiżi differenti, in-nies jużaw formati differenti biex jirrappreżentaw in-numri, pereżempju:

  • L-Istati Uniti → 123.123,12
  • Franza → 123 123,12

Għalhekk, biex tirrifletti dawn id-differenzi fl-app Laravel tiegħek, tista 'tuża NumberFormatter bil-mod li ġej:

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

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

Tista’ wkoll tikteb in-numru f’lingwa partikolari u turi xi ħaġa bħal “mija tlieta u għoxrin elf mija tlieta u għoxrin punt wieħed tnejn”:

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

Barra minn hekk, NumberFormatter jippermettilek issib muniti faċilment, pereżempju:

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

Allura għal fr tara Ewro, filwaqt li g[al en_US il-munita se tkun f'dollari Amerikani.

Ercole Palmeri

Newsletter dwar l-innovazzjoni
Titlifx l-aktar aħbarijiet importanti dwar l-innovazzjoni. Irreġistra biex tirċevihom bl-email.

Artikoli riċenti

Veeam għandu l-aktar appoġġ komprensiv għar-ransomware, mill-protezzjoni għar-rispons u l-irkupru

Coveware minn Veeam se jkompli jipprovdi servizzi ta' rispons għal inċidenti ta' estorsjoni ċibernetika. Coveware se joffri forensiċi u kapaċitajiet ta' rimedju...

April 23 2024

Rivoluzzjoni Ekoloġika u Diġitali: Kif il-Manutenzjoni Predittiva qed tittrasforma l-Industrija taż-Żejt u l-Gass

Il-manutenzjoni ta’ tbassir qed tirrivoluzzjona s-settur taż-żejt u l-gass, b’approċċ innovattiv u proattiv għall-ġestjoni tal-impjant...

April 22 2024

Ir-regolatur tal-antitrust tar-Renju Unit iqajjem allarm ta’ BigTech fuq GenAI

Is-CMA tar-Renju Unit ħarġet twissija dwar l-imġieba ta 'Big Tech fis-suq tal-intelliġenza artifiċjali. Hemm…

April 18 2024

Casa Green: rivoluzzjoni tal-enerġija għal futur sostenibbli fl-Italja

Id-Digriet "Case Green", ifformulat mill-Unjoni Ewropea biex itejjeb l-effiċjenza enerġetika tal-bini, ikkonkluda l-proċess leġiżlattiv tiegħu bi...

April 18 2024