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

问题描述 投票:0回答:4

我是 ThymeLeaf 的初学者,除了

@PreAuthorize
注释外,还没有过多使用 SpEL,所以请善意地帮助我。

我正在使用 ThymeLeaf(版本 2.1.2)以及 Spring(4.0.2.RELEASE)和

thymeleaf-spring4
包(据我所知)用 SpEL 替换默认的 OGNL 脚本。

我想要实现的只是通过

#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 提供了以下

优雅的解决方案

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

请注意单引号。预处理似乎

真的意味着在Thymeleaf中进行预处理。

但是,我已经接受了第一个工作答案。

java spring localization thymeleaf spring-el
4个回答
14
投票
以下对我有用

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

0
投票
正如您所写,它看起来像是预处理过的表达式 ala

__${...}__

请勿使用主题标签。

您可以做的是在表达式中使用 messageSource bean,因为这可以像其他任何东西一样在“正常”表达式中解析。

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

0
投票

#messages.msg

可以用。

<h1 th:text="${#strings.capitalize(#messages.msg('retrievable.key'))}"></h1>
    

-1
投票
为什么要将本地化字符串大写?如果它真正本地化为不同的语言,那么如果你对它们执行 toUpper ,你可能不会得到你想要的结果。更好的方法是将字符串本地化为您想要显示的大小写。

© www.soinside.com 2019 - 2024. All rights reserved.