Cikkek

Laravel lokalizáció lépésről lépésre útmutató, oktatóanyag példákkal

Hogyan honosítsunk meg egy Laravel-projektet, hogyan fejlesszünk ki egy projektet Laravel-ben és tegyük használhatóvá több nyelven. Ebben a cikkben példákkal láthatjuk, hogyan dolgozhat fordítási fájlokkal, hogyan hozhat létre nyelvváltót és sok mást.

A Laravel egy helyi alkalmazás, amely alkalmazkodik a különböző nyelvekhez és kultúrákhoz. A lokalizáció egy adott nyelvre szabja a nemzetközi alkalmazásokat fordítás révén.

Előfeltételek

  • Ebben a cikkben hivatkozni fogunk Laravel 8.x verzió;
  • Az oktatóanyag sikeres követéséhez rendelkeznie kell a PHP programozási nyelv és a Laravel keretrendszer szükséges ismereteivel.
  • Az Ön domainje localhost. Ha nem, cserélje ki localhost saját domain nevével vagy IP-címével (a telepítéstől függően).

Fordítási fájlokkal való munka

A Laravelben, csakúgy, mint sok más keretrendszerben, külön fájlokban tárolhatjuk a különböző nyelvek fordításait. A Laravel fordítási fájlok rendezésének két módja van:

  • Egy régebbi megközelítés, amely a fájlokat a következő helyen tárolja: resources/lang/{en,fr,ru}/{myfile.php};
  • Egy új megközelítés, amely a fájlokat a következő helyen tárolja: resources/lang/{fr.json, ru.json};

Azon nyelvek esetében, amelyek területenként különböznek, meg kell nevezni őket directory/file Például a brit angolhoz használja en_GB ahelyett en-gb. Ebben a cikkben a második megközelítésre összpontosítunk, de ugyanez vonatkozik az elsőre is (kivéve a fordítási kulcsok elnevezését és lekérését). 

Egyszerű fordítások

Most pedig menjünk a resources/views/welcome.blade.phpfájlt, és cserélje ki a tartalmát bodyjelölje meg a miénkkel, így:

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

Kezdjük azzal, hogy elkészítjük a lokalizációs üdvözlő üzenetünket, ami Laravelben nagyon egyszerű. Nem kell mást tennie, mint az „Üdvözöljük weboldalunkon” szöveget a következő kódra cserélni: {{ __('Welcome to our website') }}. Ez arra utasítja a Laravelt, hogy alapértelmezés szerint jelenítse meg az „Üdvözöljük weboldalunkon” üzenetetdefinite, és keresse meg ennek a karakterláncnak a fordítását, ha az angoltól eltérő nyelv van beállítva (erre később térünk ki). Az angol lesz az alapértelmezett nyelvdefinish alkalmazásunkból, tehát alapértelmezés szerintdefiA végén egyszerűen megjelenítjük az „Üdvözöljük weboldalunkon” szöveget. Ha a nyelv eltér, megpróbáljuk megtalálni a megfelelő fordítást, és pillanatok alatt elkészül.

Laravel lokalizáció

De honnan tudja a Laravel, hogy melyik az aktuális nyelv, vagy mely nyelvek érhetők el az alkalmazásban? Ezt az alkalmazás helyi konfigurációjának megtekintésével teszi config/app.php. Nyissa meg ezt a fájlt, és keresse meg ezt a két asszociatív tömbkulcsot:

/*
|--------------------------------------------------------------------------
| 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 billentyűk felett látható leírásoknak magától értetődőnek kell lenniük, de röviden a kulcs locale tartalmazza a helyi elődefinish (legalábbis, ha nincs más területi beállítás beállítva a kódban). És a fallback_locale akkor aktiválódik, ha nem létező területi beállítást adunk meg az alkalmazásunkban.

Amíg ez a fájl nyitva van, adjunk hozzá egy új kulcsot a kényelmünk érdekében, amely felsorolja az alkalmazásunk által támogatott összes területet. Később ezt fogjuk használni, amikor helyi kapcsolót adunk hozzá. Ez azonban nem kötelező feladat, mivel Laravel nem követeli meg tőlünk.

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

Most az alkalmazásunk három nyelvet támogat: angol, olasz és francia.

Fordítási fájlok

Most, hogy létrehoztuk az összes területet, amellyel dolgozni fogunk, folytathatjuk az előzetes üdvözlő üzenetünk fordítását.defivége.

Kezdjük azzal, hogy új lokalizációs fájlokat adunk a mappához resources/lang. Először hozzon létre egy fájlt resources/lang/it.json és adja hozzá a megfelelő fordításokat az alábbiak szerint:

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

Ezután hozzon létre egy fájlt resources/lang/fr.json:

{

"Üdvözöljük weboldalunkon": “Üdvözöljük oldalunkon”

}

Amint látja, mindig az előzetes üzenetre hivatkozunkdefinito, amelyet hozzáadtunk a fájlhoz welcome.blade.php (amely volt {{ __('Welcome to our website') }}). Az ok, amiért nem kell fájlt létrehoznunk en.json Ez azért van, mert Laravel már tudja, hogy mely üzeneteket továbbítjuk az előre beállítássaldefibefejezte a funkciót __() azok a mi helyi elődefinito en.

Helyi változás Laravelben

Jelenleg Laravel nem tudja, hogyan változtassa meg a területi beállításokat, ezért most végezzük el a fordításokat közvetlenül az útvonalon belül. Módosítsa az üdvözlő útvonalat előredefiaz alábbiak szerint készült:

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

Most már meglátogathatjuk webhelyünket, és az elérhető nyelvek bármelyikét megadjuk első útvonalszegmensként: pl. localhost/rulocalhost/fr. Látnia kell a lokalizált tartalmat. Ha nem támogatott területi beállítást ad meg, vagy egyáltalán nem ad meg, a Laravel ezt fogja használni enalapértelmezés szerintdefinita.

middleware

Előfordulhat, hogy az egyes webhelyhivatkozások nyelv- és országkódjának váltása nem az, amit szeretne, és esztétikailag nem is néz ki olyan tisztán. Ezért a nyelv beállítását egy speciális nyelvváltón keresztül végezzük el, és a felhasználói munkamenet segítségével jelenítjük meg a lefordított tartalmat. Ezért hozzon létre egy új köztes szoftvert a app/Http/Middleware/Localization.phpfájl vagy futtatással 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);
    }
}

Ez a köztes szoftver arra utasítja a Laravelt, hogy használja a felhasználó által kiválasztott területi beállítást, ha ez a kijelölés jelen van a munkamenetben.

Mivel ezt minden kérésnél meg kell tennünk, hozzá kell adnunk a köztes szoftver előtti veremhez isdefibefejezte app/http/Kernel.phpaz webköztes szoftver csoport:

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

Változtasd meg az irányt

Ezután hozzá kell adnunk egy elérési utat a területi beállítás megváltoztatásához. Lezárási útvonalat használunk, de ha szeretné, pontosan ugyanazt a kódot használhatja a vezérlőn belül:

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

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

Ezenkívül ne felejtse el eltávolítani a területi beállítás kapcsolót, amelyet korábban hozzáadtunk az előzetes üdvözlő útvonalhozdefivége:

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

Ha ez megtörtént, a felhasználó csak a beírással módosíthatja az aktuálisan beállított nyelvet localhost/language/{locale}. A localeA kijelölés a munkameneten belül tárolódik, és átirányítja a felhasználókat oda, ahonnan jöttek (ellenőrizze a Localizationköztes szoftver). Ha kipróbálni szeretné, menjen a címre localhost/language/ru(amíg a munkamenet cookie jelen van a böngészőjében), és látni fogja a lefordított tartalmat. Szabadon mozoghat a webhelyen, vagy megpróbálhatja frissíteni az oldalt, és megnézheti, hogy a kiválasztott nyelv megmarad.

A kommutátor

Most létre kell hoznunk valamit, amelyre kattintva a felhasználó megváltoztathatja a nyelvet ahelyett, hogy manuálisan írná be a helyi kódokat az URL-be. Ehhez egy nagyon egyszerű nyelvellenőrzőt adunk hozzá. Ezért hozzon létre egy újat resources/views/partials/language_switcher.blade.phpfájl a következő kóddal:

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

Szerelje be az újonnan létrehozott kapcsolót az "üdvözlő" nézetbe:

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

Nyissa meg a app/Providers/AppServiceProvider.phpfájlt, és adja hozzá a kódot a megosztáshoz, amikor a nyelvváltónk elkészül. Pontosabban, megosztjuk az aktuális területi beállítást, amely fájlként érhető el {{ $current_locale }}.

Innovációs hírlevél
Ne maradjon le az innovációval kapcsolatos legfontosabb hírekről. Regisztráljon, hogy megkapja őket e-mailben.

Speciális fordítási lehetőségek a PHP Laravelben

Főleg együtt fogunk dolgozni resources/views/welcome.blade.php, ezért mindennek a mi üdvözlő nézetünkben kell történnie, hacsak nincs másképp megadva.

Paraméterek a fordítási karakterláncokban

Például köszöntsük képzeletbeli felhasználónkat (Amandát) ahelyett, hogy csak egy általános üzenetet jelenítenénk meg:

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

Vegye figyelembe, hogy a nevet az első betűvel kisbetűvel, de a helyőrzőt az első betűvel nagybetűvel használtuk. Ily módon a Laravel segíthet abban, hogy az aktuális szót automatikusan nagybetűvel írhassa. Ez akkor történik meg, ha a helyőrző nagybetűvel kezdődik, például :Name„Caroline” vagy teljesen nagybetűs szót állít elő,  :NAME, „CAROLINE”-t gyárt.

Frissítjük fordítási fájljainkat is resources/lang/fr.jsonresources/lang/it.json , mivel jelenleg csak az angol verziót fogjuk látni bárhol, mivel a fordítási kulcsok nem egyeznek a fordításokkal.

Francia:

{

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

}

Olasz:

{

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

}

Pluralizáció

A pluralizáció működés közbeni megjelenítéséhez adjunk hozzá egy új bekezdést a szöveghez. 

A többes szám végrehajtásához a függvényt kell használni trans_choice ahelyett __(), például:

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

Mint látható, a többes számú alakokat a választja el |.

Mi van akkor, ha több többes számú alakra van szükségünk? 

Ez is lehetséges:

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

Ebben az esetben engedélyezzük a számokat 01és innen 219, végül 20-tól. Természetesen annyi szabályt adhat hozzá, amennyit csak akar.

Tehát mi van, ha többes számban szeretnénk a helyőrzőket? 

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

Szükség esetén helyőrzővel is használhatjuk a `trans_choice`-ban átadott számot :count különleges:

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

Végül ne felejtse el frissíteni a fordítási fájljait az alap fordításon végrehajtott változtatásokkal.

Olasz:

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

Francia:

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

Munka honosított dátumokkal Laravelben

A dátumok meghatározásához kihasználjuk az erejét Szén , amely alapértelmezés szerint a Laravelhez tartozikdefinita. Nézze meg a Carbon dokumentáció ; sok érdekes dolgot csinálhatsz. Például beállíthatjuk a területünket dátum és idő szabályokkal.

Egyszerű példánkban megmutatjuk az aktuális dátumot a kiválasztott nyelvre lokalizálva. Miénkben routes/web.php, frissítjük az üdvözlő oldal elérési útját, és továbbítjuk a honosított dátum üzenetet a miénknek view Üdvözöljük:

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

Frissítsünk resources/views/welcome.blade.php dátum megjelenítés hozzáadása, például:

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

Megpróbálja megváltoztatni a nyelvet a kezdőlapon localhost, látni fogjuk, hogy a dátumok most lokalizáltak, például:

Számok és pénznemek formázása a NumberFormatter segítségével

A különböző országokban az emberek különböző formátumokat használnak a számok megjelenítésére, például:

  • Egyesült Államok → 123.123,12 XNUMX
  • Franciaország → 123 123,12

Ezért, hogy tükrözze ezeket a különbségeket a Laravel alkalmazásban, használhatja Számformázó a következő módon:

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

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

Leírhatja a számot egy adott nyelven is, és valami ilyesmit jeleníthet meg: „százhuszonháromezer-százhuszonhárom pont egy kettő”:

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

Ezenkívül a NumberFormatter lehetővé teszi a pénznemek könnyű megtalálását, például:

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

Így fr eurót fog látni, míg a en_US a pénznem amerikai dollár lesz.

Ercole Palmeri

Innovációs hírlevél
Ne maradjon le az innovációval kapcsolatos legfontosabb hírekről. Regisztráljon, hogy megkapja őket e-mailben.

Friss cikkek

A színező oldalak előnyei gyerekeknek – a varázslatok világa minden korosztály számára

A finom motoros készségek színezéssel történő fejlesztése felkészíti a gyerekeket olyan összetettebb készségekre, mint az írás. Kiszínezni…

Május 2 2024

A jövő itt van: Hogyan forradalmasítja a hajózási ágazat a globális gazdaságot

A haditengerészeti szektor igazi világgazdasági hatalom, amely egy 150 milliárdos piac felé navigált...

Május 1 2024

A kiadók és az OpenAI megállapodásokat írnak alá a mesterséges intelligencia által feldolgozott információáramlás szabályozására

Múlt hétfőn a Financial Times bejelentette, hogy megállapodást köt az OpenAI-val. Az FT engedélyezi világszínvonalú újságírását…

30 április 2024

Online fizetés: Így fizethet örökké a streaming szolgáltatások

Emberek milliói fizetnek a streaming szolgáltatásokért, havi előfizetési díjat fizetve. Általános vélemény, hogy Ön…

29 április 2024