【Laravel】多言語対応(英語と日本語):言語切り替え機能の実装方法
2023.12.30 /
本記事ではLaravelで多言語対応(英語と日本語)を可能にする言語切り替え機能を実装する方法について解説していきます。
Laravelで開発したWebアプリケーションを日本だけでなく他の国のユーザーにも利用されることを想定しているならば、Webアプリケーションの表示を多言語対応にする必要があります。多言語対応にすることでグローバルなアプリケーションとなり、ユーザーベースを拡大することができます。
Webアプリケーションを多言語対応にするには言語を切り替える機能を実装する必要があります。
本記事を通して、LaravelのWebアプリケーションに言語切り替え機能を実装する方法について理解を深めてください。
Laravel:言語切り替え機能を実装する方法
LaravelによるWebアプリケーションに言語切り替え機能を実装するには以下の流れで開発を進めていきます。
- デフォルトのロケール設定
- langフォルダの作成
- 言語ファイルの設定
- 言語切り替え用のコントローラー作成
- web.phpに言語切り替えのルートを追加
- 言語切り替えボタンをBladeテンプレートに追加
- 言語をロケールに保存するミドルウェアを実装
- ビュー(Blade)で使用
上記の各開発方法について次項より詳しく解説していきます。
デフォルトのロケール設定
設定ファイルであるconfig/app.phpにデフォルトのロケール(locale)を設定します。デフォルトでは英語(en)になっているのでここでは日本語(ja)に変更してみます。
'locale' => 'ja',
設定ファイルapp.phpで設定できるlocaleとは、アプリケーションの言語環境を意味します。localeで設定された言語がアプリケーションの主要言語となり、日付や数値などのフォーマットに影響を与えます
langフォルダの作成
laravel10ではresourcesフォルダ内にlangフォルダがないため、langフォルダを作成します。langフォルダでは言語の切り替えを行う言語ファイルを格納します。
次に使用する言語のフォルダを作成します。ここでは日本語と英語に対応させるため「ja」と「en」という名前のフォルダをlang直下に作成します。
言語ファイルの設定
作成したlang直下の言語フォルダ内に言語ファイルを作成します。ここでは日本語ファイルは「resources/lang/ja」、英語ファイルは「resources/lang/en」にそれぞれ作成します。
// 例:resources/lang/ja/messages.php
<?php
return [
'welcome' => 'Office54へようこそ',
];
// 例:resources/lang/en/messages.php
<?php
return [
'welcome' => 'Welcome to Office54',
];
上記では言語ファイルとしてmessages.phpを各言語フォルダ内に作成しています。
言語切り替え用のコントローラー作成
言語切り替え用のコントローラーを作成します。まず以下コマンドを実行します。
> php artisan make:controller LanguageController --invokable
上記コマンドでLanguageController.phpというシングルアクションコントローラが作成されます。
作成されたコントローラーには以下のようにコードを記述します。
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
class LanguageController extends Controller
{
public function __invoke($lang)
{
App::setLocale($lang);
Session::put('locale', $lang);
return back();
}
}
上記コードの動作について以下で解説していきます。
ロケール(言語設定)の変更
App::setLocale($lang);
ロケール(言語設定)はWebアプリケーションで使用する日付などローカライズされたデータに影響します。そのため以下コードでロケールを選択された言語に設定します。
$langはURLから渡されるパラメーターです。ここではjaまたはenが渡されます。
セッションへ言語を保存
Session::put('locale', $lang);
ユーザーが選択した言語情報をセッションに保存します。これによりユーザーが他のページへ遷移した場合やリロードしても選択した言語で表示できるようにします。
前のページへ戻る
return back();
ユーザーが言語選択したときのページにリダイレクトしています。
web.phpに言語切り替えのルートを追加
web.phpに言語切り替えのボタンが押されたときのルートを追加します。
Route::get('/language/{lang}', \App\Http\Controllers\LanguageController::class)->name('language.switch');
言語切り替えボタンをBladeテンプレートに追加
ユーザーが言語を切り替えられるように、ヘッダーなどのBladeテンプレートにボタンなどのUIを追加します。
<ul>
<li><a href="{{ route('language.switch', 'ja') }}">JP</a></li>
<li><a href="{{ route('language.switch', 'en') }}">EN</a></li>
</ul>
言語をロケールに保存するミドルウェアを実装
セッションに保存された言語をロケール(言語設定)に保存するミドルウェアを作成します。このミドルウェアによりアプリケーション全体で選択された言語が適用されます。
ミドルウェアの作成
まずは以下コマンドを実行してミドルウェアを作成します。ここはSetLocaleミドルウェアを作成しています。
php artisan make:middleware SetLocale
上記コマンドを実行すると「app/Http/Middleware/SetLocale.php」が作成されます。
ミドルウェアの編集
作成したSetLocale.phpに以下のようにコードを記述します。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
class SetLocale
{
public function handle(Request $request, Closure $next): Response
{
if (Session::has('locale')) {
App::setLocale(Session::get('locale'));
}
return $next($request);
}
}
上記コードではセッションにlocaleキーが存在するかをif文で判定しています。
if (Session::has('locale')) {}
localeキーがセッションに存在すれば、セッションから言語を取得し、それをアプリケーションのロケールに設定しています。
App::setLocale(Session::get('locale'));
ミドルウェアの登録
ミドルウェアを作成したらアプリケーションに登録します。
「app/Http/Kernel.php」を開いて、$middlewareGroups配列のwebに以下のようにSetLocaleミドルウェアを追加します。
protected $middlewareGroups = [
'web' => [
…
\App\Http\Middleware\SetLocale::class,
],
上記の操作によりwebを使用するすべてのルートでSetLocaleミドルウェアが適用されます。
つまりセッションに保存された言語がアプリケーションで有効になるということです。
ビュー(Blade)で使用
ビュー(Blade)で選択された言語によって表示を切り替える場合は以下のように記述します。
<p>{{ __('messages.welcome') }}</p>
上記のように__()ヘルパー関数を使用する、または@langディレクティブを使用します。これらの記述により、作成していた言語ファイルに基づいて言語表示を切り替えることができます。
テーブルから取り出すデータの切り替え方法
選択されている言語によってテーブルから取り出して表示するデータを切り替える方法について解説していきます。
ここではarticlesテーブルには日本語用フィールド「title_jp」「body_jp」と英語用フィールド「title_en」「body_en」があるとします。
ビュー(Bladeファイル)ではコントローラーから対象のarticleのデータが渡されている場合、以下のようにセッションに保存されている言語によって表示を日本語データと英語データで切り替えることができます。
@if (app()->getLocale() === 'ja')
{{ $article->title }}
@else
{{ $article->title_en }}
@endif
@if (app()->getLocale() === 'ja')
{!! $article->body !!}
@else
{!! $article->body_en !!}
@endif
上記では「app()->getLocale()」でセッションに保存されている言語を取得し、jaであれば日本語データを、それ以外であれば英語データを表示する内容となっています。