
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' => 'uk']) }}">UK</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
піддиректорію uk
, в якій будуть розміщені файли з перекладами. Наприклад, додамо файл messages.php
з наступним змістом:
<?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
Тепер при перемиканні мов будемо бачити відповідні переклади фраз.
На цьому все. Успіхів!