Skip to main content

Laravel i18n: Komplett veiledning i internasjonalisering og lokalisering

Fra den første språkfilen til produksjon: Konfigurer oversettelsessystemet i Laravel, håndter flertallsformer, rett JSON-reservefeilen og legg til smarte reservekjeder for regionale varianter.

1

Forstå oversettelsessystemet i Laravel

Laravel leveres med et innebygd oversettelsessystem som støtter to filformater: PHP-tabeller og JSON. PHP-filer bruker nøstede nøkler organisert etter funksjon (auth.failed, validation.required). JSON-filer bruker kildestrengen som nøkkel. Det er enklere, men støtter ikke nøsting.

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
Oversettelsessystemet i Laravel ligger i mappen lang/ (Laravel 9+) eller resources/lang/ (Laravel 8 og tidligere). Rammeverket oppdager mappen automatisk. Hvis begge finnes, har lang/ forrang.
2

Konfigurer språkinnstillinger

Angi programmets standardspråk og reservespråk i config/app.php. Reservespråket brukes når en oversettelsesnøkkel mangler for det aktive språket. Konfigurer språkene programmet støtter, og legg til mellomvare som oppdager og angir språket brukeren foretrekker.

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

Bruk oversettelsesfunksjoner

Laravel tilbyr tre måter å oversette strenger på: hjelpefunksjonen __() (anbefalt), funksjonen trans() og Blade-direktivet @lang. Alle tre tar imot oversettelsesnøkkelen og valgfrie erstatningsparametere. Bruk __() i PHP-kode og Blade-maler, og @lang i Blade når du ikke trenger å maskere 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',
    ],
];
Foretrekk __() fremfor trans() i ny kode. __() fungerer med både PHP- og JSON-oversettelsesfiler, mens trans() bare fungerer med PHP-filer. Direktivet @lang tilsvarer {'{ __() }'} i Blade-maler, men har en litt ryddigere syntaks.
4

Håndter flertallsformer

Laravel bruker en syntaks med loddrette streker mellom flertallsformene. Den enkleste formen er 'apples' => 'There is one apple|There are many apples'. For eksplisitte intervaller bruker du 'apples' => '{0} No apples|{1} One apple|[2,*] :count apples'. Hjelpefunksjonen trans_choice() eller Str::plural() velger riktig form basert på antallet.

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"
}
Laravels innebygde flertallshåndtering behandler bare enkle regler for entall/annet riktig for de fleste språk. For språk med komplekse flertallsformer (arabisk har 6, russisk har 4 og polsk har 3) må du definere alle nødvendige CLDR-flertallskategorier. Uten dem ser brukerne grammatisk feil tekst.
5

Legg til reservekjeder for språk

Laravels innebygde reservefunksjon går bare fra det aktive språket til fallback_locale – det finnes ikke noe mellomledd. En pt-BR-bruker ser engelsk når en nøkkel mangler, i stedet for den fullgode pt-PT-oversettelsen. laravel-locale-chain løser dette ved å slå sammen oversettelser rekursivt fra en konfigurerbar reservekjede ved innlasting.

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

Automatiser oversettelser

Når Laravel i18n-oppsettet er ferdig, kan du oversette språkfilene med AI. Pek AI-assistenten mot filen for kildespråket, eller bruk kommandolinjeverktøyet i18n Agent i CI/CD-forløpet. Både PHP- og JSON-oversettelsesfiler støttes.

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
Oversett trinnvis – når du legger til nye nøkler, oversetter du bare endringene i stedet for å generere alle filene på nytt. Da bevarer du oversettelser som mennesker har gjennomgått, og unngår unødvendige endringer.

Vanlige fallgruver

Hardkodet entalls- og flertallslogikk

Hvis du skriver $count == 1 ? 'item' : 'items' i stedet for å bruke trans_choice(), fungerer ikke logikken for språk der 0 er entall (fransk), der det finnes minst 3 flertallsformer (russisk og polsk), eller der det finnes 6 former (arabisk). Bruk alltid Laravels flertallssyntaks, og definer alle nødvendige former.

JSON-oversettelser bruker ikke reservespråket

Laravels fallback_locale fungerer bare for PHP-oversettelsesfiler. JSON-oversettelser bruker kildestrengen som nøkkel, så en manglende oversettelse returnerer selve nøkkelen (den engelske teksten) i stedet for å lete i reservespråket. Det betyr at JSON-oversettelser ikke har noen reell språkreserve. Bruk laravel-locale-chain for å løse dette.

Blanding av PHP og JSON uten å forstå forrangen

Når samme nøkkel finnes i både PHP- og JSON-filer, har PHP forrang. Det kan føre til forvirrende oppførsel der en oppdatering av JSON-filen ikke har noen virkning fordi PHP-filen overskygger den. Velg ett format for hvert funksjonsnavnerom, og hold deg til det.

Prøv i18n Agent nå

Slipp oversettelsesfilen din her

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

eller klikk for å bla gjennom

Målspråk

Ingen registrering krevesUmiddelbart estimat

Vanlige spørsmål om Laravel i18n