Урок 17: Локализация в Laravel

В 17-ом уроке мы разберем создания многоязычных приложений, точнее локализацию в Laravel. Мы научимся работать с языковыми файлами, переводить текст в Blade-шаблонах, динамически переключать язык и настраивать перевод сообщений валидации. Всё это будет с примерами кода и практическими задачами.

Работа с языковыми файлами

Laravel хранит языковые файлы в директории resources/lang. По умолчанию там находится папка en (английский), но вы можете добавить любые другие языки, например ru или es.

Создание языковых файлов

  1. Создайте папку для языка. Например, для русского:
    bash
    mkdir resources/lang/ru
  2. Добавьте файлы переводов. Например, resources/lang/ru/messages.php:
    php
    return [
        'welcome' => 'Добро пожаловать!',
        'greeting' => 'Привет, :name!',
    ];

    Здесь :nameэто плейсхолдер, который будет заменяться динамически.

  3. Структурируйте файлы. Вы можете группировать переводы по категориям:
    php
    // resources/lang/ru/auth.php
    return [
        'login' => 'Войти',
        'logout' => 'Выйти',
    ];

Использование переводов

Доступ к переводам осуществляется через хелпер __() или директиву Blade @lang:

php
echo __('messages.welcome'); // Добро пожаловать!
echo __('auth.login');       // Войти

Для длинных текстов используйте JSON-файлы. Например, resources/lang/ru.json:

json
{
    "Welcome to our site!": "Добро пожаловать на наш сайт!"
}

Использование:

php
echo __('Welcome to our site!');

Перевод текста в Blade (@lang)

В Blade-шаблонах удобно использовать директиву @lang или короткий синтаксис {{ __() }}.

Примеры

blade
<!-- Простой перевод -->
<h1>@lang('messages.welcome')</h1>

<!-- Перевод с параметрами -->
<p>{{ __('greeting', ['name' => 'Максим']) }}</p>

<!-- Использование JSON-переводов -->
<div>@lang('Welcome to our site!')</div>

Множественные формы

Для работы с множественным числом используйте функцию trans_choice():

php
// resources/lang/ru/messages.php
return [
    'apples' => '{0} Нет яблок|{1} :count яблоко|[2,4] :count яблока|[5,*] :count яблок',
];

В Blade:

blade
{{ trans_choice('messages.apples', 5, ['count' => 5]) }} // 5 яблок

Динамическое переключение языка

Чтобы пользователи могли менять язык, нужно:

  1. Создать маршрут для смены языка.
  2. Сохранить выбранный язык в сессии или куках.
  3. Применить язык ко всем последующим запросам.

Шаг 1: Маршрут и контроллер

routes/web.php:

php
Route::get('locale/{lang}', [LocaleController::class, 'setLocale'])->name('locale.set');

app/Http/Controllers/LocaleController.php:

php
public function setLocale($lang)
{
    if (!in_array($lang, ['en', 'ru', 'es'])) {
        abort(400);
    }

    session()->put('locale', $lang);
    return redirect()->back();
}

Шаг 2: Middleware для установки языка

Создайте middleware:

bash
php artisan make:middleware SetLocale

app/Http/Middleware/SetLocale.php:

php
public function handle(Request $request, Closure $next)
{
    if (session()->has('locale')) {
        App::setLocale(session('locale'));
    }
    return $next($request);
}

Зарегистрируйте его в app/Http/Kernel.php (в массив web):

php
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\SetLocale::class,
        // ...
    ],
];

Шаг 3: Добавьте переключатель языка в Blade

blade
<a href="{{ route('locale.set', 'en') }}">English</a>
<a href="{{ route('locale.set', 'ru') }}">Русский</a>

Валидация с переводом ошибок

Laravel автоматически переводит сообщения валидации. Переводы хранятся в resources/lang/xx/validation.php.

Кастомизация сообщений

  1. Создайте файл переводов для валидации:
    php
    // resources/lang/ru/validation.php
    return [
        'required' => 'Поле :attribute обязательно для заполнения.',
        'email' => 'Поле :attribute должно быть корректным email-адресом.',
    ];
  2. Используйте в контроллере:
    php
    $request->validate([
        'email' => 'required|email',
        'name' => 'required|min:3',
    ]);

    При ошибке пользователь увидит:

    Поле email обязательно для заполнения.

Кастомизация атрибутов

Чтобы заменить :attribute на человекочитаемые названия, добавьте массив attributes:

php
// resources/lang/ru/validation.php
return [
    'attributes' => [
        'email' => 'Email',
        'name' => 'Имя',
    ],
];

Теперь сообщение будет:

Поле Email обязательно для заполнения.

Практические задачи

  1. Создайте языковые файлы для русского и английского, добавив переводы для главной страницы.
  2. Реализуйте переключатель языка в шапке сайта.
  3. Переведите сообщения валидации для формы регистрации.
  4. Добавьте плейсхолдеры в переводы (например, «Привет, :name»).
  5. Настройте Middleware, чтобы язык сохранялся между сессиями.

Примеры кода

Конфигурация Middleware

php
// SetLocale.php
public function handle(Request $request, Closure $next)
{
    $locale = $request->cookie('locale', config('app.locale'));
    App::setLocale($locale);
    return $next($request);
}

Перевод с параметрами

php
// resources/lang/ru/messages.php
'greeting' => 'Привет, :name! Твой баланс: :balance руб.',

// Blade
{{ __('messages.greeting', ['name' => 'Максим', 'balance' => 1000]) }}

Итоги 17-го урока

Теперь вы умеете создавать многоязычные приложения в Laravel. Это важный шаг для проектов, ориентированных на международную аудиторию. Не останавливайтесь, закрепляйте знания на практике.

Готовы углубиться в Laravel? Полный курс по Laravel для начинающих