Делаем сайт на Laravel на нескольких языках

Локализация в Laravel

Этот урок по созданию мультиязычного сайта на Laravel 5.8. Мы будем отображать сообщения пользователю, на том языке, который он выберет.
Сделаем на примере русского (ru) и английского (en) языка. (прим. переводчика — в оригинале был французский). Laravel, по дефолту, использует английский, но не все им владеют.

Существует множество сторонних пакетов для создания сайтов на нескольких языках, но Laravel имеет встроенную поддержку локализации.

Сообщения хранятся в файлах директории resources/lang. В ней должны быть подкаталоги для каждого языка, поддерживаемого сайтом.

Что мы будем делать в уроке:

  • Создадим папки для разных языков в resources/lang: ru/en.
  • Сделаем посредника (middleware) для внедрения информации о локали в каждый запрос.
  • Установим выбранный пользователем язык в сессию laravel.
  • Отобразим сообщение на выбранном языке в шаблоне Blade.

Для примера создадим новое приложение laravel:

laravel new laravel_localization_example

Входим в папку laravel_localization_example. По умолчанию локаль установлена на английский язык (en). Вы можете найти эту настройку в файле config/app.php:

'locale' => 'en',

Вы можете изменить это значение на нужный вам язык. Установим на ‘ru’.

Создаем папки для языков

В папке resources/lang уже есть подкаталог en. В нем лежат несколько файлов: auth.php, auth.php, passwords.php, validation.php.

Все файлы возвращают данные в формате key:value.

Добавим поддержку русского языка (ru). Создадим папку ru в директории resources/lang. И создадим файл constant.php и в каталоге en/ и в каталоге ru/. Убедитесь, что ключи одинаковы для всех языков. Мы просто будем менять значения.

$locale ='ru';
App::setLocale($locale);

Получаем значение локали:

App::getLocale($locale);

Помещаем информацию о локали в сессию с помощью метода контроллера:

public function setLang($locale)
{
    App::setLocale($locale);
    session()->put('locale', $locale);
    return redirect()->back();
}

Создадим посредника (Middleware) для установки локали в запросе

Создаем нового посредника:

php artisan make:middleware Localization

Вышеприведенная команда создает файл Localization.php папке app/Http/Middleware.

Сделаем новый метод в файле app/Http/Middleware/Localization.php для установки языка.
Проверям, установлен ли язык в сессии, если установлен — назначаем.

<?php
 
// Localization.php
 
namespace App\Http\Middleware;
 
use Closure;
use App;
 
class Localization
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (session()->has('locale')) {
            App::setLocale(session()->get('locale'));
        }
        return $next($request);
    }
}

 

Регистрируем посредника

После создания посредника, его нужно зарегистрировать в файле app/Http/Kernel.php, добавив одну строку:

/**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
    .....
    ....
            \App\Http\Middleware\Localization::class,
 
        ],

 

Показываем сообщения

Создаем для проверки сообщений на разных языках новый шаблон /resources/views/hello.blade.php:

{{ trans('constant.welcome')}}

Здесь я использую функцию trans(), принимающая в качестве аргумента комбинацию имени файла и имени ключа — filename.array_key_name.

Готово! Теперь шаблоны выводят сообщения в зависимости от локали, установленной у пользователя.

 

Автор: Parvez
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.