Artikelen

Laravel Lokaliséierung Schrëtt-fir-Schrëtt Guide, Tutorial mat Beispiller

Wéi een e Laravel-Projet lokaliséiert, wéi een e Projet am Laravel entwéckelt an et a verschidde Sprooche benotzbar mécht. An dësem Artikel gesi mir wéi Dir mat Iwwersetzungsdateien schafft, e Sproochewiessel erstellt a méi mat Beispiller.

Laravel ass eng Applikatioun entwéckelt fir lokal ze sinn, fir u verschidde Sproochen a Kulturen unzepassen. Lokaliséierung maacht internationaliséiert Uwendungen op eng spezifesch Sprooch duerch Iwwersetzung.

Viraussetzunge

  • An dësem Artikel wäerte mir op Laravel Versioun 8.x;
  • Fir dëst Tutorial erfollegräich ze verfollegen, musst Dir déi néideg Kenntnisser vun der PHP Programméiersprooch an dem Laravel Kader hunn.
  • Är Domain ass localhost. Wann net, ersetzen localhost mat Ärem eegenen Domain Numm oder IP Adress (ofhängeg vun Ärer Installatioun).

Schafft mat Iwwersetzungsdateien

A Laravel, grad wéi a villen anere Kaderen, kënne mir Iwwersetzunge fir verschidde Sproochen a getrennten Dateien späicheren. Et ginn zwou Weeër fir Laravel Iwwersetzungsdateien ze organiséieren:

  • Eng méi al Approche déi Dateien op der folgender Plaz späichert: resources/lang/{en,fr,ru}/{myfile.php};
  • Eng nei Approche déi Dateien op der folgender Plaz späichert: resources/lang/{fr.json, ru.json};

Fir Sproochen déi no Territoire ënnerscheeden, sollt Dir se nennen directory/file vun der Sprooch no ISO 15897. Zum Beispill, fir UK Englesch géift Dir benotzt en_GB amplaz vun en-gb. An dësem Artikel konzentréiere mir eis op déi zweet Approche, awer datselwecht gëlt fir déi éischt (ausser wéi d'Iwwersetzungsschlësselen benannt an zréckgezunn sinn). 

Einfach Iwwersetzungen

Elo, loosst eis op d' resources/views/welcome.blade.phpDatei an ersetzen den Inhalt vun der bodyTag mat eisem, wéi dëst:

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

Mir fänken un mat eisem Lokalisatiounsbegréissungsmessage virzebereeden, wat wierklech einfach zu Laravel ass. Alles wat Dir maache musst ass den Text "Wëllkomm op eiser Websäit" duerch de folgende Code ze ersetzen: {{ __('Welcome to our website') }}. Dëst wäert Laravel instruéieren "Wëllkomm op eiser Websäit" als Standard ze weisendefinite a kuckt no Iwwersetzunge vun dëser String wann eng aner Sprooch wéi Englesch agestallt ass (mir kommen méi spéit op dat). Englesch gëtt als Standardsprooch gesatdefinish vun eiser App, also par défaut AstellungdefiZum Schluss wäerte mir einfach den Text "Wëllkomm op eiser Websäit" weisen. Wann d'Lokalitéit anescht ass, probéieren mir déi passende Iwwersetzung ze fannen an et gëtt an engem Moment erstallt.

Laravel Lokalisatioun

Awer wéi weess de Laravel wat déi aktuell Sprooch ass oder wéi eng Sproochen an der Applikatioun verfügbar sinn? Et mécht dëst andeems Dir déi lokal Konfiguratioun an der App kuckt config/app.php. Öffnen dës Datei a kuckt no dësen zwee assoziativen Array-Schlësselen:

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

D'Beschreiwungen iwwer d'Schlëssel solle selbstverständlech sinn, awer kuerz, de Schlëssel locale enthält déi lokal Predefinish vun Ärer Applikatioun (op d'mannst, wa keng aner Lokalitéit am Code festgeluecht gouf). An déi fallback_locale et ass aktivéiert am Fall wou mir eng net existent Locale an eiser Applikatioun setzen.

Wärend mir dës Datei op hunn, loosst eis en neie Schlëssel addéieren fir eis Komfort all d'Lokalitéiten déi eis Applikatioun ënnerstëtzt. Mir wäerten dëst spéider benotzen wann Dir e lokale Schalter bäidréit. Wéi och ëmmer, dëst ass eng fakultativ Aufgab well Laravel eis net erfuerdert et ze maachen.

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

Elo ënnerstëtzt eis Applikatioun dräi Sproochen: Englesch, Italienesch a Franséisch.

Iwwersetzungsdateien

Elo datt mir all d'Lokaler etabléiert hunn, mat deenen mir wäerte schaffen, kënne mir virugoen a weidergoe fir eise Pre-Begréissungsmessage ze iwwersetzendefinett.

Loosst eis ufänken mat neie Lokalisatiounsdateien an den Dossier derbäi resources/lang. Als éischt, erstellt eng Datei resources/lang/it.json a fügen déi entspriechend Iwwersetzungen un, wéi follegt:

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

Als nächst erstellt eng Datei resources/lang/fr.json:

{

"Wëllkomm op eiser Websäit": "Wëllkomm op eisem Site"

}

Wéi Dir gesitt, bezéie mir ëmmer op de Pre Messagedefinito déi mir an der Datei bäigefüügt hunn welcome.blade.php (wat war {{ __('Welcome to our website') }}). De Grond firwat mir keng Datei mussen erstellen en.json et ass well de Laravel scho weess wéi eng Messagen mir duerch Pre-Astellung passéierendefiop der Funktioun fäerdeg __() si fir eis lokal Predefinet en.

Lokal Ännerung zu Laravel

Zu dësem Zäitpunkt weess Laravel net wéi d'Lokaler geännert gëtt, also loosst eis d'Iwwersetzungen direkt am Wee maachen. Änneren der wëllkomm Wee Predefiofgeschloss wéi ënnendrënner:

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

Mir kënnen elo eis Websäit besichen, eng vun de verfügbare Sproochen als den éischte Wee Segment spezifizéieren: zum Beispill, localhost/rulocalhost/fr. Dir sollt de lokaliséierten Inhalt gesinn. Am Fall wou Dir eng net-ënnerstëtzt Locale spezifizéiert oder guer keng Lokalitéit uginn, wäert Laravel benotzen enpar défautdefinit.

Middleware

D'Lokaliséierung fir all Sitelink ze wiesselen ass vläicht net wat Dir wëllt, an et gesäit vläicht net sou propper ästhetesch aus. Dofir wäerte mir d'Sproochastellung duerch e spezielle Sproochewiessel maachen an d'Benotzersessioun benotze fir den iwwersaten Inhalt ze weisen. Dofir, schafen eng nei middleware bannent der app/Http/Middleware/Localization.phpDatei oder duerch Lafen 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);
    }
}

Dës Middleware wäert Laravel instruéieren fir de Benotzer gewielte Locale ze benotzen wann dës Auswiel an der Sessioun präsent ass.

Well mir brauchen dat op all Ufro gemaach ze ginn, musse mir et och an de Pre-Mëttelware Stack addéierendefifäerdeg an app/http/Kernel.phppro il webMiddleware Grupp:

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

Course änneren

Als nächst musse mir e Wee derbäi fir d'Lokalitéit z'änneren. Mir benotzen e Zoumaache Wee, awer Dir kënnt genau dee selwechte Code an Ärem Controller benotzen wann Dir wëllt:

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

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

Vergiesst och net de Locale Toggle ze läschen, dee virdru bäigefüügt gouf an eisem Pre Welcome WeedefiNuecht:

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

Wann dëst gemaach ass, ass deen eenzege Wee fir de Benotzer déi aktuell agestallte Sprooch z'änneren andeems Dir gitt localhost/language/{locale}. Den localeD'Selektioun gëtt bannent der Sessioun gespäichert a wäert d'Benotzer viruleeden wou se hierkommen (kuckt d' LocalizationMëttelstuf). Fir et ze probéieren, gitt op localhost/language/ru(soulaang Äre Sessiouns-Cookie an Ärem Browser präsent ass) an Dir wäert den iwwersaten Inhalt gesinn. Dir kënnt fräi ronderëm d'Websäit réckelen oder probéieren d'Säit z'erfrëschen a kucken datt déi gewielte Sprooch erhale bleift.

De Kommutateur

Elo musse mir eppes erstellen datt de Benotzer klickt fir d'Sprooch z'änneren anstatt manuell lokal Coden an d'URL anzeginn. Fir dëst ze maachen, addéiere mer e ganz einfache Sproochechecker. Dofir, schafen eng nei resources/views/partials/language_switcher.blade.phpDatei mam folgende 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>

Gitt den nei erstallten Schalter an der "Wëllkomm" Vue:

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

Öffnen der app/Providers/AppServiceProvider.phpDatei a füügt de Code un fir ze deelen wann eise Sproocheschalter komponéiert gëtt. Speziell wäerte mir déi aktuell Lokalitéit deelen, déi als Datei zougänglech ass {{ $current_locale }}.

Innovatioun Newsletter
Verpasst net déi wichtegst Neiegkeeten iwwer Innovatioun. Registréiert Iech fir se per E-Mail ze kréien.

Fortgeschratt Iwwersetzungsoptiounen an PHP Laravel

Mir wäerten haaptsächlech mat resources/views/welcome.blade.php, also alles muss an eiser wëllkomm Vue geschéien wann net anescht uginn.

Parameteren an Iwwersetzung Strings

Zum Beispill, loosst eis Hallo zu eisem imaginäre Benotzer (Amanda) soen anstatt just e generesche Message ze weisen:

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

Bedenkt datt mir den Numm mam éischte Buschtaf am Klengbuch benotzt hunn, awer de Plazhalter mam éischte Buschtaf am grousse Buschtaf. Op dës Manéier kann Laravel Iech hëllefen dat aktuellt Wuert automatesch ze kapitaliséieren. Dëst geschitt wann de Plazhalter mat engem grousse Buschtaf ufänkt, zum Beispill, :Nameproduzéiert "Caroline" oder e ganz kapitaliséiert Wuert,  :NAME, produzéiert "CAROLINE".

Mir aktualiséieren och eis Iwwersetzungsdateien resources/lang/fr.jsonresources/lang/it.json , well mir am Moment nëmmen déi englesch Versioun iwwerall gesinn well d'Iwwersetzungsschlësselen net mat den Iwwersetzunge passen.

Franséisch:

{

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

}

Italienesch:

{

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

}

Pluraliséierung

Fir Pluraliséierung an Aktioun ze gesinn, loosst eis en neie Paragraphe vum Text derbäisetzen. 

Fir Pluraliséierung auszeféieren, musst Dir d'Funktioun benotzen trans_choice amplaz vun __(), zum Beispill:

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

Wéi Dir gesitt, gi Pluralforme vun engem getrennt |.

Elo, wat wa mir verschidde Pluralforme brauchen? 

Dëst ass och méiglech:

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

An dësem Fall erlaben mir Zuelen 01, a vun 219, an endlech vun 20 un. Natierlech kënnt Dir esou vill Regelen addéieren wéi Dir braucht.

Also wat wa mir d'Plazhalter an eise Pluralformen wëllen? 

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

Mir kënnen och de Grof benotzen, deen an 'trans_choice' passéiert ass, wann néideg mat engem Plazhalter :count speziell:

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

Schlussendlech, vergiesst net Är Iwwersetzungsdateien ze aktualiséieren mat all Ännerungen déi Dir un der Basis Iwwersetzung gemaach hutt.

Italienesch:

{
  "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éisch:

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

Schafft mat lokaliséierten Datumen zu Laravel

Fir Datumen ze fannen, wäerte mir d'Kraaft vun Carbon , déi mat Laravel als Standard kënntdefinit. Check aus Kuelestoff Dokumentatioun ; Dir kënnt vill interessant Saachen maachen. Zum Beispill kënne mir eis Lokalitéit mat Datum- an Zäitregelen astellen.

Fir eist einfacht Beispill weisen mir den aktuellen Datum lokaliséiert fir déi gewielte Sprooch. An eisem routes/web.php, Mir aktualiséieren d'Begréissungssäit Wee a passéieren de lokaliséierten Datum Message un eis view Wëllkomm:

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

Loosst eis update resources/views/welcome.blade.php Datum Display addéieren, sou wéi:

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

Probéieren d'Sprooch op der Homepage vun änneren localhost, wäerte mir gesinn datt d'Datume elo lokaliséiert sinn, zum Beispill:

Formatéierung vun Zuelen a Währungen mat NumberFormatter

A verschiddene Länner benotzen d'Leit verschidde Formater fir Zuelen ze representéieren, zum Beispill:

  • USA → 123.123,12
  • Frankräich → 123 123,12

Dofir, fir dës Differenzen an Ärer Laravel App ze reflektéieren, kënnt Dir benotzen NumberFormatter op déi folgend Manéier:

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

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

Dir kënnt d'Zuel och an enger bestëmmter Sprooch schreiwen an eppes weisen wéi "honnertdräianzwanzegdausend honnertdräianzwanzeg Punkt een zwee":

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

Zousätzlech, NumberFormatter erlaabt Iech einfach Währungen ze fannen, zum Beispill:

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

Also fir fr Dir wäert Euro gesinn, iwwerdeems fir en_US d'Währung wäert an US Dollar ginn.

Ercole Palmeri

Innovatioun Newsletter
Verpasst net déi wichtegst Neiegkeeten iwwer Innovatioun. Registréiert Iech fir se per E-Mail ze kréien.

Recent Artikelen

Dem Google seng nei kënschtlech Intelligenz kann DNA, RNA an "all d'Moleküle vum Liewen" modelléieren

Google DeepMind stellt eng verbessert Versioun vu sengem kënschtlechen Intelligenz Modell vir. Den neie verbesserte Modell bitt net nëmmen ...

9 Mee 2024

Entdeckt Laravel's Modular Architektur

Laravel, berühmt fir seng elegant Syntax a mächteg Features, bitt och e zolitte Fundament fir modulär Architektur. Do…

9 Mee 2024

Cisco Hypershield an Acquisitioun vun Splunk Déi nei Ära vun Sécherheet fänkt

Cisco a Splunk hëllefen Clienten hir Rees an de Security Operations Center (SOC) vun der Zukunft ze beschleunegen mat ...

8 Mee 2024

Iwwert der wirtschaftlecher Säit: déi onsichtbar Käschte vun der Ransomware

Ransomware huet d'Noriichte fir déi lescht zwee Joer dominéiert. Déi meescht Leit si sech gutt bewosst datt Attacke ...

6 Mee 2024

Innovativ Interventioun an Augmented Reality, mat engem Apple Betrachter an der Catania Polyclinic

Eng Ophthalmoplastikoperatioun mam Apple Vision Pro kommerziellen Betrachter gouf an der Catania Polyclinic duerchgefouert ...

3 Mee 2024

D'Virdeeler vu Faarwen Säiten fir Kanner - eng Welt vu Magie fir all Alter

D'Entwécklung vu Feinmotorik duerch Faarwen bereet d'Kanner op méi komplex Fäegkeeten wéi Schreiwen vir. Fir ze faarwen ...

2 Mee 2024

D'Zukunft ass hei: Wéi d'Schëfferindustrie d'Weltwirtschaft revolutionéiert

De Marinesecteur ass eng richteg global wirtschaftlech Muecht, déi op e 150 Milliarde Maart navigéiert ass ...

1 Mee 2024

Verëffentlecher an OpenAI ënnerschreiwen Ofkommes fir de Flux vun Informatioun ze regléieren, déi vu Kënschtlech Intelligenz veraarbecht gëtt

De leschte Méindeg huet d'Financial Times en Deal mat OpenAI ugekënnegt. FT lizenzéiert säi Weltklass Journalismus ...

30 Abrëll 2024