3使用文本
3.1 A multi-language welcome
我们的第一个任务是为我们的网站创建一个主页。
我们将编写此页面的第一个版本非常简单:只是标题和欢迎消息。 这是我们的/WEB-INF/templates/home.html文件:
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Good Thymes Virtual Grocery</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" media="all"
href="../../css/gtvg.css" th:href="@{/css/gtvg.css}" />
</head>
<body>
<p th:text="#{home.welcome}">Welcome to our grocery store!</p>
</body>
</html>
你会在这里注意的第一件事是这个文件是XHTML,可以被任何浏览器正确显示,因为它不包含任何非XHTML标签(并且浏览器会忽略他们不理解的所有属性,如:文本)。 此外,浏览器将以标准模式(不是在怪癖模式下)显示它,因为它具有格式良好的DOCTYPE声明。
接下来,这也是有效的XHTML2,因为我们已经指定了一个Thymeleaf DTD,它定义了像th:text这样的属性,这样你的模板就可以被认为是有效的。 甚至更多:一旦模板被处理(并且所有th:*属性都被删除),Thymeleaf将自动用标准的XHTML 1.0严格替换DOCTYPE子句中的DTD声明(我们将把这个DTD翻译功能留给后面的章节))。
还为th:*属性声明了thymeleaf命名空间:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
请注意,如果我们根本不关心模板的有效性或格式良好,我们可以简单地指定一个标准的XHTML 1.0 Strict DOCTYPE,以及没有xmlns名称空间声明:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Good Thymes Virtual Grocery</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" media="all"
href="../../css/gtvg.css" th:href="@{/css/gtvg.css}" />
</head>
<body>
<p th:text="#{home.welcome}">Welcome to our grocery store!</p>
</body>
</html>
......这仍然是Thymeleaf在XHTML模式下完全可以处理的(尽管我们的IDE可能会让我们的生活变得非常悲惨,并且显示出各处的警告)。
但足够的验证。 现在,对于模板中真正有趣的部分:让我们看看那个:text属性是关于什么的。
使用th:文本和外化文本
外化文本是从模板文件中提取模板代码的片段,以便它们可以保存在特定的单独文件(通常是.properties文件)中,并且可以很容易地用其他语言编写的等效文本替换(一个称为国际化的过程或简单地说i18n)。 外化的文本片段通常称为“消息”。
消息始终具有标识它们的键,Thymeleaf允许您使用#{...}语法指定文本应与特定消息对应:
<p th:text="#{home.welcome}">Welcome to our grocery store!</p>
我们在这里看到的实际上是Thymeleaf标准方言的两个不同特征:
th:text属性,它评估其值表达式并将此评估的结果设置为它所在标记的主体,有效地替换了我们在代码中看到的“欢迎来到我们的杂货店!”文本。
标准表达式语法中指定的#{home.welcome}表达式,指定th:text属性要使用的文本应该是带有home.welcome键的消息,该键对应于我们正在处理模板的区域设置。
现在,这个外化文本在哪里?
Thymeleaf中外化文本的位置是完全可配置的,它取决于所使用的特定org.thymeleaf.messageresolver.IMessageResolver实现。通常,将使用基于.properties文件的实现,但是如果我们想要从数据库获取消息,我们可以创建自己的实现。
但是,我们在初始化期间没有为模板引擎指定消息解析器,这意味着我们的应用程序正在使用标准消息解析器,由类org.thymeleaf.messageresolver.StandardMessageResolver实现。
此标准消息解析程序希望在.properties文件中的/WEB-INF/templates/home.html中找到同一文件夹中的消息,并使用与模板相同的名称,如:
/WEB-INF/templates/home_en.properties用于英文文本。
/WEB-INF/templates/home_es.properties用于西班牙语文本。
/WEB-INF/templates/home_pt_BR.properties用于葡萄牙语(巴西)语言文本。
/WEB-INF/templates/home.properties用于默认文本(如果区域设置不匹配)。
home.welcome=¡Bienvenido a nuestra tienda de comestibles!
我们来看看home_es.properties文件:
这就是我们将Thymeleaf流程作为模板所需的全部内容。 让我们创建我们的Home控制器。