Локализация в Laravel работает из коробки. Достаточно выполнить простейшую настройку состоящую из 5 пунктов:
- Добавить файл языков
- Добавить файлы переводов
- Добавить middleware для хранения выбранного языка в сессии
- Добавления строк перевода в шаблон
- Вывод выбор языка в шаблоне
Файл языков
Файл языков представляет из себя обычный php файл с массивом. Необходимо добавить в каталоге
config
файл
languages.php
со следующем содержимым
<?php
return [
'en' => 'English',
'ru' => 'Русский',
//... другие языки если необходимы
];
?>
Файлы переводов
Laravel предоставляет два способа управления строками перевода. Во-первых, языковые строки могут храниться в файлах в каталоге resources / lang. В этом каталоге могут быть подкаталоги для каждого языка, поддерживаемого приложением. Это подход, который Laravel использует для управления строками перевода для встроенных функций Laravel, таких как сообщения об ошибках проверки:
/resources
/lang
/en
messages.php
/es
messages.php
Второй вариант это, когда строки перевода хранятся в файле json. Я буду использовать второй вариант.
/resources
/lang
en.json
ru.json
Вам необходимо создать эти файлы и заполнить следующем содержимым
Для en.json
{
"welcome": "Welcome"
}
Для ru.json
{
"welcome": "Добро пожаловать"
}
Добавить middleware для хранения выбранного языка в сессии
Создаем middleware в командой строке. Путь должен ссылаться на корневой каталог приложения
php artisan make:middleware Language
Открываем созданный файл middleware Language.php и вставляем следующее содержимое.

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class Language
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if (Session()->has('applocale') AND array_key_exists(Session()->get('applocale'), config('languages'))) {
App::setLocale(Session()->get('applocale'));
}
else {
App::setLocale(config('app.fallback_locale'));
}
return $next($request);
}
}
Далее переходим
<корневой каталог приложения>/app/Http/Kernel.php
И добавляем в массив web наш middleware
...
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Language::class,
],
...
Строки перевода в шаблоне
Вы можете получить строки перевода из своих языковых файлов с помощью вспомогательной функции __. Например, давайте извлечем строку приветствия перевода из языкового файла resources / lang / ru.json и en.json:
{{ __('welcome') }}
У меня данная строка находится в файле:
<корневой каталог приложения>/resources/views/welcome.blade.php
Вывод выбора языка
Для вывода языка нам надо создать controller
php artisan make:controller LanguageController
Вставляем код в созданный контроллер
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redirect;
class LanguageController extends Controller
{
public function switchLang($lang)
{
if (array_key_exists($lang, Config::get('languages'))) {
Session::put('applocale', $lang);
}
return Redirect::back();
}
}
Добавляем route для контроллера
Route::get('lang/{lang}', ['as' => 'lang.switch', 'uses' => 'App\Http\Controllers\LanguageController@switchLang']);
Вывод выбора языка я также вставлю в шаблон welcome.blade.php до строки перевода
<корневой каталог приложения>/resources/views/welcome.blade.php
<div>Текущий язык: {{ Config::get('languages')[App::getLocale()] }}</div>
<div>
<p>Выбрать язык:</p>
@foreach (Config::get('languages') as $lang => $language)
@if ($lang != App::getLocale())
<a href="{{ route('lang.switch', $lang) }}"> {{$language}}</a>
@endif
@endforeach
</div>
В зависимости от выбранного языка у вас будет меняться строка перевода

Добавить комментарий