CakePHPのバグ報告ってどういう手順を踏めばいいんだろう?l10n::get()について。

CakePHPl10n のソースを読んでたら、もしかしたらこれってバグ?ってのがありました。バグなら報告したいところなんですが、いざしようと思ったらどういう手順を踏めば良いのかわからず。もしかしたらそういう仕様なのかもしれない、曖昧なものという事もあって、まずはエントリーにしてみようと思いました。

バグかな?と思っているところ

/**
 * 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を判別しているようです。

  1. 明示的に$l10n->get('jpn')などと指定する。
  2. env('HTTP_ACCEPT_LANGUAGE')を使って、HTTPリクエストヘッダーの Accept-Language*1から判別する。l10n::__autoLanguage()
  3. 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でもここは変わってません。

そもそもl10ni18n。そしてConfigure::read('Config.language')とDEFAULT_LANGUAGE定数の役割はどうなってるの?

__()で翻訳する際にi18n::translate()が使われます。この中では下記の様な順序で言語を判別していきます。

  1. $_SESSION['Config']['language']
  2. Configure::read('Config.language')
  3. 前述のHTTPリクエストヘッダーのAccept-Languageから
  4. 前述のDEFAULT_LANGUAGE定数

l10ni18nやTranslateBehaviorから使われるクラスの様なので、もしかしたらユーザーランドでl10n::get()が使われるのは想定外なのかもしれません。このあたりを調べるにはi18nのソースも読み込まないとならないかも・・・。そのうち時間があれば追っていきたいけど、とりあえずはここまでにしておきます。

環境

Mac Mac OS X 10.5.8(Leopard
MAMP 1.7.2
CakePHP 1.3.6
php 5.2.6

*1:例:Accept-Language: ja,en-us;q=0.7,en;q=0.3