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>
  <!-- 国际化 -->
  <constant name="struts.custom.i18n.resources" value="messages" />
  <!-- 默认包 -->
  <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>
  <!-- 操作包 -->
  <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] 文件。因此,这些文件被放置在 [Source Packages] 和 [1] 的根目录下。
  • 第21-23行:定义了一个没有关联类的[Action1]操作。此时将使用Struts的默认类,其execute方法返回success键。 随后,视图 [/vues/Page1.jsp] 将被返回给客户端。需要明确的是,这与直接调用视图 [/vues/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.textepage.titre1page.titre2。如果页面语言为英语(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.titre1
  • 第 10 行:显示键消息 page.titre2
  • 第 11 行:显示密钥消息 page.texte

5.5. 测试

运行项目:

  • 在 [1] 中,页面以法语显示。这是因为所使用的浏览器将法语设为首选语言,因此调用了文件 [messages.properties]。
  • 在 [3] 中,页面以英语显示。这是因为 [2] 的 URL 使用了参数 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] 文件即可。无需进行其他修改。