java - Velocity 模板 - 消息键而不是带有占位符的整个短语

标签 java velocity email-templates

我有电子邮件模板 .vm,其中包含带有来自 messages_en.properties 的消息 key 的消息:

#msg("email-body")

messages_en.properties 具有:

email-body = Hello, $name!

之后:

private String buildMessage(String templateName, Properties properties, Locale locale) {

    Template template = getVelocityEngine().getTemplate(templateName);

    VelocityContext context = new VelocityContext();

    for (String key : properties.stringPropertyNames()) {
        context.put(key, properties.getProperty(key));
    }

    context.put(LocaleDirective.MESSAGES_LOCALE, locale);

    StringWriter writer = new StringWriter();
    template.merge(context, writer);

    return writer.toString();
}

我得到:

Hello, $name!

并且名称不会替换为实际值。

管理电子邮件模板中的短语的最佳方式是什么?我只想在模板中放入消息键,而不是带有占位符的整个短语。

最佳答案

使用evaluate用于在其他变量中替换变量的指令:

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.runtime.RuntimeServices;
import org.apache.velocity.runtime.RuntimeSingleton;
import org.apache.velocity.runtime.parser.node.SimpleNode;

import java.io.StringReader;
import java.io.StringWriter;

public class Main {

    public static void main(String[] args) throws Exception {
        RuntimeServices runtimeServices = RuntimeSingleton.getRuntimeServices();
        StringReader reader = new StringReader("#evaluate($email-body)");
        SimpleNode node = runtimeServices.parse(reader, "default");

        Template template = new Template();
        template.setRuntimeServices(runtimeServices);
        template.setData(node);
        template.initDocument();


        VelocityContext context = new VelocityContext();
        context.put("name", "Maxim");
        context.put("email-body", "Hello, $name!");

        StringWriter writer = new StringWriter();
        template.merge(context, writer);

        System.out.println(writer.toString());
    }
}

输出:

Hello, Maxim!

关于java - Velocity 模板 - 消息键而不是带有占位符的整个短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504827/

相关文章:

java - 如何使用 JSP、Servlet 检索可动态添加的多个输入框的值?

java - 无法在速度模板中设置 Null

html - Div 样式在 Outlook 电子邮件中不起作用

database - 通过 SQL 脚本在 Magento 中创建邮件模板?

java - 在JAVA中将字符串分成子字符串

java - 由于双重上下文 (servlet+ContextLoaderListener),所有 Spring Framework bean 都会重复

usability - 宏的速度命名参数

Java速度虚拟机文件#set使用 boolean 变量

html - HTML 电子邮件模板是否需要使用样式属性?

java - 如何将 TextView 的文本设置为字符串资源? (适用于安卓的Java)