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行のコメントを解除します。
そして、ミドルウェアも登録しておきます。
<?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" />
実装する
多言語対応部分だけ記載します(ソースはこちら)。
ルーティング
<?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を使って多言語対応の問い合わせフォームを作りました。ルーティング等で悩まなくて済むので、言語ファイルさえ用意してあげれば、非常に簡単に多言語化することができます。