如何使用SpEL处理Thymeleaf中的本地化消息

时间:2014-03-23 18:07:01

标签: java spring localization thymeleaf spring-el

我是ThymeLeaf的初学者,除了@PreAuthorize注释外没有太多使用SpEL,所以请帮助我。

我正在使用ThymeLeaf(版本2.1.2)和Spring(4.0.2.RELEASE)以及thymeleaf-spring4包(据我所知)replaces the default OGNL scripting with SpEL

我想要实现的只是通过#strings.capitalize函数将本地化字符串大写。这是我到目前为止所尝试的:

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

完美运作并提供预期效果。

现在我尝试了这个:

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

我得到以下异常(根本原因,为清楚起见省略了其余部分):

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

好的,好的。为了好玩,我省略了大括号,得到了我的预期:<h1>为空。

所以现在我认为可能需要对retrievable.key的消息进行预处理,以便在评估#strings.capitalize时对其进行评估。虽然这对我来说似乎违反直觉和不合逻辑,因为这会破坏所有编程规则,我尝试了这种方法。它也不起作用:使用

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

导致

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

并使用

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

导致(你猜对了)<h1></h1>

我知道实际问题可以通过CSS或JavaScript解决,但它不一定是关于大写或大写,而是处理本地化字符串,这是一个例子。

那我在这里错过了什么?

由Thymeleaf论坛提供的解决方案

ThymeLeaf论坛的Zemi提供了以下内容,elegant solution

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

请注意单引号。预处理似乎真的意味着在Thymeleaf中进行预处理。

然而,我接受了第一个工作答案。

3 个答案:

答案 0 :(得分:10)

以下为我工作

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

答案 1 :(得分:0)

正如你所写,它看起来像预处理的表达式ala

__${...}__

不使用#标签。

您可以做的是在表达式中使用messageSource bean,因为这可以在&#34; normal&#34;中解决。表达为其他任何东西。

 <div th:text="${beans.messageSource.getMessage(messageVariable)}"></div>

答案 2 :(得分:-1)

为什么要将本地化字符串大写?如果它真正本地化为不同的语言,那么如果对它们执行toUpper,则可能无法获得所需的结果。更好的方法是在您想要显示的情况下本地化字符串。