Skip to main content

Laravel i18n: Komplet guide til internationalisering og lokalisering

Fra den første landestandardfil til produktion: Konfigurer Laravels oversættelsessystem, håndter flertalsformer, ret JSON-reservefejlen og tilføj intelligente reserverækkefølger for regionale landestandardvarianter.

1

Forstå Laravels oversættelsessystem

Laravel leveres med et indbygget oversættelsessystem, der understøtter to filformater: PHP-arrays og JSON. PHP-filer bruger indlejrede nøgler organiseret efter funktion (auth.failed, validation.required). JSON-filer bruger kildestrengen som nøgle, hvilket er enklere, men ikke understøtter indlejring.

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
Laravels oversættelsessystem findes i mappen lang/ (Laravel 9+) eller resources/lang/ (Laravel 8 og tidligere). Frameworket registrerer automatisk mappen. Hvis begge findes, har lang/ forrang.
2

Konfigurer landestandardindstillinger

Angiv din applikations standardlandestandard og reservelandestandard i config/app.php. Reservelandestandarden bruges, når en oversættelsesnøgle mangler i den aktive landestandard. Konfigurer de landestandarder, som din applikation understøtter og tilføj middleware for at registrere og angive brugerens foretrukne landestandard.

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

Brug oversættelsesfunktioner

Laravel giver dig tre måder at oversætte strenge på: hjælpefunktionen __() (anbefalet), funktionen trans() og Blade-direktivet @lang. Alle tre accepterer oversættelsesnøglen og valgfrie erstatningsparametre. Brug __() i PHP-kode og Blade-skabeloner og @lang i Blade, når du ikke behøver at escape 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',
    ],
];
Foretræk __() frem for trans() i ny kode. __() fungerer med både PHP- og JSON-oversættelsesfiler, mens trans() kun fungerer med PHP-filer. Direktivet @lang svarer til {'{ __() }'} i Blade-skabeloner, men har en lidt renere syntaks.
4

Håndter flertalsformer

Laravel bruger en syntaks med lodrette streger til flertalsformer. Den enkleste form er 'apples' => 'Der er ét æble|Der er mange æbler'. Brug 'apples' => '{0} Ingen æbler|{1} Ét æble|[2,*] :count æbler' til eksplicitte intervaller. Hjælpefunktionen trans_choice() eller Str::plural() vælger den korrekte form ud fra 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 indbyggede flertalshåndtering håndterer kun enkle regler med ental/andre former korrekt for de fleste sprog. Til sprog med komplekse flertalsformer (arabisk har 6, russisk har 4 og polsk har 3) skal du definere alle nødvendige CLDR-flertalskategorier. Uden dem ser brugerne grammatisk ukorrekt tekst.
5

Tilføj reserverækkefølger for landestandarder

Laravels indbyggede reserve går kun fra den aktive landestandard til fallback_locale – der er intet mellemtrin. En pt-BR-bruger med en manglende nøgle ser engelsk i stedet for den udmærkede pt-PT-oversættelse. laravel-locale-chain løser dette ved at flette oversættelser rekursivt fra en konfigurerbar reserverækkefølge ved indlæsning.

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 oversættelser

Når din Laravel i18n-opsætning er færdig, kan du oversætte dine landestandardfiler med AI. Peg din AI-assistent mod kildelandestandardfilen eller brug i18n Agent CLI i din CI/CD-pipeline. Både PHP- og JSON-oversættelsesfiler understø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
Oversæt trinvist – når du tilføjer nye nøgler, skal du kun oversætte ændringerne frem for at generere alle filer igen. Dermed bevares oversættelser, som mennesker har gennemgået, mens unødvendige ændringer undgås.

Almindelige faldgruber

Hardkodet entals-/flertalslogik

Hvis du skriver $count == 1 ? 'item' : 'items' i stedet for at bruge trans_choice(), virker det ikke på sprog, hvor 0 er ental (fransk), hvor der er 3+ flertalsformer (russisk og polsk) eller hvor der er 6 former (arabisk). Brug altid Laravels flertalssyntaks og definer alle nødvendige former.

JSON-oversættelser bruger ikke reservelandestandarden

Laravels fallback_locale fungerer kun med PHP-oversættelsesfiler. JSON-oversættelser bruger kildestrengen som nøgle, så en manglende oversættelse returnerer selve nøglen (den engelske tekst) i stedet for at søge i reservelandestandarden. Det betyder, at JSON-oversættelser ikke har en reel landestandardreserve. Brug laravel-locale-chain til at løse problemet.

Blanding af PHP og JSON uden at forstå forrang

Når den samme nøgle findes i både PHP- og JSON-filer, har PHP forrang. Det kan skabe forvirrende adfærd, hvor en opdatering af JSON-filen ikke har nogen effekt, fordi PHP-filen overskygger den. Vælg ét format pr. funktionsnavnerum og hold dig til det.

Prøv i18n Agent nu

Slip din oversættelsesfil her

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

eller klik for at vælge en fil

Målsprog

Kræver ingen tilmeldingEstimat med det samme

Ofte stillede spørgsmål om Laravel i18n