Skip to main content

Laravel i18n: kompletan vodič za internacionalizaciju i lokalizaciju

Od prve datoteke lokala do produkcije: podesite Laravel sistem za prevođenje, obradite množinu, ispravite grešku JSON rezerve i dodajte pametne lance rezervnih lokala za regionalne varijante.

1

Razumite Laravel sistem za prevođenje

Laravel sadrži ugrađeni sistem za prevođenje koji podržava dva formata datoteka: PHP nizove i JSON. PHP datoteke koriste ugnežđene ključeve organizovane po funkcionalnosti (auth.failed, validation.required). JSON datoteke koriste izvorni tekst kao ključ, što je jednostavnije, ali ne podržava ugnežđivanje.

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
Laravel sistem za prevođenje nalazi se u direktorijumu lang/ (Laravel 9+) ili resources/lang/ (Laravel 8 i stariji). Radni okvir automatski otkriva direktorijum. Ako oba postoje, lang/ ima prednost.
2

Podesite postavke lokala

Postavite podrazumevani i rezervni lokal aplikacije u config/app.php. Rezervni lokal se koristi kada ključ prevoda nedostaje u aktivnom lokalu. Podesite podržane lokale aplikacije i dodajte posrednički softver koji otkriva i postavlja željeni lokal korisnika.

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

Koristite funkcije za prevođenje

Laravel pruža tri načina za prevođenje tekstova: pomoćnu funkciju __() (preporučeno), funkciju trans() i Blade direktivu @lang. Sva tri prihvataju ključ prevoda i neobavezne parametre zamene. Koristite __() u PHP kodu i Blade šablonima, a @lang u Blade sistemu kada HTML ne treba da se kodira.

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',
    ],
];
U novom kodu izaberite __() umesto trans(). __() radi i sa PHP i sa JSON datotekama prevoda, dok trans() radi samo sa PHP datotekama. Direktiva @lang jednaka je izrazu {'{ __() }'} u Blade šablonima, ali ima malo čistiju sintaksu.
4

Obradite množinu

Laravel koristi sintaksu oblika množine razdvojenih vertikalnom crtom. Najjednostavniji oblik je 'apples' => 'There is one apple|There are many apples'. Za izričite opsege koristite 'apples' => '{0} No apples|{1} One apple|[2,*] :count apples'. Pomoćna funkcija trans_choice() ili Str::plural() bira ispravan oblik na osnovu broja.

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"
}
Ugrađena Laravel množina ispravno obrađuje samo jednostavna pravila one/other za većinu jezika. Za jezike sa složenim oblicima množine (arapski ima 6, ruski 4, poljski 3) morate da definišete sve potrebne CLDR kategorije množine. Bez njih korisnici vide gramatički neispravan tekst.
5

Dodajte lance rezervnih lokala

Ugrađena Laravel rezerva prelazi samo sa aktivnog lokala na fallback_locale — nema međukoraka. Korisnik lokala pt-BR sa nedostajućim ključem vidi engleski umesto sasvim dobrog prevoda za pt-PT. laravel-locale-chain to ispravlja dubinskim spajanjem prevoda iz podesivog lanca rezerve tokom učitavanja.

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

Automatizujte prevode

Kada podesite Laravel i18n sistem, prevedite datoteke lokala pomoću AI tehnologije. Usmerite AI pomoćnika na datoteku izvornog lokala ili koristite i18n Agent CLI u CI/CD pipeline sistemu. Podržane su i PHP i JSON datoteke prevoda.

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
Prevodite postepeno — kada dodate nove ključeve, prevedite samo razliku umesto ponovnog generisanja svih datoteka. Time se čuvaju prevodi koje su ljudi pregledali i izbegavaju nepotrebne izmene.

Uobičajene zamke

Direktno upisana logika jednine i množine

Pisanje $count == 1 ? 'item' : 'items' umesto upotrebe trans_choice() ne radi za jezike u kojima je 0 jednina (francuski), koji imaju više od 3 oblika množine (ruski, poljski) ili 6 oblika (arapski). Uvek koristite Laravel sintaksu množine i definišite sve potrebne oblike.

JSON prevodi ne prelaze na rezervu

Laravel fallback_locale radi samo za PHP datoteke prevoda. JSON prevodi koriste izvorni tekst kao ključ, pa nedostajući prevod vraća sam ključ (engleski tekst) umesto pretrage u rezervnom lokalu. To znači da JSON prevodi nemaju pravu rezervu lokala. Koristite laravel-locale-chain da to ispravite.

Mešanje PHP i JSON formata bez razumevanja prioriteta

Kada isti ključ postoji i u PHP i u JSON datoteci, PHP ima prednost. To može da izazove zbunjujuće ponašanje pri kojem ažuriranje JSON datoteke nema efekta jer je PHP datoteka zaklanja. Izaberite jedan format za svaki imenski prostor funkcionalnosti i držite ga se.

Isprobajte i18n Agent sada

Pustite datoteku za prevođenje ovde

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

ili kliknite za izbor

Ciljni jezici

Registracija nije potrebnaTrenutna procena

Česta pitanja o Laravel i18n sistemu