5. 示例 04 – 国际化
本示例将重新探讨第一个示例中涉及的国际化内容。
5.1. NetBeans 项目


它包含:
- 一个视图 [Page1.jsp]
- 两个消息文件 [messages*.properties]
- 无操作
5.2. 项目配置
[struts.xml] 文件内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- internationalization -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- default package -->
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Action1</param>
<param name="namespace">/actions</param>
</result>
</action>
</package>
<!-- equity package -->
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Action1">
<result name="success">/vues/Page1.jsp</result>
</action>
</package>
</struts>
- 第 8 行定义了一个 Struts 常量,用于指定国际化消息文件的名称,本例中为 `messages`。系统将在项目的 ClassPath 中搜索 `[messages_xx.properties]` 文件。因此,这些文件被放置在 [源代码包] [1] 的根目录下。
- 第 21–23 行:定义了一个没有关联类的操作 [Action1]。此时将使用默认的 Struts 类,其 execute 方法返回键值 "success"。 随后,视图 [/views/Page1.jsp] 将被返回给客户端。需要明确的是,这与直接调用视图 [/views/Page1.jsp] 并不相同。实际上,调用操作会触发拦截器的执行,而直接调用视图则不会。其中一个拦截器负责处理国际化。
5.3. 消息文件
messages.properties
page.texte=Ici, on met un texte fran\u00e7ais...
page.titre1=Fran\u00e7ais
page.titre2=Fran\u00e7ais
messages_en.properties
page.texte=Here, we put some english text...
page.titre1=English
page.titre2=English
它们定义了三个键:page.text、page.title1 和 page.title2。如果页面语言为英语(en),则使用 [messages_en.properties] 文件。对于所有其他语言,则使用 [messages.properties] 文件。这是默认的消息文件。使用的语言为:
- 客户端浏览器在发送给服务器的首选项中指定的语言
- 客户端请求中通过 request_locale=xx 参数指定的语言。
5.4. [Page1.jsp] 视图
该视图如下所示:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="page.titre1"/></title>
</head>
<body>
<h1><s:text name="page.titre2"/></h1>
<s:text name="page.texte"/>
</body>
</html>
- 第 7 行:显示键 page.title1 对应的消息
- 第 10 行:显示键为 page.title2 的消息
- 第 11 行:显示键为 page.text 的消息
5.5. 测试
让我们运行该项目:
![]() |
- 在 [1] 中,页面以法语显示。这是因为浏览器的首选语言设置为法语,因此使用了 [messages.properties] 文件。
- 在 [3] 中,页面以英语显示。这是因为 URL [2] 使用了 request_locale=en 参数,因此调用了 [messages_en.properties] 文件。
![]() |
在 [4] 中,请求的是德语 (de) 页面。由于没有 [messages_de.properties] 文件,因此使用默认文件 [messages.properties] [5]。
在[6]中,将英语设置为浏览器的首选语言。
![]() |
在[7]中,请求了[Action1]操作,但未带语言参数。该请求来自首选语言为英语(en)的浏览器。因此,使用[messages_en.properties]文件[8]。
从现在起,所有项目都将使用一个通用的 [messages.properties] 文件来支持所有语言。这要求我们在编写视图时使用该文件中的键。若要将项目本地化为英语,只需创建用于英语消息的 [messages_en.properties] 文件即可。无需进行其他更改。


