Artikelen

Stapsgewijze handleiding voor Laravel-lokalisatie, zelfstudie met voorbeelden

Hoe een Laravel-project te lokaliseren, hoe een project in Laravel te ontwikkelen en bruikbaar te maken in meerdere talen. In dit artikel zien we met voorbeelden hoe u met vertaalbestanden kunt werken, een taalwisselaar kunt maken en meer.

Laravel is een applicatie die is ontworpen om lokaal te zijn, om zich aan te passen aan verschillende talen en culturen. Lokalisatie stemt geïnternationaliseerde applicaties af op een specifieke taal door middel van vertaling.

voorwaarden

  • In dit artikel zullen we verwijzen naar Laravel-versie 8.x;
  • Om deze tutorial met succes te volgen, moet je de nodige kennis hebben van de programmeertaal PHP en het Laravel-framework.
  • Uw domein is localhost. Zo niet, vervang dan localhost met uw eigen domeinnaam of IP-adres (afhankelijk van uw installatie).

Werken met vertaalbestanden

In Laravel kunnen we, net als in veel andere frameworks, vertalingen voor verschillende talen opslaan in aparte bestanden. Er zijn twee manieren om Laravel-vertaalbestanden te organiseren:

  • Een oudere benadering die bestanden op de volgende locatie opslaat: resources/lang/{en,fr,ru}/{myfile.php};
  • Een nieuwe benadering die bestanden op de volgende locatie opslaat: resources/lang/{fr.json, ru.json};

Voor talen die per territorium verschillen, moet u ze een naam geven directory/file van de taal volgens ISO 15897. Voor Brits Engels zou u bijvoorbeeld gebruiken en_GB in plaats van en-gb. In dit artikel concentreren we ons op de tweede benadering, maar hetzelfde geldt voor de eerste (behalve hoe vertaalsleutels worden genoemd en opgehaald). 

Eenvoudige vertalingen

Laten we nu naar de resources/views/welcome.blade.phpbestand en vervang de inhoud van het bodytag met de onze, zoals zo:

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

We beginnen met het voorbereiden van ons welkomstbericht voor lokalisatie, wat heel eenvoudig is in Laravel. Het enige wat je hoeft te doen is de tekst “Welkom op onze website” te vervangen door de volgende code: {{ __('Welcome to our website') }}. Dit zal Laravel instrueren om standaard "Welkom op onze website" weer te gevendefinite en zoek naar vertalingen van deze string als een andere taal dan Engels is ingesteld (daar komen we later op terug). Engels wordt ingesteld als de standaardtaaldefieinde van onze app, dus standaardinstellingdefiAan het einde zullen we gewoon de tekst "Welkom op onze website" weergeven. Als de locale anders is, zullen we proberen de overeenkomende vertaling te vinden en deze zal zo gemaakt worden.

Laravel-lokalisatie

Maar hoe weet Laravel wat de huidige taal is of welke talen beschikbaar zijn in de applicatie? Het doet dit door te kijken naar de lokale configuratie in de app config/app.php. Open dit bestand en zoek naar deze twee associatieve arraysleutels:

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

De beschrijvingen boven de toetsen zouden voor zichzelf moeten spreken, maar in het kort, de sleutel locale bevat de lokale predefieinde van uw toepassing (tenminste, als er geen andere locale is ingesteld in de code). En de fallback_locale het wordt geactiveerd voor het geval we een niet-bestaande landinstelling in onze applicatie instellen.

Terwijl we dit bestand open hebben, laten we voor ons gemak een nieuwe sleutel toevoegen met een lijst van alle landinstellingen die onze applicatie ondersteunt. We zullen dit later gebruiken bij het toevoegen van een lokale switcher. Dit is echter een optionele taak, aangezien Laravel dit niet van ons vereist.

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

Nu ondersteunt onze applicatie drie talen: Engels, Italiaans en Frans.

Vertaal bestanden

Nu we alle locaties hebben vastgesteld waarmee we zullen werken, kunnen we doorgaan met het vertalen van ons welkomstbericht.defiavond.

Laten we beginnen met het toevoegen van nieuwe lokalisatiebestanden aan de map resources/lang. Maak eerst een bestand aan resources/lang/it.json en voeg de overeenkomstige vertalingen als volgt toe:

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

Maak vervolgens een bestand aan resources/lang/fr.json:

{

"Welkom op onze website": "Welkom op onze website"

}

Zoals je ziet verwijzen we altijd naar het voorberichtdefinito die we in het bestand hebben toegevoegd welcome.blade.php (welke was {{ __('Welcome to our website') }}). De reden waarom we geen bestand hoeven aan te maken en.json het is omdat Laravel al weet welke berichten we doorgeven door vooraf in te stellendefiklaar met de functie __() ze zijn voor onze lokale predefinito nl.

Lokale verandering in Laravel

Op dit moment weet Laravel niet hoe hij de locatie moet wijzigen, dus laten we voorlopig de vertalingen direct in het pad doen. Wijzig het welkomstpad voorafdefiafgewerkt zoals hieronder getoond:

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

We kunnen nu onze website bezoeken en een van de beschikbare talen specificeren als het eerste padsegment: bijvoorbeeld localhost/rulocalhost/fr. U zou de gelokaliseerde inhoud moeten zien. Als u een niet-ondersteunde landinstelling opgeeft of helemaal geen landinstelling specificeert, zal Laravel gebruiken enstandaarddefinee.

Middleware

Het wijzigen van de landinstelling voor elke sitelink is misschien niet wat u wilt, en het ziet er esthetisch misschien niet zo schoon uit. Daarom doen we de taalinstelling via een speciale taalwisselaar en gebruiken we de gebruikerssessie om de vertaalde inhoud weer te geven. Maak daarom een ​​nieuwe middleware aan in het app/Http/Middleware/Localization.phpbestand of door te draaien 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);
    }
}

Deze middleware zal Laravel instrueren om de door de gebruiker geselecteerde locale te gebruiken als deze selectie aanwezig is in de sessie.

Aangezien we dit bij elk verzoek moeten doen, moeten we het ook toevoegen aan de pre-middleware-stackdefibinnen geëindigd app/http/Kernel.phpde webmiddleware-groep:

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

Verander van koers

Vervolgens moeten we een pad toevoegen om de landinstelling te wijzigen. We gebruiken een sluitpad, maar je kunt precies dezelfde code in je controller gebruiken als je wilt:

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

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

Vergeet ook niet de locale-schakelaar te verwijderen die eerder is toegevoegd in ons pre-welkomstpaddefiavond:

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

Zodra dit is gebeurd, is de enige manier voor de gebruiker om de momenteel ingestelde taal te wijzigen, door deze in te voeren localhost/language/{locale}. De localeselectie wordt opgeslagen binnen de sessie en zal gebruikers omleiden naar waar ze vandaan kwamen (controleer de Localizationmiddle ware). Ga naar om het te proberen localhost/language/ru(zolang uw sessiecookie aanwezig is in uw browser) en u ziet de vertaalde inhoud. U kunt vrij rondlopen op de website of proberen de pagina te vernieuwen en ervoor te zorgen dat de geselecteerde taal behouden blijft.

De commutator

Nu moeten we iets maken waarop de gebruiker kan klikken om de taal te wijzigen in plaats van handmatig lokale codes in de URL in te voeren. Om dit te doen, voegen we een heel eenvoudige taalcontrole toe. Maak daarom een ​​nieuwe aan resources/views/partials/language_switcher.blade.phpbestand met de volgende code:

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

Neem de nieuw gemaakte switcher op in de "welkom" -weergave:

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

april il app/Providers/AppServiceProvider.phpbestand en voeg de code toe om te delen wanneer onze taalwisselaar wordt samengesteld. We zullen met name de huidige locale delen die toegankelijk is als een bestand {{ $current_locale }}.

Innovatie nieuwsbrief
Mis het belangrijkste nieuws over innovatie niet. Meld u aan om ze per e-mail te ontvangen.

Geavanceerde vertaalopties in PHP Laravel

We gaan vooral werken met resources/views/welcome.blade.php, dus alles moet in onze welkome weergave gebeuren, tenzij anders aangegeven.

Parameters in vertaalreeksen

Laten we bijvoorbeeld hallo zeggen tegen onze denkbeeldige gebruiker (Amanda) in plaats van alleen een generiek bericht weer te geven:

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

Merk op dat we de naam gebruikten met de eerste letter in kleine letters, maar de tijdelijke aanduiding met de eerste letter in hoofdletters. Op deze manier kan Laravel u helpen om het eigenlijke woord automatisch in hoofdletters te schrijven. Dit gebeurt als de tijdelijke aanduiding begint met een hoofdletter, bijvoorbeeld :Nameproduceert "Caroline" of een volledig hoofdletterwoord,  :NAME, produceert “CAROLINE”.

We werken ook onze vertaalbestanden bij resources/lang/fr.jsonresources/lang/it.json , aangezien we op dit moment alleen de Engelse versie zullen zien omdat de vertaalsleutels niet overeenkomen met de vertalingen.

Frans:

{

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

}

Italiaans:

{

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

}

Pluralisatie

Laten we een nieuwe alinea tekst toevoegen om meervoud in actie te zien. 

Om meervoud uit te voeren, moet u de functie gebruiken trans_choice in plaats van __(), bijvoorbeeld:

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

Zoals je kunt zien, worden meervoudsvormen gescheiden door een a |.

Wat als we meerdere meervoudsvormen nodig hebben? 

Dit is ook mogelijk:

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

In dit geval staan ​​we nummers toe 01En 219, en tot slot vanaf 20. U kunt natuurlijk zoveel regels toevoegen als u nodig heeft.

Dus wat als we de tijdelijke aanduidingen in onze meervoudsvormen willen? 

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

We kunnen indien nodig ook de telling gebruiken die is doorgegeven in `trans_choice` met behulp van een tijdelijke aanduiding :count speciaal:

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

Vergeet ten slotte niet uw vertaalbestanden bij te werken met eventuele wijzigingen die u in de basisvertaling hebt aangebracht.

Italiaans:

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

Frans:

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

Werken met gelokaliseerde datums in Laravel

Om data te lokaliseren, we zullen de kracht van benutten Carbon Fibre , die standaard bij Laravel wordt geleverddefinita. Bekijk de Carbon documentatie ; je kunt veel interessante dingen doen. We kunnen bijvoorbeeld onze locale instellen met datum- en tijdregels.

Voor ons eenvoudige voorbeeld tonen we de huidige datum gelokaliseerd voor de geselecteerde taal. In onze routes/web.php, werken we het pad van de welkomstpagina bij en geven we het gelokaliseerde datumbericht door aan het onze view welkom:

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

Laten we updaten resources/views/welcome.blade.php datumweergave toevoegen, zoals zo:

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

Proberen de taal op de startpagina van te wijzigen localhost, zullen we zien dat de datums nu gelokaliseerd zijn, bijvoorbeeld:

Getallen en valuta opmaken met NumberFormatter

In verschillende landen gebruiken mensen verschillende notaties om getallen weer te geven, bijvoorbeeld:

  • Verenigde Staten → 123.123,12
  • Frankrijk → 123 123,12

Om deze verschillen in uw Laravel-app weer te geven, kunt u daarom gebruiken Nummeropmaak op de volgende manier:

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

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

U kunt het nummer ook in een bepaalde taal schrijven en iets weergeven als "honderddrieëntwintigduizend honderddrieëntwintig komma één twee":

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

Bovendien kunt u met NumberFormatter eenvoudig valuta's lokaliseren, bijvoorbeeld:

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

Dus voor fr je zult euro's zien, terwijl voor en_US de valuta zal in Amerikaanse dollars zijn.

Ercole Palmeri

Innovatie nieuwsbrief
Mis het belangrijkste nieuws over innovatie niet. Meld u aan om ze per e-mail te ontvangen.

Recente artikelen

Hoe u gegevens en formules het beste kunt ordenen in Excel, voor een goed uitgevoerde analyse

Microsoft Excel is de referentietool voor data-analyse, omdat het veel mogelijkheden biedt voor het organiseren van datasets,…

14 mei 2024

Positieve conclusie voor twee belangrijke Walliance Equity Crowdfunding-projecten: Jesolo Wave Island en Milano Via Ravenna

Walliance, SIM en platform behoren sinds 2017 tot de koplopers in Europa op het gebied van Real Estate Crowdfunding, kondigt de voltooiing aan…

13 mei 2024

Wat is filament en hoe gebruik je Laravel-filament?

Filament is een "versneld" Laravel-ontwikkelingsframework dat verschillende full-stack-componenten biedt. Het is ontworpen om het proces van…

13 mei 2024

Onder controle van kunstmatige intelligentie

«Ik moet terugkeren om mijn evolutie te voltooien: ik zal mezelf in de computer projecteren en pure energie worden. Eenmaal gesetteld…

10 mei 2024

De nieuwe kunstmatige intelligentie van Google kan DNA, RNA en ‘alle moleculen van het leven’ modelleren

Google DeepMind introduceert een verbeterde versie van zijn kunstmatige-intelligentiemodel. Het nieuwe, verbeterde model biedt niet alleen…

9 mei 2024

Ontdek de modulaire architectuur van Laravel

Laravel, beroemd om zijn elegante syntaxis en krachtige functies, biedt ook een solide basis voor modulaire architectuur. Daar…

9 mei 2024

Cisco Hypershield en overname van Splunk Het nieuwe tijdperk van beveiliging begint

Cisco en Splunk helpen klanten hun reis naar het Security Operations Center (SOC) van de toekomst te versnellen met…

8 mei 2024

Naast de economische kant: de niet voor de hand liggende kosten van ransomware

Ransomware heeft het nieuws de afgelopen twee jaar gedomineerd. De meeste mensen weten heel goed dat aanvallen...

6 mei 2024