Xslate+Locale::Maketext::Lexiconを考える
前提:Locale::Maketext::Lexicon を Xslate でつかう (by tokuhirom)
L::M::SimpleよりもL::M::Lexiconのほうが使いやすいというのはそのとおりなんですが、うまく使うにはもうちょい工夫が必要かなと。
具体的には以下のようなことに対応したいです。
- *.poに書く値はHTMLタグが含まれるかも知れない。つまり「raw文字列」とみなすべき。
- 一方
maketext($fmt, @args)
の@args
はユーザー入力なのでエスケープしないとまずい - 最終的に
maketext
はraw文字列を返すべき
これを反映させ、二つの関数を用意するのがいいのではないかと考えました。まずl()
は普通の関数として動作するので入力値が最終的にエスケープされます。l_raw()
は特殊バージョンで、@args
をエスケープし、raw文字列を返します。このl_raw()
の第一引数にユーザー入力を与えてはいけません。
use Text::Xslate; use Text::Xslate::Util qw(html_escape html_builder); my $i18n = MyApp::I18N->get_handle('ja'); my $xslate = Text::Xslate->new( function => { l => sub { return $i18n->maketext(@_); }, l_raw => html_builder { my $format = shift; my @args = map { html_escape($_) } @_; return $i18n->maketext($format, @args); }, }, );
実行可能なサンプルコードもdistに含めておきました。
いずれ本体でもサポートするかもしれませんが、今のところはこんな感じでいけると思います。
あとはmaketext以外の周辺事項としてPerl でつくった web サイトを L10N する方法 (by tokuhirom)も参考になります。