Struts国际化

应用程序国际化

  资源文件和资源包

  要用Struts实现国际化和本地化,首先要定义资源文件的名称,这个文件会包含用默认语言编写的会在程序中出现的所有消息。这些消息以”键-值“对的形式存储,如下:
    
error.validation.localtion = The entered location is invalid
  
当对一个应用程序进行国际化处理时,所要用的各种语言版本的”标签“信息应该存放在不同的属性文件中,每一个这样的文件对应一种语言版本。所有属性文件合在一起称为资源包(Resource Bundle)。

  属性文件的命名格式可分为以下两种:
      a)文件名前缀.properties
      b)文件名前缀_语言种类.properties

   文件名后缀必须是properties,前缀可自由书写,其中语言种类字段必须是有效的ISO语言代码。文件名前缀.properties默认的形式,当其他属性文件找不到时,会默认的寻找此属性文件

如何实现应用程序国际化

  

  

配置全局资源与输出国际化信息

  1、 准备资源文件

  2 、在struts.xml中使用struts.custom.i18n.resources常量即可加载全局资源文件

1 <constant name="struts.custom.i18n.resources" value="cn.itcast.i18n.resource" />

    resource为资源文件的基本名。

  3、在jsp页面获取国际化的资源文件的信息

    使用text标签: 用来显示一条国际化消息的数据标签. 相当于从property标签调用 getText 方法. 该标签包含如下属性:

    * name: 用来检索消息的键

    * var:用来引用压入 ContextMap 栈的值的变量名

    * 可以通过  param 子标签向 text 标签传递参数

    1 <s:text name="item.username"/>

全局资源文件中含有占位符

  使用text标签传递参数:

资源文件的信息

              item.test={0},欢迎,{1}

    jsp页面

             <s:text name="item.test">

                    <s:param>用户名</s:param>      {0}

                    <s:param>密码</s:param>         {1}    

              </s:text>

   输出结果:

           用户名,欢迎,密码

在action中获取资源文件的信息

  ActionSupport 类实现了 TextProvider 接口, 该接口负责提供对各种资源包和它们的底层文本消息的访问机制

  当调用 getText() 方法时, 它将按以下顺序搜索相关的属性文件. 

•Action类的属性文件: 该文件的名字与相关的动作类的名字一样, 并且和那个动作类存放在同一个目录下
•动作类所实现的各个接口的属性文件
•动作类的各个父类的属性文件
•动作类的各个父类所实现的各个接口的属性文件
•如果动作类实现了 ModelDriven 接口, Struts 将调用 getModel() 方法并从模型对象的类开始沿着类的继承关系进行一次上溯搜索
•默认的包的属性文件
•继承关系中的下个父包里的资源包

    

 1 <%@ page language="java"  pageEncoding="UTF-8"%>
 2 <%@ taglib uri="/struts-tags" prefix="s" %>
 3 <html>
 4   <head>    
 5     <title>My JSP 'login.jsp' starting page</title>
 6   </head>
 7   <body>
 8   <br>
 9      <s:text name="item.username"/><br>
10      
11     <!-- item.test={0} 是  {1}  -->
12      <s:text name="item.test">
13        <s:param>用户名0</s:param>
14        <s:param>密码1</s:param>
15      </s:text>
16   </body>
17 </html>

国际化—JSP中直接访问某个资源文件

  i18n 标签: 用来加载一个自定义的 ResourceBundle.不用做任何配置,不用在struts.xml配

    name: 将被加载的资源集的 java 完全限定名

1 <s:i18n name=“resource">
2     <s:text name=“item.username”/>
3 </s:i18n>
4 resource为类路径下资源文件的基本名。

      如果要访问的资源文件在类路径的某个包下,可以这样访问:

1       <s:i18n name=“cn.itcast.i18n.resource">
2         <s:text name=“item.test">
3             <s:param>小张</s:param>
4         </s:text>
5       </s:i18n>
6       上面访问cn.itcast.i18n包下基本名为resource的资源文件。

  i18n.jsp

 1 <%@ page language="java"  pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
 2 <%@ taglib uri="/struts-tags" prefix="s" %>
 3 <html>
 4   <head>    
 5     <title>My JSP 'login.jsp' starting page</title>
 6   </head>
 7   <body>
 8        <s:i18n name="cn.itcast.i18n.resources">
 9        <form name="loginForm" method="post" 
10             action="${pageContext.request.contextPath}/i18n/i18nAction_login.action">
11          <table border="1">
12            <tr>
13               <td><s:text name="items.username" /></td>
14               <td><input type="text" name="username"/></td>
15            </tr>
16            <tr>
17               <td><s:text name="items.psw" /></td>
18               <td><input type="password" name="psw"/></td>
19            </tr>
20          <tr>
21               <td>&nbsp;</td>
22               <td><input type="submit" value="<s:text name='items.login'/>"/></td>
23            </tr>
24          </table>
25      <form>
26      </s:i18n>
27   </body>
28 </html>

使用 native2ascii 程序转换字符编码

  JDK 中提供了一个 native2ascii 工具程序,它可以将某种本地字符集编码的字符转换成 Unicode 转义序列的形式

  DOS 下进入 test_cn_backup.properties文件所在目录,运行下面的命令后将在当前目录下生成一个名为 test_zh_CN.properites 文件:

1     native2ascii -encoding gb2312  源文件   目标文件.properites 
2     native2ascii -encoding gb2312   test_cn_backup.txt    test_zh_CN.properites 

样例代码:

1、jsp

  login.jsp

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>    
    <title>My JSP 'login.jsp' starting page</title>
  </head>
  <body>
       <form name="loginForm" method="post" 
            action="${pageContext.request.contextPath}/i18n/i18nAction_login.action">
         <table border="1">
           <tr>
              <td><s:text name="items.username" /></td>
              <td><input type="text" name="username"/></td>
           </tr>
           <tr>
              <td><s:text name="items.psw" /></td>
              <td><input type="password" name="psw"/></td>
           </tr>
         <tr>
              <td> </td>
              <td><input type="submit" value="<s:text name='items.login'/>"/></td>
           </tr>
         </table>
     <form>
  </body>
</html>

  success.jsp

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>    
    <title>My JSP 'login.jsp' starting page</title>
  </head>
  <body>
  <br>
       成功!!!!!!!!!!!!!<br>
        <h1>xxxxxxxxxx</h1>
  </body>
</html>

  i18n.jsp

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>    
    <title>My JSP 'login.jsp' starting page</title>
  </head>
  <body>
       <s:i18n name="cn.itcast.i18n.resources">
       <form name="loginForm" method="post" 
            action="${pageContext.request.contextPath}/i18n/i18nAction_login.action">
         <table border="1">
           <tr>
              <td><s:text name="items.username" /></td>
              <td><input type="text" name="username"/></td>
           </tr>
           <tr>
              <td><s:text name="items.psw" /></td>
              <td><input type="password" name="psw"/></td>
           </tr>
         <tr>
              <td> </td>
              <td><input type="submit" value="<s:text name='items.login'/>"/></td>
           </tr>
         </table>
     <form>
     </s:i18n>
  </body>
</html>

  testParam.jsp

<%@ page language="java"  pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>    
    <title>My JSP 'login.jsp' starting page</title>
  </head>
  <body>
  <br>
     <s:text name="item.username"/><br>
     
    <!-- item.test={0} 是  {1}  -->
     <s:text name="item.test">
       <s:param>用户名0</s:param>
       <s:param>密码1</s:param>
     </s:text>
  </body>
</html>

2、java

  I18nAction.java

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class I18nAction extends ActionSupport {

	public String login(){
		System.out.println("I18nAction ************* login()");
		
		String username = this.getText("items.username");
		System.out.println("username = "+username);
		
		String psw = this.getText("items.psw");
		System.out.println("password = "+psw);
		
		return "success";
	}
	
}

3、xml

  struts_i18n.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="i18n" namespace="/i18n" extends="struts-default">
		<action name="i18nAction_login" class="cn.itcast.i18n.I18nAction" method="login">
			<result name="success">/i18n/success.jsp</result>
		</action>
	</package>
</struts>

  struts.xml

<constant name="struts.custom.i18n.resources"value="cn.zengfansheng.i18n.resources</constant>
<include file="cn/zengfansheng/struts/i18n/struts_i18n.xml"></include>

4、properties

    resources.properties

items.username=username
items.psw=password
items.login=login
item.test={0}hacket{1}

    resources_zh_CN.properties

items.username=username_en
items.psw=password_en
items.login=login_en
item.test={0}\u5C0F\u52DD{1}

  resources_en_US.properties

items.username=\u7528\u6237\u540D
items.psw=\u5BC6\u7801
items.login=\u767B\u5F55
item.test={0}xiaosheng_en{1}

  

by hacket
原文地址:https://www.cnblogs.com/hacket/p/3082674.html