LoginSignup
0
0

More than 1 year has passed since last update.

CakePHP4のI18nでpoの代わりにymlを使う

Posted at

環境

PHP
CakePHP 4.3.6

目的

国際化と地域化 が目的。
CakePHP4のデフォルトでは.poファイルを使うわけですが、個人的には見づらい。
というわけで.yml(.yaml)ファイルを使用したい。

準備

国際化と地域化 にもあるように、YamlFileParserを作ればいい。

\src\I18n\Parser\YamlFileParser.php
namespace App\I18n\Parser;

class YamlFileParser
{
    public function parse($file)
    {
        return yaml_parse_file($file);
    }
}

これ以上は特に何も書いていませんが・・・読み込む必要はありそうなので以下を追記。

\config\bootstrap.php
if (I18n::getLocale() == 'ja_JP') {
	I18n::setTranslator('default', new Loader('default', 'ja_JP', 'yaml'), 'ja_JP');
} else {
	I18n::setTranslator('default', new Loader('default', 'en_US', 'yaml'), 'en_US');
}

ymlファイルは通常通り設定します。

\resources\locales\ja_JP\default.yaml
key1:
  key2:
    key3: value

これで__('key1.key2.key3')という風にすればとれる・・・と思っていたのですが・・・。
yaml_parse_fileの戻り値は配列です。上記の例であれば以下のようになります。

['key1' => ['key2' => ['key3' => 'value']]]

実際どこで何をやっているのか? までは追えていないのですが、
__('key1')で値がとれてしまう。なぜなのか。

対策

ymlファイルの階層をなくして書き直す・・・のは馬鹿らしいし見づらいので組み替える。
配列をキーでつなげなおしてあげればいいかなと思ったので以下の処理を追加

\src\I18n\Parser\YamlFileParser.php
namespace App\I18n\Parser;

class YamlFileParser
{
	public function parse($file)
	{
		return $this->convert(yaml_parse_file($file));
	}

	protected function convert($data)
	{
		$new_data = [];
		foreach ($data as $key1 => $val1) {
			if (!is_array($val1)) {
				$new_data[$key1] = $val1;
			} else {
				$val1 = $this->convert($val1);
				foreach ($val1 as $key2 => $val2) {
					$new_data[$key1.'.'.$key2] = $val2;
				}
			}
		}
		return $new_data;
	}
}

もっといい方法があるような気はする。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0