Atik

Gid lokalizasyon Laravel etap-pa-etap, leson patikilye ak egzanp

Ki jan yo lokalize yon pwojè Laravel, ki jan yo devlope yon pwojè nan Laravel epi fè li ka itilize nan plizyè lang. Nan atik sa a nou wè ki jan yo travay ak dosye tradiksyon, kreye yon switcher lang ak plis ankò ak egzanp.

Laravel se yon aplikasyon ki fèt pou lokal, pou adapte yo ak divès lang ak kilti. Lokalizasyon adapte aplikasyon entènasyonalize nan yon lang espesifik atravè tradiksyon.

condition

  • Nan atik sa a nou pral refere a Laravel vèsyon 8.x;
  • Pou w suiv leson patikilye sa a avèk siksè, ou bezwen gen konesans ki nesesè sou langaj pwogram PHP ak kad Laravel la.
  • Domèn ou se localhost. Si ou pa, ranplase localhost ak pwòp non domèn ou oswa adrès IP ou (selon enstalasyon w).

Travay ak dosye tradiksyon

Nan Laravel, menm jan ak anpil lòt kad, nou ka estoke tradiksyon pou diferan lang nan dosye separe. Gen de fason yo òganize dosye tradiksyon Laravel:

  • Yon apwòch ki pi gran ki estoke dosye nan kote sa a: resources/lang/{en,fr,ru}/{myfile.php};
  • Yon nouvo apwòch ki estoke dosye nan kote sa a: resources/lang/{fr.json, ru.json};

Pou lang ki diferan selon teritwa, ou ta dwe nonmen yo directory/file nan lang nan dapre ISO 15897. Pou egzanp, pou angle UK ou ta itilize en_GB olye pou yo en-gb. Nan atik sa a, nou pral konsantre sou dezyèm apwòch la, men menm bagay la tou ale pou premye a (eksepte pou jan kle tradiksyon yo nonmen ak rekipere). 

Tradiksyon senp

Koulye a, ann ale nan la resources/views/welcome.blade.phpranpli epi ranplase sa ki nan bodytag ak nou, tankou sa a:

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

Nou pral kòmanse pa prepare mesaj akeyi lokalizasyon nou an, ki vrèman fasil nan Laravel. Tout sa ou dwe fè se ranplase tèks "Byenveni sou sit entènèt nou an" ak kòd sa a: {{ __('Welcome to our website') }}. Sa a pral enstwi Laravel montre "Byenveni sou sit entènèt nou an" pa defaultdefinita epi chèche tradiksyon fisèl sa a si yo mete yon lòt lang ki pa angle (n ap jwenn sa pita). Angle pral tabli kòm lang defaultdefinite nan aplikasyon nou an, Se poutèt sa pa defaultdefinita nou pral tou senpleman montre tèks la "Byenveni sou sit entènèt nou an". Si lokal la diferan, nou pral eseye chèche tradiksyon ki koresponn lan ki pral kreye nan yon moman.

Laravel lokalizasyon

Men, ki jan Laravel fè konnen ki lang aktyèl la oswa ki lang ki disponib nan aplikasyon an? Li fè sa lè w gade konfigirasyon lokal la nan app a config/app.php. Louvri fichye sa a epi chèche de kle etalaj asosyasyon sa yo:

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

Deskripsyon yo montre pi wo a kle yo ta dwe pwòp tèt ou-eksplikasyon, men nan kout, kle a locale gen chanm pre adefinan aplikasyon w lan (omwen, si pa gen okenn lòt lokal ki tabli nan kòd la). Ak la fallback_locale li aktive nan ka nou mete yon lokal ki pa egziste nan aplikasyon nou an.

Pandan ke nou gen dosye sa a louvri, ann ajoute yon nouvo kle pou konvenyans nou lis tout lokal aplikasyon nou an pral sipòte. Nou pral itilize sa pita lè nou ajoute yon switcher lokal. Sepandan, sa a se yon travay opsyonèl kòm Laravel pa mande pou nou fè li.

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

Koulye a, aplikasyon nou an sipòte twa lang: angle, Italyen ak franse.

Dosye tradiksyon

Kounye a ke nou te etabli tout lokal nou pral travay avèk yo, nou ka ale pi devan epi ale nan tradui mesaj pre akeyi nou an.definwit.

Ann kòmanse pa ajoute nouvo dosye lokalizasyon nan katab la resources/lang. Premyèman, kreye yon dosye resources/lang/it.json epi ajoute tradiksyon korespondan yo, jan sa a:

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

Apre sa, kreye yon dosye resources/lang/fr.json:

{

"Byenveni sou sit entènèt nou an": "Byenveni sou sit nou an"

}

Kòm ou ka wè, nou toujou al gade nan pre mesaj ladefinite ke nou te ajoute nan dosye a welcome.blade.php (ki te {{ __('Welcome to our website') }}). Rezon ki fè nou pa bezwen kreye yon dosye en.json Se paske Laravel deja konnen ki mesaj nou pase nan pre-settingdefifini ak fonksyon an __() yo se pou pre lokal nou andefinito en.

Chanjman lokal nan Laravel

Nan pwen sa a, Laravel pa konnen ki jan yo chanje lokalizasyon, kidonk pou kounye a nou fè tradiksyon yo dirèkteman nan chemen an. Edit chemen akeyidefifini jan yo montre anba a:

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

Nou kapab kounye a vizite sit entènèt nou an, espesifye nenpòt nan lang ki disponib kòm premye segman chemen an: pou egzanp, localhost/rulocalhost/fr. Ou ta dwe wè kontni an lokalize. Nan ka ou presize yon lokal ki pa sipòte oswa ou pa presize yon lokal ditou, Laravel pral itilize enpa anviwònman defaultdefinita.

Middleware

Chanje lokal la pou chak lyen sit ka pa sa ou vle, epi li ka pa sanble pwòp estetik. Se poutèt sa nou pral fè anviwònman lang nan yon switcher espesyal lang epi sèvi ak sesyon itilizatè a montre kontni an tradui. Se poutèt sa, kreye yon nouvo middleware anndan an app/Http/Middleware/Localization.phpdosye oswa pa kouri 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);
    }
}

Middleware sa a pral enstwi Laravel pou l sèvi ak lokal itilizatè a chwazi si seleksyon sa a prezan nan sesyon an.

Depi nou bezwen operasyon sa a dwe fèt sou chak demann, nou bezwen tou ajoute li nan pile pre middleware ladefifini nan app/http/Kernel.phppou webgwoup middleware:

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

Chanje kou

Apre sa, nou bezwen ajoute yon chemen pou chanje lokal la. Nou ap itilize yon chemen fèmen, men ou ka itilize egzakteman menm kòd la andedan kontwolè w ​​la si ou renmen:

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

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

Epitou, pa bliye retire baskil lokal la te ajoute deja nan chemen pre akeyi nou andefinwit:

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

Yon fwa sa a se fè, sèl fason pou itilizatè a chanje lang lan kounye a se pa antre localhost/language/{locale}. La localeseleksyon an pral estoke nan sesyon an epi yo pral redireksyon itilizatè yo nan kote yo soti (tcheke la Localizationmiddleware). Pou eseye li, ale nan localhost/language/ru(osi lontan ke bonbon sesyon ou a prezan nan navigatè w la) epi w ap wè kontni an tradui. Ou ka deplase atravè sit entènèt la lib oswa eseye rafrechi paj la epi wè ke lang yo chwazi a konsève.

Komitatè a

Koulye a, nou bezwen kreye yon bagay ke itilizatè a ka klike sou chanje lang nan olye pou yo manyèlman antre kòd lokal yo nan URL la. Pou fè sa, nou pral ajoute yon chèk lang trè senp. Se poutèt sa, kreye yon nouvo resources/views/partials/language_switcher.blade.phpdosye ak kòd sa a:

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

Mete switcher ki fèk kreye a nan gade "byenveni":

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

Louvri a app/Providers/AppServiceProvider.phpdosye epi ajoute kòd la pou pataje lè switcher lang nou an pral konpoze. Espesyalman, nou pral pataje lokal aktyèl la ki ka jwenn aksè kòm yon dosye {{ $current_locale }}.

Bilten inovasyon
Pa rate nouvèl ki pi enpòtan sou inovasyon. Enskri pou resevwa yo pa imel.

Opsyon tradiksyon avanse nan PHP Laravel

Nou pral sitou travay avèk resources/views/welcome.blade.php, Se konsa, tout bagay dwe rive nan opinyon akeyi nou sof si yo espesifye otreman.

Paramèt nan strings tradiksyon

Pou egzanp, ann di bonjou itilizatè imajinè nou an (Amanda) olye pou yo jis montre yon mesaj jenerik:

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

Remake byen ke nou te itilize non an ak premye lèt la an miniskil, men anplasman an ak premye lèt la an majiskil. Nan fason sa a, Laravel ka ede w otomatikman kapitalize mo aktyèl la. Sa a pral rive si placeholder la kòmanse ak yon lèt majiskil, pou egzanp, :Namepwodui "Caroline" oswa yon mo konplètman ekri majiskil,  :NAME, pwodui "CAROLINE".

Nou mete ajou dosye tradiksyon nou yo tou resources/lang/fr.jsonresources/lang/it.json , kòm nan moman sa a nou pral sèlman wè vèsyon an angle nenpòt kote kòm kle tradiksyon yo pa matche ak tradiksyon yo.

franse:

{

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

}

Italyen:

{

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

}

Pliryalizasyon

Pou wè pluralizasyon an aksyon, ann ajoute yon nouvo paragraf tèks. 

Pou fè plirizasyon, ou dwe itilize fonksyon an trans_choice olye pou yo __(), pa egzanp:

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

Kòm ou ka wè, fòm pliryèl yo separe pa yon |.

Kounye a, e si nou bezwen plizyè fòm pliryèl? 

Sa a posib tou:

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

Nan ka sa a, nou pèmèt nimewo 01, ak soti nan 219, epi finalman soti nan 20 ivè. Natirèlman, ou ka ajoute kòm anpil règ jan ou bezwen.

Se konsa, e si nou vle placeholders yo nan fòm pliryèl nou an? 

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

Nou kapab tou itilize konte yo pase nan `trans_choice` si sa nesesè lè l sèvi avèk yon plas :count espesyal:

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

Finalman, pa bliye mete ajou fichye tradiksyon ou yo ak nenpòt chanjman ou fè nan tradiksyon debaz la.

Italyen:

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

franse:

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

Travay ak dat lokalize nan Laravel

Pou jwenn dat, nou pral exploiter pouvwa a Kabòn , ki vini ak Laravel pa defaultdefinita. Tcheke la Dokiman kabòn ; ou ka fè anpil bagay enteresan. Pou egzanp, nou ka mete lokal nou an ak règ dat ak lè.

Pou egzanp senp nou an, nou pral montre dat aktyèl la lokalize pou lang yo chwazi a. Nan nou routes/web.php, nou mete ajou chemen paj akeyi a epi nou pase mesaj dat lokalize a bay pa nou view Byenveni:

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

Ann mete ajou resources/views/welcome.blade.php ajoute ekspozisyon dat, tankou sa a:

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

Eseye chanje lang nan paj kay la nan localhost, nou pral wè ke dat yo kounye a lokalize, pou egzanp:

Fòma nimewo ak lajan ak NumberFormatter

Nan diferan peyi, moun sèvi ak diferan fòma pou reprezante nimewo, pa egzanp:

  • Etazini → 123.123,12
  • Lafrans → 123 123,12

Se poutèt sa, pou reflete diferans sa yo nan aplikasyon Laravel ou a, ou ka itilize NumberFormatter nan fason sa a:

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

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

Ou kapab tou ekri nimewo a nan yon lang patikilye epi montre yon bagay tankou " sanventtwa mil sanvenntwa pwen youn de ":

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

Anplis de sa, NumberFormatter pèmèt ou byen fasil jwenn lajan, pou egzanp:

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

Se konsa pou fr ou pral wè Ero, pandan y ap pou en_US lajan an pral an dola ameriken.

Ercole Palmeri

Bilten inovasyon
Pa rate nouvèl ki pi enpòtan sou inovasyon. Enskri pou resevwa yo pa imel.

Recent Articles

Ki jan yo pi byen òganize done ak fòmil nan Excel, pou yon analiz byen fè

Microsoft Excel se zouti referans pou analiz done, paske li ofri anpil karakteristik pou òganize seri done,...

14 Me 2024

Konklizyon pozitif pou de pwojè Walliance Equity Crowdfunding enpòtan: Jesolo Wave Island ak Milano Via Ravenna.

Walliance, SIM ak platfòm nan mitan lidè yo nan Ewòp nan domèn nan Crowdfunding Imobilye depi 2017, anonse fini an ...

13 Me 2024

Ki sa ki filaman ak kouman yo sèvi ak Laravel filaman

Filaman se yon kad devlopman "akselere" Laravel, ki bay plizyè konpozan plen pil. Li fèt pou senplifye pwosesis la nan...

13 Me 2024

Anba kontwòl entèlijans atifisyèl

«Mwen dwe retounen pou konplete evolisyon mwen an: mwen pral pwojte tèt mwen andedan òdinatè a epi mwen pral vin pi enèji. Yon fwa etabli nan...

10 Me 2024

Nouvo entèlijans atifisyèl Google la ka modèl ADN, RNA ak "tout molekil lavi"

Google DeepMind ap prezante yon vèsyon amelyore nan modèl entèlijans atifisyèl li yo. Nouvo modèl amelyore bay non sèlman...

9 Me 2024

Eksplore Achitekti modilè Laravel la

Laravel, pi popilè pou sentaks elegant li yo ak karakteristik pwisan, tou bay yon fondasyon solid pou achitekti modilè. La…

9 Me 2024

Cisco Hypershield ak akizisyon de Splunk Nouvo epòk sekirite a kòmanse

Cisco ak Splunk ap ede kliyan akselere vwayaj yo nan Sant Operasyon Sekirite (SOC) nan tan kap vini an ak...

8 Me 2024

Pi lwen pase bò ekonomik la: pri ki pa evidan nan ransomware

Ransomware te domine nouvèl la pou de dènye ane yo. Pifò moun konnen byen ke atak...

6 Me 2024