javaweb国际化,用struts标签解决,注意每个页面都是action跳jsp,并且拦截器的配置使得每次将国际化配置保存在session

来源:互联网 发布:石狮哪里有淘宝拍摄 编辑:程序博客网 时间:2024/05/16 00:57

将多语言版本的项目合并到一个项目中,通过读取不同语言环境的资源文件(properties),来显示不同语言的内容。

这些资源文件在Struts2中命名必须按照以下规则命名:

2)  必须放在src或config根目录下。

3)  主文件名后必须根上 语言缩写 国家缩写

配置文件名采用 主文件名_语言_国家

文件名就要命名为:

message_zh_CN

message_en_US

 

在页面上通过:<s:i18n name="message">或s:text 两组标签来实现国际化功能。

配置属性可以图形可以手工 

中文输入

msg.product.list=\u4EA7\u54C1\u5217\u8868
msg.product.insert=\u6DFB\u52A0\u4EA7\u54C1
msg.product.name=\u4EA7\u54C1\u540D\u79F0
msg.product.description=\u4EA7\u54C1\u63CF\u8FF0
msg.product.baseprice=\u4EA7\u54C1\u4EF7\u683C
msg.product.writer=\u4F5C\u8005
msg.product.publish=\u51FA\u7248\u793E
msg.product.pages=\u9875\u6570
msg.product.productid=\u7F16\u53F7
msg.product.images=\u5C01\u9762


如果想实现手工的切换功能,就必须通过Struts的语言环境设置方法来完成。

<ahref="language_change.action?name=zh_CN">中文</a>

           <a href="language_change.action?name=en_US">English</a>
package com.kane.action;


import java.util.Locale;


import org.apache.struts2.ServletActionContext;


import com.opensymphony.xwork2.ActionSupport;


public class LanguageAction extends ActionSupport {
private String name;
public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}
private String url;
public String getUrl() {
return url;
}


public void setUrl(String url) {
this.url = url;
}


/**
* 作用的范围也只在所有的Action,所以任何页面都应该先进action
* @return
* @throws Exception
*/
public String change() throws Exception {
// 拆分传入的内容
String[] str = name.split("_");
// 先根据传入的参数建立语言环境对象 Locale
Locale loc = new Locale(str[0], str[1]);//语言,国家
// 设置为当前Struts所使用的语言环境
ServletActionContext.getContext().setLocale(loc);
// 因为struts默认国际化语言属性保存在request。手工再向Session范围保存一个属性
ServletActionContext.getRequest().getSession().setAttribute("locale",
loc);
//若每次再返回index页面,国际化只作用在action,所以必须经过action去jsp
url = "language_forward.action";
return "forward";
}
public String forward() {
return "index";
}


}

拦截器

package com.kane.intercepor;
import java.util.Locale;


import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;




public class LocaleInterceptor extends AbstractInterceptor {


@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 取得session范围中自己保存的语言环境
Locale loc = (Locale) invocation.getInvocationContext().getSession()
.get("locale");
if (loc != null) {
invocation.getInvocationContext().setLocale(loc);
}


return invocation.invoke();


}


}

struts配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="root" namespace="/" extends="struts-default"><!--
<interceptors>
<interceptor name="localeInterceptor" class="com.kane.intercepor.LocaleInterceptor">
</interceptor>
struts本身有拦截器栈,不能因为一个拦截器,而不要其他,只能往里面加 
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="localeInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>

</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>

-->
<interceptors>
<interceptor name="localeInterceptor"
class="com.kane.intercepor.LocaleInterceptor"></interceptor>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="localeInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>



<!-- 注意这里的action的class属性不是长类名,而是指向spring的配置 -->
<action name="product" class="productAction">
<!-- 路径名前面统计加/。表示从从webroot下寻找 -->
<result name="list">/pages/product_list.jsp</result>
<result name="froward">/forward.jsp</result>
<result name="insert">/pages/product_insert.jsp</result>

</action>
<!-- 这里不用!标记,这里_可以换成任何其他标示符,安全,{1}相当于取出后面跟的方法 -->
<action name="language_*" class="languageAction" method="{1}">
<result name="index">/index.jsp</result>
<result name="forward">/forward.jsp</result>
</action>


</package>

</struts>    


当然有的人会采用修改struts源码完成国际化,这里提供一篇博客链接http://blog.csdn.net/needkane/article/details/21080217

0 0