I need to use Thymeleaf templates for email sending for different locales.
I have next part in my HTML
<p th:text="#{TEST}"></p>
I have next code
Context context = new Context();
context.setLocale(Locale.GERMAN);
String emailBody = templateEngine.process( "WELCOME", context);
I have next beans
@Bean
public TemplateEngine mailTemplateEngine() {
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.addTemplateResolver(mailTemplateResolver());
templateEngine.addDialect(new LayoutDialect());
templateEngine.setMessageResolver(messageResolver());
return templateEngine;
}
@Bean
public ITemplateResolver mailTemplateResolver() {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setPrefix("/templates/email/common/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCharacterEncoding(UTF_8.name());
templateResolver.setCheckExistence(true);
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
public IMessageResolver messageResolver() {
return new StandardMessageResolver();
}
I am using next dependencies
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
I have resource bundle messages in "resources" folder for every language I need. And if you check #{TEST} from my html with ctrl+left click you can see that it sees property files, so IDEA can resolve it.
By when I am running my app and trying to send email I got next result
??TEST_de??
And I got similar result for every other language.
How to fix this ? I need TemplateEngine to be capable to get proper property value depending on locale.
When using Spring and Thymeleaf you are probably better of using the Thymeleaf classes that offer Spring integration. Like the SpringTemplateEngine
, which will connect with a Spring MessageSource
automatically.
Now when using Spring you also might want to utilize the SpringResourceTemplateResolver
as well.
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
source.setBasename("classpath:/messages");
return source;
}
@Bean
public SpringTemplateEngine mailTemplateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.addTemplateResolver(mailTemplateResolver());
templateEngine.addDialect(new LayoutDialect());
return templateEngine;
}
@Bean
public SpringResourceTemplateResolver mailTemplateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setPrefix("classpath:/templates/email/common/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding(UTF_8.name());
templateResolver.setCheckExistence(true);
templateResolver.setCacheable(false);
return templateResolver;
}
Pro Tip: When using Java config try to be as specific as possible in your return type, this makes it easier for Spring to determine callbacks like ApplicationAware
, MessageSourceAware
etc. etc.