ethnaで国際化対応 - gettextとEthnaメッセージカタログの併用

ethnaの標準エラーメッセージの表示がうまくいっていないことについ最近になって気がつきました。*1
どうも今年の4月に、Sinkan.comで国際化対応として「gettext」を適用した際に仕込んでしまったようです。


なお、米国版のSinkan.comではこの問題は出ていません。
これはSinkan.net/comのエラーメッセージは日本語ですが、Ethnaのエラーメッセージは標準で英語だからです。


さて、この問題を解決するにはgettextのメッセージカタログに移植すればいいのですが、それはなんだかめんどう(笑)
というわけで、標準で排他的に機能している「gettext」と「Ethnaメッセージカタログ」を同時に機能するよう、Ethna_I18Nを上書きしてみました。

class Discover_I18N extends Ethna_I18N
{
    function setLanguage($locale, $systemencoding = null, $clientencoding = null) {
        parent::setLanguage($locale, $systemencoding, $clientencoding);

        // 強制的にメッセージカタログ再生成
        // Ethna_I18N では、if (!$this->use_gettext) { } で再生成される。
        if ($this->use_gettext) {
            $this->messages = $this->_makeEthnaMsgCatalog();
        }
    }

    function get($msg) {
        // use_gettextの場合のみ
        // Ethnaメッセージカタログを先に反映
        if ($this->use_gettext) {
            $this->use_gettext = false;
            $msg = parent::get($msg);
            $this->use_gettext = true;
        }

        return parent::get($msg);
    }
}


これに併せてDiscover_Controllerの$classを変更すると、英語で表示されていたエラーメッセージが日本語に置き換わり、修正されました。
ただ同じような機能を2重に適用するというのはリソースの無駄であるのは確かなので、いづれかに統一する標準の実装は間違っていないと思います。


強いていえば、

    'use_gettext' => true,
    'use_ethna_msg_catalog' => false,

のようにそれぞれの可否をconfigファイルで設定できると嬉しいかもしれません。

*1:慣れすぎてしまって、標準エラーメッセージがでるような操作をしないため。