关于struts国际化的一点尝试

好久没发过blog了,其实也不是忙,感觉就是没心情。今天上午忙了一上午,被msn骗子给搞死了,到中午那会终于搞定了。下午就做了一个struts国际化的小程序,其实做struts也有快半年了,但感觉一直是只见树木不见林,决定从今天开始好好补课,不然真的要成为流水线的工人了。
下面的例子如有错误,还请各位斧正。
1、修改web.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
           <param-name>application</param-name>
           <param-value>com.sharp.struts.ApplicationResources</param-value>
         </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

文件中灰色背景部分为国际化需要增加的内容,其中com.sharp.struts.ApplicationResources跟你的WEB-INF目录下classes下的目录结构是一致的,如下图所示

2、建立资源文件ApplicationResources.source(中文源文件,而不是中文资源文件)、ApplicationResources_en.properties(英文资源文件)。
首先建立ApplicationResources_en.properties文件,内容如下:
owner.greet=Greet
owner.name=Name
owner.address=Address
owner.email=Email
owner.tel=Tel

对应的中文源文件内容如下:
owner.greet=称呼
owner.name=姓名
owner.address=地址
owner.email=电子邮件
owner.tel=联系电话

然后通过在cmd中执行native2ascii -encoding GBK ApplicationResources.source .\ApplicationResources_zh_CN.properties
命令将中文源文件生成UTF-8格式的中文资源文件,内容如下
owner.greet=\u79f0\u547c
owner.name=\u59d3\u540d
owner.address=\u5730\u5740
owner.email=\u7535\u5b50\u90ae\u4ef6
owner.tel=\u8054\u7cfb\u7535\u8bdd
这里介绍一下,native2ascii是JDK包自带的一个工具,如果你不能cmd直接执行native2ascii命令,请检查你的环境变量,这里不具体介绍了。

3、接着来介绍一下struts-config.xml文件的内容,如果熟悉struts的朋友也觉得很简单的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
    <!-- ========== Form Bean Definitions ================================== -->
    <form-beans>
        <form-bean name="ownerForm" type="com.sharp.struts.form.OwnerForm">
            <form-property name="Email" type="java.lang.String" />
            <form-property name="Greet" type="java.lang.String" initial="Mr." />
            <form-property name="Address" type="java.lang.String" />
            <form-property name="Tel" type="java.lang.Integer" initial="0" />
            <form-property name="Name" type="java.lang.String" />
        </form-bean>
       
    </form-beans>
   
    <!-- ========== Global Exception Definitions ============================== -->
    <global-exceptions />
   
    <!-- ========== Global Forward Definitions =============================== -->
    <global-forwards>
        <forward name="failure" path="/failure.jsp" />
       
    </global-forwards>
   
    <!-- ========== Action Mapping Definitions =============================== -->
    <action-mappings>
        <action
            attribute="ownerForm"
            input="/owner.jsp"
            name="ownerForm"
            path="/owner"
            type="com.sharp.struts.action.OwnerAction"
            parameter="formAction"><!--因为action类继承DispatchAction类,所以需要设置这个属性-->
            <forward name="owner"   path="/owner.jsp" />
            <forward name="success" path="/success.jsp" />
        </action>

       
    </action-mappings>
   
</struts-config>

4、现在就开始准备java和jsp文件吧
owner.jsp文件内容如下:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<html:html locale="true">
 <head>
  <meta name = "Generator" content = "Easy Struts Xslt generator for Eclipse (http://easystruts.sf.net).">
  <title>Struts Form for ownerForm</title>
  <script language="javascript">
      function changeLanguage(language) {
          if(language == "en") {
              document.all("language").value = "en";
          } else {
              document.all("language").value = "cn";
          }
          document.forms[0].submit();
      }
  </script>
 </head>
 <body>
  <html:form action="/owner">
  <input type="hidden" name="formAction" value="changeLanguage">
  <input type="hidden" name="language">

   <bean:message key="owner.greet" /> : <html:select property="greet">
      <html:option value=""></html:option>
      <html:option value="Mr.">Mr.</html:option>
      <html:option value="Miss.">Miss.</html:option>
      <html:option value="Mrs.">Mrs.</html:option>
     </html:select><html:errors property="greet"/></br>   
   <bean:message key="owner.name" /> : <html:text property="name"/><html:errors property="name"/></br>
   <bean:message key="owner.address" /> : <html:text property="address"/><html:errors property="address"/></br>
   <bean:message key="owner.email" /> : <html:text property="email"/><html:errors property="email"/></br>
   <bean:message key="owner.tel" /> : <html:text property="tel"/><html:errors property="tel"/></br>
   <html:submit/>
   <html:cancel/>
   <input type="button" name="langEn" value="英文版" onclick="changeLanguage('en')">   
   <input type="button" name="langCn" value="中文版" onclick="changeLanguage('cn')">
  </html:form>
 <body>
</html:html>

OwnerAction.java文件内容如下:
// Created by Xslt generator for Eclipse.
// XSL :  not found (java.io.FileNotFoundException:  (Bad file descriptor))
// Default XSL used : easystruts.jar$org.easystruts.xslgen.JavaClass.xsl

package com.sharp.struts.action;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.sharp.struts.form.OwnerForm;

/**
 * OwnerAction.java created by EasyStruts - XsltGen.
 *
http://easystruts.sf.net
 * created on 10-09-2004
 *
 * XDoclet definition:
 * @struts:action path="/owner" name="ownerForm" input="/owner.jsp" validate="true"
 * @struts:action-forward name="/success.jsp" path="/success.jsp"
 */
public class OwnerAction extends DispatchAction {

 
 public ActionForward changeLanguage(
  ActionMapping mapping,
  ActionForm form,
  HttpServletRequest request,
  HttpServletResponse response) {

   String language = request.getParameter("language");   
   if (language.equals("en")) {
        request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);    
   } else {    
        request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.CHINESE);
   }
   
        return mapping.findForward("owner");
    }
}
这里需要注意一下,千万不要弄错,我在这里就花费了一个多小时,因为把文件名写错了
Locale.ENGLISH是一个Locale对象,getLanguage()方法返回en,跟资源文件(ApplicationResources_en.properties)的后缀相同
Locale.CHINESE是一个Locale对象,getLanguage()方法返回zh,跟资源文件(ApplicationResources_zh_CN.properties)的后缀相同


另外还用到一个ownerForm.java文件,内容如下:
// Created by Xslt generator for Eclipse.
// XSL :  not found (java.io.FileNotFoundException:  (Bad file descriptor))
// Default XSL used : easystruts.jar$org.easystruts.xslgen.JavaClass.xsl

package com.sharp.struts.form;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

/**
 * OwnerForm.java created by EasyStruts - XsltGen.
 * http://easystruts.sf.net
 * created on 10-09-2004
 *
 * XDoclet definition:
 * @struts:form name="ownerForm"
 */
public class OwnerForm extends ActionForm {

 // --------------------------------------------------------- Instance Variables

 /** Email property */
 private String email;

 /** Greet property */
 private String greet = "Mr.";

 /** Address property */
 private String address;

 /** Tel property */
 private int tel = 0;

 /** Name property */
 private String name;
 // --------------------------------------------------------- Methods
......
//getter,setter mothod,这里不赘列了

}

5、总结
这样一个国际化的小例子就可以运行了,不过上面写得比较粗略,需要对java和struts有一定了解。
网上对国际化也有其他的做法,也可以参考。
如果上述有所偏颇,敬请斧正。

posted on 2004-10-11 16:56 候鸟南飞 阅读(5993) 评论(11)  编辑 收藏

评论

#1楼  回复 引用 查看   

支持一下,看不懂,鸟人,好深奥啊!
2004-10-14 16:30 | 柚子Nan      

#2楼  回复 引用   

thanks,我正想做这个东东呢。
2004-12-26 12:40 | Jerry.c.z zheng

#3楼  回复 引用   

呵呵 是很深奥阿!
2005-01-02 20:51 | 不至于

#4楼  回复 引用   

天啊!
我老哥叫我自己去解决这个问题!我摘了一上午还搞不懂!
2005-08-01 15:13 | 鱼儿![未注册用户]

#5楼  回复 引用   

阅读:1544 评论: 3 参与评论

标题 Struts国际化处理 二 选择自 chinaewolf 的 Blog
关键字 Struts国际化处理 二
出处

对于使用者来说,一个支持国际化的WEB程序具有下面几种形式

1. 根据用户浏览器自动设置显示的语言(无需用户干预)
2. 提供用户选择,用户根据自己的需要决定使用何种语言显示
3. 结合前两种.系统自动选择一种语言,但同时提供用户根据需要选择

使用Struts开发国际化程序是一件非常便利的事情,我们来看前两种怎么来实现

1. 这是最简单的方式,你不需要修改任何程序,只需要把资源文件按照各个语言翻译一遍并把这些文件按照国际化程序的要求命名好放置同一个目录即可. 例如 ApplicationResource_en_US.properties ApplicationResource_zh_TW.properties . 这种方式虽然自动的给用户设置好要显示的语言,但是有时候由于浏览器本身的问题,或者用户自己想看其他语种的时候就没有办法.

2. 这是比较常见的方式,由用户自己来选择所要显示的语言. 一般的情况是在首页或者登录页上增加语言的选项,用户选中其中一种登录后即以用户选择的语言进行显示,但是用户登录后必须把用户所选择的语言保存起来并让程序也就是<bean:message这些标签可以使用所选择的语言加载配置信息,因此在用户登录执行的Action类中加入如下代码

Locale locale = new Locale(request.getParameter("locale"));
//TODO:判断locale的有效性,无效的话不存入到sesssion中
req.getSession().setAttribute(Globals.LOCALE_KEY,locale);

好了,现在<bean:message/>这个标签库现在就可以根据你保存在session中的Locale对象来决定加载的是哪种语言, 通过看<bean:message/>标签库的源码我们就可以一目了然知道该标签库在加载资源前先从session或者该Locale对象,如果为空则使用request.getLocale()这个值来加载对应语言的资源,因此这种做法实际上是实现了前面提到的第三种形式. 接下来就是翻译资源文件,有如第一步讲到的.

Struts框架在实现国际化应用程序的时候还是替我们想的很周到,因此你所需要做的就是翻译.

最后切记两点:
1. 页面的字符集必须是UTF-8,例如:
<%@ page language="java" contentType="text/html;charset=UTF-8" %>
2. 另外页面的所有的提示信息都应该在资源文件中定义



2005-08-01 15:24 | 鱼儿![未注册用户]

#6楼  回复 引用   

这里怎么说得那么简单啊?现在我都乱了!
2005-08-01 15:24 | 鱼儿![未注册用户]

#7楼  回复 引用   

有struts这方面的电子版书吗?我的信箱liweiqiang1981@163.com
2005-08-17 09:48 | li[未注册用户]

#8楼  回复 引用   

好文章啊。正是我需要的
2006-04-04 18:19 | xingxing059[未注册用户]

#9楼  回复 引用   

不错!!!顶
2006-05-11 11:14 | riceboy[未注册用户]

#10楼  回复 引用   

好东西。谢谢了
2007-03-07 10:29 | Andrii[未注册用户]

#11楼  回复 引用   

非常的好 太感谢你了 解决了我一个大问题
2008-01-12 13:56 | zk[未注册用户]

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

昵称:候鸟南飞
园龄:7年11个月
粉丝:0
关注:0

搜索

 
 

常用链接

随笔档案

文章分类

相册

好友

最新评论

阅读排行榜

评论排行榜

推荐排行榜