Strurs2 国际化I18N
一:基础配置
1. 要使用Struts2来实现国际化的支持,同样先来准备国际化信息资源文件
message.properties
message_zh_CN.properties
message_en_US.properties
2.设置Struts2引用国际化信息资源文件,
(方法1):在struts.xml中设置一个常量:
<constant name="struts.custom.i18n.resources" value="message"/>
(方法二):在struts.properties中配置如下参数
struts.custom.i18n.resources= message
3.在jsp中访问国际化资源
可以直接选用Struts2的text标签来访问国际化信息,其中text标签的name属性就是要引用哪个key。
1. <%@ taglib prefix="s" uri="/struts-tags" %>
2. <s:text name="labela"/>
二:指定语言信息的不同方式
方法一:指定浏览器使用的语种
首先要去掉struts.xml或struts.properties文件中配置的如下参数
1. <constant name="struts.locale" value="zh_CN"/>
2. <constant name="struts.i18n.encoding" value="gb2312"/>
设置浏览器语言:工具==》Internet选项==》语言,通过添加、上、下移操作,将预使用的语言放在最上边
则重新访问网页,则会使用当前浏览器设置的语言对应的国际化配置信息。
方法二:struts2常量设置
在struts.xml中加上struts.locale这个常量
<constant name="struts.locale" value="zh_CN"/>
这时候,会发现无论怎么修改浏览器的语言设置,Struts2都会去访问中文信息了
方法三:请求加上request_locale=zh_CN参数
注意:该请求必须要经过struts的i18n拦截器,否则无效
也可以直接设置session
Locale local = new Locale("zh", "CN");
session.setAttribute("WW_TRANS_I18N_LOCALE", local);
i18n拦截器在Action运行之前会检查请求中是否包含了一个叫做“request_locale”的参数,如果存在此参数,则会用它的值建立一个Locale对象,并用这个Locale对象去覆盖Struts2的常量设置和浏览器的语言设置。除此之外,i18n拦截器还会把这个Locale对象放到名为WW_TRANS_I18N_LOCALE的Session属性中去,而这个属性也会覆盖Struts2的常量设置和浏览器的语言设置。因此,只需要传入一次request_locale参数,session就会记住用户的选择,整个网站就会都变成用户选择的语言了。
三种方式的覆盖方式
优先级如下:
用户指定参数>struts.xml中配置的常量>浏览器设置。
并且用户参数指定的方式,只需要设置一次,在整个session生命周期内都使用同样的语言。
S2SH项目中Action、Service、Dao各层如何获得struts2的国际化资源
S2SH项目中Action、Service、Dao各层如何获得struts2的国际化资源
Action:action可以继承ActionSupport,可以直接调用getText()方法获得
Service、Dao 层:无法通过Action的方法获得Struts2的i18n资源文件中的内容
思考:因为同一个session的国际化相同,可以借助java.util. ResourceBundle资源包,在session创建时,根据语言信息创建ResourceBundle对象,然后将其存放到session中,以后就可以通过session获得国际化资源信息。
主要代码如下
1.创建放入session中的对象
public class SessionData {
private String language;
//国际化资源包
private ResourceBundle rb;
public void setLanguage(String language) {
Locale locale = null;
if ("zh".equals(language)) {
locale = new Locale("zh", "CN");
} else {
locale = new Locale("en", "US");
}
ResourceBundle rb = ResourceBundle.getBundle("sourceName", locale);
this.rb = rb;
this.language = language;
}
//getter方法略......
}
2.将国际化资源信息通过ResourceBundle资源包放入当前session中
public String login (){
//......
String language = request.getParameter("local");
//可以获得语言信息或者可以获得Local信 息(假如用local对象,则上边setLanguage()方法适当调整下即可)
SessionData sessionData =
(SessionData)request.getSession ().getAttribute (“SessionData”);
if (sessionData == null) {
sessionData = new SessionData();
request.getSession().setAttribute(“SessionData”, sessionData);
}
//这句代码将资源文件信息放入到session中
sessionData.setLanguage(loc.getLanguage());
//......
}
3.编写公用方法,获得国际化资源文件的指定键的内容
public class I18nUtil {
//根据键key获得国际化资源文件sourceName中的值
public static String getText (String key) {
String value = "";
SessionData sd = (SessionData) ServletActionContext.getRequest()
.getSession().getAttribute(“SessionData”);
value = sd.getRb().getString(key);
return value;
}
}
4.service、Dao层使用
I18nUtil.getExceptionText(key)
<!--EndFragment-->