イントロダクション
Laravelのローカリゼーション機能はアプリケーションで多言語をサポートできるように、様々な言語の文字列を便利に取得できる方法を提供します。
言語の文字列はresources/lang
ディレクトリ下のファイルに保存します。このディレクトリの中にアプリケーションでサポートする言語のディレクトリを設置します。
/resources
/lang
/en
messages.php
/es
messages.php
全ての言語ファイルはシンプルにキーと文字列の配列をリターンします。例を見てください。
<?php
return [
'welcome' => 'Welcome to our application'
];
ロケールの設定
アプリケーションのデフォルト言語はconfig/app.php
設定ファイルで指定します。もちろんこの値はアプリケーションに合うように変更できます。さらにApp
ファサードのsetLocale
メソッドを使い、実行時にアクティブな言語を変更することもできます。
Route::get('welcome/{locale}', function ($locale) {
App::setLocale($locale);
//
});
現時点のロケールとして指定した言語の言語行が存在しない場合に使用される、「フォールバック言語」を設定することもできます。デフォルト言語と同様に、フォールバック言語もconfig/app.php
設定ファイルで指定されます。
'fallback_locale' => 'en',
現在のロケール判定
現在のロケールを調べたり、特定のロケールであるかを判定したりするには、App
ファサードのgetLocale
やisLocale
を使います。
$locale = App::getLocale();
if (App::isLocale('en')) {
//
}
言語行の取得
言語ファイルから行を取得するにはtrans
ヘルパ関数を使用します。trans
メソッドはファイルと言語行を第1引数として受け取ります。たとえばresources/lang/messages.php
言語ファイルのwelcome
言語行を取得してみましょう。
echo trans('messages.welcome');
もちろん、Bladeテンプレートエンジンを使っていれば、翻訳行を表示するために{{ }}
記法が使えますし、さらに@lang
も使用できます。
{{ trans('messages.welcome') }}
@lang('messages.welcome')
指定した言語行が存在していない場合、trans
関数はただ言語行のキーを返します。ですから前記の例で言語行が存在していなければ、trans
関数はmessages.welcome
をリターンします。
言語行のパラメータ置換
お望みなら言語行でプレースホルダを定義することもできます。全プレースホルダは:
のプレフィックスが付きます。たとえばnameプレースホルダ付きの歓迎メッセージの例をご覧ください。
'welcome' => 'Welcome, :name',
取得する言語行のプレースホルダを置き換えるには、trans
関数の第2引数に対象の配列を指定してください。
echo trans('messages.welcome', ['name' => 'dayle']);
プレースホルダを全部大文字にするか、最初の一文字を大文字にすると、その方法に合わせて値が大文字に変換されます。
'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle
複数形化
複数形化は複雑な問題であり、異なった言語において多種複雑な複数形化のルールが存在しています。「パイプ」記号の縦線を使うことで、単数形の文字列と複数形の文字列を分けることができます。
'apples' => 'There is one apple|There are many apples',
言語行に複数形化オプションが存在する場合は、trans_choice
関数に「数」を指定し、行を取得します。以下の例では数が1より大きので、複数形の言語行が返されます。
echo trans_choice('messages.apples', 10);
Laravelの翻訳にはパワフルなSymfony Translationコンポーネントを使用しているため、複数の範囲を言語行に指定することで、もっと便利な複数形化のルールも簡単に作成できます。
'apples' => '{0} There are none|[1,19] There are some|[20,Inf] There are many',
パッケージの言語ファイルのオーバーライド
いくつかのパッケージではそれ自身の言語ファイルが提供されています。出力される文言を調整するためパッケージのコアをハックする代わりに、resources/lang/vendor/{パッケージ}/{ロケールコード}
ディレクトリにファイルを設置することで、オーバーライドできます。
たとえばskyrim/hearthfire
という名前のパッケージが持っているmessages.php
の英語の言語行をオーバーライドする必要があるなら、resources/lang/vendor/hearthfire/en/messages.php
に言語ファイルを設置します。このファイルには置き換えたい言語行の定義だけを設置することができます。オーバーライドしなかった言語行は、パッケージのオリジナルな言語ファイル中の定義のままロードされます。