2013-02-23 70 views
1

在Fremarker模板中,我需要訪問Spring MVC提供的i18n資源包中的消息。Spring MVC/Freemarker:在Freemarker表達式中使用來自bundle的消息

我已經導入從spring.ftl Spring宏,我可以用下面的宏使用的消息:

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

其實我是無法從裏面表達式,如在內置插件訪問郵件:

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

我該怎麼做?

回答

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(...))} 

但是,要小心,如果您打印的值與${...},它的(當然,如果你使用的話),而如果你用<@...>打印東西,它永遠不會被轉義(因爲<@...>/<#...>打算打印標記)。因此,如果您的郵件包含HTML,則可能最終會爲用戶顯示HTML標記(因爲<將被轉義爲&lt;等等)。除非你寫<#noescape>${...}</#noescape>

(更新來逃避:FreeMarker的2.3.24支持自動無#escape逃逸,在那裏你會使用${su.message(...)?no_esc}更妙的是,如果你不知何故知道message功能,該消息是HTML裏面,你可以使用<#return springMacroRequestContext.getMessage(...)?no_esc>,然後只寫${su.message(...)}和FreeMarker不會雙重轉義它。)

+0

謝謝!非常完整的答案。 – 2013-02-24 10:33:24