mikehoge
mikehoge

Reputation: 61

Thymeleaf and Spring Boot not reading properties from localization files - Question marks appear instead of the localized string

When attempting to localize a static string the message is displayed surrounded with questionmarks "??"

e.g. ??ticket.type_en_US??

<p th:text="#{ticket.type}">Blah</p>

I have configured the basename of my messages in application.properties

and the contents of that messages.properties and messages_en_US.properties is:

ticket.type=BUGS!!!!

Config:

spring.messages.basename=messages

Output on startup:

2016-07-19 08:38:28.673 DEBUG 5175 --- [ main] ationConfigEmbeddedWebApplicationContext : Using MessageSource [org.springframework.context.support.ResourceBundleMessageSource: basenames=[messages]]

I also tried programatically using the MessageResource in the code below. I placed the messages.properties file in the same folder as the application.properties file. src/main/resources/

@Configuration
@ComponentScan("controller") 
public class WebConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware{

    private ApplicationContext applicationContext;

    @Autowired
    private MessageSource messageSource;

    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }

    @Bean
    public TemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        engine.setMessageSource(messageSource);
        return engine;
    }

    @Bean
    public ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setTemplateMode(TemplateMode.HTML);
        return resolver;
    }
}

For completeness here is my application config (like others I had to exluse the Thymeleaf class):

@SpringBootApplication(exclude={org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration.class})
public class Application {

    public static void main(String[] args) {

        ApplicationContext ctx = SpringApplication.run(Application.class, args);

    }

}

I have also verified that the message bundles are being loaded by pring out the contents on one of my REST end-point calls:

@Autowired
    private MessageSource messageSource;

    @GET
    @Produces("application/json")
    public List<MyData> getData() {
        System.out.println("HERE 1 in Conversions");

        System.out.println(messageSource.getMessage("ticket.type", null, Locale.US));

        return getTheData();
    }

This prints out the following so I know spring-boot is loading the resource bundles, but Thymeleaf is not picking them up somehow:

BUGS!!!!

Here is my full HTML page, perhaps there is an issue with it:

<html xmlns:th="http://www.thymeleaf.org">
<head>

    <title>Kitchen Sink</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

    <link href="http://cdn.jsdelivr.net/webjars/bootstrap/3.3.4/css/bootstrap.min.css"
          th:href="@{/webjars/bootstrap/3.3.4/css/bootstrap.min.css}"
          rel="stylesheet" media="screen" />

    <script src="http://cdn.jsdelivr.net/webjars/jquery/2.1.4/jquery.min.js"
            th:src="@{/webjars/jquery/2.1.4/jquery.min.js}"></script>

    <link href="../static/css/mike.css"
          th:href="@{css/mike.css}" rel="stylesheet" media="screen"/>
</head>

<body>
<div class="container">
    <div class="jumbotron">

        <h1>Hello</h1>

        <h2>Welcome to the Kitchen Sink!</h2>

        <p th:text="#{ticket.type}">Blah</p>

        <p th:text="#{test.type}">dssfgf</p>

      </div>

</body>

</html>

Upvotes: 4

Views: 4951

Answers (3)

Piotr Filochowski
Piotr Filochowski

Reputation: 140

I had a similar problem, and code from your post didn't work for me. The source of my issue was, that I didn't have message.proprerties (without any language).

I had:

messages_en.properties
messages_de.properties
messages_es.properties

but it didn't work.

It started working only when I added

messages.properties

Upvotes: 0

Ahmad
Ahmad

Reputation: 51

Please add

@EnableAutoConfiguration

in your Spring boot startup its look like

@EnableAutoConfiguration
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);

    }
}

Upvotes: 1

mikehoge
mikehoge

Reputation: 61

ok, so I figured it out. Thanks @M.Deinum for poitning out that I should just let spring-boot and Thymeleaf do what they are supposed to do.

I had to set the:

engine.setMessageSource(messageSource);

and also add the:

@Bean 

to the 2 other functions. This allowed the MessageSource to be passed into the engine and resolve the properties correctly.

I will update the question above with the correct source so people can use it for referene

Upvotes: 2

Related Questions