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' => '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

 

Тепер при перемиканні мов будемо бачити відповідні переклади фраз.

На цьому все. Успіхів!