如何使用诸如Velocity或FreeMarker之类的模板引擎构造电子邮件正文来实现i18n?
通常,人们倾向于创建如下模板:
<h3>${message.hi} ${user.userName}, ${message.welcome}</h3>
<div>
${message.link}<a href="mailto:${user.emailAddress}">${user.emailAddress}</a>.
</div>
并创建具有以下属性的资源包:
message.hi=Hi
message.welcome=Welcome to Spring!
message.link=Click here to send email.
这就产生了一个基本的问题:如果我的.vm
文件很大,包含很多行文本,那么在单独的资源包(.properties
)文件中翻译和管理每个文件就变得很麻烦。
我想做的是,.vm
为每种语言创建一个单独的文件,类似mytemplate_en_gb.vm, mytemplate_fr_fr.vm, mytemplate_de_de.vm
,然后以某种方式告诉Velocity / Spring根据输入的语言环境选择正确的文件。
春天有可能吗?还是我应该研究也许更简单,更明显的替代方法?
注意:我已经看过有关如何使用模板引擎创建电子邮件正文的Spring教程。但这似乎无法回答我关于i18n的问题。
事实证明,使用一个模板和多个language.properties文件胜过拥有多个模板。
这就产生了一个基本的问题:如果我的.vm文件变得很大,包含许多行文本,那么在单独的资源包(.properties)文件中转换和管理它们的每个文件就变得很乏味。
如果您的电子邮件结构在多个.vm
文件中重复,则更难维护。同样,人们将不得不重新发明资源束的后备机制。资源束尝试找到给定语言环境的最接近匹配项。例如,如果语言环境为en_GB
,它将尝试按顺序查找以下文件,如果没有可用的文件,则回退到最后一个文件。
我将在此处发布(详细)为简化读取Velocity模板中的资源包而必须做的事情。
弹簧配置
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="content/language" />
</bean>
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath" value="/WEB-INF/template/" />
<property name="velocityProperties">
<map>
<entry key="velocimacro.library" value="/path/to/macro.vm" />
</map>
</property>
</bean>
<bean id="templateHelper" class="com.foo.template.TemplateHelper">
<property name="velocityEngine" ref="velocityEngine" />
<property name="messageSource" ref="messageSource" />
</bean>
TemplateHelper类
public class TemplateHelper {
private static final XLogger logger = XLoggerFactory.getXLogger(TemplateHelper.class);
private MessageSource messageSource;
private VelocityEngine velocityEngine;
public String merge(String templateLocation, Map<String, Object> data, Locale locale) {
logger.entry(templateLocation, data, locale);
if (data == null) {
data = new HashMap<String, Object>();
}
if (!data.containsKey("messages")) {
data.put("messages", this.messageSource);
}
if (!data.containsKey("locale")) {
data.put("locale", locale);
}
String text =
VelocityEngineUtils.mergeTemplateIntoString(this.velocityEngine,
templateLocation, data);
logger.exit(text);
return text;
}
}
速度模板
#parse("init.vm")
#msg("email.hello") ${user} / $user,
#msgArgs("email.message", [${emailId}]).
<h1>#msg("email.heading")</h1>
我必须创建一个简短的宏,msg
以便从消息束中读取。看起来像这样:
#**
* msg
*
* Shorthand macro to retrieve locale sensitive message from language.properties
*#
#macro(msg $key)
$messages.getMessage($key,null,$locale)
#end
#macro(msgArgs $key, $args)
$messages.getMessage($key,$args.toArray(),$locale)
#end
资源包
email.hello=Hello
email.heading=This is a localised message
email.message=your email id : {0} got updated in our system.
用法
Map<String, Object> data = new HashMap<String, Object>();
data.put("user", "Adarsh");
data.put("emailId", "adarsh@email.com");
String body = templateHelper.merge("send-email.vm", data, locale);
发送电子邮件时,页脚中有下面的标准消息。 此电子邮件是使用CakePHP框架发送的,http://cakephp.org. 它似乎使用了这个: 我的控制器里有这个。 创建了以下视图: /应用程序/查看/电子邮件/文本/梦想。ctp /应用程序/视图/布局/电子邮件/文本/梦想。ctp 是否有任何其他设置我错过了cakephp使用我的布局? *注:如果我重新命名我的梦想。ctp默认。ctp它使用那个
问题内容: 我想使用Django模板发送HTML电子邮件: 我找不到任何有关的信息,而django-mailer仅发送HTML模板,而没有动态数据。 如何使用Django的模板引擎生成电子邮件? 问题答案: 从docs,要发送HTML电子邮件,你想使用其他内容类型,如下所示: 你可能需要两个用于电子邮件的模板-一个看起来像这样的纯文本模板,存储在你的模板目录下: 还有一个HTMLy,存放在以下位置
我在VTL文档中看到了如何编写一个模板,可以以这种方式处理列表…如果我可以将这样的列表传递给模板的话。但我怎么去那里?我尝试将Java ArrayList(而不是String)放入映射中,但这似乎不起作用。当我尝试访问$headers.list时,它只给我一个文字字符串“$headers.list”。那么正确的做法是什么呢?
我有一个使用commons电子邮件的项目(http://search.maven.org/#artifactdetails|组织。阿帕奇。commons | commons电子邮件| 1.2 | jar)通过maven发送。我想使用电子邮件模拟类(http://commons.apache.org/email/testapidocs/org/apache/commons/mail/mocks/Mo
我有一个spring mvc应用程序,我试图将日期LocalDate呈现为字符串,对于普通视图,它可以工作,但对于电子邮件,它不工作,并抛出以下错误: 原因:org.springframework.core.convert.converterNotFoundException:找不到能够从[java.time.localdate]类型转换为[java.lang.string]类型的转换器 代码:
我正在使用freemarker模板生成电子邮件。我将freemarker与spring结合使用。我很难用参数替换来实现国际化。我用它来代替一个参数。例子: 消息你好=你好,{0} 在fm模板中,我有 然而,我无法弄清楚如何进行多参数替换。 消息你好{0},欢迎来到{1} 我如何在模板中表示这一点?当我尝试以下方法时: 它不起作用。你能帮忙吗?当做