当您使用 Thymeleaf 的 #locale 时,您使用的是对 Java Locale 对象的引用。
什么有效?
以下内容按您预期的方式工作,因为在评估每个 case 语句之前,它已经将 Java locale 对象评估为其字符串表示形式:
<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 在评估 switch 语句的其余部分之前评估 #locale(对其字符串表示形式)。
补充说明
因为 Thymeleaf 的 #locale 代表一个 Java Locale 对象,您可以使用 Locales 的任何合适的字段和方法,例如:
<div th:text="${#locale.country}"></div> <!-- a field -->
<div th:text="${#locale.toLanguageTag()}"></div> <!-- a method -->
这就是为什么仅在 Thymeleaf switch 语句中使用 ${#locale} 与您期望它匹配的 'en_GB' 字符串文字不匹配的原因:Thymeleaf 正在将对象与字符串进行比较。
当你使用这个...
<div th:text="${#locale}"></div>
...您再次访问对象本身。但在这种情况下,对象在被 Thymeleaf 渲染时会在显示之前使用其 toString() 方法 - 为您提供 en_GB 显示值。
但是,当你使用这个...
<div th:switch="${#locale}">
<h1 th:case="'en_GB'">HOWDY</h1>
</div>
...Thymeleaf 在 switch 语句中使用的是 locale 对象,而不是它的字符串表示。