Spring Boot i18n + Thymeleaf:在 messages.properties 文件中使用数组

Posted

技术标签:

【中文标题】Spring Boot i18n + Thymeleaf:在 messages.properties 文件中使用数组【英文标题】:Spring Boot i18n + Thymeleaf: using arrays in the messages.properties files 【发布时间】:2021-02-08 05:11:39 【问题描述】:

我正在用 i18n 和三种语言构建一个 Spring Boot 网站。这意味着当我在表单中有一个带有多个字符串的选择输入时(例如选择 apple/banana/carrot),我不能只将这些字符串放在模板中,我必须通过消息包运行它们。我发现我可以像这样在选择输入中简单地使用数值:

<option value="1" th:text="#user.function[1]">Lorem</option>
<option value="2" th:text="#user.function[2]">Ipsum</option>
<option value="3" th:text="#user.function[3]">Dolor</option>
<option value="4" th:text="#user.function[4]">Sit</option>
<option value="5" th:text="#user.function[5]">Amet</option>

然后从消息属性文件中的数组中提取实际字符串,对于英语,该文件如下所示:

user.function[1]=Lorem
user.function[2]=Ipsum
user.function[3]=Dolor
user.function[4]=Sit
user.function[5]=Ames

这似乎可以用于提取数据,因为我可以显示例如像这样的模板中的“Dolor”:

th:text="#user.function(3)"

当我需要使用数据库中的字段而不是简单的“3”时,就会出现问题,例如用户功能:

th:text="#user.function($user.function)"

即使 $user.function 返回 3,上面的行也只是返回:

??user.function_en??

我做错了什么?

【问题讨论】:

【参考方案1】:

这是因为您正在尝试评估内在表达。 Thymeleaf 官方文档说

´__$...__´ 语法是一个预处理表达式,它是一个内部表达式,在实际评估整个表达式之前先进行评估

您可以在这里阅读更多内容https://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#dynamic-fields

你可以试试这样的

th:text="#user.function(__$user.function__)"

这意味着内部user.function 将在外部user.function 之前评估

【讨论】:

谢谢,试过了,但没有任何改变。仍然得到相同的 ??user.function_en??

以上是关于Spring Boot i18n + Thymeleaf:在 messages.properties 文件中使用数组的主要内容,如果未能解决你的问题,请参考以下文章

i18n 在 spring-boot / thymeleaf 项目中它没有检索本地化消息

Spring Boot 中的 I18n + Thymeleaf

Spring Boot i18n + Thymeleaf:在 messages.properties 文件中使用数组

带有 Spring Boot 和 thymeleaf 的 Spring MVC 4 - i18n 无法正常工作

Spring Boot 入门之 Web 篇

springBoot引入thymyleaf