如何使资源包与现有的Freemarker模板一起使用?

时间:2014-04-02 01:24:48

标签: java templates freemarker

我正在为IBM Connections开发Java应用程序,我的应用程序需要生成和发送基于模板的电子邮件 Connections包括几个使用资源包的Freemarker模板。我希望我的代码能够使用这些副本进行最少的更改,但我以前从未使用过Freemarker。

在我的Java代码中,如何以现有模板的工作方式将资源包与Freemarker模板相关联?

模板和资源包在此目录结构中:

notifications (directory)
-> activities (directory)
  -> resources (directory)
    -> nls (directory)
      -> properties files
  -> Template FTL files
-> resources (directory)
  -> nls (directory)
    -> properties files
  -> Imported FTL files

其中一个主要模板文件是“notifyMail.ftl”。该文件中特别感兴趣的一些行是:

<#import "*/resources/commonStructure.ftl" as s>
<#import "*/resources/commonUtil.ftl" as u>
<#import "*/resources/commonUrlUtil.ftl" as urlUtil>
<#lt><@s.header>${u.resource("email.notify.body."+"${key}","${activity.event.sender.display.name}",urlUtil.linkifyItem("${activity.node.permalink}", "${activity.node.name}"))}</@s.header>

“commonUtil.ftl”文件声明了两个使用资源包的函数,如下所示 第一个函数使用名为“__parameters”的成员 我假设需要在Java代码中传递给Freemarker,因为我没有看到它在模板中的任何地方定义。

<#function resource messageKey params...>
    <#if __parameters.__resourceBundle?keys?seq_contains(messageKey)>
        <#local bundleString = bundleResource(__parameters.__resourceBundle,messageKey,params) />
    <#elseif __parameters.__sharedBundle?keys?seq_contains(messageKey)>
        <#local bundleString = bundleResource(__parameters.__sharedBundle,messageKey,params) />
    <#else>
        <#return messageKey /> <#-- message key not found, return the key back -->
    </#if>

    <#if bundleString??>
        <#return bundleString />
    <#else>
        <#return messageKey />
    </#if>
</#function>

<#function bundleResource bundle messageKey params>
<#if bundle??>
<#switch params?size>
<#case 0>
    <#return bundle(messageKey)>
    <#break>
<#case 1>
    <#return bundle(messageKey, params[0])>
    <#break>
<#case 2>
    <#return bundle(messageKey, params[0], params[1])>
    <#break>
<#case 3>
    <#return bundle(messageKey, params[0], params[1], params[2])>
    <#break>
<#case 4>
    <#return bundle(messageKey, params[0], params[1], params[2], params[3])>
    <#break>
<#case 5>
    <#return bundle(messageKey, params[0], params[1], params[2], params[3], params[4])>
    <#break>
<#default>
    <#stop "resource function doesn't support more than 5 parameters for a message due to language reason. And it's seldom to have more than 5 parameters in a message. However, you can extend the limit by changing the function if you really want to."/>
</#switch>
</#if>
</#function>

1 个答案:

答案 0 :(得分:2)

对此的解决方案结果很简单,但由于我的属性文件出现问题,我在使邮件格式化工作正常时遇到了很多麻烦。

我发送给Map的{​​{1}}只需要FTL文件使用的同一层次结构中的freemarker.template.Template.process()个实例。

E.g。 FTL文件的位置如下:

ResourceBundle

我有一个带有Java源代码的__parameters.__resourceBundle文件,并将其添加到发送给Freemarker的地图中,如下所示:

notification.properties