首页 > 解决方案 > Thymeleaf - 获取语言环境并进行比较

问题描述

下面应该将 h1 设置为 HOWDY,因为语言环境显示 en_GB,但它不属于这种情况吗?

我在这里做错了吗?谢谢

    <h1 th:text="${#locale}"></h1>
    <div th:switch="${#locale}">
        <h1 th:case="'en_GB'">HOWDY</h1>
    </div>

标签: thymeleaf

解决方案


当您使用 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 对象,而不是它的字符串表示。


推荐阅读