Уроки по программированию

Локализация в Laravel с переключателем языков (мультиязычность)

Локализация в Laravel работает из коробки. Достаточно выполнить простейшую настройку состоящую из 5 пунктов:

  1. Добавить файл языков
  2. Добавить файлы переводов
  3. Добавить middleware для хранения выбранного языка в сессии
  4. Добавления строк перевода в шаблон
  5. Вывод выбор языка в шаблоне

Файл языков

Файл языков представляет из себя обычный 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 и вставляем следующее содержимое.
2021-04-29_23-10-57

<?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>

В зависимости от выбранного языка у вас будет меняться строка перевода

Комментарии к статье

  • Оставьте первый комментарий - автор старался

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *