【问题标题】:Spring MVC/Freemarker: using a message from a bundle in a Freemarker expressionSpring MVC/Freemarker:在 Freemarker 表达式中使用来自 bundle 的消息
【发布时间】:2013-02-23 14:33:30
【问题描述】:

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

我该怎么做?

【问题讨论】:

    标签: spring-mvc internationalization freemarker


    【解决方案1】:

    在你展示的具体情况下,也许你应该写

    <#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 的影响(当然,如果您使用它),而如果您使用&lt;@...&gt; 打印一些东西,它永远不会被转义(如@987654332 @/&lt;#...&gt; 用于打印标记)。因此,如果您的消息包含 HTML,使用 ${...} 您可能最终会为用户显示 HTML 标记(因为 &amp;lt; 将转义为 &amp;lt; 等等)。除非,你写&lt;#noescape&gt;${...}&lt;/#noescape&gt;

    (转义更新:FreeMarker 2.3.24 支持在没有#escape 的情况下自动转义,你可以使用${su.message(...)?no_esc}。更好的是,如果你在message 函数中知道消息是HTML,你可以使用&lt;#return springMacroRequestContext.getMessage(...)?no_esc&gt;,然后只写${su.message(...)},FreeMarker 不会双重转义它。)

    【讨论】:

    • 谢谢!非常完整的答案。
    猜你喜欢
    • 2011-03-10
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多