引き続きCatalystでごにょごにょしてるんですが、(NanoAにもそろそろ戻りたい気もしてきた) hidekさんの http://blog.hide-k.net/archives/2009/01/catalyst_4.php を参考にしつつ、C::P::FV::S::Autoでフォームの検証をしようとしてエラーメッセージに日本語を書いたら化けた。ほんでtypesterさんに聞いてみたら先に$c->config->{validator}->{profiles}を作っとけばC::P::FV::S::Autoで作らないので、profiles.ymlをロードするプラグインを先にさせば解決できるよ、とのことでした。 MyApp.pmで↓
use Catalyst qw(
....
FormValidator::Simple
+MyApp::Util::ProfileLoader
FormValidator::Simple::Auto
);
こんな感じにして、MyApp::Util::ProfileLoaderを書いて
package MyApp::Util::ProfileLoader;
use strict;
use YAML;
use Encode;
sub setup { my $c = shift;
my $config = $c->config->{validator};
Catalyst::Exception->throw( message =>
__PACKAGE__ . qq/: You need to load "Catalyst::Plugin::FormValidator::Simple"/ )
unless $c->isa('Catalyst::Plugin::FormValidator::Simple');
$c->log->warn( __PACKAGE__ . qq/: You must set validator profiles/ )
unless $config->{profiles};
if ( $config->{profiles} and ref $config->{profiles} ne 'HASH' ) {
my $profiles = eval {
no warnings 'once';
local $YAML::UseAliases = 0;
YAML::Load( Encode::decode( 'utf8', YAML::Dump( YAML::LoadFile( $config->{profiles} ) ) ) ); # XXX: remove yaml aliases
};
Catalyst::Exception->throw( message => __PACKAGE__ . qq/: $@/ ) if $@;
$config->{profiles} = $profiles;
}
$c->NEXT::setup(@_);
}
1;
って感じでC::P::FV::S::Autoのsetupの前半部分をパクりつつdecodeを挟んでおいた。これでちゃんと日本語が化けずに出るようになった。ほんで、typoたんはC::P::I18Nでprofiles.ymlの中のメッセージも国際化してるそうです。