Локализация в 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>
В зависимости от выбранного языка у вас будет меняться строка перевода
Добавить комментарий