問題
CakePHP に Fixture Factories を導入しようとしていた。 Faker が利用できるので、日本語化しようと思ったがどうもうまくいかない。
原因と解決
defaultLocale がハイフン区切りの ja-JP
になっていた。
アンダースコア区切りの ja_JP
を指定することで解決した。
詳細
Fixture Factories で使用する Faker は、 I18n::getLocale()
で取得した Locale を使用するようになっている。
なので、アプリケーション側で設定されている Locale が自動的に適用される。
今回は CakePHP 側で Locale 設定していたが、アンダースコアの ja_JP
ではなく、 ja-JP
になっていた。
処理を追っていくと、適用する Locale のプロバイダーがアンダースコア形式になっているのが前提のためだった。
- https://github.com/FakerPHP/Faker/blob/v1.19.0/src/Faker/Factory.php#L36-L51
- https://github.com/FakerPHP/Faker/blob/v1.19.0/src/Faker/Factory.php#L59-L68
備忘
原因としては分かったけれど、アンダースコアかハイフンかって、なにか仕様とか規格で決まってるのかなぁと思って調べてみた。
これ!という決定的な情報は見つからなかったんだけれども、どうやら Unix / Linux 系の言語設定ではアンダースコア区切りらしい。
locale
コマンドや、LANG
環境変数を確認すると ja_JP.UTF-8
のようになっている。(まぁ自分の設定次第ではあるが)
ところが RFC5646 で言語タグのフォーマットを見てみると、ハイフン区切りで定義されている。
この辺で間違いが起こりやすいのかもしれない。
CakePHP の国際化のドキュメントでは en_US
とか fr_FR
のようなアンダースコア形式がサンプルの中で用いられているので、アンダースコアで設定するのが正攻法で間違いなさそう。