【问题标题】:Thymeleaf - getting locale and comparingThymeleaf - 获取语言环境并进行比较
【发布时间】:2021-05-03 07:08:22
【问题描述】:

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

我在这里做错了吗?谢谢

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

【问题讨论】:

标签: thymeleaf


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多