環境
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;
}
}
もっといい方法があるような気はする。