menu-icon

Laravel 6で問い合わせフォーム(多言語対応)

Laravel Localizationを使って、以前作成した問い合わせフォームを多言語対応(英語と日本語)させました。

完成したものはこちらにあります。

環境

  • PHP 7.4
  • Laravel 6

準備

Laravel Localization

composerでインストールします。

$ composer require mcamara/laravel-localization

次にコンフィグファイルを作成します。

$ php artisan vendor:publish --provider="Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider"

config/laravellocalization.phpが作成されます。対応する言語に応じてsupportedLocalesを編集します(デフォルトでは英語(en)とスペイン語(es)が有効となっています)。今回は英語(en)と日本語(ja)に対応しますので、es行をコメントアウトし、ja行のコメントを解除します。

そして、ミドルウェアも登録しておきます。

app/Http/Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /* 略 */

    /**
    * The application's route middleware.
    *
    * @var array
    */
    protected $routeMiddleware = [
        /* 略 */
        'localize'                => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
        'localizationRedirect'    => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
        'localeSessionRedirect'   => \Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
        'localeCookieRedirect'    => \Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
        'localeViewPath'          => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class
    ];

    /* 略 */
}

言語ファイル

以下のコマンドを実行すると、Laravelパッケージに含まれる言語ファイル(auth.php,passwords.php,pagination.php,validation.php)の日本語版が作成されます。Validation用の言語ファイルはこれをベースに作るのが早いです。

$ php -r "copy('https://readouble.com/laravel/6.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
$ php -f install-ja-lang.php
$ php -r "unlink('install-ja-lang.php');"

Pure CSS

多言語対応とは直接関係ないですが、今回はCSSフレームワークのPureを使用します。とにかく軽量なのが特徴です。以下の2行をhead要素に追加するだけで使えます。

<link rel="stylesheet" href="https://unpkg.com/purecss@2.0.3/build/pure-min.css" />
<link rel="stylesheet" href="https://unpkg.com/purecss@2.0.3/build/grids-responsive-min.css" />

実装する

多言語対応部分だけ記載します(ソースはこちら)。

ルーティング

routes/web.php
<?php

Route::group(['prefix' => LaravelLocalization::setLocale()], function() {
    Route::get('/', 'ContactController@showForm')->name('form');
    Route::post('/', 'ContactController@confirm');
    Route::get('/confirm', 'ContactController@showConfirm')->name('confirm');
    Route::post('/confirm', 'ContactController@send');
    Route::get('/finish', 'ContactController@showFinish')->name('finish');
});

これでprefixで言語コードを指定できるようになります。すなわちhttps://hoge.com/jaでアクセスすれば日本語の問い合わせフォーム、https://hoge.com/enでアクセスすれば英語の問い合わせフォームが表示されるようになります。

言語切り替えメニュー

言語を切り替えるためのドロップダウンメニューをheader部分に追加します。

      <div class="header-menu pure-menu pure-menu-horizontal">
        <ul class="pure-menu-list">
          <li class="pure-menu-item pure-menu-has-children pure-menu-allow-hover">
            <a href="#" id="menuLink1" class="pure-menu-link">{{ LaravelLocalization::getCurrentLocaleNative() }}</a>
            <ul class="pure-menu-children">
              @foreach(LaravelLocalization::getSupportedLocales() as $localeCode => $properties)
                <li class="pure-menu-item">
                  <a class="pure-menu-link" rel="alternate" hreflang="{{ $localeCode }}" href="{{ LaravelLocalization::getLocalizedURL($localeCode, null, [], true) }}">
                    {{ $properties['native'] }}
                  </a>
                </li>
              @endforeach
            </ul>
          </li>
        </ul>
      </div>

動かしてみる

初期表示はブラウザの言語設定に依存します。自分の環境だと日本語で表示されます。これらの挙動はコンフィグ設定やミドルウェアで変更できます。

言語メニューでEnglishを選択します。

表示が英語に切り替わりました。

まとめ

Laravel Localizationを使って多言語対応の問い合わせフォームを作りました。ルーティング等で悩まなくて済むので、言語ファイルさえ用意してあげれば、非常に簡単に多言語化することができます。