Artikoloj

Laravel-lokiga gvidilo paŝo post paŝo, lernilo kun ekzemploj

Kiel lokalizi projekton de Laravel, kiel disvolvi projekton en Laravel kaj fari ĝin uzebla en pluraj lingvoj. En ĉi tiu artikolo ni vidas kiel labori kun tradukdosieroj, krei lingvoŝanĝilon kaj pli kun ekzemploj.

Laravel estas aplikaĵo desegnita por esti loka, por adaptiĝi al diversaj lingvoj kaj kulturoj. Lokigo tajlas internaciigitajn aplikojn al specifa lingvo per traduko.

kondiĉoj

  • En ĉi tiu artikolo ni referencos Laravel-versio 8.x;
  • Por sukcese sekvi ĉi tiun lernilon, vi devas havi la necesan scion pri la PHP-programlingvo kaj la kadro Laravel.
  • Via domajno estas localhost. Se ne, anstataŭigu localhost kun via propra domajna nomo aŭ IP-adreso (depende de via instalado).

Laborante kun tradukdosieroj

En Laravel, same kiel en multaj aliaj kadroj, ni povas stoki tradukojn por malsamaj lingvoj en apartaj dosieroj. Estas du manieroj organizi Laravel-tradukdosierojn:

  • Pli malnova aliro, kiu stokas dosierojn en la sekva loko: resources/lang/{en,fr,ru}/{myfile.php};
  • Nova aliro, kiu stokas dosierojn en la sekva loko: resources/lang/{fr.json, ru.json};

Por lingvoj kiuj malsamas laŭ teritorio, vi devus nomi ilin directory/file de la lingvo laŭ ISO 15897. Ekzemple, por brita angla vi uzus en_GB anstataŭ en-gb. En ĉi tiu artikolo, ni koncentriĝos pri la dua aliro, sed la sama validas por la unua (krom kiel tradukaj ŝlosiloj estas nomitaj kaj prenitaj). 

Simplaj tradukoj

Nun, ni iru al la resources/views/welcome.blade.phpdosiero kaj anstataŭigi la enhavon de la bodyetikedu kun la nia, jene:

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

Ni komencos preparante nian lokalizigan bonvenan mesaĝon, kiu estas vere facila en Laravel. Vi nur devas anstataŭigi la tekston "Bonvenon al nia retejo" per la sekva kodo: {{ __('Welcome to our website') }}. Ĉi tio instruos Laravel montri "Bonvenon al nia retejo" defaŭltedefinite kaj serĉu tradukojn de ĉi tiu ĉeno se alia lingvo ol la angla estas agordita (ni atingos tion poste). La angla estos agordita kiel la defaŭlta lingvodefifinaĵo de nia aplikaĵo, do defaŭltedefiFine ni simple montros la tekston "Bonvenon al nia retejo". Se la loko estas malsama, ni provos trovi la kongruan tradukon kaj ĝi estos kreita en momento.

Laravel-lokigo

Sed kiel Laravel scias, kiu estas la nuna lingvo aŭ kiuj lingvoj disponeblas en la aplikaĵo? Ĝi faras tion rigardante la lokan agordon en la app config/app.php. Malfermu ĉi tiun dosieron kaj serĉu ĉi tiujn du asociajn tabelŝlosilojn:

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

La priskriboj montritaj super la klavoj devus esti memklaraj, sed mallonge, la ŝlosilo locale enhavas la lokan predefifinaĵo de via aplikaĵo (almenaŭ, se neniu alia loko estis agordita en la kodo). Kaj la fallback_locale ĝi estas aktivigita se ni starigas neekzistantan lokaĵon en nia aplikaĵo.

Dum ni havas ĉi tiun dosieron malfermita, ni aldonu novan ŝlosilon por nia komforto listigante ĉiujn lokojn, kiujn nia aplikaĵo subtenos. Ni uzos ĉi tion poste aldonante lokan ŝaltilon. Tamen ĉi tio estas laŭvola tasko ĉar Laravel ne postulas, ke ni faru ĝin.

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

Nun nia aplikaĵo subtenas tri lingvojn: la angla, la itala kaj la franca.

Tradukaj dosieroj

Nun kiam ni establis ĉiujn lokojn, kun kiuj ni laboros, ni povas daŭrigi kaj traduki nian antaŭbonvenigan mesaĝon.definokto.

Ni komencu aldonante novajn lokalizajn dosierojn al la dosierujo resources/lang. Unue, kreu dosieron resources/lang/it.json kaj aldonu la respondajn tradukojn, jene:

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

Poste, kreu dosieron resources/lang/fr.json:

{

"Bonvenon al nia retejo": "Bonvenon al nia retejo"

}

Kiel vi povas vidi, ni ĉiam referencas al la antaŭmesaĝodefinito kiun ni aldonis en la dosiero welcome.blade.php (kio estis {{ __('Welcome to our website') }}). La kialo kial ni ne devas krei dosieron en.json estas ĉar Laravel jam scias, kiujn mesaĝojn ni preterpasas antaŭ agordodefifiniĝis ĉe la funkcio __() ili estas por nia loka predefinito en.

Loka ŝanĝo en Laravel

Je ĉi tiu punkto, Laravel ne scias kiel ŝanĝi lokojn, do nuntempe, ni faru la tradukojn rekte en la vojo. Modifi la bonvenan vojon predefifinita kiel montrite sube:

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

Ni nun povas viziti nian retejon, specifante iun ajn el la disponeblaj lingvoj kiel la unuan vojon: ekzemple, localhost/rulocalhost/fr. Vi devus vidi la lokalizitan enhavon. Se vi specifigas nesubtenan lokaĵon aŭ tute ne specifas lokaĵon, Laravel uzos endefaŭltedefinita.

Middleware

Ŝanĝi la lokon por ĉiu retejo-ligilo eble ne estas tio, kion vi volas, kaj ĝi eble ne aspektas tiel pura estetike. Tial ni faros la lingvan agordon per speciala lingvoŝanĝilo kaj uzos la uzantan sesion por montri la tradukitan enhavon. Tial kreu novan mezvaron ene de la app/Http/Middleware/Localization.phpdosiero aŭ per kurado 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);
    }
}

Ĉi tiu mezprogramo instrukcios al Laravel uzi la elektitan lokon de la uzanto se ĉi tiu elekto ĉeestas en la sesio.

Ĉar ni bezonas tion fari laŭ ĉiu peto, ni ankaŭ devas aldoni ĝin al la antaŭmezprograma stakodefifinis en app/http/Kernel.phppo il webMezvargrupo:

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

Ŝanĝi kurson

Poste, ni devas aldoni vojon por ŝanĝi la lokon. Ni uzas fermvojon, sed vi povas uzi precize la saman kodon ene de via regilo se vi ŝatas:

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

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

Ankaŭ, ne forgesu forigi la lokan baskulon antaŭe aldonitan en nia antaŭbonveniga vojodefinokto:

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

Post kiam ĉi tio estas farita, la nura maniero por la uzanto ŝanĝi la nuntempe fiksitan lingvon estas enirante localhost/language/{locale}. La localeelekto estos konservita ene de la sesio kaj redirektos uzantojn al kie ili venis (kontrolu la Localizationmezvaro). Por provi ĝin, iru al localhost/language/ru(dum via sesiokuketo ĉeestas en via retumilo) kaj vi vidos la tradukitan enhavon. Vi povas libere movi la retejon aŭ provi refreŝigi la paĝon kaj vidi, ke la elektita lingvo estas konservita.

La komutilo

Nun ni devas krei ion, kion la uzanto povas klaki por ŝanĝi la lingvon anstataŭ permane enigi lokajn kodojn en la URL. Por fari tion, ni aldonos tre simplan lingvokontrolilon. Tial kreu novan resources/views/partials/language_switcher.blade.phpdosiero kun la sekva kodo:

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

Enmetu la nove kreitan ŝaltilon en la "bonvena" vido:

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

Malfermu la app/Providers/AppServiceProvider.phpdosiero kaj aldonu la kodon por kunhavi kiam nia lingvoŝanĝilo estos komponita. Specife, ni dividos la nunan lokadon alirebla kiel dosiero {{ $current_locale }}.

Informilo pri novigo
Ne maltrafu la plej gravajn novaĵojn pri novigado. Registriĝi por ricevi ilin retpoŝte.

Altnivelaj tradukaj opcioj en PHP Laravel

Ni ĉefe laboros kun resources/views/welcome.blade.php, do ĉio devas okazi laŭ nia bonvena vido krom se alie specifita.

Parametroj en tradukaj ĉenoj

Ekzemple, ni diru saluton al nia imaga uzanto (Amanda) anstataŭ nur montri ĝeneralan mesaĝon:

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

Rimarku, ke ni uzis la nomon kun la unua litero en minusklo, sed la lokokupilon kun la unua litero en majusklo. Tiel, Laravel povas helpi vin aŭtomate majuskligi la realan vorton. Ĉi tio okazos se la lokokupilo komenciĝas per majuskla litero, ekzemple, :Nameproduktas "Karolino" aŭ plene ĉapelitan vorton,  :NAME, produktas "KAROLINO".

Ni ankaŭ ĝisdatigas niajn tradukdosierojn resources/lang/fr.jsonresources/lang/it.json , ĉar nuntempe ni nur vidos la anglan version ie ajn ĉar la tradukŝlosiloj ne kongruas kun la tradukoj.

Franca:

{

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

}

Itala:

{

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

}

Pluraligo

Por vidi pluregon en agado, ni aldonu novan alineon de teksto. 

Por plenumi pluraligon, vi devas uzi la funkcion trans_choice anstataŭ __(), ekzemple:

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

Kiel vi povas vidi, pluralformoj estas apartigitaj per a |.

Nun, kio se ni bezonas plurajn pluralajn formojn? 

Ĉi tio ankaŭ eblas:

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

En ĉi tiu kazo, ni permesas nombrojn 01, kaj de 219, kaj fine de 20 pluen. Kompreneble, vi povas aldoni tiom da reguloj kiom vi bezonas.

Kio do se ni volas la anstataŭaĵojn en niaj pluralaj formoj? 

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

Ni ankaŭ povas uzi la kalkulon pasitan en `trans_choice` se necese uzante anstataŭilon :count speciala:

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

Fine, ne forgesu ĝisdatigi viajn tradukdosierojn kun ajnaj ŝanĝoj faritaj al la baza traduko.

Itala:

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

Franca:

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

Laborante kun lokalizitaj datoj en Laravel

Por lokalizi datojn, ni utiligos la potencon de karbonon , kiu venas kun Laravel defaŭltedefinita. Rigardu la Karbondokumentado ; vi povas fari multajn interesajn aferojn. Ekzemple, ni povas agordi nian lokadon kun dataj kaj temporeguloj.

Por nia simpla ekzemplo, ni montros la nunan daton lokalizitan por la elektita lingvo. En nia routes/web.php, ni ĝisdatigas la bonvenan paĝan vojon kaj transdonas la lokalizitan datmesaĝon al la nia view bonvenon:

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

Ni ĝisdatigu resources/views/welcome.blade.php aldonante daton, tiel:

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

Provante ŝanĝi la lingvon sur la ĉefpaĝo de localhost, ni vidos, ke la datoj nun estas lokalizitaj, ekzemple:

Formatado de nombroj kaj valutoj kun NumberFormatter

En malsamaj landoj, homoj uzas malsamajn formatojn por reprezenti nombrojn, ekzemple:

  • Usono → 123.123,12
  • Francio → 123 123,12

Tial, por reflekti ĉi tiujn diferencojn en via Laravel-apo, vi povas uzi NumberFormatter en la sekva maniero:

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

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

Vi ankaŭ povas skribi la nombron en aparta lingvo kaj montri ion kiel "cent dudek tri mil cent dudek tri punkto unu du":

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

Krome, NumberFormatter permesas vin facile lokalizi valutojn, ekzemple:

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

Do por fr vi vidos Eŭrojn, dum por en_US la valuto estos en usonaj dolaroj.

Ercole Palmeri

Informilo pri novigo
Ne maltrafu la plej gravajn novaĵojn pri novigado. Registriĝi por ricevi ilin retpoŝte.

Lastaj artikoloj

Eldonistoj kaj OpenAI subskribas interkonsentojn por reguligi la fluon de informoj prilaboritaj de Artefarita Inteligenteco

Pasintlunde, la Financial Times anoncis interkonsenton kun OpenAI. FT licencas sian mondklasan ĵurnalismon...

30 aprilo 2024

Interretaj Pagoj: Jen Kiel Fluaj Servoj Faras Vin Pagi Eterne

Milionoj da homoj pagas por streaming-servoj, pagante monatajn abonkotizojn. Estas komuna opinio, ke vi...

29 aprilo 2024

Veeam havas la plej ampleksan subtenon por ransomware, de protekto ĝis respondo kaj reakiro

Coveware de Veeam daŭre liveros servojn de respondaj incidentoj pri ciberĉantaĝo. Coveware ofertos krimmedicinajn kaj solvajn kapablojn...

23 aprilo 2024

Verda kaj Cifereca Revolucio: Kiel Prognoza Prizorgado Transformas la Petrolo kaj Gasa Industrio

Prognoza prizorgado revolucias la petrolon kaj gasan sektoron, kun noviga kaj iniciatema aliro al plantadministrado...

22 aprilo 2024