自分だけのクイズ作成 - Quipha公開中

【Laravel9】Langファイルを認識しない場合の対応

Laravel
スポンサーリンク

はじめに

先日Laravel9が公開されました。
Laravel9に関しては、以前まとめましたので以下の記事をご覧ください。

Laravel9をぼちぼち使い始めていますが、今回はLangファイルについてうまく動作しない場合の対応をまとめました。

他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。

使用するバージョンなど
  • Windows 11 or macOS Monterey (M1)
  • Laravel 9

【紹介】個人開発

私の個人開発ですがQuiphaというサービスを開発しました。(Laravel, Vue3など)
良かったら、会員登録して動作を試してみて下さい。

また、Laravel 9 実践入門という書籍を出版しました。
Kindle Unlimitedを契約している方であれば、読み放題で無料でご覧いただくことができます

是非多くの方に読んでいただき、Laravelの開発に少しでもお役に立てたら幸いです。

Langフォルダについて

Laravel8と9ですが、Langフォルダの場所が変更になっています。

  • Laravel8: resources\lang\
  • Laravel9: lang\

結論からですが、「resources\lang\」フォルダを優先しており、そちらのフォルダが存在する場合、「lang\」フォルダの方が読み込まれません

初期状態の確認

まずは、初期状態で動作確認を行います。
以下のコマンドでLaravelプロジェクトを作成します。

$ curl -s https://laravel.build/laravel9-app-sample | bash
$ cd laravel9-app-sample/

「laravel9-app-sample」はプロジェクト名ですので、任意で指定してください。

Laravel Sailを使いプロジェクトを作成していますが、詳しくは以下の記事をご覧ください。

Windows
Mac

Sailを起動します。

$ sail up -d

以下のURLにアクセスします。

http://localhost

Laravelの起動画面が表示されました。

langフォルダについて、初期状態では以下のファイルが存在しました。

lang\
  en\
    auth.php
    pagination.php
    passwords.php
    validation.php

動作確認するためにルーティングを追加します。

routes\web.php
Route::get('/lang', function () {
    return view('lang');
});

以下のファイルを作成します。
中身はLangファイルのメッセージを表示するようにしています。

resources\views\lang.blade.php
{{ __('validation.accepted') }}

validation.phpの中の「accepted」キーのメッセージを表示します。

http://localhost/lang

画面に以下の文字列が表示されました。
正しくLangファイルを認識しています。

スポンサーリンク

Langフォルダを作成

以下の場所にフォルダを作成します。
これはLaravel8のLangフォルダと同じ場所です。

resources\lang

この状態で先ほどと同じURLにアクセスします。
今度はメッセージではなく、Langのキーがそのまま表示されました。
Langファイルを認識していません

「resources\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について解説している記事がありますのでご覧ください。

\オススメ/

コメント

タイトルとURLをコピーしました