はじめに
まず、Laravel9に関しては、以前まとめましたので以下の記事をご覧ください。
Laravel9をぼちぼち使い始めていますが、今回はLangファイルについてうまく動作しない場合の対応をまとめました。
他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。
【紹介】個人開発
私の個人開発ですがQuiphaというサービスを開発しました。(Laravel, Vue3など)
良かったら、会員登録して動作を試してみて下さい。
また、Laravel 9 実践入門という書籍を出版しました。
Kindle Unlimitedを契約している方であれば、読み放題で無料でご覧いただくことができます。
Langフォルダについて
Laravel8と9ですが、Langフォルダの場所が変更になっています。
結論からですが、「resources\lang\」フォルダを優先しており、そちらのフォルダが存在する場合、「lang\」フォルダの方が読み込まれません。
なお、Laravel10の場合はデフォルトでLangフォルダがありません。
以下のコマンドで作成できます。
php artisan lang:publish
初期状態の確認
まずは、初期状態で動作確認を行います。
以下のコマンドでLaravelプロジェクトを作成します。
$ curl -s https://laravel.build/laravel9-app-sample | bash
$ cd laravel9-app-sample/
Laravel Sailを使いプロジェクトを作成していますが、詳しくは以下の記事をご覧ください。
Sailを起動します。
$ sail up -d
以下のURLにアクセスします。
http://localhost
Laravelの起動画面が表示されました。
langフォルダについて、初期状態では以下のファイルが存在しました。
lang\
en\
auth.php
pagination.php
passwords.php
validation.php
動作確認するためにルーティングを追加します。
Route::get('/lang', function () {
return view('lang');
});
以下のファイルを作成します。
中身はLangファイルのメッセージを表示するようにしています。
{{ __('validation.accepted') }}
http://localhost/lang
画面に以下の文字列が表示されました。
正しくLangファイルを認識しています。
Langフォルダを作成
以下の場所にフォルダを作成します。
これはLaravel8のLangフォルダと同じ場所です。
resources\lang
この状態で先ほどと同じURLにアクセスします。
今度はメッセージではなく、Langのキーがそのまま表示されました。
Langファイルを認識していません。
注意が必要なケース
Composerパッケージが対応していない場合
例えば以下のパッケージの導入を考えてみます。
導入や詳しい解説は以下の記事をご覧ください。
この導入時に、コマンドを実行してBladeやLangファイルをコピーします。
現時点では、「resources\lang」フォルダの方へコピーが行われます。
(今後は改善されるかもしれません)
その場合は、「lang\」フォルダの方へ移動し、「resources\lang」を削除すると大丈夫です。
Laravel8から移行した場合
Laravel8のプロジェクトをLaravel9に移行した際も注意しましょう。
どちからのLangフォルダに統一しましょう。
Laravelの処理の確認
実際にLaravelのソースを確認しましょう。
vendor\laravel\framework\src\Illuminate\Foundation\Application.php
以下の関数で判定していました。
18行目で、「resources\lang」フォルダが存在すれば、そちらを優先して返却しているのが分かります。
/**
* Bind all of the application paths in the container.
*
* @return void
*/
protected function bindPathsInContainer()
{
$this->instance('path', $this->path());
$this->instance('path.base', $this->basePath());
$this->instance('path.config', $this->configPath());
$this->instance('path.public', $this->publicPath());
$this->instance('path.storage', $this->storagePath());
$this->instance('path.database', $this->databasePath());
$this->instance('path.resources', $this->resourcePath());
$this->instance('path.bootstrap', $this->bootstrapPath());
$this->useLangPath(value(function () {
if (is_dir($directory = $this->resourcePath('lang'))) {
return $directory;
}
return $this->basePath('lang');
}));
}
さいごに
今回は、Laravel9のLangフォルダの挙動について確認しました。
もしうまく認識しない場合は確認しましょう。
他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。
コメント