Blog

Locale::Maketext::Lexicon を Xslate でつかう

あたくしは普段 Locale::Maketext::Lexicon を利用しているので、Locale::Maketext::Lexicon をつかったサンプルをかいてみた。

#!perl
use strict;
use warnings;
use utf8;

package MyApp::I18N;
use FindBin qw($Bin);
use parent 'Locale::Maketext';
use Locale::Maketext::Lexicon {
    '*' => [Gettext => "$Bin/locale/*.po"],
    _auto => 1,
    _decode => 1,
    _style => 'gettext',
};

package main;
use Encode ();
use Text::Xslate;

my $i18n = MyApp::I18N->get_handle('ja');
my $xslate = Text::Xslate->new(
    syntax   => 'TTerse',
    function => {
        l => sub {
            return $i18n->maketext(@_);
        },
    },
);

binmode STDOUT, ':utf8';
print $xslate->render_string(<<'TEMPLATE');
[% l('Hello!') %]
[% l('Hello! %1.', '太郎') %]
[% l('tokyo') %]
TEMPLATE

gfx作の、Locale::Maketext::Simple バージョンは以下のもの。ここで Locale::Maketext::Simple は Locale::Maketext::Lexicon のラッパーである。Locale::Maketext::Lexicon がない場合にはそのままのデータをかえすなどの処理をしていて罠がおおいので注意。

#!perl
use strict;
use warnings;
use utf8;

use Text::Xslate;
use FindBin qw($Bin);
use Encode ();
use Locale::Maketext::Lexicon;
use Locale::Maketext::Simple
    Style    => 'gettext',
    Encoding => 'UTF-8',
    Path     => "$Bin/locale",
;

loc_lang('ja');

my $xslate = Text::Xslate->new(
    syntax   => 'TTerse',
    function => {
        l => sub {
            return Encode::decode_utf8( loc(@_) );
        },
    },
);

binmode STDOUT, ':utf8';
print $xslate->render_string(<<'TEMPLATE');
[% l('Hello!') %]
[% l('tokyo') %]
TEMPLATE

【Conclusion】
Locale::Maketext::Simple の罠っぽい感じをみると Locale::Maketext::Lexicon でいいかな、っておもったりする。
あと、Simple っていう名前だけどいうほどシンプルにはなってない。