towary

Przewodnik krok po kroku po lokalizacji Laravel, samouczek z przykładami

Jak zlokalizować projekt Laravel, jak rozwinąć projekt w Laravel i uczynić go użytecznym w wielu językach. W tym artykule widzimy, jak pracować z plikami tłumaczeń, tworzyć przełącznik językowy i nie tylko z przykładami.

Laravel to aplikacja zaprojektowana tak, aby była lokalna, aby dostosować się do różnych języków i kultur. Lokalizacja dostosowuje umiędzynarodowione aplikacje do określonego języka poprzez tłumaczenie.

Wymagania

  • W tym artykule odniesiemy się do Wersja Laravela 8.x;
  • Aby pomyślnie wykonać ten samouczek, musisz posiadać niezbędną wiedzę na temat języka programowania PHP i frameworka Laravel.
  • Twoja domena to localhost. Jeśli nie, wymień localhost z własną nazwą domeny lub adresem IP (w zależności od instalacji).

Praca z plikami tłumaczeń

W Laravelu, podobnie jak w wielu innych frameworkach, możemy przechowywać tłumaczenia dla różnych języków w osobnych plikach. Istnieją dwa sposoby organizowania plików tłumaczeń Laravel:

  • Starsze podejście, które przechowuje pliki w następującej lokalizacji: resources/lang/{en,fr,ru}/{myfile.php};
  • Nowe podejście, które przechowuje pliki w następującej lokalizacji: resources/lang/{fr.json, ru.json};

W przypadku języków, które różnią się w zależności od terytorium, należy je nazwać directory/file języka zgodnie z ISO 15897. Na przykład dla brytyjskiego angielskiego, którego byś użył en_GB zamiast en-gb. W tym artykule skupimy się na drugim podejściu, ale to samo dotyczy pierwszego (z wyjątkiem sposobu nazywania i pobierania kluczy translacji). 

Proste tłumaczenia

A teraz przejdźmy do resources/views/welcome.blade.phpplik i zastąp zawartość pliku bodytag z naszym, w ten sposób:

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

Zaczniemy od przygotowania wiadomości powitalnej dotyczącej lokalizacji, co w Laravelu jest naprawdę proste. Wystarczy, że zamienisz tekst „Witamy na naszej stronie” na następujący kod: {{ __('Welcome to our website') }}. Spowoduje to, że Laravel domyślnie wyświetli „Witamy na naszej stronie internetowej”.definite i poszukaj tłumaczeń tego ciągu, jeśli ustawiony jest język inny niż angielski (do tego przejdziemy później). Angielski zostanie ustawiony jako język domyślnydefifinisz naszej aplikacji, więc domyślniedefiNa koniec po prostu wyświetlimy tekst „Witamy na naszej stronie”. Jeśli język jest inny, postaramy się znaleźć pasujące tłumaczenie, które za chwilę zostanie utworzone.

Lokalizacja Laravela

Ale skąd Laravel wie, który język jest aktualny lub jakie języki są dostępne w aplikacji? Robi to, patrząc na lokalną konfigurację w aplikacji config/app.php. Otwórz ten plik i poszukaj tych dwóch kluczy tablicy asocjacyjnej:

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

Opisy pokazane nad klawiszami powinny być oczywiste, ale w skrócie klucz locale zawiera lokalny predefinish aplikacji (przynajmniej jeśli w kodzie nie ustawiono żadnych innych ustawień regionalnych). i fallback_locale jest aktywowany w przypadku, gdy ustawimy nieistniejące ustawienia regionalne w naszej aplikacji.

Gdy mamy ten plik otwarty, dodajmy dla wygody nowy klucz zawierający listę wszystkich lokalizacji obsługiwanych przez naszą aplikację. Użyjemy tego później podczas dodawania lokalnego przełącznika. Jest to jednak zadanie opcjonalne, ponieważ Laravel nie wymaga od nas tego.

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

Teraz nasza aplikacja obsługuje trzy języki: angielski, włoski i francuski.

Pliki tłumaczeń

Teraz, gdy ustaliliśmy wszystkie lokalizacje, z którymi będziemy pracować, możemy przejść do tłumaczenia naszej wstępnej wiadomości powitalnejdefinoc.

Zacznijmy od dodania nowych plików lokalizacyjnych do folderu resources/lang. Najpierw utwórz plik resources/lang/it.json i dodaj odpowiednie tłumaczenia w następujący sposób:

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

Następnie utwórz plik resources/lang/fr.json:

{

"Witamy na naszej stronie internetowej": "Witamy na naszej stronie"

}

Jak widać, zawsze odnosimy się do wiadomości wstępnejdefinito, który dodaliśmy w pliku welcome.blade.php (który był {{ __('Welcome to our website') }}). Powód, dla którego nie musimy tworzyć pliku en.json to dlatego, że Laravel już wie, które wiadomości przekazujemy przez ustawienie wstępnedefiskończył na funkcji __() są dla naszego lokalnego predefinito pl.

Lokalna zmiana w Laravel

W tym momencie Laravel nie wie, jak zmienić ustawienia regionalne, więc na razie wykonajmy tłumaczenia bezpośrednio w ścieżce. Zmodyfikuj ścieżkę powitalną predefiwykończone jak pokazano poniżej:

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

Możemy teraz odwiedzić naszą stronę internetową, podając jako pierwszy segment ścieżki dowolny z dostępnych języków: np. localhost/rulocalhost/fr. Powinieneś zobaczyć zlokalizowaną zawartość. Jeśli określisz nieobsługiwane ustawienia regionalne lub w ogóle nie określisz ustawień regionalnych, Laravel użyje endomyślniedefiNita.

Middleware

Zmiana ustawień regionalnych dla każdego linku do witryny może nie być tym, czego chcesz, i może nie wyglądać tak czysto estetycznie. Dlatego ustawimy język za pomocą specjalnego przełącznika języka i użyjemy sesji użytkownika do wyświetlenia przetłumaczonej treści. Dlatego utwórz nowe oprogramowanie pośredniczące w app/Http/Middleware/Localization.phpplik lub uruchamiając 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);
    }
}

To oprogramowanie pośrednie poinstruuje Laravel, aby użył ustawień regionalnych wybranych przez użytkownika, jeśli ten wybór jest obecny w sesji.

Ponieważ musimy to robić przy każdym żądaniu, musimy również dodać to do stosu przed oprogramowaniem pośrednimdefiskończył w app/http/Kernel.phpdla webgrupa oprogramowania pośredniego:

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

Zmień kurs

Następnie musimy dodać ścieżkę do zmiany ustawień regionalnych. Używamy ścieżki zamykającej, ale jeśli chcesz, możesz użyć dokładnie tego samego kodu w swoim kontrolerze:

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

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

Nie zapomnij również usunąć przełącznika ustawień regionalnych, który został wcześniej dodany w naszej ścieżce powitalnejdefinoc:

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

Po wykonaniu tej czynności jedynym sposobem zmiany aktualnie ustawionego języka przez użytkownika jest wprowadzenie localhost/language/{locale}. Plik localewybór zostanie zapisany w ramach sesji i przekieruje użytkowników do miejsca, z którego przyszli (sprawdź plik Localizationoprogramowanie pośrednie). Aby spróbować, przejdź do localhost/language/ru(o ile sesyjny plik cookie jest obecny w Twojej przeglądarce) i zobaczysz przetłumaczoną treść. Możesz swobodnie poruszać się po serwisie lub spróbować odświeżyć stronę i zobaczyć, czy wybrany język jest zachowany.

Komutator

Teraz musimy stworzyć coś, co użytkownik będzie mógł kliknąć, aby zmienić język, zamiast ręcznie wprowadzać kody lokalne w adresie URL. Aby to zrobić, dodamy bardzo prosty moduł sprawdzania języka. Dlatego utwórz nowy resources/views/partials/language_switcher.blade.phpplik z następującym kodem:

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

Uwzględnij nowo utworzony przełącznik w widoku powitalnym:

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

kwiecień app/Providers/AppServiceProvider.phpplik i dodaj kod do udostępnienia, gdy nasz przełącznik językowy zostanie skomponowany. W szczególności udostępnimy bieżące ustawienia regionalne, do których można uzyskać dostęp jako plik {{ $current_locale }}.

Biuletyn innowacji
Nie przegap najważniejszych wiadomości dotyczących innowacji. Zarejestruj się, aby otrzymywać je e-mailem.

Zaawansowane opcje tłumaczenia w PHP Laravel

Będziemy pracować głównie z resources/views/welcome.blade.php, więc wszystko musi się dziać w naszym widoku powitalnym, chyba że określono inaczej.

Parametry w ciągach tłumaczeń

Na przykład przywitajmy się z naszym wyimaginowanym użytkownikiem (Amandą), zamiast wyświetlać tylko ogólny komunikat:

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

Zauważ, że użyliśmy nazwy z pierwszą literą małą literą, ale symbol zastępczy z pierwszą literą wielką literą. W ten sposób Laravel może pomóc w automatycznym zapisywaniu słowa wielką literą. Stanie się tak, jeśli symbol zastępczy zaczyna się od dużej litery, na przykład :Nametworzy „Caroline” lub słowo pisane wielką literą,  :NAME, produkuje „CAROLINE”.

Aktualizujemy również nasze pliki tłumaczeń resources/lang/fr.jsonresources/lang/it.json , ponieważ w tej chwili wszędzie zobaczymy tylko wersję angielską, ponieważ klucze tłumaczeń nie pasują do tłumaczeń.

Francuski:

{

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

}

Włoski:

{

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

}

Pluralizacja

Aby zobaczyć, jak działa liczba mnoga, dodajmy nowy akapit tekstu. 

Aby wykonać liczbę mnogą, musisz użyć funkcji trans_choice zamiast __(), na przykład:

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

Jak widać, formy liczby mnogiej są oddzielone przez a |.

A co, jeśli potrzebujemy wielu form liczby mnogiej? 

Jest to również możliwe:

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

W tym przypadku dopuszczamy liczby 01219, a wreszcie od 20. Oczywiście możesz dodać tyle reguł, ile potrzebujesz.

A co, jeśli chcemy symboli zastępczych w naszej liczbie mnogiej? 

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

W razie potrzeby możemy również użyć liczby przekazanej w `trans_choice`, używając symbolu zastępczego :count specjalny:

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

Na koniec nie zapomnij zaktualizować plików tłumaczeń o wszelkie zmiany wprowadzone w tłumaczeniu podstawowym.

Włoski:

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

Francuski:

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

Praca z zlokalizowanymi datami w Laravel

Aby zlokalizować daty, wykorzystamy moc Węgiel , który jest domyślnie dostarczany z Laravelemdefinita. Sprawdź Dokumentacja karbonowa ; można robić wiele ciekawych rzeczy. Na przykład możemy ustawić nasze ustawienia regionalne z regułami daty i godziny.

W naszym prostym przykładzie pokażemy bieżącą datę zlokalizowaną dla wybranego języka. W naszym routes/web.php, aktualizujemy ścieżkę strony powitalnej i przekazujemy wiadomość o zlokalizowanej dacie do naszej view Witamy:

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

Zaktualizujmy resources/views/welcome.blade.php dodanie wyświetlania daty, w ten sposób:

{{ __('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óba zmiany języka na stronie głównej localhost, zobaczymy, że daty są teraz zlokalizowane, na przykład:

Formatowanie liczb i walut za pomocą NumberFormatter

W różnych krajach ludzie używają różnych formatów do przedstawiania liczb, na przykład:

  • Stany Zjednoczone → 123.123,12
  • Francja → 123 123,12

Dlatego, aby odzwierciedlić te różnice w swojej aplikacji Laravel, możesz użyć Formatowanie liczb w następujący sposób:

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

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

Możesz również wpisać liczbę w określonym języku i wyświetlić coś w rodzaju „sto dwadzieścia trzy tysiące sto dwadzieścia trzy przecinek jeden dwa”:

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

Ponadto NumberFormatter pozwala łatwo zlokalizować waluty, na przykład:

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

Więc dla fr zobaczysz euro, podczas gdy dla en_US walutą będą dolary amerykańskie.

Ercole Palmeri

Biuletyn innowacji
Nie przegap najważniejszych wiadomości dotyczących innowacji. Zarejestruj się, aby otrzymywać je e-mailem.

Najnowsze artykuły

Veeam oferuje najbardziej wszechstronną obsługę oprogramowania ransomware, od ochrony po reagowanie i odzyskiwanie

Coveware by Veeam będzie w dalszym ciągu świadczyć usługi reagowania na incydenty związane z wyłudzeniami cybernetycznymi. Coveware będzie oferować funkcje kryminalistyczne i naprawcze…

Kwiecień 23 2024

Rewolucja ekologiczna i cyfrowa: jak konserwacja predykcyjna zmienia przemysł naftowy i gazowy

Konserwacja predykcyjna rewolucjonizuje sektor naftowo-gazowy dzięki innowacyjnemu i proaktywnemu podejściu do zarządzania zakładami.…

Kwiecień 22 2024

Brytyjski organ antymonopolowy podnosi alarm BigTech w związku z GenAI

Brytyjskie CMA wydało ostrzeżenie dotyczące zachowań Big Tech na rynku sztucznej inteligencji. Tam…

Kwiecień 18 2024

Casa Green: rewolucja energetyczna dla zrównoważonej przyszłości we Włoszech

Rozporządzenie w sprawie zielonych domów, opracowane przez Unię Europejską w celu zwiększenia efektywności energetycznej budynków, zakończyło proces legislacyjny…

Kwiecień 18 2024