Skip to main content

Laravel i18n: komplett guide till internationalisering och lokalisering

Från den första språkfilen till produktion: konfigurera Laravels översättningssystem, hantera pluralformer, åtgärda JSON-felet med reservspråk och lägg till smarta reservspråkskedjor för regionala varianter.

1

Förstå Laravels översättningssystem

Laravel har ett inbyggt översättningssystem som stöder två filformat: PHP-arrayer och JSON. PHP-filer använder nästlade nycklar som ordnas efter funktion (auth.failed, validation.required). JSON-filer använder källsträngen som nyckel, vilket är enklare, men saknar stöd för nästling.

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 översättningssystem finns i katalogen lang/ (Laravel 9+) eller resources/lang/ (Laravel 8 och tidigare). Ramverket identifierar katalogen automatiskt. Om båda finns prioriteras lang/.
2

Konfigurera språkinställningar

Ange applikationens standardspråk och reservspråk i config/app.php. Reservspråket används när en översättningsnyckel saknas för det aktiva språket. Konfigurera vilka språk applikationen stöder och lägg till mellanprogram som identifierar och anger användarens föredragna språk.

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

Använd översättningsfunktioner

Laravel erbjuder tre sätt att översätta strängar: hjälpfunktionen __() (rekommenderas), funktionen trans() och Blade-direktivet @lang. Alla tre tar emot översättningsnyckeln och valfria ersättningsparametrar. Använd __() i PHP-kod och Blade-mallar och @lang i Blade när HTML-utdata inte behöver HTML-kodas.

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',
    ],
];
Föredra __() framför trans() i ny kod. __() fungerar med både PHP- och JSON-översättningsfiler, medan trans() bara fungerar med PHP-filer. Direktivet @lang motsvarar {'{ __() }'} i Blade-mallar, men har något renare syntax.
4

Hantera pluralformer

Laravel använder lodstrecksavgränsad syntax för pluralformer. Den enklaste formen är 'apples' => 'There is one apple|There are many apples'. För uttryckliga intervall använder du 'apples' => '{0} No apples|{1} One apple|[2,*] :count apples'. Hjälpfunktionen trans_choice() eller Str::plural() väljer rätt form utifrån antalet.

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 inbyggda pluralhantering hanterar bara enkla one/other-regler korrekt för de flesta språk. För språk med komplexa pluralformer (arabiska har 6, ryska har 4 och polska har 3) måste du definiera alla nödvändiga CLDR-pluralkategorier. Annars visas grammatiskt felaktig text för användarna.
5

Lägg till reservspråkskedjor

Laravels inbyggda reservfunktion går bara från det aktiva språket till fallback_locale. Det finns inget mellansteg. En pt-BR-användare som saknar en nyckel ser därför engelska i stället för den fullt användbara pt-PT-översättningen. laravel-locale-chain åtgärdar detta genom att djupsammanfoga översättningar från en konfigurerbar reservspråkskedja vid inlä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

Automatisera översättningar

När Laravel i18n är konfigurerat kan du översätta språkfilerna med AI. Ge källspråkfilen till din AI-assistent eller använd i18n Agent CLI i CI/CD-processen. Både PHP- och JSON-översättningsfiler stöds.

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
Översätt stegvis. När du lägger till nya nycklar översätter du bara ändringarna i stället för att generera om alla filer. Då bevaras översättningar som har granskats av människor och onödiga ändringar undviks.

Vanliga fallgropar

Hårdkodad logik för singular och plural

Att skriva $count == 1 ? 'item' : 'items' i stället för att använda trans_choice() fungerar inte för språk där 0 är singular (franska), där det finns minst 3 pluralformer (ryska och polska) eller där det finns 6 former (arabiska). Använd alltid Laravels pluralsyntax och definiera alla nödvändiga former.

JSON-översättningar använder inte reservspråket

Laravels fallback_locale fungerar bara för PHP-översättningsfiler. JSON-översättningar använder källsträngen som nyckel, så en saknad översättning returnerar själva nyckeln (den engelska texten) i stället för att söka i reservspråket. Det innebär att JSON-översättningar inte har något riktigt reservspråk. Åtgärda detta med laravel-locale-chain.

PHP och JSON blandas utan förståelse för prioriteringen

När samma nyckel finns i både PHP- och JSON-filer prioriteras PHP. Det kan leda till förvirrande beteende där en uppdatering av JSON-filen inte får någon effekt eftersom PHP-filen åsidosätter den. Välj ett format per funktionsnamnrymd och använd det konsekvent.

Prova i18n Agent nu

Släpp din översättningsfil här

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

eller klicka för att välja en fil

Målspråk

Ingen registrering krävsPrisuppskattning direkt

Vanliga frågor om Laravel i18n