CakePHPのバグ報告ってどういう手順を踏めばいいんだろう?l10n::get()について。
CakePHPの l10n のソースを読んでたら、もしかしたらこれってバグ?ってのがありました。バグなら報告したいところなんですが、いざしようと思ったらどういう手順を踏めば良いのかわからず。もしかしたらそういう仕様なのかもしれない、曖昧なものという事もあって、まずはエントリーにしてみようと思いました。
バグかな?と思っているところ
/** * Gets the settings for $language. * If $language is null it attempt to get settings from L10n::__autoLanguage(); if this fails * the method will get the settings from L10n::__setLanguage(); * * @param string $language Language (if null will use DEFAULT_LANGUAGE if defined) * @access public */ function get($language = null) { if ($language !== null) { return $this->__setLanguage($language); } elseif ($this->__autoLanguage() === false) { return $this->__setLanguage(); } }https://github.com/cakephp/cakephp/blob/1.3.7/cake/libs/l10n.php#L339
l10n::get()
でlanguageが取得できます。このlanguageは定数を読み取るか、HTTPヘッダーから自動で判別を試みるかして決まります。この内、HTTPヘッダーから自動で設定出来た場合のみ、languageが取得できません。
このl10n::get()
は、ざっとソースを読むところ、下記の様な順序でlanguageを判別しているようです。
- 明示的に
$l10n->get('jpn')
などと指定する。 env('HTTP_ACCEPT_LANGUAGE')
を使って、HTTPリクエストヘッダーの Accept-Language*1から判別する。l10n::__autoLanguage()
- DEFAULT_LANGUAGE定数があれば、それを使う。
l10n::__setLanguage()
なお、ざっとなので間違いや抜け落ちもあると思います。また、APPとしての設定はConfigure::read('Config.language')
がありますが、これは見ていないようです。ただ、もし Configure::read('Config.language') === null
な場合に限り、逆にConfigure::write('Config.language', $this->lang)
で設定しています。
一行追加しただけのUnified diff
### Eclipse Workspace Patch 1.0 #P cakephp1.3.6 Index: cake/libs/l10n.php =================================================================== --- cake/libs/l10n.php (revision 966) +++ cake/libs/l10n.php (working copy) @@ -350,6 +350,7 @@ } elseif ($this->__autoLanguage() === false) { return $this->__setLanguage(); } + return $this->lang; } /**
1行追加しただけですが、l10n::get()
で、自動判別された場合でもlanguageを返すには、こうなるんじゃないかと思います。もしかしたらそういう仕様なのかもしれないけど、l10n::get()
のDocBlockにも「Gets the settings for $language.」とあるので、取得できて良いと思うんですよね。どうでしょう?
ちなみに1.3.7が先日でましたが、まだ置き換えてないので1.3.6です。でも1.3.7でもここは変わってません。
そもそもl10nとi18n。そしてConfigure::read('Config.language')とDEFAULT_LANGUAGE定数の役割はどうなってるの?
__()
で翻訳する際にi18n::translate()が使われます。この中では下記の様な順序で言語を判別していきます。
- $_SESSION['Config']['language']
- Configure::read('Config.language')
- 前述のHTTPリクエストヘッダーのAccept-Languageから
- 前述のDEFAULT_LANGUAGE定数
l10nはi18nやTranslateBehaviorから使われるクラスの様なので、もしかしたらユーザーランドでl10n::get()が使われるのは想定外なのかもしれません。このあたりを調べるにはi18nのソースも読み込まないとならないかも・・・。そのうち時間があれば追っていきたいけど、とりあえずはここまでにしておきます。
*1:例:Accept-Language: ja,en-us;q=0.7,en;q=0.3