🗺️

Laravel localeの取得と設定する方法

2024/06/14に公開

はじめに

Laravelでlocaleの設定と取得の方法が色々あったので一覧にしてみた。

https://laravel.com/docs/11.x/localization

環境

  • PHP 8.3.8
  • laravel/framework 11.10.0
  • laravel/laravel 11.1.0

localeの定義している場所

localeはconfig/app.phplocaleに定義がある。

https://github.com/laravel/framework/blob/v11.10.0/config/app.php#L88

https://github.com/laravel/laravel/blob/v11.1.1/config/app.php#L81

つまり、configの値を取得したり、設定したりする箇所が色々あることになる。

設定と取得の方法

ざっくりと分けるとクラス、へルパ関数、もしくは、ファサードの3つの方法がある。

クラス

\Illuminate\Config\Repository::get

condif/app.phplocaleの値を取得することができる。

use Illuminate\Config\Repository;

$config = new Illuminate\Config\Repository();
$locale = $config->get('app.locale');

\Illuminate\Config\Repository::set

condif/app.phplocaleの値を設定することができる。

use Illuminate\Config\Repository;

$config = new Illuminate\Config\Repository();
$config->set('app.locale', 'ja');

実際に書き換えるわけではなく、\Illuminate\Config\Repositoryクラス内の$items配列の要素を書き換えている。

\Illuminate\Foundation\Application::getLocale

内部的には\Illuminate\Config\Repositoryクラスのgetメソッドを実行し、app.localeの値を取得している。

use Illuminate\Foundation\Application;

$application = new Application();
$locale = $application->getLocale();

\Illuminate\Foundation\Application::currentLocale

内部的には\Illuminate\Foundation\ApplicationクラスのgetLocaleメソッドを実行している。

use Illuminate\Foundation\Application;

$application = new Application();
$locale = $application->currentLocale();

\Illuminate\Foundation\Application::setLocale

内部的には\Illuminate\Config\Repositoryクラスのsetメソッドを実行し、app.localeの値を書き換えている。
さらに\Illuminate\Translation\TranslatorクラスのsetLocaleメソッドを実行している。

use Illuminate\Foundation\Application;

$application = new Application();
$application->setLocale('ja');

\Illuminate\Translation\Translator::getLocale

Illuminate\Translation\Translatorクラスのコンストラクタの第2引数で指定したlocaleを取得することができる。

use Illuminate\Translation\Translator;

$loader = new XXX(); // これは省略
$translator = new Translator($loader, 'ja');
$locale = $translator->getLocale();

サービスプロバイダの実装を確認すると、\Illuminate\Foundation\Application::getLocaleを実行しているので、config/app.phplocaleを取得することになる。

https://github.com/laravel/framework/blob/v11.10.0/src/Illuminate/Translation/TranslationServiceProvider.php#L19-L32

\Illuminate\Translation\Translator::locale

内部的には\Illuminate\Translation\TranslatorクラスのgetLocaleメソッドを実行している。

use Illuminate\Translation\Translator;

$loader = new XXX(); // これは省略
$translator = new Translator($loader, 'ja');
$locale = $translator->locale();

\Illuminate\Translation\Translator::setLocale

\Illuminate\Translation\Translatorクラスの$localeプロパティを書き換える。

use Illuminate\Translation\Translator;

$loader = new XXX(); // これは省略
$translator = new Translator($loader, 'ja');
$translator->setLocale('en');

へルパ関数、ファサード

クラスのところに書いたメソッドと使い方は同じです。

appへルパ関数、Appファサード

$locale = app()->getLocale();
$locale = app()->currentLocale();
app()->setLocale('ja');

$locale = App::getLocale();
$locale = App::currentLocale();
App::setLocale('ja');

ドキュメントではAppファサードを使っている。

configへルパ関数、Configファサード

$locale = config()->get('app.locale');
$locale = config(('app.locale');

config()->set('app.locale', 'ja');
config(['app.locale' => 'ja']);

$locale = Config::get('app.locale');
Config::set('app.locale', 'ja');

transへルパ関数、Langファサード

$locale = trans()->getLocale();
$locale = trans()->locale();
trans()->setLocale('ja');

$locale = Lang::getLocale();
$locale = Lang::locale();
Lang::setLocale('ja');

まとめ

書いてみたら色々違いがあった。

現在の言語を取得または設定の場合は\Illuminate\Foundation\Applicationappへルパ関数Appファサードのどちらかを使うのが良さそうな雰囲気を感じる結果になった。

GitHubで編集を提案

Discussion