Laravel: локализация интерфейса

Laravel: локализация интерфейса

Рано или поздно скорее всего столкнётесь с разработкой мультиязычных сайтов. Расмотрим вариант попроще - как в Laravel реализовать перевод интерфейса и переключение языков.

Возможны два варианта мультиязычности:

  • полная мультиязычность, т.е. перевод всего контента. Это подразумевает наличие дополнительных таблиц и моделей для текстовой информации (такой вариант реализован на данном сайте)
  • мультиязычный интерфейс. В этом случае переводятся только общие элементы интрефейса (например, меню, сообщения и т.д.)

В данной статье разберём основу второго варианта (сео-фишки и добавление локали к роутам затрагивать не буду).

Версия фреймворка: Laravel: 5.8

Нам необходим роут для переключения языков. При этом всё, что нужно - записать значение локали в сессию, потому даже не будем создавать контроллер, достаточно обычного колбека. Открываем routes/web.php и добавляем:

Route::get('locale/{locale}', function ($locale) {
    Session::put('locale', $locale);

    return redirect()->back();
})->name('locale');

 

Также понадобится какой-нибудь шаблон, чтобы добавить переключатель. Запустим в консоли:

php artisan make:auth

 

Откроем созданный предыдущей командой resources/views/layouts/app.blade.php, и в правое меню добавим такие строки:

<ul class="navbar-nav ml-auto">
    ...
    <li class="nav-item">
        <a class="nav-link" href="{{ route('locale', ['locale' => 'en']) }}">EN</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="{{ route('locale', ['locale' => 'ru']) }}">RU</a>
    </li>
</ul>

 

Всё это хорошо, но надо как-то объяснить приложению, что надо посмотреть в сессию и взять оттуда значение локали. Создадим middleware:

php artisan make:middleware Localization

 

Откроем его (файл app/Http/Middleware/Localization.php) и отредактируем метод handle:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;

class Localization
{
    public function handle($request, Closure $next)
    {
        if (Session::has('locale')) {
            App::setLocale(Session::get('locale'));
        }

        return $next($request);
    }
}

 

После добавим новый middleware в массив $middlewareGroups файла app/Http/Kernel.php:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \App\Http\Middleware\Localization::class,
    ],

    ...
];

 

Далее создадим в директории resources/lang поддиректорию ru, в которой будут размещены файлы с переводами. Например, создадим файл messages.php cо следующим содержимым:

<?php

return [
    'dashboard' => 'Панель управления',
    'you_are_logged_in' => 'Вы вошли в систему!',
];

 

Аналогичный файл messages.php добавим в директории resources/lang/en, и вставим строки с переводами:

<?php

return [
    'dashboard' => 'Dashboard',
    'you_are_logged_in' => 'You are logged in!',
];

 

Подкорректируем resources/home.blade.php:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('messages.dashboard') }}</div>

                <div class="card-body">
                    {{ __('messages.you_are_logged_in') }}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

 

Теперь при переключении языков будем видеть соответствущие переводы фраз.

На этом всё. Успехов!