thymeleaf - Thymeleaf - 获取语言环境并进行比较
问题描述
下面应该将 h1 设置为 HOWDY,因为语言环境显示 en_GB,但它不属于这种情况吗?
我在这里做错了吗?谢谢
<h1 th:text="${#locale}"></h1>
<div th:switch="${#locale}">
<h1 th:case="'en_GB'">HOWDY</h1>
</div>
解决方案
当您使用 Thymeleaf 时#locale
,您使用的是对 JavaLocale
对象的引用。
什么有效?
以下以您期望的方式工作,因为它在评估每个语句之前已经将 Javalocale
对象评估为其字符串表示:case
<div th:switch="${#locale.toString()}">
<h1 th:case="'en_GB'">HOWDY</h1>
</div>
以下也有效:
<div th:switch="__${#locale}__">
<h1 th:case="'en_GB'">HOWDY</h1>
</div>
在这种情况下,它可以工作,因为您正在使用 Thymeleaf 预处理器语法__${...}__
强制 Thymeleaf 在评估语句#locale
的其余部分之前评估(对其字符串表示形式)switch
。
附加说明
因为 Thymeleaf#locale
代表一个 JavaLocale
对象,所以您可以使用任何Locale
合适的字段和方法,例如:
<div th:text="${#locale.country}"></div> <!-- a field -->
<div th:text="${#locale.toLanguageTag()}"></div> <!-- a method -->
这就是为什么仅${#locale}
在 Thymeleaf switch 语句中使用与'en_GB'
您期望它匹配的字符串文字不匹配的原因:Thymeleaf 正在将对象与字符串进行比较。
当你使用这个...
<div th:text="${#locale}"></div>
...您再次访问对象本身。但在这种情况下,对象将toString()
在 Thymeleaf 呈现时使用其方法,然后再显示 - 为您提供en_GB
显示的值。
然而,当你使用这个...
<div th:switch="${#locale}">
<h1 th:case="'en_GB'">HOWDY</h1>
</div>
...Thymeleaf 在 switch 语句中使用 locale 对象,而不是它的字符串表示。