はじめに

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

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

Laravelは翻訳文字列を管理する2つの方法を提供します。まず、言語文字列はアプリケーションのlangディレクトリ内のファイルに保存できます。このディレクトリ内には、アプリケーションがサポートする各言語のサブディレクトリがある場合があります。これは、バリデーションエラーメッセージなどのLaravelの組み込み機能の翻訳文字列を管理するためにLaravelが使用するアプローチです:

  1. /lang
  2. /en
  3. messages.php
  4. /es
  5. messages.php

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

  1. /lang
  2. en.json
  3. es.json

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

言語ファイルの公開

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

  1. php artisan lang:publish

ロケールの設定

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

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

  1. ``````php
  2. use Illuminate\Support\Facades\App;
  3. Route::get('/greeting/{locale}', function (string $locale) {
  4. if (! in_array($locale, ['en', 'es', 'fr'])) {
  5. abort(400);
  6. }
  7. App::setLocale($locale);
  8. // ...
  9. });
  10. `

現在のロケールの決定

現在のロケールを決定したり、ロケールが特定の値であるかどうかを確認するために、currentLocaleおよびisLocaleメソッドをAppファサードで使用できます:

  1. use Illuminate\Support\Facades\App;
  2. $locale = App::currentLocale();
  3. if (App::isLocale('en')) {
  4. // ...
  5. }

複数形の言語

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

  1. use Illuminate\Support\Pluralizer;
  2. /**
  3. * Bootstrap any application services.
  4. */
  5. public function boot(): void
  6. {
  7. Pluralizer::useLanguage('spanish');
  8. // ...
  9. }

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

翻訳文字列の定義

短いキーの使用

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

  1. /lang
  2. /en
  3. messages.php
  4. /es
  5. messages.php

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

  1. <?php
  2. // lang/en/messages.php
  3. return [
  4. 'welcome' => 'Welcome to our application!',
  5. ];

地域によって異なる言語の場合、ISO 15897に従って言語ディレクトリの名前を付けるべきです。例えば、「en_GB」は「en-gb」ではなく、イギリス英語に使用されるべきです。

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

翻訳可能な文字列が多数あるアプリケーションでは、すべての文字列を「短いキー」で定義すると、ビューでキーを参照する際に混乱を招く可能性があり、アプリケーションがサポートするすべての翻訳文字列に対してキーを継続的に考案するのは面倒です。

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

  1. {
  2. "I love programming.": "Me encanta programar."
  3. }

キー/ファイルの競合

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

翻訳文字列の取得

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

  1. echo __('messages.welcome');

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. use Illuminate\Support\Facades\Lang;
  2. use Money\Money;
  3. /**
  4. * Bootstrap any application services.
  5. */
  6. public function boot(): void
  7. {
  8. Lang::stringable(function (Money $money) {
  9. return $money->formatTo('en_GB');
  10. });
  11. }

複数形

複数形は複雑な問題であり、異なる言語には複数形に関するさまざまな複雑なルールがあります。ただし、Laravelは、定義した複数形のルールに基づいて文字列を異なる方法で翻訳するのに役立ちます。|文字を使用して、文字列の単数形と複数形を区別できます:

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

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

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

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

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

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

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

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

  1. 'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',
  2. echo trans_choice('time.minutes_ago', 5, ['value' => 5]);
  1. ``````php
  2. 'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',
  3. `

パッケージ言語ファイルのオーバーライド

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

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