Laravelで言語切替UIを作る!多言語対応(ローカリゼーション)実践ガイド
生徒
「Laravelで作ったサイトを、ボタン一つで日本語から英語に切り替えられるようにしたいです!」
先生
「それは『言語スイッチャー』と呼ばれる機能ですね。Laravelのローカリゼーション機能を使えば、初心者の方でも実装できますよ。」
生徒
「難しそうですが、私にもできますか?」
先生
「仕組みを理解すれば大丈夫です。まずは基本の設定から順番に解説していきましょう!」
1. Laravelのローカリゼーションとは?
Laravelにおけるローカリゼーション(Localization)とは、アプリケーションを複数の言語に対応させる仕組みのことです。 例えば、日本人がアクセスしたときは「こんにちは」と表示し、アメリカ人がアクセスしたときは「Hello」と表示するように、表示する文字を動的に切り替えることができます。
プログラミング未経験の方にとって、「言語を切り替える」と聞くと、ページを丸ごと作り直す必要があるのではないかと不安になるかもしれません。 しかし、Laravelでは翻訳ファイルという辞書のようなものを用意しておくだけで、システムが自動的に適切な言葉を選んで表示してくれます。
この機能を使う大きなメリットは、SEO(検索エンジン最適化)において非常に有利になる点です。 多言語対応が適切になされているサイトは、世界中のユーザーから検索される可能性が高まり、Googleなどの検索エンジンからも「親切な設計のサイト」として評価されやすくなります。
2. 言語ファイルの準備と仕組み
まずは、翻訳の「辞書」となるファイルを作りましょう。Laravelでは lang というフォルダの中に言語ごとのフォルダを作成します。
日本語なら ja フォルダ、英語なら en フォルダです。
ディレクトリ構造の例:
lang/ja/messages.php
lang/en/messages.php
このファイルの中に、キーと値のセットを書きます。キーは「言葉のID」のようなもので、プログラムからはこのIDを指定して文字を呼び出します。
// lang/ja/messages.php
return [
'welcome' => 'ようこそ、私たちのサイトへ!',
'login' => 'ログイン',
];
このように、配列という形式でデータを管理します。'welcome' というキーに対して、日本語のメッセージを紐付けています。
3. 言語を切り替えるルートの設定
次に、ユーザーが言語を切り替えるための「道筋(ルート)」を決めます。 ユーザーが「英語にしたい」というリクエストを送ったときに、その指示を受け取って処理する場所が必要です。
routes/web.php に、言語設定を保存するためのルートを記述しましょう。
ここでは、セッションという仕組みを使います。セッションとは、ユーザーがサイトを見ている間、一時的に情報を保存しておくための「カゴ」のようなものです。
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
Route::get('lang/{locale}', function ($locale) {
if (in_array($locale, ['en', 'ja'])) {
Session::put('locale', $locale);
}
return redirect()->back();
});
このコードでは、URLに /lang/ja や /lang/en と入力されたとき、その値をセッションに保存し、元のページに戻るという処理を行っています。
in_array という命令は、指定された言語が許可されているもの(今回は英語か日本語)かどうかを確認するための安全策です。
4. ミドルウェアで言語を常に反映させる
セッションに言語の設定を保存しただけでは、まだ画面には反映されません。 ページが表示されるたびに、「セッションに保存された言語は何かな?」と確認して、Laravelのシステムに教える必要があります。 これを行うのがミドルウェアです。
ミドルウェアは、リクエストがアプリケーションに届く前に通る「関所」のような存在です。 ここで「現在の言語はこれですよ」とセットすることで、全てのページで正しい言語が表示されるようになります。
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
class SetLocale
{
public function handle($request, Closure $next)
{
if (Session::has('locale')) {
App::setLocale(Session::get('locale'));
}
return $next($request);
}
}
App::setLocale() という命令を使うことで、Laravel全体の言語設定を瞬時に書き換えることができます。
これを bootstrap/app.php(Laravel 11以降の場合)などで有効にすることで、常に言語設定が反映されるようになります。
5. 言語スイッチャーのUIをHTMLで作る
いよいよ、ユーザーがクリックするボタン(UI)を作成します。 Bootstrap 5を使って、見た目も綺麗で使いやすい言語切替ボタンを作ってみましょう。 今回はナビゲーションバーの中に配置するドロップダウン形式の例を紹介します。
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="langSelect" data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-translate"></i> 言語選択
</button>
<ul class="dropdown-menu" aria-labelledby="langSelect">
<li><a class="dropdown-item" href="/lang/ja">日本語</a></li>
<li><a class="dropdown-item" href="/lang/en">English</a></li>
</ul>
</div>
このHTMLでは、bi bi-translate というアイコンを使って、一目で言語設定だとわかるようにしています。
各リンク先は、先ほど設定した /lang/{locale} のルートに繋がっています。
ユーザーが「English」をクリックすると、裏側でセッションが書き換わり、ページが更新されて英語表記になります。
6. 実際に翻訳テキストを表示する方法
最後に、作成した辞書ファイル(言語ファイル)から文字を呼び出す方法を解説します。
BladeテンプレートというLaravelの画面表示用ファイルの中では、__('キー名') という短い命令を使います。
<div class="container mt-5">
<h1 class="display-4 text-primary">
{{ __('messages.welcome') }}
</h1>
<p class="lead">
{{ __('messages.login') }} してサービスを利用してください。
</p>
</div>
{{ __('messages.welcome') }} と書くだけで、現在の設定が日本語なら「ようこそ、私たちのサイトへ!」、英語なら「Welcome to our site!」と自動で切り替わります。
もし辞書ファイルに存在しないキーを指定した場合は、そのキーの名前がそのまま表示されるので、綴り間違いには注意しましょう。
この仕組みを応用すれば、ナビゲーションメニュー、エラーメッセージ、ボタンの文字など、サイト内のあらゆるテキストを簡単に多言語化できます。 世界中の人が利用するグローバルなウェブサイト制作の第一歩として、ぜひこの言語スイッチャーをマスターしてください。
7. 開発時に役立つ用語解説
今回の実装で登場した、プログラミング初心者がつまずきやすい用語を整理しておきましょう。
| 用語 | 意味 |
|---|---|
| ディレクトリ | パソコン上の「フォルダ」のことです。 |
| リダイレクト | 特定のページから別のページへ自動的に転送することです。 |
| 配列 (Array) | 複数のデータを一つのまとまりとして管理する仕組みです。 |
| キー (Key) | データを取り出すための「見出し」や「名前」のことです。 |
| ミドルウェア | プログラムの本体が動く前に実行される補助的な処理のことです。 |
これらの用語はLaravelだけでなく、他のプログラミング言語でも共通して使われる非常に重要な概念です。 一度に全て覚える必要はありませんが、実際にコードを書きながら「ああ、これが配列か!」と少しずつ馴染んでいくのが上達の近道です。
まとめ
ここまで、Laravelを利用した多言語対応(ローカリゼーション)の具体的な実装手順について詳しく解説してきました。 グローバルな視点でのウェブサイト制作において、言語スイッチャーの導入はユーザーの利便性を飛躍的に向上させる重要な要素です。 今回学んだ仕組みを正しく理解し、適切に検索エンジン最適化(SEO)を意識した構築を行うことで、世界中のユーザーへコンテンツを届けることが可能になります。
実装のポイント振り返り
多言語対応の核心は、言語ごとの翻訳ファイルを適切に管理し、ユーザーの選択をセッションで保持、そしてミドルウェアでシステム全体に反映させるという一連の流れにあります。 特に、ミドルウェアを利用してリクエストごとに言語設定を上書きする手法は、Laravelの柔軟性を活かした非常にスマートな解決策です。 これにより、開発者は個別のコントローラーで言語を意識することなく、Bladeテンプレート内で共通のキーを呼び出すだけで済むようになります。
応用的な実装サンプル
実際のプロジェクトでは、より多くの情報を一括で管理したり、言語設定をより堅牢に扱う必要があります。 例えば、現在の設定言語を判定して、ボタンの表示を動的に変更するロジックを組み込むと、さらに使い勝手の良いUIになります。 以下に、より実用的な言語設定の判定を含むサンプルコードを記載します。
// 現在の言語設定を取得して条件分岐する例
$currentLocale = App::getLocale();
if ($currentLocale == 'ja') {
echo '現在は日本語設定です。';
} else {
echo 'Current language is English.';
}
また、ミドルウェアの登録についても再確認しておきましょう。
Laravel 11以降では、bootstrap/app.php にミドルウェアを追記することで、アプリケーション全体に適用させることができます。
この設定を忘れると、セッションに値を保存しても画面表示が切り替わらないため、注意が必要です。
// bootstrap/app.php でのミドルウェア登録イメージ
->withMiddleware(function (Middleware $middleware) {
$middleware->append(SetLocale::class);
})
運用とSEOに関する補足
多言語サイトを運用する上で、SEOの観点からはURLの設計も重要です。
今回はセッションベースの切り替えを紹介しましたが、より本格的なSEO対策を行う場合は、URLの先頭に /ja/ や /en/ といったプレフィックスを付ける手法も検討に値します。
検索エンジンはURLごとに言語を認識するため、物理的なURLが分かれている方がインデックスされやすくなるというメリットがあります。
まずは今回のセッション方式で基本をマスターし、ステップアップとしてURLルーティングによる言語切り替えにも挑戦してみてください。
最終的な動作確認の例
実装が完了したら、実際にブラウザで動作を確認しましょう。 デバッグの際は、現在のセッション状態や、Laravelが認識しているロケールを画面に出力して確認するとスムーズです。
現在のロケール設定: ja
セッション内の言語情報: ja
表示されるメッセージ: ようこそ、私たちのサイトへ!
このように、一つひとつのステップを確実に踏んでいけば、Laravelでの多言語化は決して難しいものではありません。 ユーザーにとって最適な言語で情報を届けることは、信頼性の高いウェブサービスを構築する第一歩です。 今回作成した言語スイッチャーをベースに、さらに魅力的な多言語サイトを作り上げていきましょう。
生徒
「先生、お疲れ様でした!言語切り替えの仕組みがよく分かりました。 翻訳ファイルを作って、セッションに保存して、ミドルウェアで適用する。 この3つのステップが重要なんですね!」
先生
「その通りです!よく整理できましたね。 特にミドルウェアの役割を理解できたのは大きいです。 全てのページで共通の処理を自動的に行ってくれるので、開発効率がぐっと上がりますよ。」
生徒
「はい!あと、Bladeテンプレートの中で __('messages.welcome') と書くだけで、
勝手に言葉が変わったときは感動しました。
これなら、後から英語以外の言語、例えばフランス語や中国語を追加するのも簡単そうですね。」
先生
「素晴らしい視点ですね。まさに拡張性の高さがLaravelの魅力です。
lang/fr フォルダを作って翻訳ファイルを用意すれば、すぐにフランス語対応が可能です。
ただ、翻訳するテキストが増えてくると管理が大変になるので、整理整頓を心がけましょう。」
生徒
「なるほど、キーの名前を分かりやすくしておくのがコツですね。 ところで、SEOについても少し触れていましたが、言語を切り替えたときにURLが変わらないのは大丈夫なのでしょうか?」
先生
「鋭い質問です!セッション方式は、同じURLで中身を切り替えるので、ユーザーには親切ですが、 検索エンジンに『別の言語のページがあるよ』と伝えるには、URLを分ける方が有利な場合もあります。 将来的に大規模な海外向けサイトを作るなら、URLに言語コードを含める方法も学んでみてください。」
生徒
「分かりました!まずはこのセッション方式を完璧に使いこなせるように練習します。 プログラミングって、仕組みが繋がっていく感じがして本当に面白いです!」
先生
「その調子です!自分で書いたコードが動いて、表示が変わる瞬間を大切にしてください。 次は、データベースの内容を多言語化する方法などにも挑戦してみましょう。 応援していますよ!」
生徒
「ありがとうございます、先生!もっと色々な機能を実装できるよう頑張ります!」