2017-01-06 5 views
0

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

#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

Использование 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! 
+0

Это работает, если все сообщения (в данном случае с электронной почтой тела) помещаются в VelocityContext, но если я попробуйте загрузить #msg, а затем # evaluate в .vm-файле, которого нет. – Justas

+0

Что такое 'msg' и какой оператор не работает? –

+0

# evaluate ('# msg ("email-body")') выводит Hello, $ name! – Justas