2
3

More than 3 years have passed since last update.

【Laravel】多言語切り替え機能の実装

Last updated at Posted at 2020-09-04

備忘録、第四弾。

前回書いた「【Vue.js】vue-i18nを使って多言語化」の続き。
Laravelで切り替え機能を実装してみた。

参考:
https://mydnic.be/post/laravel-5-and-his-fcking-non-persistent-app-setlocale

実装

まずは使用する言語を配列で用意します。

config/languages.php
<?php

return [
    'ja' => '日本語',
    'en' => 'English',
    'cn' => '簡体字',
    'tw' => '繁体字',
];

?>

次に言語切り替え処理を書くコントローラーを用意します。

$ php artisan make:controller LanguageController
LanguageController.php
class LanguageController extends Controller
{
    public function switchLang($lang)
    {
        //用意した言語配列に引数で渡したlangがある時、
        //セッションにkey(applocale):value($lang)を保存する
        if (array_key_exists($lang, Config::get('languages'))) {
            Session::put('applocale', $lang);
        }
        return Redirect::back();
    }
}

middlewareを作成します。

$ php artisan make:middleware Language

setlocale()はロケール情報を設定するメソッドです。

Middleware/Language.php
class Language
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Session::has('applocale') AND array_key_exists(Session::get('applocale'), Config::get('languages'))) {
            App::setLocale(Session::get('applocale'));
        }
        else {
            App::setLocale(Config::get('app.fallback_locale'));
        }
        return $next($request);
    }
}

新しいミドルウェアを追加したら、カーネルへの追加も忘れずに。

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\Language::class,
        ],

ルーティングを設定します。

web.php
Route::get('lang/{lang}', ['as'=>'lang.switch', 'uses'=>'LanguageController@switchLang']);

ナビバーにドロップダウンを仕込みます。

nav.blade.php
        <li class="nav-item dropdown" id="nav-lang">
          <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">
            {{ Config::get('languages')[App::getLocale()] }}
          <span class="caret"></span></a>
          <ul class="dropdown-menu">
            @foreach ((array)Config::get('languages') as $lang => $language)
              @if ($lang != App::getLocale())
                <li>
                  <a href="{{ route('lang.switch', $lang) }}">{{$language}}</a>
                </li>
              @endif
            @endforeach
          </ul>
       </li>

動かして見るとこんな感じ
スクリーンショット 2020-09-04 23.10.33.png
ドロップダウン
スクリーンショット 2020-09-04 23.11.01.png
Englishを選んでみましょう
スクリーンショット 2020-09-04 23.11.27.png
上手く切り替わりました!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3