Članki

Vodnik po korakih za lokalizacijo Laravel, vadnica s primeri

Kako lokalizirati projekt Laravel, kako razviti projekt v Laravel in ga narediti uporabnega v več jezikih. V tem članku s primeri vidimo, kako delati s prevajalskimi datotekami, ustvariti preklopnik jezikov in več.

Laravel je lokalna aplikacija, ki se prilagaja različnim jezikom in kulturam. Lokalizacija prek prevoda prilagodi internacionalizirane aplikacije določenemu jeziku.

Predpogoji

  • V tem članku se bomo sklicevali na Laravel različica 8.x;
  • Za uspešno spremljanje te vadnice morate imeti potrebno znanje programskega jezika PHP in ogrodja Laravel.
  • Vaša domena je localhost. Če ne, zamenjajte localhost z lastnim imenom domene ali naslovom IP (odvisno od vaše namestitve).

Delo s prevodnimi datotekami

V Laravel, tako kot v mnogih drugih okvirih, lahko shranimo prevode za različne jezike v ločenih datotekah. Prevajalske datoteke Laravel lahko organizirate na dva načina:

  • Starejši pristop, ki shranjuje datoteke na naslednje mesto: resources/lang/{en,fr,ru}/{myfile.php};
  • Nov pristop, ki shranjuje datoteke na naslednje mesto: resources/lang/{fr.json, ru.json};

Za jezike, ki se razlikujejo po ozemlju, jih morate poimenovati directory/file jezika v skladu z ISO 15897. Na primer, za britansko angleščino bi uporabili en_GB namesto en-gb. V tem članku se bomo osredotočili na drugi pristop, toda enako velja za prvega (razen tega, kako so poimenovani in pridobljeni prevodni ključi). 

Preprosti prevodi

Zdaj pa pojdimo na resources/views/welcome.blade.phpdatoteko in zamenjajte vsebino datoteke bodyoznačite z našim, takole:

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

Začeli bomo s pripravo našega pozdravnega sporočila o lokalizaciji, kar je v Laravelu zelo enostavno. Vse kar morate storiti je, da zamenjate besedilo “Dobrodošli na naši spletni strani” z naslednjo kodo: {{ __('Welcome to our website') }}. To bo ukazalo Laravelu, da privzeto prikaže »Dobrodošli na naši spletni strani«.definite in poiščite prevode tega niza, če je nastavljen jezik, ki ni angleščina (to bomo obravnavali pozneje). Angleščina bo nastavljena kot privzeti jezikdefikonec naše aplikacije, torej privzeta nastavitevdefiNa koncu bomo preprosto prikazali besedilo "Dobrodošli na naši spletni strani". Če je lokalna nastavitev drugačna, bomo poskusili najti ustrezen prevod in ustvarjen bo v trenutku.

Lokalizacija Laravel

Toda kako Laravel ve, kateri je trenutni jezik ali kateri jeziki so na voljo v aplikaciji? To naredi tako, da pogleda lokalno konfiguracijo v aplikaciji config/app.php. Odprite to datoteko in poiščite ta dva ključa asociativnega polja:

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

Opisi, prikazani nad ključi, bi morali biti samoumevni, a na kratko, ključ locale vsebuje krajevno preddefinish vaše aplikacije (vsaj, če v kodi ni nastavljen noben drug jezik). In fallback_locale aktivira se v primeru, da v naši aplikaciji nastavimo neobstoječo področno nastavitev.

Medtem ko imamo to datoteko odprto, dodajmo nov ključ za naše udobje s seznamom vseh jezikov, ki jih bo naša aplikacija podpirala. To bomo uporabili pozneje pri dodajanju lokalnega preklopnika. Vendar je to izbirna naloga, saj je Laravel od nas ne zahteva.

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

Zdaj naša aplikacija podpira tri jezike: angleščino, italijanščino in francoščino.

Prevajalske datoteke

Zdaj, ko smo določili vse jezike, s katerimi bomo delali, lahko nadaljujemo s prevajanjem našega pred pozdravnega sporočiladefinite.

Začnimo z dodajanjem novih lokalizacijskih datotek v mapo resources/lang. Najprej ustvarite datoteko resources/lang/it.json in dodajte ustrezne prevode, kot sledi:

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

Nato ustvarite datoteko resources/lang/fr.json:

{

“Dobrodošli na naši spletni strani”: “Dobrodošli na naši strani”

}

Kot lahko vidite, se vedno sklicujemo na predhodno sporočilodefinito, ki smo ga dodali v datoteko welcome.blade.php (ki je {{ __('Welcome to our website') }}). Razlog, zakaj nam ni treba ustvariti datoteke en.json to je zato, ker Laravel že ve, katera sporočila posredujemo s prednastavitvijodefikončal na funkciji __() so za naš lokalni predefinito en.

Lokalna sprememba v Laravelu

Na tej točki Laravel ne ve, kako spremeniti področne nastavitve, zato zaenkrat naredimo prevode neposredno znotraj poti. Spremenite pozdravno pot preddefikončano, kot je prikazano spodaj:

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

Zdaj lahko obiščemo naše spletno mesto in kot prvi segment poti določimo katerega koli od razpoložljivih jezikov: na primer, localhost/rulocalhost/fr. Morali bi videti lokalizirano vsebino. Če navedete nepodprte področne nastavitve ali področnih nastavitev sploh ne navedete, bo Laravel uporabil enprivzetodefinita.

Vmesna programska oprema

Zamenjava področnih nastavitev za vsako povezavo do spletnega mesta morda ne bo tisto, kar želite, in morda ne bo videti tako čisto estetsko. Zato bomo nastavitev jezika opravili prek posebnega preklopnika jezikov in uporabili uporabniško sejo za prikaz prevedene vsebine. Zato ustvarite novo vmesno programsko opremo znotraj app/Http/Middleware/Localization.phpdatoteko ali z zagonom 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);
    }
}

Ta vmesna programska oprema bo Laravelu ukazala, naj uporabi uporabniško izbrane lokalne nastavitve, če je ta izbira prisotna v seji.

Ker moramo to storiti pri vsaki zahtevi, ga moramo dodati tudi v sklad pred vmesno programsko opremodefikončal v app/http/Kernel.phpza webskupina vmesne programske opreme:

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

Spremenite tečaj

Nato moramo dodati pot za spremembo področnih nastavitev. Uporabljamo pot zapiranja, vendar lahko uporabite popolnoma isto kodo znotraj vašega krmilnika, če želite:

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

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

Prav tako ne pozabite odstraniti preklopa področnih nastavitev, ki je bil predhodno dodan v našo pot pred dobrodošlicodefinoč:

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

Ko je to storjeno, je edini način, da uporabnik spremeni trenutno nastavljeni jezik, tako da vnese localhost/language/{locale}. The localeizbor bo shranjen znotraj seje in bo uporabnike preusmeril tja, od koder so prišli (preverite Localizationvmesna programska oprema). Če želite poskusiti, pojdite na localhost/language/ru(dokler je vaš sejni piškotek prisoten v vašem brskalniku) in videli boste prevedeno vsebino. Po spletnem mestu se lahko prosto premikate ali poskusite osvežiti stran in preverite, ali je izbrani jezik ohranjen.

Komutator

Zdaj moramo ustvariti nekaj, kar lahko uporabnik klikne, da spremeni jezik, namesto da ročno vnaša lokalne kode v URL. Za to bomo dodali zelo preprost pregledovalnik jezika. Zato ustvarite novo resources/views/partials/language_switcher.blade.phpdatoteko z naslednjo kodo:

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

Vključite novo ustvarjeni preklopnik v pogled "dobrodošli":

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

Odprite app/Providers/AppServiceProvider.phpin dodajte kodo za skupno rabo, ko bo sestavljen naš preklopnik jezikov. Natančneje, delili bomo trenutne področne nastavitve, do katerih je mogoče dostopati kot datoteko {{ $current_locale }}.

Glasilo o inovacijah
Ne zamudite najpomembnejših novic o inovacijah. Prijavite se, če jih želite prejemati po e-pošti.

Napredne možnosti prevajanja v PHP Laravel

Delali bomo predvsem z resources/views/welcome.blade.php, zato se mora vse zgoditi v našem pozdravnem pogledu, razen če ni določeno drugače.

Parametri v prevodnih nizih

Na primer, pozdravimo našo namišljeno uporabnico (Amanda), namesto da samo prikažemo splošno sporočilo:

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

Upoštevajte, da smo uporabili ime s prvo črko z malimi črkami, ogrado pa s prvo črko z veliko črko. Na ta način vam lahko Laravel pomaga samodejno zapisati pravo besedo z veliko začetnico. To se bo zgodilo, če se ograda začne z veliko črko, na primer :Nameproizvede "Caroline" ali besedo s polno veliko začetnico,  :NAME, proizvaja "CAROLINE".

Posodabljamo tudi naše prevodne datoteke resources/lang/fr.jsonresources/lang/it.json , saj bomo trenutno povsod videli samo angleško različico, saj se prevodni ključi ne ujemajo s prevodi.

francosko:

{

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

}

Italijanščina:

{

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

}

Pluralizacija

Če želite videti pluralizacijo v akciji, dodamo nov odstavek besedila. 

Za izvedbo pluralizacije morate uporabiti funkcijo trans_choice namesto __(), na primer:

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

Kot lahko vidite, so množinske oblike ločene z a |.

Kaj pa, če potrebujemo več množinskih oblik? 

To je možno tudi:

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

V tem primeru dopuščamo številke 01in od 219, nazadnje pa od 20. dalje. Seveda lahko dodate poljubno število pravil.

Kaj torej, če želimo ogradne oznake v naših množinskih oblikah? 

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

Uporabimo lahko tudi štetje, posredovano v `trans_choice`, če je potrebno z ogrado :count poseben:

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

Nazadnje ne pozabite posodobiti svojih prevodnih datotek z vsemi spremembami, ki ste jih naredili v osnovnem prevodu.

Italijanščina:

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

francosko:

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

Delo z lokaliziranimi datumi v Laravelu

Za iskanje datumov bomo izkoristili moč Carbon , ki je privzeto priložen Laraveludefinita. Oglejte si Karbonska dokumentacija ; lahko narediš veliko zanimivih stvari. Na primer, lahko nastavimo svoje lokalne nastavitve s pravili za datum in čas.

Za naš preprost primer bomo prikazali trenutni datum, lokaliziran za izbrani jezik. V našem routes/web.php, posodobimo pot do pozdravne strani in posredujemo lokalizirano sporočilo o datumu naši view dobrodošli:

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

Posodobimo resources/views/welcome.blade.php dodajanje prikaza datuma, takole:

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

Poskušam spremeniti jezik na domači strani localhost, bomo videli, da so datumi zdaj lokalizirani, na primer:

Oblikovanje števil in valut z NumberFormatter

V različnih državah ljudje uporabljajo različne oblike za predstavitev števil, na primer:

  • Združene države → 123.123,12
  • Francija → 123 123,12

Če želite odražati te razlike v vaši aplikaciji Laravel, lahko uporabite NumberFormatter na naslednji način:

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

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

Številko lahko tudi napišete v določenem jeziku in prikažete nekaj takega kot "sto dvajset tri tisoč sto dvajset tri pika ena dva":

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

Poleg tega vam NumberFormatter omogoča preprosto iskanje valut, na primer:

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

Torej za fr evrov boste videli, medtem ko je za en_US valuta bo v ameriških dolarjih.

Ercole Palmeri

Glasilo o inovacijah
Ne zamudite najpomembnejših novic o inovacijah. Prijavite se, če jih želite prejemati po e-pošti.

Nedavni članki

Založniki in OpenAI podpisujejo sporazume za urejanje pretoka informacij, ki jih obdeluje umetna inteligenca

Prejšnji ponedeljek je Financial Times objavil dogovor z OpenAI. FT licencira svoje vrhunsko novinarstvo ...

April 30 2024

Spletna plačila: Evo, kako vam storitve pretakanja omogočajo večno plačevanje

Milijoni ljudi plačujejo storitve pretakanja in plačujejo mesečne naročnine. Splošno mnenje je, da si…

April 29 2024

Veeam ponuja najobsežnejšo podporo za izsiljevalsko programsko opremo, od zaščite do odziva in obnovitve

Coveware by Veeam bo še naprej zagotavljal storitve odzivanja na incidente kibernetskega izsiljevanja. Coveware bo nudil forenziko in zmogljivosti sanacije ...

April 23 2024

Zelena in digitalna revolucija: kako predvideno vzdrževanje preoblikuje naftno in plinsko industrijo

Prediktivno vzdrževanje revolucionira sektor nafte in plina z inovativnim in proaktivnim pristopom k upravljanju obratov.…

April 22 2024