В 17-ом уроке мы разберем создания многоязычных приложений, точнее локализацию в Laravel. Мы научимся работать с языковыми файлами, переводить текст в Blade-шаблонах, динамически переключать язык и настраивать перевод сообщений валидации. Всё это будет с примерами кода и практическими задачами.
Работа с языковыми файлами
Laravel хранит языковые файлы в директории resources/lang
. По умолчанию там находится папка en
(английский), но вы можете добавить любые другие языки, например ru
или es
.
Создание языковых файлов
- Создайте папку для языка. Например, для русского:
mkdir resources/lang/ru
- Добавьте файлы переводов. Например,
resources/lang/ru/messages.php
:return [ 'welcome' => 'Добро пожаловать!', 'greeting' => 'Привет, :name!', ];
Здесь
:name
это плейсхолдер, который будет заменяться динамически. - Структурируйте файлы. Вы можете группировать переводы по категориям:
// resources/lang/ru/auth.php return [ 'login' => 'Войти', 'logout' => 'Выйти', ];
Использование переводов
Доступ к переводам осуществляется через хелпер __()
или директиву Blade @lang
:
echo __('messages.welcome'); // Добро пожаловать! echo __('auth.login'); // Войти
Для длинных текстов используйте JSON-файлы. Например, resources/lang/ru.json
:
{ "Welcome to our site!": "Добро пожаловать на наш сайт!" }
Использование:
echo __('Welcome to our site!');
Перевод текста в Blade (@lang)
В Blade-шаблонах удобно использовать директиву @lang
или короткий синтаксис {{ __() }}
.
Примеры
<!-- Простой перевод --> <h1>@lang('messages.welcome')</h1> <!-- Перевод с параметрами --> <p>{{ __('greeting', ['name' => 'Максим']) }}</p> <!-- Использование JSON-переводов --> <div>@lang('Welcome to our site!')</div>
Множественные формы
Для работы с множественным числом используйте функцию trans_choice()
:
// resources/lang/ru/messages.php return [ 'apples' => '{0} Нет яблок|{1} :count яблоко|[2,4] :count яблока|[5,*] :count яблок', ];
В Blade:
{{ trans_choice('messages.apples', 5, ['count' => 5]) }} // 5 яблок
Динамическое переключение языка
Чтобы пользователи могли менять язык, нужно:
- Создать маршрут для смены языка.
- Сохранить выбранный язык в сессии или куках.
- Применить язык ко всем последующим запросам.
Шаг 1: Маршрут и контроллер
routes/web.php:
Route::get('locale/{lang}', [LocaleController::class, 'setLocale'])->name('locale.set');
app/Http/Controllers/LocaleController.php:
public function setLocale($lang) { if (!in_array($lang, ['en', 'ru', 'es'])) { abort(400); } session()->put('locale', $lang); return redirect()->back(); }
Шаг 2: Middleware для установки языка
Создайте middleware:
php artisan make:middleware SetLocale
app/Http/Middleware/SetLocale.php:
public function handle(Request $request, Closure $next) { if (session()->has('locale')) { App::setLocale(session('locale')); } return $next($request); }
Зарегистрируйте его в app/Http/Kernel.php
(в массив web
):
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\SetLocale::class, // ... ], ];
Шаг 3: Добавьте переключатель языка в Blade
<a href="{{ route('locale.set', 'en') }}">English</a> <a href="{{ route('locale.set', 'ru') }}">Русский</a>
Валидация с переводом ошибок
Laravel автоматически переводит сообщения валидации. Переводы хранятся в resources/lang/xx/validation.php
.
Кастомизация сообщений
- Создайте файл переводов для валидации:
// resources/lang/ru/validation.php return [ 'required' => 'Поле :attribute обязательно для заполнения.', 'email' => 'Поле :attribute должно быть корректным email-адресом.', ];
- Используйте в контроллере:
$request->validate([ 'email' => 'required|email', 'name' => 'required|min:3', ]);
При ошибке пользователь увидит:
Поле email обязательно для заполнения.
Кастомизация атрибутов
Чтобы заменить :attribute
на человекочитаемые названия, добавьте массив attributes
:
// resources/lang/ru/validation.php return [ 'attributes' => [ 'email' => 'Email', 'name' => 'Имя', ], ];
Теперь сообщение будет:
Поле Email обязательно для заполнения.
Практические задачи
- Создайте языковые файлы для русского и английского, добавив переводы для главной страницы.
- Реализуйте переключатель языка в шапке сайта.
- Переведите сообщения валидации для формы регистрации.
- Добавьте плейсхолдеры в переводы (например, «Привет, :name»).
- Настройте Middleware, чтобы язык сохранялся между сессиями.
Примеры кода
Конфигурация Middleware
// SetLocale.php public function handle(Request $request, Closure $next) { $locale = $request->cookie('locale', config('app.locale')); App::setLocale($locale); return $next($request); }
Перевод с параметрами
// resources/lang/ru/messages.php 'greeting' => 'Привет, :name! Твой баланс: :balance руб.', // Blade {{ __('messages.greeting', ['name' => 'Максим', 'balance' => 1000]) }}
Итоги 17-го урока
Теперь вы умеете создавать многоязычные приложения в Laravel. Это важный шаг для проектов, ориентированных на международную аудиторию. Не останавливайтесь, закрепляйте знания на практике.
Готовы углубиться в Laravel? Полный курс по Laravel для начинающих