struts2之国际化
来源:互联网 发布:数据新闻的发展 编辑:程序博客网 时间:2024/05/24 23:12
国际化主要是指语言国际化,目的是扫除语言障碍,让使用不同语言的的用户能方便的使用同一个系统。其实国际化的核心就是i18n拦截器,会对请求进行拦截,获取request_local的值,这个值就是客户浏览器的地区语言环境,i18n会将这个值实例化成Local对象,并存储在用户Session中。(i18n这个名字是由internationalization的收尾字母及中间字符的个数组成的,相当于是简写吧)
那么,开始讨论今天的问题:
一、如何配置国际化资源文件
(1)Action 范围资源文件:在Action类文件所在的路径建立名为ActionName_language_country.properties 的文件
(2)包范围资源文件:在包的根路径下建立文件名为package_language_country.properties 的属性文件,一旦建立,处于该包下的所有 Action 都可以访问该资源文件。注意:包范围资源文件的 baseName 就是package,不是Action所在的包名。
(3)全局资源文件(可在src目录下也可以在WEB-INF/classes目录下)
命名方式: globalMessage_language_country.properties
在struts.xml文件中配置 :<constant name="struts.custom.i18n.resources" value="globalMessage"/>
或在struts.properties 文件中配置:struts.custom.i18n.resources=globalMessage
二、访问国际化消息
(1)在Action类中,Action类需要实现TextProvider接口,调用其 getText() 方法获取 value 值(可以通过继承ActinSupport间接实现TextProvider)
(2)在页面上,可以使用 s:text 标签; 对于表单标签可以使用表单标签的 key 属性值
time2=Time:${date}
struts2确定Locale对象的过程
(1) i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。并把其设置为 session 的 WW_TRANS_I18N_LOCALE 属性
(2) 若 request 没有名为request_locale 的参数,则 i18n 拦截器会从 Session 中获取 WW_TRANS_I18N_LOCALE 的属性值,若该值不为空,则将该属性值设置为浏览者的默认Locale
(3)若 session 中的 WW_TRANS_I18N_LOCALE 的属性值为空,则从 ActionContext 中获取 Locale 对象。
在获得客户端地区的语言后,struts2就会加载就近的国际化资源文件。
具体实现:
那么,开始讨论今天的问题:
一、如何配置国际化资源文件
(1)Action 范围资源文件:在Action类文件所在的路径建立名为ActionName_language_country.properties 的文件
(2)包范围资源文件:在包的根路径下建立文件名为package_language_country.properties 的属性文件,一旦建立,处于该包下的所有 Action 都可以访问该资源文件。注意:包范围资源文件的 baseName 就是package,不是Action所在的包名。
(3)全局资源文件(可在src目录下也可以在WEB-INF/classes目录下)
命名方式: globalMessage_language_country.properties
在struts.xml文件中配置 :<constant name="struts.custom.i18n.resources" value="globalMessage"/>
或在struts.properties 文件中配置:struts.custom.i18n.resources=globalMessage
(4)临时指定资源文件:<s:i18n.../> 标签的 name 属性指定临时的国际化资源文件
国际化资源文件加载的顺序:离当前 Action 较近的将被优先加载.
二、访问国际化消息
(1)在Action类中,Action类需要实现TextProvider接口,调用其 getText() 方法获取 value 值(可以通过继承ActinSupport间接实现TextProvider)
(2)在页面上,可以使用 s:text 标签; 对于表单标签可以使用表单标签的 key 属性值
a. 若有占位符, 则可以使用 s:text 标签的 s:param 子标签来填充占位符;
time=Time:{0}
<s:text name="time">
<s:param value="date"></s:param>
</s:text>
time2=Time:${date}
<s:text name="time2"></s:text>
struts2确定Locale对象的过程
(1) i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。并把其设置为 session 的 WW_TRANS_I18N_LOCALE 属性
(2) 若 request 没有名为request_locale 的参数,则 i18n 拦截器会从 Session 中获取 WW_TRANS_I18N_LOCALE 的属性值,若该值不为空,则将该属性值设置为浏览者的默认Locale
(3)若 session 中的 WW_TRANS_I18N_LOCALE 的属性值为空,则从 ActionContext 中获取 Locale 对象。
如图:
在获得客户端地区的语言后,struts2就会加载就近的国际化资源文件。
具体实现:
Action类:
<span style="font-size:14px;">import java.util.Date;import com.opensymphony.xwork2.ActionSupport;public class LanguageChangeAction extends ActionSupport {private static final long serialVersionUID = 1L;private Date date;public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String execute() throws Exception {//通过 getText() 方法获取 value 值 即 获取国际化消息String username = getText("username");System.out.println(username);//穿件日期对象date = new Date();return super.execute();}}</span>通过全局配置国际化资源,在WEB-INF下创建classes文件夹,并创建文件:
英语:globalMessage_en_US.properties
<span style="font-size:14px;">username=UserNamepassword=PassWordsubmit=Submitlogin=Logintime=Time:{0}time2=Time:${date}</span>中文:globalMessage_zh_CN.properties
<span style="font-size:14px;">username=\u7528\u6237\u540dpassword=\u5bc6\u7801submit=\u63d0\u4ea4login=\u767b\u5f55time=\u65f6\u95f4:{0}time2=\u65f6\u95f4:${date}</span>在struts.xml文件中配置
<action name="lanChe" class="com.struts2.i18nchange.LanguageChangeAction"> <result name="success">/login.jsp</result> </action>jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><center><h2><s:text name="login"></s:text></h2><br><s:form action="test"><!-- label标签是将字段名写死在页面上,用key属性可以通过OGNL获取国际化资源 --><s:textfield name="username" key="username"></s:textfield><s:password name="password" key="password"></s:password><s:submit key="submit"></s:submit></s:form><br>用 s:text 标签的 s:param 子标签来填充占位符:<br><s:text name="time"><s:param value="date"></s:param></s:text><br><br>利用标签和 OGNL 表达式访问:<br><s:text name="time2"></s:text><br><br><a href="lanChe?request_locale=zh_CN">中文</a><a href="lanChe?request_locale=en_US">English</a></center></body></html>运行结果(分别对应中文和英语环境):
在这个例子中须注意: 中英文切换超链接必须是一个 struts2 的请求, 因为要使 i18n 拦截器工作;第一次请求也必须是struts2请求,因为要通过 s:text标签获取国际化消息。
0 0
- Struts2之国际化
- Struts2之国际化
- 四、Struts2之国际化
- Struts2之国际化
- struts2之国际化详解
- struts2.0之国际化
- struts2之国际化
- Struts2之国际化 .
- Struts2之国际化
- Struts2之国际化
- struts2学习之---国际化
- Struts2学习之国际化机制
- struts2之5--国际化支持
- Struts2学习笔记之国际化
- 国际化之struts2实现研究
- (九)struts2之国际化
- Struts2学习笔记之国际化
- java框架之struts2国际化
- 一、cocos2d-x 3.0 final使用httpclient编译到android,需要用到的android.mk
- uva11645 - Bits 统计 巧妙的大数
- Linux和Unix系统的关系和区别详细介绍
- gdb调试
- 百度竞价每天主要做什么?
- struts2之国际化
- UVa 10494 - If We Were a Child Again
- php上传文件不成功的情况
- rabbitmq
- Linux系统下启动MySQL的命令及相关知识
- 来这些向前辈们学习学习~
- QML与Qt C++ 交互机制探讨与总结
- lazy懒加载(延迟加载)UITableView
- 价格折扣的小数位数显示