在Fremarker模板中,我需要在Freemarker表达式中访问Spring MVC提供的i18n资源包中的消息。
我已经从spring.ftl
导入了Spring宏,我可以使用以下宏的消息:
<@spring.messageText "my.key" "Default message" />
但实际上我无法从内部表达式访问消息,例如在内置函数中:
${myBoolean?string( ###here I want my true message###, ###here I want my false message###)}
我该怎么做?
答案 0 :(得分:4)
在你展示的具体案例中,也许你应该写
<#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标记(因为<
将转义为<
,依此类推)。除非,你写<#noescape>${...}</#noescape>
。
(更新为转义:FreeMarker 2.3.24支持在没有#escape
的情况下自动转义,你可以使用${su.message(...)?no_esc}
。更好的是,如果你以某种方式知道message
函数内的那个消息是HTML,您可以使用<#return springMacroRequestContext.getMessage(...)?no_esc>
,然后只需编写${su.message(...)}
,FreeMarker就不会双重转义它。)