Шаблон скорости - ключ сообщения вместо целой фразы с заполнителями

У меня есть шаблон электронной почты.vm, который содержит сообщение с ключом сообщения messages_en.properties:

#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!

И имя не заменяется фактическим значением.

Какой лучший способ управлять фразами в шаблоне электронной почты? Я хочу поместить в шаблон только ключ сообщения, а не целую фразу с заполнителем.

1 ответ

Используйте директиву оценки для замены переменных внутри другой переменной:

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!
Другие вопросы по тегам