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() и Blade директиву @lang. Сва три прихватају кључ превода и необавезне параметре замене. Користите __() у 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' => 'There is one apple|There are many apples'. За изричите опсеге користите 'apples' => '{0} No apples|{1} One apple|[2,*] :count apples'. Помоћна функција 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

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

Када подесите Laravel i18n систем, преведите датотеке локала помоћу AI технологије. Усмерите AI помоћника на датотеку изворног локала или користите i18n Agent CLI у CI/CD pipeline систему. Подржане су и 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 преводи не прелазе на резерву

Laravel fallback_locale ради само за PHP датотеке превода. JSON преводи користе изворни текст као кључ, па недостајући превод враћа сам кључ (енглески текст) уместо претраге у резервном локалу. То значи да JSON преводи немају праву резерву локала. Користите laravel-locale-chain да то исправите.

Мешање PHP и JSON формата без разумевања приоритета

Када исти кључ постоји и у PHP и у JSON датотеци, PHP има предност. То може да изазове збуњујуће понашање при којем ажурирање JSON датотеке нема ефекта јер је PHP датотека заклања. Изаберите један формат за сваки именски простор функционалности и држите га се.

Испробајте i18n Agent сада

Пустите датотеку за превођење овде

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

или кликните за избор

Циљни језици

Регистрација није потребнаТренутна процена

Честа питања о Laravel i18n систему