Laravel多言語対応入門!URLに言語パラメータを追加して世界中のユーザーに届けよう
生徒
「海外の人も見るサイトを作りたいのですが、URLの最初に /ja/ や /en/ と入れるにはどうすればいいですか?」
先生
「それはLaravelのローカリゼーションという機能を使います。URLの一部を言語の切り替えスイッチにする設定が必要ですね。」
生徒
「URLで言語を管理できると、検索エンジンにも優しそうですね!難しそうですが、私にもできますか?」
先生
「大丈夫ですよ。ルートパラメータという仕組みを使えば、初心者の方でも順番に進めるだけで実装できます。一緒にやってみましょう!」
1. Laravelの多言語対応とURLパラメータの基本
Webサイトを日本語だけでなく英語や中国語など、複数の言語で表示できるようにすることをローカリゼーション(多言語対応)と呼びます。 Laravelには、表示する文字を切り替える機能が標準で備わっていますが、ユーザーが今どの言語で見ているかを判断する材料が必要です。
その判断材料として最も一般的でSEO(検索エンジン最適化)に有利なのが、URLに言語コードを含める方法です。 例えば、「https://example.com/ja/about」なら日本語、「https://example.com/en/about」なら英語を表示するといった仕組みです。 このようにURLの一部を変化させる変数のことを、プログラミングの世界ではパラメータと呼びます。
URLに言語を入れることで、Googleなどの検索エンジンが「このページは日本語版だ」「こちらは英語版だ」と正しく認識してくれるようになります。 これは、世界中の人々に自分のサイトを見つけてもらうために非常に重要な設定となります。
2. ルート設定で言語パラメータを受け取る準備
まずは、Laravelのルーティング(URLと処理を関連付ける設定)を変更しましょう。
通常は routes/web.php というファイルにURLの設定を書いていきます。
ここで、URLの先頭に {locale} という記述を追加することで、どんな言語コードが来ても受け入れられるようになります。
ルートパラメータとは、URLの中の特定の場所を「穴埋め問題」のように自由な文字を受け取れるようにする仕組みのことです。
中括弧 {} で囲った部分が、後でプログラムの中で再利用できる変数になります。
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\App;
// URLの最初に言語コード(enやjaなど)を受け取る設定
Route::get('/{locale}/welcome', function ($locale) {
// 受け取った言語コードがサポート対象か確認し、アプリの言語を設定する
if (! in_array($locale, ['en', 'ja', 'es'])) {
abort(404);
}
App::setLocale($locale);
return view('welcome');
});
このコードでは、URLが /ja/welcome なら $locale には ja が入り、
/en/welcome なら en が入るようになっています。
もし対応していない言語が入力された場合は、abort(404) という命令で「ページが見つかりません」というエラーを返します。
3. ミドルウェアを使って自動で言語を切り替える
先ほどの例では、一つのページごとに言語設定を書かなければならず、ページが増えると大変です。 そこで登場するのがミドルウェアです。 ミドルウェアとは、目的のページが表示される前に「割り込んで」実行される処理のことで、検問所のような役割を果たします。
すべてのページで共通して言語をチェックしたい場合は、専用のミドルウェアを作成するのが最も効率的です。 まず、コマンドプロンプトやターミナルで下記のコマンドを入力して、新しいミドルウェアを作成します。
php artisan make:middleware SetLocale
作成された app/Http/Middleware/SetLocale.php ファイルの中に、URLのパラメータを読み取って言語を設定する処理を書きます。
namespace App\Http\Middleware;
import Closure;
import Illuminate\Support\Facades\App;
import Illuminate\Support\Facades\URL;
class SetLocale
{
public function handle($request, Closure $next)
{
// URLからlocaleという名前のパラメータを取得する
$locale = $request->route('locale');
// 言語が指定されていれば、アプリの言語として設定する
if ($locale) {
App::setLocale($locale);
}
// URLを生成するときに、現在の言語を自動で引き継ぐ設定
URL::defaults(['locale' => $locale]);
return $next($request);
}
}
URL::defaults という命令を使うことで、リンクを作成する際にいちいち「現在は日本語だから ja を付けて...」と手動で書かなくても、自動的に現在の言語をURLに組み込んでくれるようになります。
4. ルートグループで複数のページを一括管理
ミドルウェアを作成したら、それを適用する範囲を決めます。
Laravelのルートグループ機能を使うと、複数のURLに対してまとめて共通のルールを適用できます。
これにより、サイト内の全てのページに /{locale}/ という接頭辞を付けることができます。
routes/web.php を開き、作成したミドルウェアをグループ全体に適用する設定を記述しましょう。
プログラミング未経験の方にとって、グループ化は「同じルールの箱にまとめて入れる」イメージを持つと理解しやすいです。
use App\Http\Middleware\SetLocale;
use Illuminate\Support\Facades\Route;
// prefixでURLの先頭に必ずパラメータが付くようにし、ミドルウェアを通す
Route::middleware([SetLocale::class])->prefix('{locale}')->group(function () {
// この中のルートは全て /ja/ や /en/ から始まるようになる
Route::get('/', function () {
return view('top');
});
Route::get('/contact', function () {
return view('contact');
});
});
このように書くと、トップページは /ja/、お問い合わせページは /ja/contact というURLでアクセスできるようになります。
接頭辞(prefix)を設定することで、URLの構造がスッキリと整理され、管理が非常に楽になります。
5. ブレードテンプレートで多言語リンクを作る
URLにパラメータを含める設定ができたら、次は実際にユーザーが言語を切り替えるためのボタンやリンクを作ります。
Laravelの画面を作る機能であるBlade(ブレード)テンプレートでは、route 関数を使って簡単にリンクを生成できます。
現在のページを維持したまま言語だけを切り替えるリンクを作るには、ルート名と新しい言語パラメータを渡します。
HTMLの知識があれば、<a> タグの中にLaravelの命令を埋め込むだけなので簡単です。
<div class="language-switcher">
<!-- 日本語への切り替えリンク -->
<a href="{{ route(Route::currentRouteName(), ['locale' => 'ja']) }}" class="btn btn-primary">
<i class="bi bi-translate"></i> 日本語
</a>
<!-- 英語への切り替えリンク -->
<a href="{{ route(Route::currentRouteName(), ['locale' => 'en']) }}" class="btn btn-secondary">
<i class="bi bi-globe"></i> English
</a>
</div>
<p class="mt-3">
現在の設定言語: <strong>{{ App::getLocale() }}</strong>
</p>
Route::currentRouteName() は、現在表示しているページの「名前」を取得する便利な機能です。
これを使うことで、どのページにいてもそのページの日本語版や英語版へ一瞬でジャンプできるリンクが完成します。
Bootstrapのクラスを使えば、見た目もプロっぽく仕上げることが可能です。
6. 言語ファイルの作成と表示の切り替え
URLの設定が終わったら、最後に実際の文字を切り替える準備をしましょう。
Laravelでは lang というフォルダの中に言語ごとのフォルダを作り、そこに翻訳データを保存します。
例えば、lang/ja/messages.php と lang/en/messages.php を作成します。
連想配列という形式を使って、キー(名前)と値(実際の文章)をペアにして保存します。 初心者の方は「単語帳」をイメージしてください。左側に共通の名前、右側にそれぞれの言語の言葉が書いてある状態です。
// lang/ja/messages.php の中身
return [
'welcome' => 'ようこそ、私たちのサイトへ!',
'description' => 'プログラミング初心者の方でも安心して学べる環境を提供します。',
];
// lang/en/messages.php の中身
return [
'welcome' => 'Welcome to our website!',
'description' => 'We provide an environment where even beginners can learn with confidence.',
];
画面で表示するときは、__('ファイル名.キー') という短い命令を使います。
URLが /ja/ なら日本語ファイルから、/en/ なら英語ファイルから自動で文字が引っ張ってこられます。
これで、一つのプログラムファイルで複数の言語に対応した素晴らしいWebサイトが完成します。
7. URLパラメータを利用する際の注意点
多言語対応を導入する際に気をつけたいのが、全てのリンクを正しく更新することです。
URLの構造が変わるため、今まで /about でアクセスできていたページは、必ず /ja/about や /en/about のように言語パラメータが必要になります。
もし、特定のページだけ言語パラメータを付けたくない場合は、ルートグループの外側にその設定を書く必要があります。
また、画像やCSSファイルなどの静的ファイルは、通常多言語化の対象外ですので、これらを読み込むURLに {locale} を含めないよう注意しましょう。
最後に、検索エンジンへの配慮として、HTMLの <head> タグ内に hreflang というタグを設定することをお勧めします。
これは「このページの英語版はこちらですよ」とGoogleに教えてあげるための目印になります。
こうした細かい積み重ねが、Webサイトの信頼性とアクセスアップに繋がります。
まとめ
今回の記事では、Laravelを用いた多言語対応(ローカリゼーション)の基礎から、実践的なURLパラメータの活用方法、そしてミドルウェアによる効率的な言語切り替え管理までを詳しく解説してきました。Webアプリケーションを世界中のユーザーに届けるためには、単に文字を翻訳するだけでなく、検索エンジンが各言語のコンテンツを正しく認識できる構造にすることが不可欠です。
多言語対応の重要ポイントの振り返り
多言語サイトを構築する上で最も重要なのは、ユーザーがどの言語を選択しているかをシステムが常に把握し、適切なコンテンツを出し分ける仕組み作りです。Laravelの標準機能を活用することで、複雑な条件分岐を書くことなく、スマートに言語設定を管理できます。
- URLパラメータの活用:
/{locale}/形式を採用することで、SEO効果を高め、ユーザーがURLを見ただけで現在の言語を把握できるようにします。 - ミドルウェアの導入: 全てのルートで共通の言語設定処理を自動化し、開発効率を大幅に向上させます。
- ルートグループの利用: プレフィックス(prefix)設定により、URL設計の一貫性を保ちます。
- 言語ファイルの分離:
langフォルダ内で日本語や英語のテキストを管理し、保守性の高いコードを実現します。
実践的な実装コードの再確認
実際のプロジェクトで役立つ、さらに踏み込んだ実装例を紹介します。例えば、言語パラメータがURLに含まれていない場合に、ブラウザの言語設定を自動で判別してリダイレクトさせる処理などは、ユーザー体験(UX)を向上させるために非常に有効です。
下記は、コントローラーやミドルウェア内で現在の言語設定に基づいた動的な処理を行う際のサンプルコードです。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class PageController extends Controller
{
/**
* 多言語対応したトップページを表示するメソッド
*/
public function index(Request $request, $locale)
{
// 現在のアプリロケールを取得して確認
$currentLocale = App::getLocale();
// 特定の言語の時だけ特別なデータを取得する例
$newsItems = [];
if ($currentLocale === 'ja') {
$newsItems = ['お知らせ1', 'お知らせ2'];
} else {
$newsItems = ['News 1', 'News 2'];
}
return view('top', compact('newsItems'));
}
}
また、ビュー(Blade)側で言語を切り替えるスイッチをより実用的にデザインする場合、Bootstrap 5のドロップダウンメニューを活用すると、非常に洗練された印象になります。
<div class="dropdown">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" id="languageMenu" data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-translate"></i> {{ strtoupper(App::getLocale()) }}
</button>
<ul class="dropdown-menu" aria-labelledby="languageMenu">
<li>
<a class="dropdown-item" href="{{ route(Route::currentRouteName(), array_merge(request()->route()->parameters(), ['locale' => 'ja'])) }}">
<i class="bi bi-flag"></i> 日本語
</a>
</li>
<li>
<a class="dropdown-item" href="{{ route(Route::currentRouteName(), array_merge(request()->route()->parameters(), ['locale' => 'en'])) }}">
<i class="bi bi-flag"></i> English
</a>
</li>
</ul>
</div>
SEOとユーザビリティを高めるためのヒント
検索エンジン(Googleなど)に多言語サイトを正しくインデックスさせるためには、HTMLの head セクション内に link rel="alternate" タグを設置することが強く推奨されます。これにより、重複コンテンツと見なされるリスクを回避し、地域ごとの検索結果に適切な言語のページを表示させることができます。
Laravelの多言語対応は、単なる翻訳機能にとどまらず、グローバル展開を視野に入れたWeb開発において強力な武器となります。今回学んだ「URLパラメータによる言語管理」は、スケーラブルなシステムを構築するための第一歩です。ここからさらに、データベースの多言語化や、日付・通貨のフォーマット変更など、各地域の文化に合わせた「真のローカリゼーション」へとステップアップしていきましょう。
生徒
「先生、今回のまとめを読んで、URLに言語コードを入れることのメリットがさらによく分かりました!ただ翻訳するだけじゃなくて、検索エンジンのことも考えないといけないんですね。」
先生
「その通りです。Googleなどの検索エンジンは、URLが分かれていることで『これは日本語版』『これは英語版』と区別しやすくなるんですよ。SEO対策の基本ですね。」
生徒
「ミドルウェアの中で URL::defaults を使ったのが印象的でした。あれのおかげで、一度設定してしまえば、サイト内のリンクをいちいち書き換えなくて済むので楽ちんですね!」
先生
「素晴らしいところに気づきましたね!プログラミングでは『同じことを繰り返さない(DRYの原則)』が大切です。自動で言語を引き継ぐ仕組みは、大規模なサイトになればなるほど威力を発揮しますよ。」
生徒
「Bootstrap 5のドロップダウンを使った言語切り替えも、自分のポートフォリオサイトに取り入れてみたいと思います。見た目もかっこよくなりそうです!」
先生
「ぜひやってみてください。多言語対応ができるようになると、作れるサイトの幅が一気に世界中へ広がります。これからも一つずつ着実に技術を積み上げていきましょうね。」