Spring MVC / Freemarker:使用Freemarker表达式中的包中的消息

时间:2013-02-23 14:33:31

标签: spring-mvc internationalization freemarker

在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###)}

我该怎么做?

1 个答案:

答案 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标记(因为<将转义为&lt;,依此类推)。除非,你写<#noescape>${...}</#noescape>

(更新为转义:FreeMarker 2.3.24支持在没有#escape的情况下自动转义,你可以使用${su.message(...)?no_esc}。更好的是,如果你以某种方式知道message函数内的那个消息是HTML,您可以使用<#return springMacroRequestContext.getMessage(...)?no_esc>,然后只需编写${su.message(...)},FreeMarker就不会双重转义它。)