2

在 Fremarker 模板中,我需要访问从 Freemarker 表达式中 Spring MVC 提供的 i18n 资源包中获取的消息。

我已经从中导入了 Spring 宏,spring.ftl并且可以将消息与以下宏一起使用:

<@spring.messageText "my.key" "Default message" />

但实际上我无法从内部表达式访问消息,例如内置函数:

${myBoolean?string( ###here I want my true message###, ###here I want my false message###)}

我怎样才能做到这一点?

4

1 回答 1

5

在您展示的具体案例中,也许您应该只写

<#if myBoolean><@spring.messageText ...><#else><@spring.messageText ...></#if>

如果经常需要,那就做一个#macro

在更一般的情况下,问题是您不能从表达式中调用宏(或指令),Spring 也应该提供一个函数变体message。我不知道 Spring MVC,但是看着spring.ftl,似乎springMacroRequestContext.getMessage(code, text)应该可以解决这个问题。但这很冗长,所以您可能想创建一个/lib/springutils.ftl内容如下:

<#function message code text=''>
    <#if text != ''>
        <#return springMacroRequestContext.getMessage(code, text)>
    <#else>
        <#return springMacroRequestContext.getMessage(code)>
    </#if>
</#function>

然后在您的模板中:

<#import "/lib/springutils.ftl" as su>

${myBoolean?string(su.message(...), su.message(...))}

但是,请注意,如果您使用 打印一个值${...},它会受到#escape(当然,如果您使用它)的影响,而如果您使用 打印一些东西<@...>,它永远不会转义(作为<@...>/<#...>意味着打印标记)。因此,如果您的消息包含 HTML,${...}那么您最终可能会按字面意思为用户显示 HTML 标记(如<将转义到&lt;等等)。除非,你写<#noescape>${...}</#noescape>.

(转义更新:FreeMarker 2.3.24 支持不带 的自动转义#escape,你可以使用${su.message(...)?no_esc}。更好的是,如果你在message函数内部知道消息是 HTML,你可以使用<#return springMacroRequestContext.getMessage(...)?no_esc>,然后只写${su.message(...)},FreeMarker 不会加倍-逃脱它。)

于 2013-02-24T09:22:08.030 回答