【问题标题】:How to create special ROOT_OPS in Template-Toolkit?如何在 Template-Toolkit 中创建特殊的 ROOT_OPS?
【发布时间】:2013-03-01 14:59:56
【问题描述】:

我在Dancer 环境中使用Locale::TextDomainTemplate-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 中创建“__”(和朋友)根操作?

【问题讨论】:

    标签: perl internationalization locale template-toolkit dancer


    【解决方案1】:

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

    $Template::Stash::PRIVATE = 0;
    

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是你的问题,我也是这么回答的。
    猜你喜欢
    • 2012-03-12
    • 2017-06-02
    • 2015-01-09
    • 2010-09-22
    • 2012-05-29
    • 1970-01-01
    • 2011-01-18
    • 2011-01-30
    • 2012-05-01
    相关资源
    最近更新 更多