Laravel Langの使い方|langディレクトリの場所と多言語化の手順

Laravel入門

世界がますますボーダレスになり、ビジネスもグローバルな展開が求められる今日、多言語対応のウェブアプリケーションの需要が増大しています。Laravelは、PHPの人気フレームワークの一つで、多機能で柔軟な言語サポート機能を提供しています。その中でも「Laravel Lang」は多言語対応をシンプルかつ効率的に実現するためのツールです。本ガイドでは、Laravel Langの基本的な使い方から、多言語アプリケーションを構築する際のベストプラクティスまで詳しく解説し、開発者が直面する疑問を解決していきます。

Laravel Lang(laravel-lang/lang)パッケージの導入

「Laravel Lang」という名称は、Laravel本体の多言語機能を指す場合と、80以上の言語の翻訳ファイルを提供するコミュニティパッケージlaravel-lang/langを指す場合があります。パッケージ版を使うと、翻訳ファイルをゼロから書かずに導入できます。

composer require laravel-lang/lang --dev
php artisan lang:add ja

インストール後は、Artisanコマンドで言語ファイルの追加・公開・管理を行います。代表的なコマンドは以下の記事で個別に解説しています。

langディレクトリが無い場合の対処(Laravel 11以降)

Laravel 11以降のアプリケーションスケルトンには、langディレクトリが最初から含まれていません。「チュートリアル通りにlang/ja/messages.phpを探したのに見つからない」というつまずきは、ほとんどがこれが原因です。翻訳ファイルをカスタマイズしたい場合は、次のArtisanコマンドで公開します。

php artisan lang:publish

実行するとプロジェクトルートにlang/en/が生成され、validation.phpauth.phppasswords.phppagination.phpといったフレームワーク標準の翻訳ファイルを編集できるようになります。公開せずにそのまま使う場合でも、翻訳自体はフレームワーク内部のファイルが使われるため、多言語化そのものは動作します。

また、言語ファイルの置き場所はLaravel 9で変更されています。バージョンによって参照するパスが異なるため、古い記事のコードをコピーする際は注意してください。

Laravelのバージョン 言語ファイルの場所 初期状態
Laravel 8以前 resources/lang/ 最初から存在する
Laravel 9・10 lang/(プロジェクトルート直下) 最初から存在する
Laravel 11以降 lang/(プロジェクトルート直下) 存在しない(lang:publishで生成)

自分のプロジェクトがどのバージョンかは php artisan --version で確認できます。サポート期限とあわせて確認したい場合はLaravelのEOLはいつ?バージョン別サポート終了日とアップグレードの目安もあわせてご覧ください。

Laravel Langの基本

まず、多言語対応のアプリケーションを作成するために必要な基本設定と知識を確認しましょう。言語ファイルを配置するフォルダは、Laravel 9以降ではプロジェクトルート直下のlangです(Laravel 8以前はresources/lang)。この中に言語ごとのフォルダを作成し、翻訳ファイルを配置することで多言語対応が可能になります。

言語ファイルの構造

例えば、日本語と英語に対応させるためには、lang/jalang/enフォルダを作成します。各フォルダ内には翻訳する内容を含むPHPファイルを設置します。ファイルの命名は自由ですが、messages.phpvalidation.phpのように役割に沿った名称を付けるのが一般的です。

それぞれのファイルでは、配列を返す形式で翻訳キーとその翻訳を定義します。以下はシンプルな例です:

// lang/en/messages.php
return [
    'welcome' => 'Welcome to our application!',
    'goodbye' => 'Thank you for visiting.',
];

// lang/ja/messages.php
return [
    'welcome' => '私たちのアプリケーションへようこそ!',
    'goodbye' => 'ご訪問いただきありがとうございます。',
];

言語の切り替え

アプリケーション内で動的に言語を切り替えるためには、App::setLocale($locale)メソッドを使用します。ここで$localeは使用したい言語の略称(’en’, ‘ja’など)を示します。また、デフォルトの言語はconfig/app.phplocaleで設定しますが、その値はLaravel 11以降ではAPP_LOCALE環境変数から読み込まれるのが標準です。翻訳が見つからないときに使われる「フォールバック言語」もAPP_FALLBACK_LOCALEで指定できます。

# .env
APP_LOCALE=ja
APP_FALLBACK_LOCALE=en
// config/app.php(Laravel 11以降の既定)
'locale' => env('APP_LOCALE', 'en'),
'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),

.envを書き換えても反映されない場合は、設定キャッシュが残っている可能性があります。php artisan config:clear を実行してから再度確認してください。

現在のロケールを判定する

今どの言語が選択されているかは、AppファサードのcurrentLocale()isLocale()で確認できます。ビューで言語切替UIの状態を出し分けるときに便利です。

use Illuminate\Support\Facades\App;

$locale = App::currentLocale(); // 'ja'

if (App::isLocale('ja')) {
    // 日本語表示のときだけの処理
}

翻訳の利用

設定した言語ファイルの翻訳は、__('key')もしくは@lang('key')を用いることでビューやコントローラー内で利用できます。例えば、以下のようにして翻訳を取得します:

{{ __('messages.welcome') }}

多言語対応をより効率的に

Laravel Langを使った基本設定だけでも十分多言語対応が可能ですが、さらに効率的に開発を進めるための工夫もいくつか存在します。

JSONベースの翻訳

従来の翻訳ファイルに加え、LaravelはJSON形式のファイルを用いた翻訳もサポートしています。これにより、一つのファイルで複数の言語の翻訳を定義できるため、管理が容易になります。

JSONファイルはlangディレクトリ直下に配置し、言語コードをファイル名にして保存します。例えば、lang/en.jsonには次のように定義できます:

{
    "Welcome": "Welcome",
    "Goodbye": "Goodbye"
}

そしてこれらの翻訳は、他と同様に__('Welcome')といった形式で利用できるので非常に便利です。

設定による翻訳の動的切り替え

翻訳の切り替えをユーザーの選択に基づいて動的に行うためには、セッションやクッキーを使用して選択された言語を保持するのが一般的です。例えば、ユーザーが言語選択を行った際は、その情報をセッションに保存し、次回以降の表示でそのセッション情報に基づいてアプリケーション言語を設定します。

Route::get('language/{locale}', function ($locale) {
    if (! in_array($locale, ['en', 'ja'])) {
        abort(400);
    }
    session(['locale' => $locale]);
    App::setLocale($locale);
    return redirect()->back();
});

ベストプラクティス

Laravelで多言語対応を実施する際に考慮すべきポイントや、より良い実装へと導くベストプラクティスを紹介します。

翻訳キーの一貫性

翻訳キーは一貫した形式で命名し、どこで使用されているか明確になるように工夫しましょう。例えば、モジュール名や機能名を含めたキー名とすることで、組織化された管理が容易になります。

'menu.settings' => 'Settings',
'menu.home' => 'Home',

文脈を考慮した翻訳

同じ単語でも文脈によって意味が変わる場合があります。したがって、翻訳キーの命名においてもその文脈を考慮し、必要に応じて異なるキーを設けましょう。

コミュニティと連携

Laravelは非常に活発なコミュニティが存在するため、他の開発者が作成した翻訳ファイルをコミュニティ内で共有したり、既存の翻訳を利用することも可能です。「Laravel Lang」のGitHubリポジトリなどを活用し、これらの共有リソースを積極的に利用することをお勧めします。

よくある質問

Laravel Langのlangディレクトリはどこにありますか?

Laravel 9以降はプロジェクトルート直下のlangディレクトリです。Laravel 8以前はresources/langでした。さらにLaravel 11以降は初期状態でlangディレクトリ自体が存在しないため、php artisan lang:publishを実行して生成する必要があります。

「Laravel Lang」はLaravel本体の機能ですか、パッケージですか?

両方の意味で使われます。Laravel本体には__()App::setLocale()による多言語(Localization)機能が標準で備わっています。一方、コミュニティパッケージのlaravel-lang/langは、80以上の言語のバリデーションメッセージや認証メッセージの翻訳ファイルをまとめて提供するものです。日本語のバリデーションメッセージをゼロから書きたくない場合は、後者を導入すると手間を大幅に削減できます。

バリデーションメッセージだけ日本語にしたい場合は?

lang/ja/validation.phpを用意すれば、フォームのエラーメッセージだけを日本語化できます。laravel-lang/langを入れてphp artisan lang:add jaを実行すれば、翻訳済みのvalidation.phpがそのまま手に入ります。個別メッセージのカスタマイズ方法はLaravelでバリデーションエラーメッセージをカスタマイズする方法で解説しています。アプリ全体をまとめて日本語化したい場合はLaravelで簡単に日本語化する方法:手順と便利なライブラリの紹介もあわせてどうぞ。

__()と@lang()はどちらを使うべきですか?

どちらも同じ翻訳を取得しますが、現在のLaravel公式ドキュメントでは__()ヘルパが標準的な書き方として案内されています。Bladeの@lang()ディレクティブは古いコードで見かける書き方で、出力のエスケープの扱いが{{ __('...') }}と異なるため、新規に書くなら{{ __('messages.welcome') }}に統一しておくのが無難です。

翻訳キーが表示されずキー名そのままが出てしまいます

messages.welcomeのようにキー名がそのまま画面に出る場合、そのキーが現在のロケールの翻訳ファイルに存在していません。ファイルのパス(lang/{ロケール}/{ファイル名}.php)、配列のキー名、App::currentLocale()の値の3点を順に確認してください。設定キャッシュを使っている環境ではphp artisan config:clearも試す価値があります。

結論

Laravel Langを使用した多言語対応は、フレームワークの特長を最大限に活用しつつ、ユーザーに対して魅力的で使いやすいインターフェースを提供することを可能にします。正確かつ効率的な翻訳管理を行うことで、グローバルな視点を持ったアプリケーション開発を進めていきましょう。ターミナルの設定から開始し、実際の利用に至るまでのプロセスをしっかりと理解することで、より良い開発体験と結果を手に入れることができます。

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント