Laravelでマルチ言語ルートを設定する方法!ロケールごとのprefixで簡単管理
生徒
「Laravelで作ったサイトを日本語と英語の両方で表示させたいです。どうやって言語ごとにURLを分けられますか?」
先生
「それにはマルチ言語ルートを設定して、言語ごとにURLの先頭に『/ja』や『/en』を付ける方法が便利ですよ。」
生徒
「その『マルチ言語ルート』って何ですか?難しい言葉に聞こえます…」
先生
「マルチ言語ルートとは、言葉(言語)ごとにWebページのURLを分けて、どの言語で表示するかをLaravelのルーティングで管理する仕組みのことです。たとえば日本語のページは /ja/home、英語のページは /en/home といった具合にURLの先頭を分けます。」
先生
「これを実現するために、Laravelのルートで言語ごとにprefix(プレフィックス)を付ける設定方法を紹介しますね!」
1. prefix(プレフィックス)とは?
prefix(プレフィックス)とは、URLの先頭に付ける「共通の文字列」のことで、ページがどの言語向けなのかを表すためによく使われます。たとえば https://example.com/ja/home の ja 部分がprefixで、日本語ページであることを示しています。
Laravelでは、複数のルートに同じprefixをまとめて付けられる仕組みがあり、言語別のURLを管理する際に非常に便利です。prefixを使うことで「日本語ページは/ja/... 」「英語ページは/en/... 」というようにURLの構造が整理され、どの言語のページなのかが一目で分かるようになります。
簡単な例として、prefixあり・なしのURLの違いを比べてみましょう。
// prefixを使わない場合(言語が分からない)
/home
// prefixを使う場合(言語が明確に分かる)
/ja/home // 日本語ページ
/en/home // 英語ページ
このようにprefixを付けるだけで、URLの見やすさや管理のしやすさが大きく改善されます。特にマルチ言語サイトでは欠かせない考え方なので、まずは「URLの先頭に言語コードを付けて役割を分ける仕組み」として覚えておくと理解しやすくなります。
2. マルチ言語ルートの基本的な設定方法
前の章で、prefix(プレフィックス)が「URLの先頭につける共通の文字列」だという話をしました。ここでは、そのprefixを実際にLaravelのルーティングに設定して、日本語用URLと英語用URLを分ける具体的な書き方を見ていきます。
マルチ言語ルートの第一歩は、routes/web.php に「言語ごとのまとまり」を作ることです。LaravelにはRoute::prefix()とgroup()という機能があり、「このグループに属するルートは全部/jaから始める」「このグループは全部/enから始める」といった設定を一括で書けます。
例えば、日本語と英語の2つの言語に対応したシンプルなホームページを用意する場合、次のように書きます。
use Illuminate\Support\Facades\Route;
// 日本語用ルートグループ
Route::prefix('ja')->group(function () {
Route::get('/home', function () {
return view('home_ja'); // 日本語用のホームページ(home_ja.blade.php など)
});
});
// 英語用ルートグループ
Route::prefix('en')->group(function () {
Route::get('/home', function () {
return view('home_en'); // 英語用のホームページ(home_en.blade.php など)
});
});
このコードが書いてある状態で、ブラウザから /ja/home にアクセスすると日本語ページが表示され、/en/home にアクセスすると英語ページが表示されます。URLの先頭にあるjaとenが、それぞれの言語を表すprefixになっているイメージです。
少しだけ用語を整理しておきましょう。
Route::prefix('ja')… 「この中のルートはすべて/jaから始まるURLにする」という宣言です。group(function () { ... })… その宣言の中に、実際のルート(Route::get()など)をまとめて書くためのかっこ(グループ)です。Route::get('/home', ...)… 「/ja/home」「/en/home」といったURLにアクセスが来たときに実行する処理を登録しています。return view('home_ja');… 「home_ja」という名前のビュー(Bladeテンプレート)を表示してね、という指示です。
プログラミング未経験の方は、「日本語用のかたまり」「英語用のかたまり」をそれぞれRoute::prefix()で囲んでいる、とイメージすると分かりやすいです。同じ/homeというパスでも、前に付くprefixが違うことで別のページを出し分けられるため、マルチ言語サイトのURL設計がすっきり整理できます。
このように、まずはroutes/web.phpに言語ごとのルートグループを用意することが、マルチ言語ルート設定の基本となります。ここを押さえておくと、次の章でロケールや動的なprefix設定の話を読むときもスムーズに理解しやすくなります。
3. ロケール(locale)って何?
ロケール(locale)とは、「このページをどの言語で表示するか」を決めるための設定のことです。Laravelでは、アプリ全体の言語を切り替えるために、このロケールを使います。たとえば en は英語、ja は日本語といった具合に、2~3文字のコードで言語を表現します。
マルチ言語サイトを作る場合、このロケールをURLに含めておくと、ユーザーがどの言語のページを見たいのかをLaravelが判断しやすくなります。例えば /ja/home なら日本語、/en/home なら英語、とURLだけで意図が分かるのが大きなメリットです。
もう少しイメージしやすいように、ロケールとURLの関係を簡単な例で確認してみましょう。
// ロケールごとに表示する内容を変えるイメージ
URL: /ja/home → "こんにちは!ようこそ"(日本語)
URL: /en/home → "Hello! Welcome"(英語)
このように、ロケールは「どの言語でページを表示するかを決める案内役」のような存在です。Laravelのマルチ言語機能を理解するうえで欠かせない考え方なので、まずは「URLの言語コード=ロケール」と覚えておくと、後の設定がとても分かりやすくなります。
4. 動的にロケールごとのprefixを設定する方法
マルチ言語サイトを構築する際、対応する言語が後から増えることは珍しくありません。そのたびにルートを一つずつ追加していては管理が大変になるため、Laravelの設定ファイルからまとめてロケール(言語コード)を管理し、自動的にルートを生成する方法が便利です。
Laravelでは config/app.php の中に、自分が対応したい言語を配列として登録するだけで、その内容をルート設定で再利用できます。たとえば、日本語・英語・フランス語の3言語に対応させたい場合、次のように設定を追加します。
// config/app.php の一部
'locales' => ['ja', 'en', 'fr'],
あとは、この配列を使って各言語ごとのルートグループを自動的に生成していきます。ルートファイルで配列をループすることで、対応言語が増えてもコードをほとんど書き換えずに済みます。
// routes/web.php
$locales = config('app.locales');
foreach ($locales as $locale) {
Route::prefix($locale)->group(function () use ($locale) {
Route::get('/home', function () use ($locale) {
return view('home_' . $locale); // home_ja / home_en / home_fr など
});
});
}
この仕組みによって、新しい言語をアプリに追加したいときは config/app.php にロケールを1行追加するだけで、自動的に対応言語のルートが増えます。ファイルを何か所も編集する必要がなく、管理がとても楽になるのが大きなメリットです。特に、ページ数が多い多言語サイトでは、この「動的ルート生成」が作業効率に大きく貢献します。
5. URLからロケールを自動判別して切り替える工夫
Laravelでは、URLのprefixから言語設定(ロケール)を自動で切り替える方法があります。
これはミドルウェアという機能で実現します。ミドルウェアはリクエストがLaravelに届く前に処理を挟む仕組みで、ロケールを設定してからページを表示できます。
例として簡単なミドルウェアのコードを紹介します。
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
class SetLocale
{
public function handle($request, Closure $next)
{
$locale = $request->segment(1); // URLの最初の部分を取得
if (in_array($locale, config('app.locales'))) {
App::setLocale($locale); // Laravelの言語設定を切り替え
}
return $next($request);
}
}
このミドルウェアをルートグループに登録すれば、URLの /ja や /en に合わせて言語を切り替えられます。
6. 重要ポイントのおさらい
- マルチ言語ルートはURLの先頭に言語コード(prefix)を付けて管理
- prefixはルートグループでまとめて設定でき、コードがシンプルに
- config/app.phpなどで対応言語(ロケール)を管理し、動的にルート生成も可能
- ミドルウェアでURLからロケールを判別し、Laravelの言語設定を自動切替
- 言語ごとにBladeテンプレートを用意し、ページ内容を切り替えられる
まとめ
ここまで見てきたように、Laravelでマルチ言語ルートを構築する方法は、国際化されたWebサイトを作るうえで非常に大切な要素になります。日本語や英語だけでなく、さまざまな国や地域のユーザーに向けて情報を届けたい場合、URLの構造を言語ごとに統一することはとても重要です。URLの先頭に付けるprefixによって、どの言語でページを表示しているかを視覚的にもわかりやすく表現でき、その分、利用者にとっても管理者にとっても扱いやすい仕組みを整えることができます。複雑なルーティングを整理しながら、技術的にも運用的にも無理のない方法でマルチ言語対応を実現できるのは、Laravelの柔軟な仕組みがあるからこそです。 prefixは単純な文字列指定に見えますが、実際には大規模な国際化サイトの核になる構造であり、URLの分類やSEOにおいても効果を発揮します。日本語のコンテンツを整理したいとき、英語ページを独立させて管理したいとき、あるいは複数のヨーロッパ言語に展開したいときなど、prefixを言語ごとに設定しておけば、サイト全体の構造をとてもわかりやすく維持できます。また、Laravelのルートグループにprefixをまとめて指定すると、関連するルートを簡潔に管理できるため、コードの見通しがよくなるのはもちろん、開発者が迷わずページ構造をたどれるという利点もあります。 さらに、ロケールという概念はマルチ言語対応の中心ともいえる存在です。単なる言語コードではなく、その国や地域の文化に基づいた表現を統一するために用いられる重要な設定です。日付や数値の表現、メッセージの翻訳などもロケールに依存する部分が多く、適切なロケールが設定されることで、より自然な形でコンテンツが提供されます。Laravelではロケールを簡単に切り替えられるため、URLのprefixと組み合わせることで、利用者が求める言語でシームレスにページを表示できます。 実務に近い場面では、単に言語を切り替えるだけでなく、追加したい言語が増えていくことがよくあります。そんなとき、config/app.php の locales 配列に言語コードを追加するだけでルートが自動生成されるように設計すると、後からの拡張性が高まります。そのままミドルウェアを組み合わせれば、URLからロケールを判断し、自動でLaravel内部の言語設定も切り替えられます。これにより、言語処理の一貫性が保たれ、ユーザーに自然でわかりやすい画面を届けられるようになります。 また、多言語ページを作るときには、テンプレートも言語ごとに整理することが重要です。Bladeファイルを言語コード付きで管理すれば、ページ内容を迷わず切り替えられ、誤った言語が表示されるリスクも減らせます。開発が進むにつれ、言語ごとのコンテンツ量が増えることもありますが、フォルダや命名規則を統一しておくことで長期的なメンテナンス性も高まります。 最後に、実用的なマルチ言語ルートの例として、prefix・ロケール・ミドルウェアを組み合わせたサンプルコードを改めて載せておきます。この構成は実務でもよく採用されるので、理解しておくと応用範囲が広がります。
サンプルプログラム:prefixとミドルウェアで言語ルートを統合管理
$locales = config('app.locales');
Route::middleware('setlocale')->group(function () use ($locales) {
foreach ($locales as $locale) {
Route::prefix($locale)->group(function () use ($locale) {
Route::get('/home', function () use ($locale) {
return view('home_' . $locale);
})->name('home.' . $locale);
});
}
});
この構造では、configファイルの locales に登録された言語ごとにルートが生成され、setlocaleミドルウェアによってURLの先頭部分と内部のロケール設定を一致させています。サイト全体を多言語に対応させたいときにも拡張しやすく、管理が複雑になりにくい形です。言語を増やすときも locales 配列に追記するだけで対応可能なため、長期運用を考えた設計としても非常に有効です。国際的なユーザーを対象としたWebサイトを作成する際には、こうした柔軟な構造が重要となり、Laravelのルーティング機能を最大限活用することで快適な利用環境を作れます。
生徒
「マルチ言語ルートって難しそうと思っていたんですが、prefixとロケールを組み合わせるだけで意外とシンプルに作れるんですね。」
先生
「そうですね。Laravelのルートグループとミドルウェアがうまく働いてくれるので、複雑に見えても仕組み自体はわかりやすく整理されていますよ。」
生徒
「configに言語を追加するだけで自動でルートが増えるのもいいですね。後で言語が増えるときにも困らなそうです。」
先生
「その通りです。国際化対応は長期的な変更が発生しやすいので、拡張しやすい構造にしておくととても楽になりますよ。」
生徒
「ありがとうございます!これなら自分のサイトにも多言語ページを組み込めそうです!」