如何在Template-Toolkit中创建特殊的ROOT_OPS?

时间:2013-03-01 14:59:57

标签: perl internationalization locale template-toolkit dancer

我在Locale::TextDomain环境Dancer中使用Template-Toolkit

是的,我知道Dancer-Plugin-I18N并尝试过,但我不想使用它!

我看了Defining_Custom_Virtual_Methods并根据我的需要进行了调整。

# load Template::Stash to make method tables visible
use Template::Stash;

$Template::Stash::ROOT_OPS->{ 'localize' }    = sub {
    return __(shift); 
};

并在视图中

[% localize("Hello")  %] 

效果很好。

但我想把所有Locale::TextDomain functions包裹起来:

$Template::Stash::ROOT_OPS->{__}    = sub { return __x(shift) };
$Template::Stash::ROOT_OPS->{__x}   = sub { return __x(shift, @_) };
$Template::Stash::ROOT_OPS->{__n}   = sub { return __n(shift, shift, shift) };
$Template::Stash::ROOT_OPS->{__nx}  = sub { return __nx(shift, shift, shift, @_) };
$Template::Stash::ROOT_OPS->{__xn}  = sub { return __xn(shift, shift, shift, @_) };
$Template::Stash::ROOT_OPS->{__p}   = sub { return __p(shift, shift) };
$Template::Stash::ROOT_OPS->{__px}  = sub { return __px(shift, shift, @_) };
$Template::Stash::ROOT_OPS->{__np}  = sub { return __np(shift, shift, shift, shift) };
$Template::Stash::ROOT_OPS->{__npx} = sub { return __npx(shift, shift, shift, shift, @_) };

但不幸的是,使用'__'或'__x'是不可能的 作为代币。

所以我的问题是:如何在Template-Toolkit中创建'__'(和朋友)根操作?

2 个答案:

答案 0 :(得分:3)

模板工具包不会导出以_开头的函数,因为它们被视为私有。您可以通过在Stash操作之前设置以下内容来解决此问题:

$Template::Stash::PRIVATE = 0;

答案 1 :(得分:0)

词法分析器不会将它们识别为标识符。将模块更改为接受前导_似乎远非微不足道。