在Struts1.X 中通过页面设置国际化语言:http://wing123.iteye.com/admin/blogs/384112
- <body>
- <s:a href="/Struts2/changeLang.action?lang=en">English</s:a>
- <s:a href="/Struts2/changeLang.action?lang=zh">中文</s:a>
- <center>
- <s:text name="addUser"/>
- </center>
- </body>
<body> <s:a href="/Struts2/changeLang.action?lang=en">English</s:a> <s:a href="/Struts2/changeLang.action?lang=zh">中文</s:a> <center> <s:text name="addUser"/> </center> </body>
struts.xml
- <struts>
- <!-- 设置全局配置文件 -->
- <constant name="struts.custom.i18n.resources" value="message"/>
- <!-- 解决中文乱码 -->
- <constant name="struts.i18n.encoding" value="gbk"/>
- <package name="Struts2" extends="struts-default">
- <action name="changeLang" class="com.bjsxt.action.ChangeLangAction">
- <result name="success">/register2/register.jsp</result>
- </action>
- </package>
- </struts>
<struts> <!-- 设置全局配置文件 --> <constant name="struts.custom.i18n.resources" value="message"/> <!-- 解决中文乱码 --> <constant name="struts.i18n.encoding" value="gbk"/> <package name="Struts2" extends="struts-default"> <action name="changeLang" class="com.bjsxt.action.ChangeLangAction"> <result name="success">/register2/register.jsp</result> </action> </package> </struts>
message_en_US.properties
- addUser=Add User
addUser=Add User
message_ zh _CN.properties
- addUser=\u6DFB\u52A0\u7528\u6237
addUser=\u6DFB\u52A0\u7528\u6237
ChangeLangAction
- public class ChangeLangAction extends ActionSupport{
- private String lang;
- public String getLang() {
- return lang;
- }
- public void setLang(String lang) {
- this.lang = lang;
- }
- @Override
- public String execute() throws Exception {
- changeLang();
- return SUCCESS;
- }
- /**
- * 手动改变Locale
- */
- private void changeLang() {
- Locale currentLocale = Locale.getDefault();
- //1、根据页面请求,创建下同的Locale对象
- if("en".equals(getLang().trim())) {
- currentLocale = new Locale("en","US");
- }else if("zh".equals(getLang().trim())) {
- currentLocale = new Locale("zh","CN");
- }
- /*
- * 2、设置Action中的Locale
- * 前台页面的Locale和后台session中的Locale范围是不一样的
- * a)只改页面Locale当前页面信息会改变但提交后Locale又会改回到默认的
- * b)改变了后台Locale,当前线程中的页面Locale并不会改变,但会随下一次提交
- * Action一同改变,所以可能要刷新页面两次,第一次只变后台Locale,第二次
- * 前台和后台同时改变
- *
- * 为避免上述情况,需要前台和后台的Locale一起改变
- */
- ActionContext.getContext().setLocale(currentLocale);
- ServletActionContext.getRequest().getSession().setAttribute(
- "WW_TRANS_I18N_LOCALE", currentLocale);
- }
- }
public class ChangeLangAction extends ActionSupport{
private String lang;
public String getLang() {
return lang;
}
public void setLang(String lang) {
this.lang = lang;
}
@Override
public String execute() throws Exception {
changeLang();
return SUCCESS;
}
/**
* 手动改变Locale
*/
private void changeLang() {
Locale currentLocale = Locale.getDefault();
//1、根据页面请求,创建下同的Locale对象
if("en".equals(getLang().trim())) {
currentLocale = new Locale("en","US");
}else if("zh".equals(getLang().trim())) {
currentLocale = new Locale("zh","CN");
}
/*
* 2、设置Action中的Locale
* 前台页面的Locale和后台session中的Locale范围是不一样的
* a)只改页面Locale当前页面信息会改变但提交后Locale又会改回到默认的
* b)改变了后台Locale,当前线程中的页面Locale并不会改变,但会随下一次提交
* Action一同改变,所以可能要刷新页面两次,第一次只变后台Locale,第二次
* 前台和后台同时改变
*
* 为避免上述情况,需要前台和后台的Locale一起改变
*/
ActionContext.getContext().setLocale(currentLocale);
ServletActionContext.getRequest().getSession().setAttribute(
"WW_TRANS_I18N_LOCALE", currentLocale);
}
}
看提供的例子很重要:
运行例子struts2-blank-2.0.9
http://localhost:8080/struts2-blank-2.0.9/example/HelloWorld.action?request_locale=en有效。
原来在Struts 2.0中,通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。
Struts 2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptor chain)中。
它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。
如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。
除此之外,i18n拦截器还会将上面生成的Locale对象保存在用户Session的名为WW_TRANS_I18N_LOCALE的属性中。一旦用户Session中存在一个名为
WW_TRANS_I18N_LOCALE的属性,则该属性指定的Locale将会作为浏览者的默认Locale。
Struts1.X 与 Struts2.X 的区别 :
1、Struts1.X 通过在HttpSession中设置固定的变量实现
2、Struts2.X 比较方便,只需设置Action中的Locale