
Laravel: локализация интерфейса
08.07.2019 22:09 | Laravel, PHP
Рано или поздно скорее всего столкнётесь с разработкой мультиязычных сайтов. Расмотрим вариант попроще - как в 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
Теперь при переключении языков будем видеть соответствущие переводы фраз.
На этом всё. Успехов!