万维网World Wide Web的迅猛发展推动了跨国业务的发展,为了使企业的Web应用能支持全球客户,软件开发应用发出了支持多国语言,国际化的Web应用.国际化简称I18N指的是在软件设计阶段,就应该使软件具有支持多种语言和地区的功能.这样当需要在应用中添加对一种新的语言和国家的支持的时候,不需要对自己的软件返工,无需修改应用的程序代码.简单的说,本地化意味着针对不同的语言的客户,发出不同的软件版本.国际化意味着同一个软件可以面向使用不同语言的客户.如果一个应用支持国际化,应该具备以下特征:
1) 当应用需要支持一种新的语言时,无需修改应用源代码.
2) 文本,消息和图片从源程序代码中抽取出来,存储在外部.
3) 应该根据用户语言和地理位置,对于特定文化和相关的数据,如日期,时间,货币进行格式转换.
4) 支持非标准字符集.
5) 可以方便快捷的对应用做出调整,使它适应新的语言和地区.
Web应用使用本地化或者国际化都会涉及字符编码转换的问题,默认的情况下IE浏览
器发送请求的时候采用ISO-8859-1字符编码,如果Web应用程序要正确的读取用户发送的中文数据,则需要进行编码转换.一种方式是在处理请求前,先设置HttpServletRequest对象的字符编码,如下:
request.setCharacterEncoding(“gb2312”);
还有一种方法是对用户输入的请求数据进行编码转换如下:
String data=request.getParameter(“data”);
If(data!=null)
Data=new String(data.getBytes(“ISO-8859-1”),”GB2312”);
如果数据库系统的字符编码是GB2312,那么可以直接读取数据库的中文数据,如果数据库的字符集是ISO-8859-1那么必须先对来自数据库的数据进行编码转换,然后才能使用.如果在XML文件中包含中文,可以将XML文件的字符编码设置为GB2312,例如:
还可以设置相应对象的字符编码.例如:
Servlet:response.setContentType(“text/html;charset=GB2312”);
JSP:<%@page contentType=”text/html;charset=GB2312”%>
HTML:
JAVA在其核心库中提供了支持I18N的类和接口,java.util.Locale类是重要的JAVA的支持I18N的类,在JAVA语言中几乎所有对国际化和本地化的支持都依赖与这个类.关于这个类的详细介绍应参阅JAVA语言的API.ResourceBundle类也是在java.util包中,这个类提供和存放了管理与Locale相关的资源的功能,这些资源包括文本或者按钮的,状态信息图片名,错误信息,网页标题等.Struts框架并没有直接使用JAVA语言提供的ResourceBundle类,在Struts框架中提供了两个类,他们都在org.apache.struts.util包中.这两个类具有ResourceBundle相似的功能,分别是MessageResources和PropertyMessageResources类.
说了半天自己感觉我阐述的很乱,因为都是一些需要了解的知识所以我大略说了一下,下面我详细的介绍一下Struts框架对国际化的支持.主要是体现在能够输出和用户Locale相符合的文本和图片上.当Struts配置文件的元素的locale属性为truts的时候,Struts框架把用户的Locale实例保存在Session范围内,这样Struts矿局爱能够根据这个实例来从ResourceBundle中选择合适的资源文本.最简单的说就是用户如果是cn就去cn的本地资源文件中读取信息,如果是ch就去ch的本地资源文本文件中读取数据.首先要创建Struts的ResourceBundle,对于多个应用模块的Struts应用,可以为每一个子应用配置一个或者多个ResourceBundle应用中的每一个模块都可以访问这些Bundle,配置文件中每个元素定义了一个ResourceBundle,当应用包含多个的时候,用Key属性来区别它们.这只好的.properties文件一般放在Web应用的classes目录下,其实配置没什么就是按照固定的套路,重点要研讨的应该是如何访问ResourceBundle.Struts应用,子应用模块,ResourceBundle和资源文件之间存在以下的关系:
1) 一个Struts应用可以有多个子应用模块,必须有一个默认的子应用模块.只能一个.
2) 一个子应用模块可以有多个ResourceBundle,必须有一个默认的Bundle,只能一个.
3) 一个ResourceBundle可以有多个资源文件,必须有一个默认的文件,只能有一个.
在Action类中定义了getResources(request)方法,可以返回默认的MessageResources
对象,代表当前应用模块使用默认的ResourceBundle.如果要获得特定的MessageResources对象可以调用Action基类的getResources(request.key)方法,其中参数key和Struts配置文件中的元素的key属性对应.得到MessageResources对象后,可以通过方法来访问消息文本.例如:
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
Locale locale = getLocale(request);
MessageResources messages = getResources(request);
String msg = messages.getMessage(locale,”hello.error”);
……
}
org.apache.struts.util.MessageResources的getMessage()方法有好几种重载的形式,下面列出常用的几种:
1) 根据参数指定的Locale检查对应的资源文件,然后返回参数的key对应的消息文本getMessage(java.util.Locale locale,String key)
2) 根据参数指定的Locale检查对应的资源文件,然后返回参数和key对应的文本args参数用于替换符合消息文本的参数:
getMessage(java.util.Locale locale,String key,Object[] args)
使用ResourceBundle绑定的Struts组件例如:
1) ActionMessage类和标签.
2) StringBean标签库和标签.
3) 在Validator验证框架中访问ResourceBundle.
4) 在声明类型异常处理中访问ResourceBundle.
国际化应用的问题感觉理解上不是很容易,可以查阅相关的资料百度和Google可是中
国和世界的大宝箱哦. (网友们的支持,是我继续写技术文章的动力!)
posted on 2005-10-28 16:23
我心依旧 阅读(2041)
评论(1) 编辑 收藏