freemarker配置按区域设置和模板名称获取模板

时间:2014-04-11 18:30:44

标签: java spring localization freemarker

我的EmailHandler类如下:

Class EmailHandler {
    ...
    @Autowired
        protected Configuration config;
    }
    ...
    protected Template getTemplate(String templateName, Locale locale) throws IOException, TemplateException {
        return config.getTemplate(templateName, locale);
    }
    ...
}

在我的applicationcontext.xml中,我有

<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
    <property name="templateLoaderPath" value="classpath:/templates/email"/>
</bean>

我的模板目录结构如下:

--src
----main
------resources
--------templates
----------email
------------template1.ftl
------------template2.ftl
------------template3.ftl
------------template4.ftl
------------multilanguage
--------------fr
----------------template1.ftl

目前总是调用getTemplate(string,Locale.US)。但是,将来,我希望能够使用(string,Locale.FR)调用getTemplate。

以下是我的问题: 1.如何更改目录结构以指定法语模板。 2. config.getTemplate(templateName,locale)是什么;到底怎么办?该方法如何在模板目录中找到Locale.US的模板? 3.我想从email / multilanguage / fr目录加载我的法语模板。我该怎么做?

谢谢,

仙人

1 个答案:

答案 0 :(得分:4)

当您致电getTemplate("foo.ftl", Locale.US)时,FreeMarker首先尝试加载foo_en_US.ftl,然后加载foo_en.ftl,最后加载foo.ftl。所以法语模板应该命名为foo_fr.ftl

getTemplate指定的区域设置也决定了locale设置在模板中的值。但是,这可以在Environment对象中重写。如果您调用myTemplate.process(...)而不是env = myTemplate.createProcessingEnvironment(...); env.setLocale(...); env.process(),或者使用<#setting locale='...'>调用模板,则可以这样做。

在根据区域设置从子目录加载模板时,您可以为其实现TemplateLookupStrategy(请参阅http://freemarker.org/docs/api/freemarker/cache/TemplateLookupStrategy.html)。