メインコンテンツまでスキップ

ローカライゼーション

はじめに

注記

Laravelアプリケーションのスケルトンにはデフォルトで lang ディレクトリが含まれていません。Laravelの言語ファイルをカスタマイズしたい場合は、lang:publish Artisanコマンドを使用して公開することができます。

Laravelのローカライゼーション機能は、さまざまな言語の文字列を取得する便利な方法を提供し、アプリケーション内で複数の言語を簡単にサポートできるようにします。

Laravelでは、翻訳文字列を管理するための2つの方法が提供されています。まず、言語文字列はアプリケーションの lang ディレクトリ内のファイルに保存されることがあります。このディレクトリ内には、アプリケーションでサポートされている各言語用のサブディレクトリがあるかもしれません。これは、Laravelがビルトインの機能(例:バリデーションエラーメッセージ)の翻訳文字列を管理するために使用するアプローチです:

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

また、翻訳文字列は、lang ディレクトリ内に配置されたJSONファイル内で定義することもできます。このアプローチを取る場合、アプリケーションでサポートされている各言語に対応するJSONファイルがこのディレクトリ内に配置されます。このアプローチは、多数の翻訳可能な文字列を持つアプリケーションにおすすめです:

    /lang
en.json
es.json

このドキュメントでは、翻訳文字列を管理する各アプローチについて説明します。

言語ファイルの公開

デフォルトでは、Laravelアプリケーションのスケルトンには lang ディレクトリが含まれていません。Laravelの言語ファイルをカスタマイズしたい場合や独自の言語ファイルを作成したい場合は、lang:publish Artisanコマンドを使用して lang ディレクトリをスキャフォールドする必要があります。lang:publish コマンドは、アプリケーションに lang ディレクトリを作成し、Laravelで使用されるデフォルトの言語ファイルセットを公開します:

php artisan lang:publish

ロケールの設定

アプリケーションのデフォルト言語は、通常は APP_LOCALE 環境変数を使用して設定される config/app.php 構成ファイルの locale 構成オプションに保存されます。この値をアプリケーションのニーズに合わせて変更することができます。

デフォルト言語に加えて、指定された翻訳文字列がデフォルト言語に含まれていない場合に使用される "フォールバック言語" を構成することもできます。デフォルト言語と同様に、フォールバック言語も config/app.php 構成ファイルで構成され、その値は通常は APP_FALLBACK_LOCALE 環境変数を使用して設定されます。

App ファサードが提供する setLocale メソッドを使用して、実行時に単一のHTTPリクエストのデフォルト言語を変更することができます:

    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 メソッドを使用して、現在のロケールを決定したり、ロケールが特定の値であるかどうかを確認したりすることができます:

    use Illuminate\Support\Facades\App;

$locale = App::currentLocale();

if (App::isLocale('en')) {
// ...
}

複数言語

Eloquentやフレームワークの他の部分で使用される「複数形変換」を行うLaravelの「複数形変換子」に、英語以外の言語を使用するよう指示することができます。これは、アプリケーションのサービスプロバイダの boot メソッド内で useLanguage メソッドを呼び出すことで実現できます。現在サポートされている複数形変換子の言語は、frenchnorwegian-bokmalportuguesespanishturkishです:

    use Illuminate\Support\Pluralizer;

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

// ...
}

警告

複数形変換子の言語をカスタマイズする場合は、Eloquentモデルの テーブル名 を明示的に定義する必要があります。

翻訳文字列の定義

ショートキーの使用

通常、翻訳文字列はlangディレクトリ内のファイルに保存されます。このディレクトリ内には、アプリケーションでサポートされている各言語用のサブディレクトリがあるはずです。これは、Laravelがビルトインの機能(たとえば、バリデーションエラーメッセージ)の翻訳文字列を管理するために使用するアプローチです。

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

すべての言語ファイルは、キー付き文字列の配列を返します。例:

    <?php

// lang/en/messages.php

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

警告

地域によって異なる言語の場合、言語ディレクトリはISO 15897に従って命名する必要があります。たとえば、イギリス英語の場合は「en_GB」を使用する必要があり、「en-gb」ではなく。

キーとして翻訳文字列を使用する

多くの翻訳可能な文字列を持つアプリケーションでは、すべての文字列を「ショートキー」で定義すると、ビューでキーを参照する際に混乱し、アプリケーションでサポートされるすべての翻訳文字列に対して継続的にキーを発明するのは手間がかかります。

このため、Laravelでは、翻訳文字列を「デフォルト」の翻訳としてキーとして定義するサポートも提供されています。翻訳文字列をキーとして使用する言語ファイルは、langディレクトリ内のJSONファイルとして保存されます。たとえば、アプリケーションにスペイン語の翻訳がある場合は、lang/es.jsonファイルを作成する必要があります。

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

キーとファイルの競合

他の翻訳ファイル名と競合する翻訳文字列キーを定義すべきではありません。たとえば、「NL」ロケールの__('Action')を翻訳する際に、nl/action.phpファイルが存在するがnl.jsonファイルが存在しない場合、翻訳者はnl/action.phpの全内容を返します。

翻訳文字列の取得

__ヘルパー関数を使用して言語ファイルから翻訳文字列を取得できます。翻訳文字列を定義する際に「ショートキー」を使用している場合は、__関数に「ドット」構文を使用してキーを含むファイルとキー自体を渡す必要があります。たとえば、lang/en/messages.php言語ファイルからwelcome翻訳文字列を取得しましょう。

    echo __('messages.welcome');

指定された翻訳文字列が存在しない場合、__ 関数は翻訳文字列キーを返します。したがって、上記の例を使用すると、翻訳文字列が存在しない場合、__ 関数は messages.welcome を返します。

翻訳文字列をキーとして使用する場合は、文字列のデフォルト翻訳を __ 関数に渡す必要があります。

    echo __('I love programming.');

同様に、翻訳文字列が存在しない場合、__ 関数は与えられた翻訳文字列キーを返します。

Blade テンプレートエンジンを使用している場合は、{{ }} エコーシンタックスを使用して翻訳文字列を表示できます:

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

翻訳文字列内のパラメータの置換

必要であれば、翻訳文字列内にプレースホルダーを定義することができます。すべてのプレースホルダーは : で接頭辞が付けられます。たとえば、プレースホルダー名を持つウェルカムメッセージを定義できます:

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

翻訳文字列を取得する際にプレースホルダーを置換するには、__ 関数の第二引数として置換の配列を渡すことができます:

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

プレースホルダーがすべて大文字であるか、最初の文字だけが大文字である場合、翻訳された値もそれに応じて大文字になります:

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

オブジェクトの置換フォーマット

翻訳プレースホルダーとしてオブジェクトを提供しようとすると、オブジェクトの __toString メソッドが呼び出されます。__toString メソッドは PHP の組み込みの "マジックメソッド" の1つです。ただし、サードパーティのライブラリに属するクラスとやり取りしている場合など、特定のクラスの __toString メソッドを制御できない場合があります。

このような場合、Laravel ではその特定のタイプのオブジェクトに対するカスタムフォーマットハンドラを登録することができます。これを実現するためには、トランスレータの stringable メソッドを呼び出す必要があります。stringable メソッドは、そのフォーマットを担当するオブジェクトのタイプを型ヒントするクロージャを受け入れます。通常、stringable メソッドは、アプリケーションの AppServiceProvider クラスの boot メソッド内で呼び出すべきです。```

    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を使用すると、定義した複数形のルールに基づいて異なる方法で文字列を翻訳するのに役立ちます。|文字を使用して、文字列の単数形と複数形を区別することができます:

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

もちろん、翻訳文字列をキーとして使用する場合も複数形がサポートされています:

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

さらに、複数の値の範囲に対して翻訳文字列を指定するより複雑な複数形のルールを作成することもできます:

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

複数形オプションを持つ翻訳文字列を定義した後は、trans_choice 関数を使用して指定された「数」に対応する行を取得できます。この例では、数が1より大きいため、翻訳文字列の複数形が返されます:

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

複数形の文字列にプレースホルダ属性を定義することもできます。これらのプレースホルダは、trans_choice 関数の3番目の引数として配列を渡すことで置換されることができます:

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

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

trans_choice 関数に渡された整数値を表示したい場合は、組込みの :count プレースホルダを使用できます:

    'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',

パッケージ言語ファイルの上書き

一部のパッケージには独自の言語ファイルが付属している場合があります。これらの行を調整するためにパッケージのコアファイルを変更する代わりに、lang/vendor/{package}/{locale} ディレクトリにファイルを配置することでこれらを上書きすることができます。

たとえば、skyrim/hearthfire というパッケージの messages.php の英語の翻訳文字列を上書きする必要がある場合は、lang/vendor/hearthfire/en/messages.php に言語ファイルを配置する必要があります。このファイルでは、上書きしたい翻訳文字列のみを定義する必要があります。上書きしない翻訳文字列は、パッケージの元の言語ファイルから引き続き読み込まれます。