Skip to content

5. 示例 04 – 国际化

本示例将重新探讨第一个示例中涉及的国际化内容。

5.1. NetBeans 项目

Image

Image

它包含:

  • 一个视图 [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.textpage.title1page.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] 文件即可。无需进行其他更改。