本文へ移動
Laravel Tips

多言語対応(ローカライズ)

アプリを複数の言語に対応させる多言語対応(ローカライズ)で、言語ファイルの作り方、言葉の取り出し方、置きかえ、単数と複数の使い分けを説明します。

多言語対応(ローカライズ)は、アプリに出す文字を、使う人の言語に合わせて切りかえるしくみです。たとえば、同じ「ようこそ」の場所に、日本語の人には「ようこそ」、英語の人には「Welcome」と出せます。そのために、言語ごとの言葉を別のファイルにまとめておき、必要なときに取り出します。

言葉のファイルの管理のしかたは2つあります。1つ目は、言語ごとのフォルダを作り、PHP のファイルに言葉を書く方法です。バリデーション(入力のチェック)のエラーの文など、Laravel の機能に入っている言葉も、この方法で管理されています。

text
/lang
    /en
        messages.php
    /es
        messages.php

2つ目は、言語ごとに1つの JSON ファイルを作る方法です。言葉がたくさんあるアプリでは、こちらがすすめられています。

text
/lang
    en.json
    es.json

補足

新しい Laravel のアプリには、はじめは lang フォルダがありません。Laravel の言語ファイルを直したいときは、次の節の lang:publish コマンドで取り出します。

言語ファイルを取り出す#

lang フォルダがないアプリで、Laravel の言語ファイルを直したり、自分の言語ファイルを作ったりするときは、lang:publish という Artisan コマンド(php artisan で動かすコマンド)で、lang フォルダを作ります。このコマンドは、lang フォルダを作り、Laravel が使う初期の言語ファイルも取り出します。

bash
php artisan lang:publish

使う言語を決める#

アプリの初期の言語は、config/app.php の locale に書かれています。ふつうは、環境変数(環境ごとに変える設定値)の APP_LOCALE で決めます。アプリに合わせて、変えられます。

「予備の言語」(フォールバック)も決められます。初期の言語に、ほしい言葉がないときに、使われます。これも config/app.php にあり、ふつうは APP_FALLBACK_LOCALE で決めます。

1回のリクエストのあいだだけ、初期の言語を変えるには、App ファサード(Route::get() のように、クラス名と :: で機能を呼べる窓口)の setLocale メソッドを使います。

php
use Illuminate\Support\Facades\App;

Route::get('/greeting/{locale}', function (string $locale) {
    if (! in_array($locale, ['en', 'es', 'fr'])) {
        abort(400);
    }

    App::setLocale($locale);

    // ...
});

いまの言語を調べる#

App ファサードの currentLocale と isLocale で、いまの言語を調べたり、ある言語かを確かめたりできます。

php
use Illuminate\Support\Facades\App;

$locale = App::currentLocale();

if (App::isLocale('en')) {
    // ...
}
メソッド 説明
setLocale そのリクエストのあいだの言語を変える
currentLocale いまの言語を返す
isLocale いまの言語が、指定した言語かを調べる

複数形にするときの言語#

Eloquent など、Laravel の一部では、「単語を複数形にする」しくみ(プルーラライザー)が使われます。これは、はじめは英語の決まりで動きます。英語以外にもできます。サービスプロバイダ(アプリの起動のときに、道具箱へ道具を登録する場所)の boot メソッドで、useLanguage を呼びます。使える言語は、french・norwegian-bokmal・portuguese・spanish・turkish です。

php
use Illuminate\Support\Pluralizer;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Pluralizer::useLanguage('spanish');

    // ...
}

注意

プルーラライザーの言語を変えたときは、Eloquent のモデル(データベースの表を、PHP から扱いやすくしたクラス)に、表の名前をはっきり書いてください。モデルの表の名前は、ふつうモデルの名前を複数形にして決まるので、言語を変えると、ちがう名前になるおそれがあるからです。

言葉を決める#

短いキーで決める#

言葉は、ふつう、lang フォルダの中のファイルに書きます。アプリが対応する言語ごとに、フォルダを作ります。

text
/lang
    /en
        messages.php
    /es
        messages.php

言語ファイルは、キーと言葉の組の配列を返します。

php
<?php

// lang/en/messages.php

return [
    'welcome' => 'Welcome to our application!',
];

注意

地域によって言葉が変わる言語は、フォルダの名前を ISO 15897 の形にします。たとえば、イギリス英語は、en-gb ではなく en_GB とします。

文そのものをキーにする#

言葉がたくさんあるアプリでは、短いキーで全部の言葉を決めると、ビューで使うときに分かりにくくなります。また、言葉のたびにキーを考えるのも大変です。

そのため、Laravel では、初期の言語(たとえば英語)で書いた文そのものを、キーにする方法も使えます。この形の言語ファイルは、lang フォルダの JSON ファイルです。たとえば、スペイン語の訳があるアプリでは、lang/es.json を作ります。

json
{
    "I love programming.": "Me encanta programar."
}

キーとファイルのぶつかり#

ほかの言語ファイルの名前と、ぶつかるキーを決めてはいけません。たとえば、nl/action.php というファイルがあり、nl.json がないときに、nl の言語で __('Action') を使うと、nl/action.php の中身が、まるごと返ってしまいます。

言葉を取り出す#

言語ファイルの言葉は、__ というヘルパー関数(どこからでも呼べる便利な関数)で取り出します。短いキーを使っているときは、キーが入っているファイルの名前と、キーを、ドット . でつないで渡します。たとえば、lang/en/messages.php の welcome は、次のように取り出します。

php
echo __('messages.welcome');

その言葉がないときは、__ は、渡したキーをそのまま返します。この例なら、言葉がないと、messages.welcome が返ります。

文そのものをキーにしている(前の「文そのものをキーにする」の方法)ときは、その文を __ に渡します。

php
echo __('I love programming.');

この場合も、言葉がないときは、渡したキーがそのまま返ります。

Blade テンプレート(画面の見た目を書くファイル)では、{{ }} で表示できます。

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

言葉の中の値を置きかえる#

言葉の中に、置き場所(プレースホルダー)を作れます。置き場所は、: で始めます。たとえば、名前を入れる、あいさつの言葉です。

php
'welcome' => 'Welcome, :name',

取り出すときに、__ の2つ目の引数へ、置きかえる値の配列を渡します。

php
echo __('messages.welcome', ['name' => 'dayle']);

置き場所が、全部大文字、または頭だけ大文字のときは、置きかえる値も、それに合わせて大文字になります。

php
'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle

オブジェクトの置きかえ方#

置き場所へ、オブジェクトを渡すと、そのオブジェクトの __toString メソッド(PHP が、オブジェクトを文字にするときに呼ぶ決まったメソッド)が呼ばれます。でも、外のライブラリのクラスなど、自分で __toString を直せないことがあります。

そんなときは、そのオブジェクトの表し方を、登録できます。翻訳の係(トランスレーター)の stringable メソッドに、関数を渡します。その関数の引数には、表し方を決めたいオブジェクトの型を書きます。ふつうは、AppServiceProvider の boot メソッドで呼びます。

php
use Illuminate\Support\Facades\Lang;
use Money\Money;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Lang::stringable(function (Money $money) {
        return $money->formatTo('en_GB');
    });
}

単数と複数の使い分け#

単数と複数の決まりは、言語によってさまざまで、難しい問題です。Laravel では、自分で決めた決まりに従って、言葉を変えられます。| で、単数と複数を分けて書きます。

php
'apples' => 'There is one apple|There are many apples',

文そのものをキーにする方法でも使えます。

json
{
    "There is one apple|There are many apples": "Hay una manzana|Hay muchas manzanas"
}

数の範囲ごとに、言葉を決める、込み入った決まりも作れます。

php
'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',

複数の形がある言葉を決めたら、trans_choice 関数で、数に合った言葉を取り出します。この例では、数が 1 より大きいので、複数の形が返ります。

php
echo trans_choice('messages.apples', 10);

単数と複数の言葉にも、置き場所を使えます。trans_choice の3つ目の引数へ、配列を渡して置きかえます。

php
'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',

echo trans_choice('time.minutes_ago', 5, ['value' => 5]);

trans_choice に渡した数そのものを表示したいときは、:count という置き場所を使えます。

php
'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',
書き方 説明
A|B | で、単数の言葉と、複数の言葉を分ける
{0} 数がちょうど 0 のときの言葉
{1} 数がちょうど 1 のときの言葉
[1,19] 数が 1 から 19 のときの言葉
[20,*] 数が 20 以上のときの言葉(* は「その先ずっと」)
:count trans_choice に渡した数に置きかわる

パッケージの言語ファイルを上書きする#

パッケージ(ほかの人が作った、部品の集まり)には、パッケージ自身の言語ファイルが入っていることがあります。言葉を少し変えたいとき、パッケージの元のファイルを直す必要はありません。lang/vendor/{package}/{locale} に、上書きするファイルを置けます。

たとえば、skyrim/hearthfire というパッケージの messages.php の英語の言葉を上書きするなら、lang/vendor/hearthfire/en/messages.php にファイルを置きます。このファイルには、上書きしたい言葉だけを書きます。上書きしない言葉は、パッケージの元の言語ファイルから読まれます。

関連するページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧