将多语言版本的项目合并到一个项目中,通过读取不同语言环境的资源文件(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