Skip to main content

Laravel i18n: пълно ръководство за интернационализация и локализация

От първия файл за локал до внедряването в реална среда: настройте системата за превод на Laravel, обработвайте множествено число, отстранете грешката при резервното търсене в JSON и добавете интелигентни резервни вериги за регионални варианти.

1

Разберете системата за превод на Laravel

Laravel включва вградена система за превод, която поддържа два файлови формата: PHP масиви и JSON. PHP файловете използват вложени ключове, организирани по функционалности (auth.failed, validation.required). JSON файловете използват изходния низ като ключ, което е по-просто, но не поддържа влагане.

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 се намира в директорията lang/ (Laravel 9+) или resources/lang/ (Laravel 8 и по-стари версии). Фреймуъркът открива директорията автоматично. Ако съществуват и двете, lang/ е с предимство.
2

Настройте локалите

Задайте локала по подразбиране и резервния локал на приложението си в config/app.php. Резервният локал се използва, когато в активния локал липсва ключ за превод. Настройте поддържаните локали на приложението си и добавете междинен софтуер, който да разпознава и задава предпочитания локал на потребителя.

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

Използвайте функциите за превод

Laravel предоставя три начина за превод на низове: помощната функция __() (препоръчително), функцията trans() и директивата @lang на Blade. И трите приемат ключа за превод и незадължителни параметри за заместване. Използвайте __() в PHP код и шаблони Blade, а @lang — в Blade, когато не е необходимо да екранирате 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',
    ],
];
Предпочитайте __() пред trans() в новия код. __() работи както с PHP, така и с JSON файлове за превод, докато trans() работи само с PHP файлове. Директивата @lang е еквивалентна на {'{ __() }'} в шаблоните Blade, но има малко по-изчистен синтаксис.
4

Обработете множественото число

Laravel използва синтаксис с форми за множествено число, разделени с вертикална черта. Най-простият вариант е 'apples' => 'Има една ябълка|Има много ябълки'. За изрични диапазони използвайте 'apples' => '{0} Няма ябълки|{1} Една ябълка|[2,*] :count ябълки'. Помощната функция trans_choice() или Str::plural() избира правилната форма според броя.

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"
}
Вградената поддръжка на Laravel за множествено число обработва правилно само простите правила one/other за повечето езици. За езици със сложни форми за множествено число (арабският има 6, руският — 4, а полският — 3) трябва да зададете всички необходими категории за множествено число от CLDR. Без тях потребителите ще виждат граматически неправилен текст.
5

Добавете вериги от резервни езикови настройки

Вграденият резервен механизъм на Laravel преминава само от активната езикова настройка към fallback_locale — няма междинна стъпка. При липсващ ключ потребител с pt-BR вижда английския текст вместо напълно подходящия превод на pt-PT. laravel-locale-chain решава проблема, като при зареждането рекурсивно обединява преводите от конфигурируема резервна верига.

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

Автоматизирайте преводите

След като завършите настройката на i18n в Laravel, преведете файловете за съответните езикови настройки с помощта на ИИ. Посочете на своя асистент с ИИ изходния езиков файл или използвайте i18n Agent CLI във Вашия CI/CD пайплайн. Поддържат се файлове за превод както във формат PHP, така и във формат 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
Превеждайте поетапно — когато добавяте нови ключове, превеждайте само разликите, вместо да създавате отново всички файлове. Така се запазват прегледаните от човек преводи и се избягват ненужни промени.

Често срещани затруднения

Твърдо зададена логика за единствено и множествено число

Използването на $count == 1 ? 'item' : 'items' вместо trans_choice() води до грешки при езици, в които 0 изисква единствено число (френски), има 3+ форми за множествено число (руски, полски) или има 6 форми (арабски). Винаги използвайте синтаксиса на Laravel за множествено число и задавайте всички необходими форми.

При JSON преводите не се използва резервен език

fallback_locale на Laravel работи само за PHP файлове за превод. При JSON преводите изходният текст служи като ключ, затова при липсващ превод се връща самият ключ (английският текст), вместо да се търси в резервната езикова настройка. Това означава, че JSON преводите нямат истински резервен език. Използвайте laravel-locale-chain, за да решите проблема.

Смесване на PHP и JSON без разбиране на приоритета

Когато един и същ ключ съществува едновременно в PHP и JSON файл, PHP има предимство. Това може да доведе до объркващо поведение, при което актуализирането на JSON файла няма ефект, защото PHP файлът го засенчва. Изберете един формат за всяко пространство от имена на функционалност и го използвайте последователно.

Изпробвайте i18n Agent сега

Пуснете тук Вашия файл за превод

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

или натиснете, за да изберете файл

Целеви езици

Не се изисква регистрацияНезабавна оценка

Често задавани въпроси за i18n в Laravel