Этот урок по созданию мультиязычного сайта на Laravel 5.8. Мы будем отображать сообщения пользователю, на том языке, который он выберет.
Сделаем на примере русского (ru) и английского (en) языка. (прим. переводчика — в оригинале был французский). Laravel, по дефолту, использует английский, но не все им владеют.
Существует множество сторонних пакетов для создания сайтов на нескольких языках, но Laravel имеет встроенную поддержку локализации.
Сообщения хранятся в файлах директории resources/lang. В ней должны быть подкаталоги для каждого языка, поддерживаемого сайтом.
Для примера создадим новое приложение 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();
}
Создаем нового посредника:
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
Перевод: Demiurge Ash