Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can localized messages in Thymeleaf be processed using SpEL

I am a beginner with ThymeLeaf and have not used SpEL too much except for @PreAuthorize annotations, so please be so kind to help me out.

I am using ThymeLeaf (version 2.1.2) together with Spring (4.0.2.RELEASE) and the thymeleaf-spring4 package which (as far as I understood it) replaces the default OGNL scripting with SpEL.

What I want to achieve is simply that a localized string is capitalized via #strings.capitalize function. Here is what I tried so far:

<h1 th:text="#{retrievable.key}">Text to be replaced</h1>

Works perfectly and gives the expected result.

Now when I tried this:

<h1 th:text="${#strings.capitalize(#{retrievable.key})}">Text to be replaced</h1>

I got the following exception (root cause, rest omitted for clarity):

org.springframework.expression.spel.SpelParseException:
EL1043E:(pos 21): Unexpected token.  Expected 'identifier' but was 'lcurly({)'

Ok, fine. Just for fun, I omitted the curly brackets and got what I expected: the <h1> was empty.

So now I thought that it might necessary to preprocess the retrieval of the message for retrievable.key so that it is already evaluated when #strings.capitalize is evaluated. Though this seemed bot either counterintuitive and illogical to me, as this would break all programming rules, I tried that approach. It did not work either: using

${#strings.capitalize(__#retrievable.key__)}

lead to

org.thymeleaf.exceptions.TemplateProcessingException:
Could not parse as expression: "#retrievable.key"

and using

${#strings.capitalize(__#{retrievable.key}__)}

led to (you guessed it) <h1></h1>.

I know that the actual problem can be solved with CSS or JavaScript, but it's not necessarily about uppercasing or capitalizing, but on processing of localized strings and this is an example.

So what am I missing here?

Solution provided by Thymeleaf Forum

Zemi of the ThymeLeaf Forum provided the following, elegant solution:

<h1 th:text="${#strings.capitalize('__#{retrievable.key}__')}">Text to be replaced</h1>

Please notice the single quotes. Preprocessing seems to really mean preprocessing in Thymeleaf.

I have accepted the first working answer, however.

like image 738
Markus W Mahlberg Avatar asked Mar 23 '14 18:03

Markus W Mahlberg


1 Answers

The following worked for me

<body th:with="message=#{retrievable.key}">
    <h1 th:text="${#strings.capitalize(message)}">Text to be replaced</h1>
</body>
like image 143
geoand Avatar answered Oct 21 '22 21:10

geoand