Články

Laravel lokalizace krok za krokem průvodce, tutoriál s příklady

Jak lokalizovat projekt Laravel, jak vyvinout projekt v Laravelu a učinit jej použitelným ve více jazycích. V tomto článku na příkladech uvidíme, jak pracovat s překladovými soubory, vytvořit přepínač jazyků a další.

Laravel je aplikace navržená tak, aby byla místní, aby se přizpůsobila různým jazykům a kulturám. Lokalizace přizpůsobuje internacionalizované aplikace konkrétnímu jazyku prostřednictvím překladu.

Předpoklady

  • V tomto článku budeme odkazovat Laravel verze 8.x;
  • Pro úspěšné absolvování tohoto návodu je potřeba mít potřebné znalosti programovacího jazyka PHP a frameworku Laravel.
  • Vaše doména je localhost. Pokud ne, vyměňte localhost s vaším vlastním názvem domény nebo IP adresou (v závislosti na vaší instalaci).

Práce s překladovými soubory

V Laravelu, stejně jako v mnoha jiných frameworkech, můžeme ukládat překlady pro různé jazyky do samostatných souborů. Překladové soubory Laravel lze uspořádat dvěma způsoby:

  • Starší přístup, který ukládá soubory do následujícího umístění: resources/lang/{en,fr,ru}/{myfile.php};
  • Nový přístup, který ukládá soubory do následujícího umístění: resources/lang/{fr.json, ru.json};

U jazyků, které se liší podle území, byste je měli pojmenovat directory/file jazyka podle ISO 15897. Například pro britskou angličtinu byste použili en_GB namísto en-gb. V tomto článku se zaměříme na druhý přístup, ale totéž platí pro první (kromě toho, jak jsou pojmenovány a načteny překladové klíče). 

Jednoduché překlady

Nyní pojďme k resources/views/welcome.blade.phpa nahraďte obsah souboru bodyoznačte naším, takto:

<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čneme přípravou naší uvítací zprávy o lokalizaci, což je v Laravelu opravdu snadné. Jediné, co musíte udělat, je nahradit text „Vítejte na našem webu“ následujícím kódem: {{ __('Welcome to our website') }}. Tím dá Laravel pokyn, aby ve výchozím nastavení zobrazoval „Vítejte na našem webu“.definite a vyhledejte překlady tohoto řetězce, pokud je nastaven jiný jazyk než angličtina (k tomu se dostaneme později). Jako výchozí jazyk bude nastavena angličtinadefinish naší aplikace, takže ve výchozím nastavenídefiNa konci jednoduše zobrazíme text „Vítejte na našem webu“. Pokud je národní prostředí jiné, pokusíme se najít odpovídající překlad a ten se za chvíli vytvoří.

Laravel lokalizace

Jak ale Laravel ví, který jazyk je aktuální nebo které jazyky jsou v aplikaci dostupné? Dělá to tak, že se podíváte na místní konfiguraci v aplikaci config/app.php. Otevřete tento soubor a vyhledejte tyto dva klíče asociativního pole:

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

Popisy zobrazené nad klávesami by měly být samozřejmé, ale zkrátka klíčové locale obsahuje místní predefinish vaší aplikace (alespoň pokud v kódu nebylo nastaveno jiné národní prostředí). A fallback_locale aktivuje se v případě, že v naší aplikaci nastavíme neexistující národní prostředí.

Zatímco máme tento soubor otevřený, přidejte nový klíč pro naše pohodlí se seznamem všech lokalit, které bude naše aplikace podporovat. To použijeme později při přidávání místního přepínače. Toto je však volitelný úkol, protože Laravel nevyžaduje, abychom to dělali.

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

Nyní naše aplikace podporuje tři jazyky: angličtinu, italštinu a francouzštinu.

Překladové soubory

Nyní, když jsme stanovili všechna národní prostředí, se kterými budeme pracovat, můžeme pokračovat a přejít k překladu naší předběžné uvítací zprávydefinoc.

Začněme přidáním nových lokalizačních souborů do složky resources/lang. Nejprve vytvořte soubor resources/lang/it.json a přidejte odpovídající překlady takto:

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

Dále vytvořte soubor resources/lang/fr.json:

{

"Vítejte na našem webu": “Vítejte na našich stránkách”

}

Jak vidíte, vždy odkazujeme na předběžnou zprávudefinito, které jsme přidali do souboru welcome.blade.php (který byl {{ __('Welcome to our website') }}). Důvod, proč nemusíme vytvářet soubor en.json je to proto, že Laravel již ví, které zprávy předáváme přednastavenímdefiskončil ve funkci __() jsou pro naše místní predefinito en.

Místní změna v Laravelu

V tuto chvíli Laravel neví, jak změnit národní prostředí, takže prozatím udělejme překlady přímo uvnitř cesty. Upravte uvítací cestu predefihotovo, jak je znázorněno níže:

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

Nyní můžeme navštívit naše webové stránky, přičemž jako první segment cesty uvedeme kterýkoli z dostupných jazyků: např. localhost/rulocalhost/fr. Měli byste vidět lokalizovaný obsah. V případě, že zadáte nepodporované národní prostředí nebo neuvedete národní prostředí vůbec, použije Laravel enve výchozím stavudefinita.

middleware

Přepínání národního prostředí pro každý odkaz na web nemusí být to, co chcete, a nemusí to vypadat tak čistě esteticky. Proto provedeme nastavení jazyka pomocí speciálního přepínače jazyků a použijeme uživatelskou relaci k zobrazení přeloženého obsahu. Vytvořte proto nový middleware uvnitř app/Http/Middleware/Localization.phpsouboru nebo spuštěním 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);
    }
}

Tento middleware dá Laravelu pokyn k použití uživatelem vybraného národního prostředí, pokud je tento výběr v relaci přítomen.

Protože to potřebujeme udělat u každého požadavku, musíme to také přidat do před middlewarového zásobníkudefiskončil v app/http/Kernel.phppro webskupina middlewaru:

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

Změnit kurz

Dále musíme přidat cestu ke změně národního prostředí. Používáme uzavírací cestu, ale pokud chcete, můžete použít přesně stejný kód uvnitř ovladače:

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

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

Nezapomeňte také odstranit přepínač národního prostředí, který byl dříve přidán do naší předběžné uvítací cestydefinoc:

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

Jakmile to provedete, jediným způsobem, jak může uživatel změnit aktuálně nastavený jazyk, je zadání localhost/language/{locale}. The localevýběr bude uložen v rámci relace a přesměruje uživatele tam, odkud přišli (zaškrtněte políčko Localizationmiddleware). Chcete-li to vyzkoušet, přejděte na localhost/language/ru(pokud je váš soubor cookie relace přítomen ve vašem prohlížeči) a uvidíte přeložený obsah. Po webu se můžete libovolně pohybovat nebo zkusit stránku obnovit a uvidíte, že zvolený jazyk zůstane zachován.

Komutátor

Nyní musíme vytvořit něco, na co může uživatel kliknout a změnit jazyk namísto ručního zadávání místních kódů do adresy URL. K tomu přidáme velmi jednoduchou kontrolu jazyka. Proto vytvořte nový resources/views/partials/language_switcher.blade.phpsoubor s následujícím kódem:

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

Zahrnout nově vytvořený přepínač do „uvítacího“ zobrazení:

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

Otevři app/Providers/AppServiceProvider.phpsoubor a přidejte kód, který chcete sdílet, až bude vytvořen náš přepínač jazyků. Konkrétně budeme sdílet aktuální národní prostředí, ke kterému lze přistupovat jako k souboru {{ $current_locale }}.

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.

Pokročilé možnosti překladu v PHP Laravel

Budeme hlavně pracovat s resources/views/welcome.blade.php, takže vše se musí stát v našem uvítacím pohledu, pokud není uvedeno jinak.

Parametry v překladových řetězcích

Řekněme například ahoj naší imaginární uživatelce (Amandě) místo pouhého zobrazení obecné zprávy:

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

Všimněte si, že jsme použili název s prvním písmenem malým písmem, ale zástupný znak s prvním písmenem velkým. Tímto způsobem vám Laravel může pomoci automaticky psát velkými písmeny skutečné slovo. K tomu dojde, pokud zástupný symbol začíná velkým písmenem, např. :Namevytvoří „Caroline“ nebo slovo s velkými písmeny,  :NAME, vyrábí „CAROLINE“.

Aktualizujeme také naše překladové soubory resources/lang/fr.jsonresources/lang/it.json , protože v tuto chvíli všude uvidíme pouze anglickou verzi, protože překladové klíče neodpovídají překladům.

Francouzština:

{

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

}

Italština:

{

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

}

Pluralizace

Chcete-li vidět pluralizaci v akci, přidejte nový odstavec textu. 

Chcete-li provést pluralizaci, musíte použít funkci trans_choice namísto __(), například:

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

Jak vidíte, tvary v množném čísle jsou odděleny a |.

Co když potřebujeme více tvarů množného čísla? 

To je také možné:

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

V tomto případě povolujeme čísla 01a od 219a nakonec od 20. Samozřejmě můžete přidat tolik pravidel, kolik potřebujete.

Co když tedy chceme zástupné symboly v našem množném čísle? 

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

V případě potřeby můžeme také použít počet předaný v `trans_choice` pomocí zástupného symbolu :count speciální:

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

Nakonec nezapomeňte aktualizovat své překladové soubory se všemi změnami, které jste provedli v základním překladu.

Italština:

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

Francouzština:

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

Práce s lokalizovanými daty v Laravelu

K vyhledání termínů využijeme sílu Uhlík , který je standardně dodáván s Laravelemdefinita. Podívejte se na Karbonová dokumentace ; můžete dělat spoustu zajímavých věcí. Můžeme například nastavit naše národní prostředí pomocí pravidel pro datum a čas.

Pro náš jednoduchý příklad ukážeme aktuální datum lokalizované pro vybraný jazyk. V našem routes/web.php, aktualizujeme cestu k uvítací stránce a předáme lokalizovanou datovou zprávu naší view Vítejte:

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

Pojďme aktualizovat resources/views/welcome.blade.php přidání zobrazení data, například:

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

Pokus o změnu jazyka na domovské stránce localhost, uvidíme, že data jsou nyní lokalizována, například:

Formátování čísel a měn pomocí NumberFormatter

V různých zemích lidé používají k vyjádření čísel různé formáty, například:

  • Spojené státy americké → 123.123,12 XNUMX
  • Francie → 123 123,12

Proto, abyste tyto rozdíly odráželi ve vaší aplikaci Laravel, můžete použít NumberFormatter následujícím způsobem:

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

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

Můžete také napsat číslo v konkrétním jazyce a zobrazit něco jako „sto dvacet tři tisíce sto dvacet tři čárka jedna dva“:

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

NumberFormatter vám navíc umožňuje snadno najít měny, například:

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

Tak pro fr uvidíte eura, zatímco pro en_US měna bude v amerických dolarech.

Ercole Palmeri

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.

Nedávné články

Výhody omalovánek pro děti - svět kouzel pro všechny věkové kategorie

Rozvíjení jemné motoriky prostřednictvím vybarvování připravuje děti na složitější dovednosti, jako je psaní. Barvit…

2. května 2024

Budoucnost je tady: Jak lodní průmysl revolucionizuje globální ekonomiku

Námořní sektor je skutečnou globální ekonomickou velmocí, která se dostala na 150miliardový trh...

1. května 2024

Vydavatelé a OpenAI podepisují dohody o regulaci toku informací zpracovávaných umělou inteligencí

Minulé pondělí Financial Times oznámily dohodu s OpenAI. FT licencuje svou prvotřídní žurnalistiku…

30. dubna 2024

Online platby: Zde je návod, jak vám streamovací služby umožňují platit navždy

Miliony lidí platí za streamovací služby a platí měsíční předplatné. Je obecný názor, že jste…

29. dubna 2024