Artikler

Laravel-lokalisering trinn-for-trinn-guide, opplæring med eksempler

Hvordan lokalisere et Laravel-prosjekt, hvordan utvikle et prosjekt i Laravel og gjøre det brukbart på flere språk. I denne artikkelen ser vi hvordan du jobber med oversettelsesfiler, lager en språkbytter og mer med eksempler.

Laravel er en applikasjon designet for å være lokal, for å tilpasse seg ulike språk og kulturer. Lokalisering skreddersyr internasjonaliserte applikasjoner til et spesifikt språk gjennom oversettelse.

Forutsetninger

  • I denne artikkelen vil vi referere til Laravel versjon 8.x;
  • For å lykkes med å følge denne opplæringen, må du ha den nødvendige kunnskapen om PHP-programmeringsspråket og Laravel-rammeverket.
  • Domenet ditt er localhost. Hvis ikke, bytt ut localhost med ditt eget domenenavn eller IP-adresse (avhengig av installasjonen din).

Arbeid med oversettelsesfiler

I Laravel, akkurat som i mange andre rammeverk, kan vi lagre oversettelser for forskjellige språk i separate filer. Det er to måter å organisere Laravel-oversettelsesfiler på:

  • En eldre tilnærming som lagrer filer på følgende plassering: resources/lang/{en,fr,ru}/{myfile.php};
  • En ny tilnærming som lagrer filer på følgende plassering: resources/lang/{fr.json, ru.json};

For språk som er forskjellige etter territorium, bør du navngi dem directory/file av språket i henhold til ISO 15897. For eksempel for britisk engelsk vil du bruke en_GB i stedet for en-gb. I denne artikkelen vil vi fokusere på den andre tilnærmingen, men det samme gjelder den første (bortsett fra hvordan oversettelsesnøkler navngis og hentes). 

Enkle oversettelser

Nå, la oss gå til resources/views/welcome.blade.phpfil og erstatt innholdet i bodytag med vår, slik:

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

Vi starter med å utarbeide velkomstmeldingen vår for lokalisering, som er veldig enkelt i Laravel. Alt du trenger å gjøre er å erstatte teksten "Velkommen til vår nettside" med følgende kode: {{ __('Welcome to our website') }}. Dette vil instruere Laravel til å vise "Velkommen til nettstedet vårt" som standarddefinite og se etter oversettelser av denne strengen hvis et annet språk enn engelsk er angitt (vi kommer til det senere). Engelsk vil bli satt som standardspråkdefinish av appen vår, så som standardinnstillingdefiPå slutten vil vi bare vise teksten "Velkommen til vår nettside". Hvis lokaliteten er annerledes, vil vi prøve å finne den matchende oversettelsen, og den vil bli opprettet på et øyeblikk.

Laravel lokalisering

Men hvordan vet Laravel hvilket som er gjeldende språk eller hvilke språk som er tilgjengelige i applikasjonen? Den gjør dette ved å se på den lokale konfigurasjonen i appen config/app.php. Åpne denne filen og se etter disse to assosiative array-nøklene:

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

Beskrivelsene vist over tastene skal være selvforklarende, men kort sagt nøkkelen locale inneholder den lokale predefinish av søknaden din (i det minste hvis ingen annen lokalitet er angitt i koden). Og fallback_locale den aktiveres i tilfelle vi angir en ikke-eksisterende lokalitet i applikasjonen vår.

Mens vi har denne filen åpen, la oss legge til en ny nøkkel for enkelhets skyld med en liste over alle lokalitetene applikasjonen vår støtter. Vi vil bruke dette senere når vi legger til en lokal switcher. Dette er imidlertid en valgfri oppgave da Laravel ikke krever at vi gjør det.

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

Nå støtter applikasjonen vår tre språk: engelsk, italiensk og fransk.

Oversettelsesfiler

Nå som vi har etablert alle lokalitetene vi skal jobbe med, kan vi gå videre og gå videre til å oversette vår forhåndsvelkomstmeldingdefikveld.

La oss starte med å legge til nye lokaliseringsfiler i mappen resources/lang. Lag først en fil resources/lang/it.json og legg til de tilsvarende oversettelsene, som følger:

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

Deretter oppretter du en fil resources/lang/fr.json:

{

"Velkommen til vår nettside": “Velkommen til vår side”

}

Som du kan se, henviser vi alltid til forhåndsmeldingendefinito som vi la til i filen welcome.blade.php (som var {{ __('Welcome to our website') }}). Grunnen til at vi ikke trenger å lage en fil en.json det er fordi Laravel allerede vet hvilke meldinger vi sender ved forhåndsinnstillingdefiferdig på funksjonen __() de er for vår lokale predefiikke en.

Lokal endring i Laravel

På dette tidspunktet vet ikke Laravel hvordan man endrer lokaliteter, så la oss foreløpig gjøre oversettelsene rett inne i banen. Endre velkomstbanen predefifullført som vist nedenfor:

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

Vi kan nå besøke nettstedet vårt og spesifisere hvilket som helst av de tilgjengelige språkene som det første banesegmentet: for eksempel, localhost/rulocalhost/fr. Du bør se det lokaliserte innholdet. I tilfelle du spesifiserer en lokalitet som ikke støttes eller ikke spesifiserer en lokalitet i det hele tatt, vil Laravel bruke ensom standarddefinita.

Middleware

Det er kanskje ikke det du ønsker å bytte sted for hver nettstedskobling, og det ser kanskje ikke like rent ut estetisk. Det er derfor vi vil gjøre språkinnstillingen gjennom en spesiell språkbytter og bruke brukersesjonen til å vise det oversatte innholdet. Lag derfor en ny mellomvare inne i app/Http/Middleware/Localization.phpfil eller ved å kjøre 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);
    }
}

Denne mellomvaren vil instruere Laravel til å bruke den brukervalgte lokaliteten hvis dette valget er til stede i økten.

Siden vi trenger at dette skal gjøres på hver forespørsel, må vi også legge det til pre-mellomvarestabelendefiferdig i app/http/Kernel.phpper il webmellomvaregruppe:

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

Endre kurs

Deretter må vi legge til en bane for å endre lokaliteten. Vi bruker en lukkebane, men du kan bruke nøyaktig samme kode i kontrolleren din hvis du vil:

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

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

Ikke glem å fjerne lokalitetsbryteren tidligere lagt til i vår forhåndsvelkomststidefikveld:

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

Når dette er gjort, er den eneste måten for brukeren å endre gjeldende språk ved å gå inn localhost/language/{locale}. De localevalget vil bli lagret i økten og vil omdirigere brukere dit de kom fra (sjekk Localizationmellomvare). For å prøve det, gå til localhost/language/ru(så lenge øktinformasjonskapselen din er til stede i nettleseren din) og du vil se det oversatte innholdet. Du kan bevege deg fritt rundt på nettsiden eller prøve å oppdatere siden og se at det valgte språket er bevart.

Kommutatoren

Nå må vi lage noe som brukeren kan klikke for å endre språk i stedet for å legge inn lokale koder manuelt i URL-en. For å gjøre dette, legger vi til en veldig enkel språkkontroll. Opprett derfor en ny resources/views/partials/language_switcher.blade.phpfil med følgende kode:

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

Ta med den nyopprettede bryteren i "velkommen"-visningen:

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

Åpne app/Providers/AppServiceProvider.phpfil og legg til koden for å dele når språkbytteren vår skal lages. Nærmere bestemt vil vi dele gjeldende lokalitet som kan nås som en fil {{ $current_locale }}.

Nyhetsbrev for innovasjon
Ikke gå glipp av de viktigste nyhetene om innovasjon. Registrer deg for å motta dem på e-post.

Avanserte oversettelsesalternativer i PHP Laravel

Vi skal hovedsakelig jobbe med resources/views/welcome.blade.php, så alt må skje i vårt velkomstsyn med mindre annet er spesifisert.

Parametere i oversettelsesstrenger

La oss for eksempel si hei til vår imaginære bruker (Amanda) i stedet for bare å vise en generisk melding:

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

Merk at vi brukte navnet med den første bokstaven i liten bokstav, men plassholderen med den første bokstaven i stor bokstav. På denne måten kan Laravel hjelpe deg med å automatisk skrive det faktiske ordet med stor bokstav. Dette vil skje hvis plassholderen starter med en stor bokstav, for eksempel, :Nameproduserer "Caroline" eller et ord med store bokstaver,  :NAME, produserer "CAROLINE".

Vi oppdaterer også oversettelsesfilene våre resources/lang/fr.jsonresources/lang/it.json , siden vi for øyeblikket bare vil se den engelske versjonen hvor som helst, siden oversettelsesnøklene ikke samsvarer med oversettelsene.

Fransk:

{

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

}

Italiensk:

{

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

}

Pluralisering

For å se pluralisering i aksjon, la oss legge til et nytt tekstavsnitt. 

For å utføre pluralisering må du bruke funksjonen trans_choice i stedet for __(), for eksempel:

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

Som du kan se, er flertallsformer atskilt med en |.

Hva om vi trenger flere flertallsformer? 

Dette er også mulig:

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

I dette tilfellet tillater vi tall 01, og fra 219, og til slutt fra 20 og utover. Selvfølgelig kan du legge til så mange regler du trenger.

Så hva om vi vil ha plassholderne i våre flertallsformer? 

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

Vi kan også bruke tellingen som er bestått i `trans_choice` om nødvendig ved å bruke en plassholder :count spesiell:

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

Til slutt, ikke glem å oppdatere oversettelsesfilene dine med eventuelle endringer du har gjort i basisoversettelsen.

Italiensk:

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

Fransk:

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

Jobber med lokaliserte datoer i Laravel

For å finne datoer vil vi utnytte kraften til Carbon , som leveres med Laravel som standarddefinita. Sjekk ut Karbondokumentasjon ; du kan gjøre mange interessante ting. For eksempel kan vi angi lokaliteten vår med dato- og klokkeslettregler.

For vårt enkle eksempel viser vi gjeldende dato lokalisert for det valgte språket. I vår routes/web.php, oppdaterer vi velkomstsidebanen og sender den lokaliserte datomeldingen til vår view Velkommen:

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

La oss oppdatere resources/views/welcome.blade.php legge til datovisning, slik:

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

Prøver å endre språket på hjemmesiden til localhost, vil vi se at datoene nå er lokalisert, for eksempel:

Formatere tall og valutaer med NumberFormatter

I forskjellige land bruker folk forskjellige formater for å representere tall, for eksempel:

  • USA → 123.123,12 XNUMX
  • Frankrike → 123 123,12

Derfor, for å reflektere disse forskjellene i Laravel-appen din, kan du bruke NumberFormatter på følgende måte:

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

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

Du kan også skrive tallet på et bestemt språk og vise noe sånt som "ett hundre og tjuetre tusen ett hundre og tjuetre poeng en to":

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

I tillegg lar NumberFormatter deg enkelt finne valutaer, for eksempel:

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

Så for fr vil du se Euro, mens for en_US valutaen vil være i amerikanske dollar.

Ercole Palmeri

Nyhetsbrev for innovasjon
Ikke gå glipp av de viktigste nyhetene om innovasjon. Registrer deg for å motta dem på e-post.

Siste artikler

Fremtiden er her: Hvordan shippingindustrien revolusjonerer den globale økonomien

Marinesektoren er en ekte global økonomisk makt, som har navigert mot et 150 milliarder marked...

1 mai 2024

Utgivere og OpenAI signerer avtaler for å regulere flyten av informasjon som behandles av kunstig intelligens

Sist mandag kunngjorde Financial Times en avtale med OpenAI. FT lisensierer sin journalistikk i verdensklasse...

30 april 2024

Nettbetalinger: Her er hvordan strømmetjenester får deg til å betale for alltid

Millioner av mennesker betaler for strømmetjenester og betaler månedlige abonnementsavgifter. Det er vanlig oppfatning at du...

29 april 2024

Veeam har den mest omfattende støtten for løsepengevare, fra beskyttelse til respons og gjenoppretting

Coveware by Veeam vil fortsette å tilby responstjenester for cyberutpressing. Coveware vil tilby kriminaltekniske og utbedringsmuligheter...

23 april 2024