Artikuj

Udhëzues hap pas hapi për lokalizimin e Laravel, tutorial me shembuj

Si të lokalizoni një projekt Laravel, si të zhvilloni një projekt në Laravel dhe ta bëni atë të përdorshëm në shumë gjuhë. Në këtë artikull ne shohim se si të punojmë me skedarët e përkthimit, të krijojmë një ndërrues gjuhësh dhe më shumë me shembuj.

Laravel është një aplikacion i krijuar për të qenë lokal, për t'u përshtatur me gjuhë dhe kultura të ndryshme. Lokalizimi përshtat aplikacionet e ndërkombëtarizuara në një gjuhë specifike përmes përkthimit.

parakushtet

  • Në këtë artikull do t'i referohemi Versioni i Laravel 8.x;
  • Për të ndjekur me sukses këtë tutorial, duhet të keni njohuritë e nevojshme për gjuhën e programimit PHP dhe kornizën Laravel.
  • Domeni juaj është localhost. Nëse jo, zëvendësojeni localhost me emrin tuaj të domenit ose adresën IP (në varësi të instalimit tuaj).

Puna me skedarë përkthimi

Në Laravel, ashtu si në shumë korniza të tjera, ne mund të ruajmë përkthime për gjuhë të ndryshme në skedarë të veçantë. Ka dy mënyra për të organizuar skedarët e përkthimit Laravel:

  • Një qasje më e vjetër që ruan skedarët në vendndodhjen e mëposhtme: resources/lang/{en,fr,ru}/{myfile.php};
  • Një qasje e re që ruan skedarët në vendndodhjen e mëposhtme: resources/lang/{fr.json, ru.json};

Për gjuhët që ndryshojnë sipas territorit, duhet t'i emërtoni ato directory/file të gjuhës sipas ISO 15897. Për shembull, për anglishten e Mbretërisë së Bashkuar do të përdorni en_GB në vend të en-gb. Në këtë artikull, ne do të përqendrohemi në qasjen e dytë, por e njëjta gjë vlen edhe për të parën (përveç se si emërtohen dhe merren çelësat e përkthimit). 

Përkthime të thjeshta

Tani, le të shkojmë në resources/views/welcome.blade.phpskedari dhe zëvendësoni përmbajtjen e bodyetiketo me tonat, si kështu:

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

Ne do të fillojmë duke përgatitur mesazhin tonë të mirëseardhjes së lokalizimit, i cili është vërtet i lehtë në Laravel. E tëra çfarë ju duhet të bëni është të zëvendësoni tekstin "Mirë se vini në faqen tonë të internetit" me kodin e mëposhtëm: {{ __('Welcome to our website') }}. Kjo do të udhëzojë Laravel të shfaqë "Mirë se vini në faqen tonë të internetit" si parazgjedhjedefinite dhe kërkoni për përkthime të këtij vargu nëse është caktuar një gjuhë tjetër përveç anglishtes (ne do të arrijmë tek ajo më vonë). Anglishtja do të vendoset si gjuha e paracaktuardefinish i aplikacionit tonë, kështu që sipas cilësimeve të parazgjedhuradefiNë fund ne thjesht do të shfaqim tekstin "Mirë se vini në faqen tonë të internetit". Nëse vendndodhja është e ndryshme, ne do të përpiqemi të gjejmë përkthimin që përputhet dhe ai do të krijohet në një moment.

Lokalizimi i Laravel

Por si e di Laravel cila është gjuha aktuale apo cilat gjuhë janë të disponueshme në aplikacion? Këtë e bën duke parë konfigurimin lokal në aplikacion config/app.php. Hapeni këtë skedar dhe kërkoni për këto dy çelësa të grupit shoqërues:

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

Përshkrimet e treguara sipër çelësave duhet të jenë vetë-shpjeguese, por me pak fjalë, çelësi locale përmban para lokaledefiNish i aplikacionit tuaj (të paktën, nëse nuk është vendosur ndonjë vend tjetër në kod). Dhe fallback_locale ai aktivizohet në rast se vendosim një vend jo-ekzistent në aplikacionin tonë.

Ndërsa e kemi të hapur këtë skedar, le të shtojmë një çelës të ri për lehtësinë tonë, duke renditur të gjitha vendndodhjet që do të mbështesë aplikacioni ynë. Ne do ta përdorim këtë më vonë kur shtojmë një ndërrues lokal. Sidoqoftë, kjo është një detyrë opsionale pasi Laravel nuk kërkon që ne ta bëjmë atë.

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

Tani aplikacioni ynë mbështet tre gjuhë: anglisht, italisht dhe frëngjisht.

Skedarët e përkthimit

Tani që kemi krijuar të gjitha vendet me të cilat do të punojmë, mund të vazhdojmë dhe të vazhdojmë me përkthimin e mesazhit tonë të mirëseardhjes paraprakedefinatën.

Le të fillojmë duke shtuar skedarë të rinj lokalizimi në dosje resources/lang. Së pari, krijoni një skedar resources/lang/it.json dhe shtoni përkthimet përkatëse, si më poshtë:

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

Tjetra, krijoni një skedar resources/lang/fr.json:

{

“Mirë se vini në faqen tonë të internetit”: “Mirëserdhe në faqen tonë”

}

Siç mund ta shihni, ne gjithmonë i referohemi mesazhit paraprakdefinito që kemi shtuar në skedar welcome.blade.php (e cila ishte {{ __('Welcome to our website') }}). Arsyeja pse nuk duhet të krijojmë një skedar en.json sepse Laravel tashmë e di se cilat mesazhe kalojmë duke vendosur paraprakishtdefipërfunduar në funksion __() ato janë për para tona lokaledefinito en.

Ndryshimi lokal në Laravel

Në këtë pikë, Laravel nuk di se si të ndryshojë lokalet, kështu që tani për tani, le të bëjmë përkthimet direkt brenda shtegut. Ndrysho rrugën e mirëseardhjes paradefipërpunuar siç tregohet më poshtë:

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

Tani mund të vizitojmë faqen tonë të internetit, duke specifikuar ndonjë nga gjuhët e disponueshme si segmentin e parë të rrugës: për shembull, localhost/rulocalhost/fr. Ju duhet të shihni përmbajtjen e lokalizuar. Në rast se specifikoni një vend të pambështetur ose nuk specifikoni fare një vend, Laravel do të përdorë ensipas parazgjedhjesdefinita

middleware

Ndërrimi i vendndodhjes për secilën lidhje të sajtit mund të mos jetë ajo që dëshironi dhe mund të mos duket aq e pastër nga ana estetike. Kjo është arsyeja pse ne do të bëjmë cilësimin e gjuhës përmes një ndërruesi të veçantë të gjuhës dhe do të përdorim sesionin e përdoruesit për të shfaqur përmbajtjen e përkthyer. Prandaj, krijoni një ndërmjetës të ri brenda app/Http/Middleware/Localization.phpskedar ose duke ekzekutuar 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);
    }
}

Ky softuer i mesëm do të udhëzojë Laravel të përdorë vendndodhjen e zgjedhur nga përdoruesi nëse kjo përzgjedhje është e pranishme në seancë.

Meqenëse kjo duhet të bëhet në çdo kërkesë, ne gjithashtu duhet ta shtojmë atë në grupin e para-midwaredefipërfunduar në app/http/Kernel.phppër webgrupi i programeve të mesme:

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

Ndrysho kursin

Më pas, duhet të shtojmë një shteg për të ndryshuar vendndodhjen. Ne po përdorim një shteg mbylljeje, por ju mund të përdorni saktësisht të njëjtin kod brenda kontrolluesit tuaj nëse dëshironi:

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

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

Gjithashtu, mos harroni të hiqni ndryshimin lokal të shtuar më parë në rrugën tonë të mirëseardhjesdefinata:

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

Pasi të bëhet kjo, e vetmja mënyrë që përdoruesi të ndryshojë gjuhën e caktuar aktualisht është duke hyrë localhost/language/{locale}.  localepërzgjedhja do të ruhet brenda sesionit dhe do t'i ridrejtojë përdoruesit nga kanë ardhur (kontrolloni Localizationprogrami i mesëm). Për ta provuar, shkoni te localhost/language/ru(përderisa skedari juaj i sesionit është i pranishëm në shfletuesin tuaj) dhe do të shihni përmbajtjen e përkthyer. Mund të lëvizni lirshëm nëpër uebsajt ose të provoni të rifreskoni faqen dhe të shihni që gjuha e zgjedhur është ruajtur.

Komutatori

Tani duhet të krijojmë diçka që përdoruesi mund të klikojë për të ndryshuar gjuhën në vend që të fusë manualisht kodet lokale në URL. Për ta bërë këtë, ne do të shtojmë një kontrollues gjuhësor shumë të thjeshtë. Prandaj, krijoni një të re resources/views/partials/language_switcher.blade.phpskedar me kodin e mëposhtëm:

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

Përfshini ndërruesin e sapokrijuar në pamjen "mirëseardhje":

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

Hape app/Providers/AppServiceProvider.phpskedari dhe shtoni kodin për ta ndarë kur do të përpilohet ndërruesi ynë i gjuhës. Në mënyrë të veçantë, ne do të ndajmë vendndodhjen aktuale që mund të aksesohet si skedar {{ $current_locale }}.

Buletini i inovacionit
Mos humbisni lajmet më të rëndësishme mbi inovacionin. Regjistrohuni për t'i marrë ato me email.

Opsione të avancuara të përkthimit në PHP Laravel

Ne do të punojmë kryesisht me resources/views/welcome.blade.php, kështu që gjithçka duhet të ndodhë në këndvështrimin tonë të mirëpritur, përveç nëse specifikohet ndryshe.

Parametrat në vargjet e përkthimit

Për shembull, le t'i themi përshëndetje përdoruesit tonë imagjinar (Amanda) në vend që të shfaqim vetëm një mesazh të përgjithshëm:

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

Vini re se emrin e kemi përdorur me shkronjën e parë me shkronjë të vogël, por mbajtësin e vendit me shkronjën e parë me shkronjë të madhe. Në këtë mënyrë, Laravel mund t'ju ndihmojë të shkruani automatikisht fjalën aktuale. Kjo do të ndodhë nëse mbajtësi i vendit fillon me një shkronjë të madhe, për shembull, :Nameprodhon "Caroline" ose një fjalë të shkruar plotësisht,  :NAME, prodhon “CAROLINE”.

Ne gjithashtu përditësojmë skedarët tanë të përkthimit resources/lang/fr.jsonresources/lang/it.json , pasi për momentin do të shohim vetëm versionin anglisht kudo pasi çelësat e përkthimit nuk përputhen me përkthimet.

Frëngjisht:

{

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

}

Italisht:

{

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

}

Pluralizimi

Për të parë pluralizimin në veprim, le të shtojmë një paragraf të ri teksti. 

Për të kryer pluralizimin, duhet të përdorni funksionin trans_choice në vend të __(), për shembull:

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

Siç mund ta shihni, format e shumësit ndahen me a |.

Tani, çka nëse na duhen forma të shumta shumësi? 

Kjo është gjithashtu e mundur:

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

Në këtë rast, ne lejojmë numrat 01, dhe nga 219, dhe në fund nga 20 e tutje. Sigurisht, mund të shtoni sa më shumë rregulla që ju nevojiten.

Po sikur të duam mbajtësit e vendeve në format tona të shumësit? 

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

Ne gjithashtu mund të përdorim numërimin e kaluar në "trans_choice" nëse është e nevojshme duke përdorur një vendmbajtes :count special:

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

Së fundi, mos harroni të përditësoni skedarët tuaj të përkthimit me çdo ndryshim që keni bërë në përkthimin bazë.

Italisht:

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

Frëngjisht:

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

Puna me data të lokalizuara në Laravel

Për të gjetur datat, ne do të shfrytëzojmë fuqinë e Karbon , i cili vjen me Laravel si parazgjedhjedefinita. Shikoni Dokumentacioni i karbonit ; ju mund të bëni shumë gjëra interesante. Për shembull, ne mund të vendosim vendndodhjen tonë me rregullat e datës dhe orës.

Për shembullin tonë të thjeshtë, ne do të tregojmë datën aktuale të lokalizuar për gjuhën e zgjedhur. Në tonë routes/web.php, ne përditësojmë shtegun e faqes së mirëseardhjes dhe ia kalojmë mesazhin tonë të lokalizuar të datës view mirëseardhje:

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

Le të përditësojmë resources/views/welcome.blade.php duke shtuar shfaqjen e datës, si kjo:

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

Përpjekja për të ndryshuar gjuhën në faqen kryesore të localhost, do të shohim që datat tani janë të lokalizuara, për shembull:

Formatimi i numrave dhe valutave me NumberFormatter

Në vende të ndryshme, njerëzit përdorin formate të ndryshme për të paraqitur numrat, për shembull:

  • Shtetet e Bashkuara → 123.123,12
  • Francë → 123 123,12

Prandaj, për të pasqyruar këto dallime në aplikacionin tuaj Laravel, mund të përdorni NumberFormatter në mënyrën e mëposhtme:

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

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

Ju gjithashtu mund ta shkruani numrin në një gjuhë të caktuar dhe të shfaqni diçka si "njëqind e njëzet e tre mijë e njëqind e njëzet e tre pikë një dy":

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

Për më tepër, NumberFormatter ju lejon të gjeni lehtësisht monedhat, për shembull:

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

Pra për fr ju do të shihni euro, ndërsa për en_US monedha do të jetë në dollarë amerikanë.

Ercole Palmeri

Buletini i inovacionit
Mos humbisni lajmet më të rëndësishme mbi inovacionin. Regjistrohuni për t'i marrë ato me email.

Artikujt e fundit

Ideja brilante: Bandalux prezanton Airpure®, perden që pastron ajrin

Rezultat i inovacionit të vazhdueshëm teknologjik dhe i përkushtimit ndaj mjedisit dhe mirëqenies së njerëzve. Bandalux prezanton Airpure®, një tendë…

12 Prill 2024

Modelet e Dizajnit Vs Parimet SOLID, avantazhet dhe disavantazhet

Modelet e projektimit janë zgjidhje specifike të nivelit të ulët për problemet e përsëritura në dizajnimin e softuerit. Modelet e dizajnit janë…

11 Prill 2024

Magica, aplikacioni iOS që thjeshton jetën e shoferëve në menaxhimin e automjetit të tyre

Magica është aplikacioni i iPhone që e bën menaxhimin e automjeteve të thjeshtë dhe efikas, duke i ndihmuar drejtuesit të kursejnë dhe…

11 Prill 2024

Grafikët e Excel, çfarë janë ato, si të krijoni një grafik dhe si të zgjidhni grafikun optimal

Një grafik Excel është një vizual që përfaqëson të dhënat në një fletë pune në Excel.…

9 Prill 2024