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

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

我正在使用ThymeLeaf(版本2.1.2)和Spring(4.0.2.RELEASE)和软件包(据我所知)用SpEL替换默认的OGNL脚本thymeleaf-spring4

我想实现的只是通过#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 Forum的Zemi提供了以下优雅的解决方案

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

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

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


答案 1

以下内容对我有用

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

答案 2

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

__${...}__

不要使用 # 标签。

您可以做的是在表达式中使用 messageSource Bean,因为这可以在“正常”表达式中像其他任何内容一样解决。

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

推荐