Artikels

Laravel-lokalisering stap-vir-stap gids, handleiding met voorbeelde

Hoe om 'n Laravel-projek te lokaliseer, hoe om 'n projek in Laravel te ontwikkel en dit in verskeie tale bruikbaar te maak. In hierdie artikel sien ons hoe om met vertaallêers te werk, 'n taalkieser te skep en meer met voorbeelde.

Laravel is 'n toepassing wat ontwerp is om plaaslik te wees, om aan te pas by verskeie tale en kulture. Lokalisering pas geïnternasionaliseerde toepassings aan by 'n spesifieke taal deur vertaling.

voorvereistes

  • In hierdie artikel sal ons verwys na Laravel weergawe 8.x;
  • Om hierdie tutoriaal korrek te volg, moet jy die nodige kennis van die PHP-programmeertaal en die Laravel-raamwerk hê.
  • Jou domein is localhost. Indien nie, vervang localhost met jou domeinnaam of IP-adres (afhangende van jou installasie).

Werk met vertaallêers

In Laravel, net soos in baie ander raamwerke, kan ons vertalings vir verskillende tale in aparte lêers stoor. Daar is twee maniere om Laravel-vertalingslêers te organiseer:

  • 'n Ou benadering wat die stoor van lêers op die volgende plek behels: resources/lang/{en,fr,ru}/{myfile.php};
  • 'n Nuwe benadering wat die berging van lêers op die volgende plek behels: resources/lang/{fr.json, ru.json};

Vir tale wat volgens grondgebied verskil, moet jy die noem directory/file van die taal volgens ISO 15897. Byvoorbeeld, vir Britse Engels sal jy gebruik en_GB in plaas van en-gb. In hierdie artikel sal ons op die tweede benadering fokus, maar dieselfde geld vir die eerste (met die uitsondering van hoe vertaalsleutels benoem en herwin word). 

Eenvoudige vertalings

Nou, kom ons gaan na resources/views/welcome.blade.phplêer en vervang die inhoud van die bodymerk met ons s'n, soos volg:

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

Ons sal begin deur ons verwelkomingsboodskap vir lokalisering voor te berei, wat baie maklik in Laravel is. Al wat jy hoef te doen is om die "Welkom by ons webwerf" teks met die volgende kode te vervang: {{ __('Welcome to our website') }}. Dit sal Laravel opdrag gee om "Welkom by ons webwerf" by verstek te vertoondefinita en soek vertalings van hierdie string as 'n ander taal as Engels gestel is (ons sal later daarby uitkom). Engels sal as die verstektaal gestel worddefiniteit van ons toepassing, dus by verstekdefinita sal ons bloot die teks "Welkom by ons webwerf" vertoon. As die plek anders is, sal ons probeer om die ooreenstemmende vertaling te soek wat binne 'n oomblik geskep sal word.

Laravel lokalisering

Maar hoe weet Laravel wat die huidige taal is of watter tale in die toepassing beskikbaar is? Dit doen dit deur na die plaaslike konfigurasie in die toepassing te kyk config/app.php. Maak hierdie lêer oop en soek hierdie twee assosiatiewe skikkingsleutels:

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

Die beskrywings wat bo die sleutels getoon word, moet selfverduidelikend wees, maar in kort, die sleutel locale bevat die voorkamerdefinooi van jou aansoek (ten minste, indien geen ander plek in die kode gestel is nie). En die fallback_locale dit word geaktiveer as ons 'n nie-bestaande kamer in ons toepassing stel.

Terwyl ons hierdie lêer oop het, laat ons 'n nuwe sleutel byvoeg vir ons gerief, 'n lys van al die plekke wat ons toepassing sal ondersteun. Ons sal dit later gebruik wanneer ons 'n plaaslike skakelaar byvoeg. Dit is egter 'n opsionele taak aangesien Laravel nie van ons vereis om dit te doen nie.

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

Nou ondersteun ons toepassing drie tale: Engels, Italiaans en Frans.

Vertaling lêers

Noudat ons al die plekke gevestig het waarmee ons sal werk, kan ons voortgaan om ons voorafverwelkomingsboodskap te vertaaldefinag.

Kom ons begin deur nuwe lokaliseringslêers by die gids te voeg resources/lang. Skep eers 'n lêer resources/lang/it.json en voeg die ooreenstemmende vertalings soos volg by:

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

Skep dan 'n lêer resources/lang/fr.json:

{

"Welkom by ons webwerf": “Welkom by ons webwerf”

}

Soos u kan sien, verwys ons altyd na die voorboodskapdefinte wat ons in die lêer bygevoeg het welcome.blade.php (wat was {{ __('Welcome to our website') }}). Die rede waarom ons nie 'n hoef te skep nie en.json Dit is omdat Laravel reeds weet watter boodskappe ons deur voorafinstelling deurstuurdefiklaar met die funksie __() hulle is vir ons plaaslike predefinito en.

Plaaslike oorskakeling in Laravel

Op hierdie stadium weet Laravel nie hoe om van plek te verander nie, so vir nou doen ons die vertalings direk binne die pad. Wysig vooraf welkom paddefivoltooi soos hieronder getoon:

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

Nou kan ons ons webwerf besoek en enige van die beskikbare tale as die eerste padsegment spesifiseer: byvoorbeeld, localhost/rulocalhost/fr. Jy behoort gelokaliseerde inhoud te sien. In die geval dat jy 'n nie-ondersteunde plek spesifiseer of glad nie 'n plek spesifiseer nie, sal Laravel gebruik enby verstek instellingdefinita.

middleware

Om die plek vir elke werfskakel te verander, is dalk nie wat jy wil hê nie en lyk dalk nie so skoon esteties nie. Daarom sal ons die taalinstelling via 'n spesiale taalwisselaar uitvoer en die gebruikerssessie gebruik om die vertaalde inhoud te vertoon. Daarom skep dit 'n nuwe middelware binne die app/Http/Middleware/Localization.phplêer of hardloop 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);
    }
}

Hierdie middelware sal Laravel opdrag gee om die plek wat deur die gebruiker gekies is te gebruik as hierdie keuse in die sessie teenwoordig is.

Aangesien ons nodig het dat hierdie bewerking op elke versoek uitgevoer moet word, moet ons dit ook by die voormiddelware-stapel voegdefiingeskryf het app/http/Kernel.phpvir die webmiddelware 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 koers

Vervolgens moet ons 'n pad byvoeg om die plek te verander. Ons gebruik 'n sluitingspad, maar jy kan presies dieselfde kode binne jou beheerder gebruik as jy wil:

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

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

Moet ook nie vergeet om die locale-wisselaar te verwyder wat voorheen in ons voorafverwelkomingspad bygevoeg is niedefinag:

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

Sodra dit gedoen is, is die enigste manier vir die gebruiker om die tans gestelde taal te verander deur in te voer localhost/language/{locale}. Die localeseleksie sal binne die sessie gestoor word en sal gebruikers herlei na waar hulle vandaan kom (kyk die Localizationmiddelware). Om dit te probeer, gaan na localhost/language/ru(solank jou sessiekoekie in jou blaaier teenwoordig is) en jy sal die vertaalde inhoud sien. Jy kan vrylik op die webwerf beweeg of probeer om die bladsy te verfris en sien dat die geselekteerde taal behoue ​​bly.

Die kommutator

Nou moet ons iets skep waarop die gebruiker kan klik om die taal te verander in plaas daarvan om locale kodes handmatig in die URL in te voer. Om dit te doen, sal ons 'n baie eenvoudige taalkontrole byvoeg. Skep dus 'n nuwe een resources/views/partials/language_switcher.blade.phplêer met die volgende 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>

Sluit die nuutgeskepte skakelaar in die "welkom"-aansig in:

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

Maak die oop app/Providers/AppServiceProvider.phplêer en voeg die kode by om te deel wanneer ons taalwisselaar saamgestel is. Spesifiek, ons sal die huidige ligginginstellings deel wat as 'n lêer verkry kan word {{ $current_locale }}.

Innovasie nuusbrief
Moenie die belangrikste nuus oor innovasie mis nie. Registreer om hulle per e-pos te ontvang.

Gevorderde vertaalopsies in PHP Laravel

Ons sal hoofsaaklik met resources/views/welcome.blade.php, so alles moet in ons welkome siening gebeur, tensy anders gespesifiseer.

Parameters in vertaalstringe

Kom ons sê byvoorbeeld hallo vir ons denkbeeldige gebruiker (Amanda) in plaas daarvan om net 'n generiese boodskap te vertoon:

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

Neem asseblief kennis dat ons die naam met die eerste letter kleinletter gebruik het, maar die plekhouer met die eerste letter hoofletters. Op hierdie manier kan Laravel jou help om die werklike woord outomaties met hoofletters te gebruik. Dit sal gebeur as die plekhouer met 'n hoofletter begin, byvoorbeeld, :Nameproduseer "Caroline" of 'n volledige hoofletterwoord,  :NAME, produseer "CAROLINE".

Ons werk ook ons ​​vertaallêers op resources/lang/fr.jsonresources/lang/it.json , aangesien ons op die oomblik net die Engelse weergawe oral sal sien aangesien die vertaalsleutels nie ooreenstem met die vertalings nie.

Frans:

{

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

}

Italiano:

{

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

}

Pluralisasie

Om pluralisering in aksie te sien, kom ons voeg 'n nuwe paragraaf teks by. 

Om pluralisering uit te voer, moet jy die funksie gebruik trans_choice in plaas van __(), byvoorbeeld:

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

Soos jy kan sien, word die meervoudsvorme geskei deur 'n |.

Nou, wat as ons meer meervoudsvorme nodig het? 

Dit is ook moontlik:

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

In hierdie geval laat ons getalle toe 01, en van 219, en uiteindelik vanaf 20. Natuurlik kan jy soveel reëls byvoeg as wat jy nodig het.

So, wat as ons plekhouers in ons meervoudsvorme wil hê? 

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

Ons kan ook die telling wat in `trans_choice` geslaag is, gebruik indien nodig deur 'n plekhouer te gebruik :count spesiaal:

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

Ten slotte, moenie vergeet om jou vertalinglêers op te dateer met enige veranderinge wat jy aan die basisvertaling gemaak het nie.

Italiano:

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

Werk met gelokaliseerde datums in Laravel

Om datums op te spoor, sal ons die krag van koolstof , wat by verstek by Laravel komdefinita. Kyk na die Koolstof dokumentasie ; jy kan baie cool dinge doen. Ons kan byvoorbeeld ons lokalisering opstel met datum- en tydreëls.

Vir ons eenvoudige voorbeeld, sal ons die huidige datum gelokaliseer vir die geselekteerde taal wys. In ons routes/web.php, werk ons ​​die welkombladsypad op en gee die gelokaliseerde datumboodskap aan ons s'n deur 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
    ]);
});

Kom ons werk op resources/views/welcome.blade.php byvoeging van datumvertoning, soos hierdie:

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

Probeer om die taal te verander op die tuisblad van localhost, sal ons sien dat die datums nou gelokaliseer is, byvoorbeeld:

Formateer getalle en geldeenhede met NumberFormatter

In verskillende lande gebruik mense verskillende formate om getalle voor te stel, byvoorbeeld:

  • Verenigde State → 123.123,12
  • Frankryk → 123 123,12

Daarom, om hierdie verskille in jou Laravel-toepassing te weerspieël, kan jy gebruik NumberFormatter op die volgende manier:

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

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

Jy kan ook die getal in 'n spesifieke taal skryf en iets sien soos "honderd drie-en-twintigduisend, honderd drie-en-twintig punt een twee":

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

Verder laat NumberFormatter jou toe om geldeenhede maklik op te spoor, byvoorbeeld:

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

So vir fr jy sal sien Euro, terwyl vir en_US die geldeenheid sal in Amerikaanse dollars wees.

Ercole Palmeri

Innovasie nuusbrief
Moenie die belangrikste nuus oor innovasie mis nie. Registreer om hulle per e-pos te ontvang.

Onlangse artikels

Die voordele van inkleurbladsye vir kinders - 'n wêreld van magie vir alle ouderdomme

Die ontwikkeling van fyn motoriese vaardighede deur inkleur berei kinders voor vir meer komplekse vaardighede soos skryf. Om in te kleur...

2 Mei 2024

Die toekoms is hier: hoe die verskepingsbedryf die wêreldekonomie revolusioneer

Die vlootsektor is 'n ware globale ekonomiese moondheid, wat na 'n 150 miljard-mark navigeer het ...

1 Mei 2024

Uitgewers en OpenAI onderteken ooreenkomste om die vloei van inligting wat deur Kunsmatige Intelligensie verwerk word, te reguleer

Verlede Maandag het die Financial Times 'n ooreenkoms met OpenAI aangekondig. FT lisensieer sy wêreldklas-joernalistiek ...

30 April 2024

Aanlynbetalings: Hier is hoe stroomdienste jou vir altyd laat betaal

Miljoene mense betaal vir stromingsdienste en betaal maandelikse intekengeld. Dit is algemene opinie dat jy...

29 April 2024