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、そこで を使用します。さらに良いことに、メッセージが HTML であることを関数${su.message(...)?no_esc}内で何らかの方法で知っている場合は、を使用できます。逃げる。)message<#return springMacroRequestContext.getMessage(...)?no_esc>${su.message(...)}

于 2013-02-24T09:22:08.030 に答える