Artiklar

Laravel-lokalisering steg-för-steg guide, handledning med exempel

Hur man lokaliserar ett Laravel-projekt, hur man utvecklar ett projekt i Laravel och gör det användbart på flera språk. I den här artikeln ser vi hur man arbetar med översättningsfiler, skapar en språkväxlare och mer med exempel.

Laravel är en applikation designad för att vara lokal, för att anpassa sig till olika språk och kulturer. Lokalisering skräddarsyr internationaliserade applikationer till ett specifikt språk genom översättning.

förutsättningar

  • I den här artikeln kommer vi att hänvisa till Laravel version 8.x;
  • För att framgångsrikt följa denna handledning måste du ha nödvändiga kunskaper om PHP-programmeringsspråket och Laravel-ramverket.
  • Din domän är localhost. Om inte, byt ut localhost med ditt eget domännamn eller IP-adress (beroende på din installation).

Arbeta med översättningsfiler

I Laravel, precis som i många andra ramverk, kan vi lagra översättningar för olika språk i separata filer. Det finns två sätt att organisera Laravel-översättningsfiler:

  • En äldre metod som lagrar filer på följande plats: resources/lang/{en,fr,ru}/{myfile.php};
  • En ny metod som lagrar filer på följande plats: resources/lang/{fr.json, ru.json};

För språk som skiljer sig åt efter territorium bör du namnge dem directory/file av språket enligt ISO 15897. Till exempel för brittisk engelska skulle du använda en_GB istället för en-gb. I den här artikeln kommer vi att fokusera på det andra tillvägagångssättet, men detsamma gäller för det första (förutom hur översättningsnycklar namnges och hämtas). 

Enkla översättningar

Nu, låt oss gå till resources/views/welcome.blade.phpfil och ersätt innehållet i bodytagga med vår, så här:

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

Vi börjar med att förbereda vårt välkomstmeddelande för lokalisering, vilket är väldigt enkelt i Laravel. Allt du behöver göra är att ersätta texten "Välkommen till vår hemsida" med följande kod: {{ __('Welcome to our website') }}. Detta kommer att instruera Laravel att visa "Välkommen till vår webbplats" som standarddefinite och leta efter översättningar av denna sträng om ett annat språk än engelska är inställt (vi kommer till det senare). Engelska kommer att ställas in som standardspråkdefinish av vår app, så som standardinställningdefiI slutet kommer vi helt enkelt visa texten "Välkommen till vår webbplats". Om lokalen är annorlunda kommer vi att försöka hitta den matchande översättningen och den kommer att skapas på ett ögonblick.

Laravel lokalisering

Men hur vet Laravel vilket som är det aktuella språket eller vilka språk som är tillgängliga i applikationen? Den gör detta genom att titta på den lokala konfigurationen i appen config/app.php. Öppna den här filen och leta efter dessa två associativa array-nycklar:

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

Beskrivningarna som visas ovanför nycklarna bör vara självförklarande, men i korthet, nyckeln locale innehåller den lokala predefinish av din ansökan (åtminstone om ingen annan lokalisering har ställts in i koden). Och den fallback_locale den aktiveras om vi ställer in en icke-existerande lokalitet i vår applikation.

Medan vi har den här filen öppen, låt oss lägga till en ny nyckel för vår bekvämlighet som listar alla språk som vår applikation stöder. Vi kommer att använda detta senare när vi lägger till en lokal switcher. Detta är dock en valfri uppgift eftersom Laravel inte kräver att vi gör det.

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

Nu stöder vår applikation tre språk: engelska, italienska och franska.

Översättningsfiler

Nu när vi har etablerat alla lokaler vi kommer att arbeta med kan vi gå vidare och gå vidare med att översätta vårt välkomstmeddelandedefinatt.

Låt oss börja med att lägga till nya lokaliseringsfiler i mappen resources/lang. Skapa först en fil resources/lang/it.json och lägg till motsvarande översättningar enligt följande:

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

Skapa sedan en fil resources/lang/fr.json:

{

"Välkommen till vår hemsida": "Välkommen till vår sida"

}

Som du ser hänvisar vi alltid till förmeddelandetdefinito som vi lagt till i filen welcome.blade.php (som var {{ __('Welcome to our website') }}). Anledningen till att vi inte behöver skapa en fil en.json det beror på att Laravel redan vet vilka meddelanden vi skickar genom förinställningdefiavslutade på tillställningen __() de är för vår lokala predefinito en.

Lokal förändring i Laravel

Vid det här laget vet inte Laravel hur man ändrar språk, så låt oss nu göra översättningarna direkt inuti sökvägen. Ändra välkomstvägen predefiavslutat enligt nedan:

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

Vi kan nu besöka vår webbplats och ange vilket som helst av de tillgängliga språken som det första sökvägssegmentet: till exempel, localhost/rulocalhost/fr. Du bör se det lokaliserade innehållet. Om du anger ett språk som inte stöds eller inte alls anger ett språk, kommer Laravel att använda ensom standarddefinita.

middle~~POS=TRUNC

Att byta språk för varje webbplatslänk kanske inte är vad du vill, och det kanske inte ser lika rent estetiskt ut. Det är därför vi kommer att göra språkinställningen genom en speciell språkväxling och använda användarsessionen för att visa det översatta innehållet. Skapa därför en ny mellanvara inuti app/Http/Middleware/Localization.phpfil eller genom att köra 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);
    }
}

Denna mellanprogram kommer att instruera Laravel att använda den användarvalda lokalen om detta val finns i sessionen.

Eftersom vi behöver göra detta på varje begäran måste vi också lägga till det i pre-mellanvarustackendefislutade i app/http/Kernel.phpför 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 */
  ],

Ändra kurs

Därefter måste vi lägga till en sökväg för att ändra språket. Vi använder en stängningsväg, men du kan använda exakt samma kod inuti din kontroller om du vill:

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

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

Glöm inte heller att ta bort språkväxlingen som tidigare lagts till i vår förvälkomstvägdefinatt:

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

När detta är gjort är det enda sättet för användaren att ändra det aktuella språket genom att gå in localhost/language/{locale}. De localeval kommer att lagras i sessionen och kommer att omdirigera användarna dit de kom ifrån (kontrollera Localizationmellanprogram). För att prova, gå till localhost/language/ru(så länge din sessionscookie finns i din webbläsare) och du kommer att se det översatta innehållet. Du kan röra dig fritt på webbplatsen eller försöka uppdatera sidan och se att det valda språket bevaras.

Kommutatorn

Nu måste vi skapa något som användaren kan klicka på för att ändra språk istället för att manuellt mata in lokala koder i URL:en. För att göra detta lägger vi till en mycket enkel språkkontroll. Skapa därför en ny resources/views/partials/language_switcher.blade.phpfil med följande kod:

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

Inkludera den nyskapade switchern i "välkommen"-vyn:

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

Öppna app/Providers/AppServiceProvider.phpfil och lägg till koden för att dela när vår språkväxling kommer att skapas. Specifikt kommer vi att dela den aktuella lokalen som kan nås som en fil {{ $current_locale }}.

Nyhetsbrev för innovation
Missa inte de viktigaste nyheterna om innovation. Registrera dig för att få dem via e-post.

Avancerade översättningsalternativ i PHP Laravel

Vi kommer främst att arbeta med resources/views/welcome.blade.php, så allt måste hända i vår välkomstvy om inte annat anges.

Parametrar i översättningssträngar

Låt oss till exempel säga hej till vår imaginära användare (Amanda) istället för att bara visa ett allmänt meddelande:

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

Observera att vi använde namnet med den första bokstaven i gemener, men platshållaren med den första bokstaven i versaler. På så sätt kan Laravel hjälpa dig att automatiskt använda versaler i det faktiska ordet. Detta händer om platshållaren börjar med en stor bokstav, t.ex. :Nameproducerar "Caroline" eller ett ord med stort versal,  :NAME, producerar "CAROLINE".

Vi uppdaterar även våra översättningsfiler resources/lang/fr.jsonresources/lang/it.json , eftersom vi för närvarande bara kommer att se den engelska versionen någonstans eftersom översättningsnycklarna inte matchar översättningarna.

Franska:

{

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

}

italiano:

{

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

}

Pluralisering

För att se pluralisering i praktiken, låt oss lägga till ett nytt textstycke. 

För att utföra pluralisering måste du använda funktionen trans_choice istället för __(), till exempel:

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

Som du kan se är pluralformer åtskilda av a |.

Vad händer nu om vi behöver flera pluralformer? 

Detta är också möjligt:

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

I det här fallet tillåter vi siffror 01och 219, och slutligen från 20 och framåt. Naturligtvis kan du lägga till så många regler du behöver.

Så vad händer om vi vill ha platshållarna i våra pluralformer? 

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

Vi kan också använda antalet passerade i `trans_choice` om det behövs med en platshållare :count särskild:

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

Slutligen, glöm inte att uppdatera dina översättningsfiler med eventuella ändringar du gjort i basöversättningen.

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

Franska:

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

Arbetar med lokaliserade datum i Laravel

För att hitta datum kommer vi att utnyttja kraften i Kol , som levereras med Laravel som standarddefinita. Kolla in Koldokumentation ; du kan göra många intressanta saker. Till exempel kan vi ställa in vår plats med datum- och tidsregler.

För vårt enkla exempel visar vi det aktuella datumet lokaliserat för det valda språket. I vår routes/web.php, uppdaterar vi välkomstsidans sökväg och skickar det lokaliserade datummeddelandet till vårt view Välkommen:

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

Låt oss uppdatera resources/views/welcome.blade.php lägga till datumvisning, så här:

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

Försöker ändra språket på hemsidan för localhost, kommer vi att se att datumen nu är lokaliserade, till exempel:

Formatera siffror och valutor med NumberFormatter

I olika länder använder människor olika format för att representera siffror, till exempel:

  • USA → 123.123,12
  • Frankrike → 123 123,12

Därför, för att återspegla dessa skillnader i din Laravel-app, kan du använda NumberFormatter på följande sätt:

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

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

Du kan också skriva numret på ett visst språk och visa något i stil med "hundratjugotre tusen etthundratjugotre poäng ett två":

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

Dessutom låter NumberFormatter dig enkelt hitta valutor, till exempel:

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

Så för fr du kommer att se Euro, medan för en_US valutan kommer att vara i amerikanska dollar.

Ercole Palmeri

Nyhetsbrev för innovation
Missa inte de viktigaste nyheterna om innovation. Registrera dig för att få dem via e-post.

Articoli recenti

Fördelarna med målarbok för barn - en värld av magi för alla åldrar

Att utveckla finmotorik genom färgläggning förbereder barn för mer komplexa färdigheter som att skriva. Att färglägga…

2 maj 2024

Framtiden är här: Hur sjöfartsindustrin revolutionerar den globala ekonomin

Marinesektorn är en sann global ekonomisk makt, som har navigerat mot en marknad på 150 miljarder...

1 maj 2024

Publishers och OpenAI tecknar avtal för att reglera flödet av information som bearbetas av artificiell intelligens

I måndags tillkännagav Financial Times ett avtal med OpenAI. FT licensierar sin journalistik i världsklass...

30 April 2024

Onlinebetalningar: Här är hur streamingtjänster får dig att betala för alltid

Miljontals människor betalar för streamingtjänster och betalar månatliga prenumerationsavgifter. Det är en allmän uppfattning att du...

29 April 2024