Skip to main content

Laravel i18n: celovit vodnik po internacionalizaciji in lokalizaciji

Od prve jezikovne datoteke do produkcije: nastavite Laravelov prevajalski sistem, obravnavajte množinske oblike, odpravite napako nadomeščanja pri JSON ter dodajte pametne verige nadomestnih jezikovnih različic za regionalne različice.

1

Spoznajte Laravelov prevajalski sistem

Laravel ima vgrajen prevajalski sistem, ki podpira dve obliki datotek: polja PHP in JSON. Datoteke PHP uporabljajo ugnezdene ključe, razvrščene po funkcijah (auth.failed, validation.required). Datoteke JSON kot ključ uporabljajo izvorno besedilo, kar je preprosteje, vendar ne podpira gnezdenja.

Terminal
composer create-project laravel/laravel my-app
cd my-app

# Laravel includes i18n out of the box
# No extra packages needed for basic usage
Laravelov prevajalski sistem je v imeniku lang/ (Laravel 9 in novejši) ali resources/lang/ (Laravel 8 in starejši). Ogrodje imenik zazna samodejno. Če obstajata oba, ima lang/ prednost.
2

Nastavite jezikovne različice

V config/app.php nastavite privzeto in nadomestno jezikovno različico svoje aplikacije. Nadomestna različica se uporabi, kadar v dejavni različici manjka prevajalski ključ. Določite podprte jezikovne različice svoje aplikacije in dodajte vmesno programsko opremo, ki zazna ter nastavi uporabnikovo prednostno različico.

config/app.php
// config/app.php
return [
    'locale' => 'en',            // Default locale
    'fallback_locale' => 'en',   // Fallback when key is missing
    'faker_locale' => 'en_US',

    // Available locales (for your language switcher)
    'available_locales' => ['en', 'de', 'ja', 'es', 'fr', 'pt-BR'],
];
app/Http/Middleware/SetLocale.php
// app/Http/Middleware/SetLocale.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class SetLocale
{
    public function handle(Request $request, Closure $next)
    {
        $locale = $request->segment(1); // e.g. /de/about

        if (in_array($locale, config('app.available_locales'))) {
            app()->setLocale($locale);
        }

        return $next($request);
    }
}
3

Uporabljajte prevajalske funkcije

Laravel ponuja tri načine prevajanja besedil: pomožno funkcijo __() (priporočeno), funkcijo trans() in direktivo Blade @lang. Vse tri sprejmejo prevajalski ključ in neobvezne nadomestne parametre. __() uporabljajte v kodi PHP in predlogah Blade, @lang pa v Blade, kadar Vam ni treba ubežati HTML.

lang/en/messages.php
// lang/en/messages.php
return [
    'welcome' => 'Welcome to our application',
    'greeting' => 'Hello, :name!',
    'nav' => [
        'home' => 'Home',
        'about' => 'About',
        'settings' => 'Settings',
    ],
];

// lang/de/messages.php
return [
    'welcome' => 'Willkommen in unserer Anwendung',
    'greeting' => 'Hallo, :name!',
    'nav' => [
        'home' => 'Startseite',
        'about' => 'Über uns',
        'settings' => 'Einstellungen',
    ],
];
V novi kodi dajte prednost __() pred trans(). __() deluje s prevajalskimi datotekami PHP in JSON, trans() pa samo z datotekami PHP. Direktiva @lang je v predlogah Blade enakovredna {'{ __() }'}, vendar ima nekoliko čistejšo skladnjo.
4

Obravnavajte množinske oblike

Laravel za množinske oblike uporablja skladnjo, ločeno z navpičnicami. Najpreprostejša oblika je 'apples' => 'There is one apple|There are many apples'. Za izrecne razpone uporabite 'apples' => '{0} No apples|{1} One apple|[2,*] :count apples'. Pomožna funkcija trans_choice() ali Str::plural() glede na število izbere pravilno obliko.

lang/en.json
// lang/en.json
{
    "Welcome back!": "Welcome back!",
    "You have :count new notifications": "You have :count new notifications",
    "Copyright :year :company": "Copyright :year :company"
}

// lang/de.json
{
    "Welcome back!": "Willkommen zurück!",
    "You have :count new notifications": "Sie haben :count neue Benachrichtigungen",
    "Copyright :year :company": "Copyright :year :company"
}
Laravelovo vgrajeno oblikovanje množine za večino jezikov pravilno obravnava samo preprosti pravili one/other. Pri jezikih z zapletenimi množinskimi oblikami (arabščina jih ima 6, ruščina 4, poljščina 3) morate določiti vse zahtevane množinske kategorije CLDR. Brez njih uporabniki vidijo slovnično napačna besedila.
5

Dodajte verige nadomestnih jezikovnih različic

Laravelovo vgrajeno nadomeščanje gre samo od dejavne različice do fallback_locale, brez vmesnega koraka. Uporabnik različice pt-BR pri manjkajočem ključu vidi angleščino namesto povsem ustreznega prevoda pt-PT. laravel-locale-chain to odpravi z globokim združevanjem prevodov iz nastavljive nadomestne verige ob nalaganju.

resources/views/example.blade.php
{{-- Simple translation --}}
<h1>{{ __('messages.welcome') }}</h1>

{{-- With variables --}}
<p>{{ __('messages.greeting', ['name' => $user->name]) }}</p>

{{-- Using @lang directive --}}
<h2>@lang('messages.nav.home')</h2>

{{-- JSON translations (use the string itself as key) --}}
<p>{{ __('Welcome back!') }}</p>

{{-- Pluralization --}}
{{ trans_choice('{0} No items|{1} One item|[2,*] :count items', $count) }}

{{-- Inside Blade components --}}
<x-button>{{ __('messages.nav.settings') }}</x-button>
6

Avtomatizirajte prevode

Ko je nastavitev Laravel i18n končana, prevedite svoje jezikovne datoteke z umetno inteligenco. Pomočniku umetne inteligence pokažite izvorno jezikovno datoteko ali pa v pipelineu CI/CD uporabite CLI i18n Agent. Podprte so prevajalske datoteke PHP in JSON.

config/locale-chain.php
// Install locale chain package
composer require i18n-agent/laravel-locale-chain

// config/locale-chain.php
return [
    'chains' => [
        'pt-BR' => ['pt-BR', 'pt', 'en'],
        'zh-Hant-TW' => ['zh-Hant-TW', 'zh-Hant', 'zh', 'en'],
        'es-419' => ['es-419', 'es', 'en'],
    ],
];

// In AppServiceProvider::boot()
use I18nAgent\LocaleChain\LocaleChainServiceProvider;

// The package automatically deep-merges translations
// across the chain: pt-BR -> pt -> en
Prevajajte postopoma: ko dodate nove ključe, prevedite le diff in ne ustvarjajte znova vseh datotek. Tako ohranite prevode, ki so jih pregledali ljudje, in preprečite nepotrebne spremembe.

Pogoste pasti

Trdo kodirana logika ednine in množine

Zapis $count == 1 ? 'item' : 'items' namesto uporabe trans_choice() ne deluje v jezikih, kjer je 0 ednina (francoščina), kjer obstajajo vsaj 3 množinske oblike (ruščina, poljščina) ali kjer jih je 6 (arabščina). Vedno uporabite Laravelovo množinsko skladnjo in določite vse zahtevane oblike.

Prevodi JSON nimajo nadomestne različice

Laravelov fallback_locale deluje samo pri prevajalskih datotekah PHP. Prevodi JSON kot ključ uporabljajo izvorno besedilo, zato manjkajoči prevod vrne sam ključ (angleško besedilo), namesto da bi ga poiskal v nadomestni jezikovni različici. Prevodi JSON torej nimajo pravega nadomeščanja. Težavo odpravite z laravel-locale-chain.

Mešanje PHP in JSON brez razumevanja prednosti

Kadar isti ključ obstaja v datotekah PHP in JSON, ima PHP prednost. To lahko povzroči nejasno delovanje, pri katerem posodobitev datoteke JSON nima učinka, ker jo zasenči datoteka PHP. Za vsak imenski prostor funkcije izberite eno obliko in jo dosledno uporabljajte.

Preizkusite i18n Agent zdaj

Spustite prevajalsko datoteko sem

JSON, YAML, PO, XML, CSV, Markdown, Properties

ali kliknite za izbiro

Ciljni jeziki

Registracija ni potrebnaTakojšnja ocena

Pogosta vprašanja o Laravel i18n