ethnaで国際化対応 - ActionFormの選択肢があるフォーム

ethnaフレームワークを利用して開発されている「新刊.net」を「Sinkan.com」へ国際化対応しました。
実際には別サービスなので正確にいうと国際化対応ではないのですが、ethnaの国際化対応の手法を利用して実装したのでご容赦を。


対応するに当たっていくつかコツがあったのでメモ代わりに順次書いていきたいと思います。
…というか id:hidea に残しておけと怒られました (^^;


なおこの内容は、以下にあるethnaのプロジェクト国際化のテキストを前提に書かれています。

ActionFormの選択肢があるフォームと、{form_input}フォームヘルパへの対応

FORM_TYPE_CHECKBOX、FORM_TYPE_RADIO、FORM_TYPE_SELECT などの選択肢があるフォームは、ActionForm で以下のように指定できます。

'access_level' => array (
	'type'		=> VAR_TYPE_INT,
	'form_type'	=> FORM_TYPE_SELECT,
	'name'		=> '公開・非公開',
	'required'	=> true,
	'option'	=> array('0' => '非公開', '1' => '公開')
),

これはテンプレートで、

{form_input name="access_level"}

とフォームヘルパを利用することで手軽にフォームとしてHTML出力することができます。


詳しくは、ethna のリファレンスをご覧ください。

>> フォームヘルパ:選択肢があるフォーム - ethna


ただこの書き方だと、'option'で設定する選択肢が「ethna i18nコマンド」でカタログ化されません。
それ所か、カタログを手動で用意したとしても出力が翻訳されません。
gettextで翻訳される箇所だけならフォームヘルパをオーバーライドしてがりがりと書き換えればいいので、さして難しくはないのですがカタログ化されない部分を書き直すのは面倒です。 *1


そこで別途方法を探っていたところ、'option'には関数名を指定できることを知りました。
ならば、と上のコードを以下のように書き換えました。

class Discover_Form_Options extends Discover_ActionForm {
	/**
	 *  @access private
	 *  @var    array   フォーム値定義
	 */
	var $form = array(
		'access_level' => array (
			'type'		=> VAR_TYPE_INT,
			'form_type'	=> FORM_TYPE_SELECT,
			'name'		=> '公開・非公開',
			'required'	=> true,
			'option'	=> 'access_level_option',
		),
		'notify_checkbox' => array(
			'type'      => array(VAR_TYPE_INT),
			'form_type'	=> FORM_TYPE_CHECKBOX,
			'name'		=> 'メール通知',
			'option'	=> 'notify_checkbox_option',
		),
	}

	function access_level_option() {
		return array(
			'0' => _et('非公開'),
			'1' => _et('公開'),
		);
	}
	function notify_checkbox_option() {
		return array(
			NOTIFY_STATUS_DISCOVER => _et('新着/更新されたアイテムを通知'),
			NOTIFY_STATUS_RELEASE  => _et('発売日直前のアイテムを通知'),
		);
	}
}

これならカタログ化も翻訳の問題も同時にクリアされます。
直接配列を指定するのと比べるとほんの少し見通しが悪くなりますが、問題にするほどでもないでしょう。

*1:後々ethnaがアップデートされた時なんか特に