Search code examples
spring-bootspring-mvcthymeleafproperties-file

Calling messages.properties dynamically with controller model variable and Thymeleaf


I have my messages.properties like this:

tablas.menu.paises=Pa\u00EDses
tablas.menu.regiones=Regiones
tablas.menu.anhos=A\u00F1os
tablas.menu.universidades=Universidades
tablas.menu.usuarios=Usuarios

In the .html I have a menu showing each item with th:each:

<li class="nav-item" th:each="menu : ${menus}">
  <a th:text="#{tablas.menu.${menu.nombre}}"></a>
</li>

For each "menu in ${menus}", menu.nombre has the values paises, regiones, anhos... But thymeleaf doesn't recognise the model variable inside the #{}, and this it is giving me in the view the error when it doesn't find the message:

??tablas.menu.${menu.nombre}_es_ES??

Configuration is ok, if I change the call for #{tablas.menu.regiones} I get 'regiones' and so. Is there any way to call a message from messages.properties dynamically using a model variable like this?

Thanks.


Solution

  • You can use the #messages utility object for this:

    <a th:text="${#messages.msg('tablas.menu.' + menu.nombre)}" />
    

    Or you can create the string using literal substitution:

    <a th:text="#{|tablas.menu.${menu.nombre}|}" />
    

    I would recommend using preprocessing only as a last resort, as bad values can cause runtime errors. (Although they do work for this.)