在struts.properties裏面添加配置
struts.custom.i18n.resources=Resources
Resources 可以自己定義新建資源文件
在sirmapp/src/下新建文件
Resources_en_US.properties
Resources_zh_CN.properties
文件開頭Resources 對應第一步struts.custom.i18n.resources的屬性增加中英文切換功能
3.1 增加實現中英文切換的action
package com.xxx.framework.web.action;
import com.opensymphony.xwork2.ActionContext;
import com.xxx.common.web.RequestContext;
import com.xxx.common.web.XxxAction;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import java.util.Locale;
public class LanguageAction extends XxxAction {
private String language;
public void setLanguage(String language) {
this.language = language;
}
public String changeToChinese() {
Locale locale=new Locale("zh","CN");//(這個能根據你傳來的值動態改變)
ActionContext.getContext().setLocale(locale);
this.request.getSession().setAttribute("WW_TRANS_I18N_LOCALE", locale);
return "success";
}
public String changeToEnglish() {
Locale locale=new Locale("en","US");//(這個能根據你傳來的值動態改變)
ActionContext.getContext().setLocale(locale);
this.request.getSession().setAttribute("WW_TRANS_I18N_LOCALE", locale);
return "success";
}
}
3.2 在struts-XXX.xml
/first.jsp
/first.jsp
在first.jsp 中添加中英文切換鏈接
<b class="split">|</b>
<a href="${contextPath}/chinese.action?request_locale=zh_CN"><s:text name="chinese" /></a>
<a href="${contextPath}/english.action?request_locale=en_US"><s:text name="english" /></a>
- 添加過濾器。
由於程序始終是隻會讀取瀏覽器發送過來的區域信息,其他頁面沒有獲取session的WW_TRANS_I18N_LOCALE值。因此要通過過濾器從session裏獲得區域對象,並修改請求報頭,從而實現了自定義國際化切換。
增加I18nFilter.java, I18nRequestWrapper.java,代碼來自於網絡
package com.xxx.common.web;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class I18nFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest r = (HttpServletRequest) req;
I18nRequestWrapper request = new I18nRequestWrapper(r);
filterChain.doFilter(request, resp);
}
}
package com.xxx.common.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;
import java.util.Locale;
public class I18nRequestWrapper extends HttpServletRequestWrapper {
private Locale locale = null;
public I18nRequestWrapper(HttpServletRequest request) {
super(request);
HttpSession session = request.getSession();
locale = (Locale) session.getAttribute("WW_TRANS_I18N_LOCALE");
}
/**
* struts2的BUG,如果重定向的話,國際化默認取HTTP請求頭中的參數 替換HTTP請求參數
**/
@Override
public String getHeader(String name) {
String value = super.getHeader(name);
if ("Accept-Language".equals(name) && locale != null) {
value = locale.getLanguage() + "_" + locale.getCountry()
+ value.substring(6, value.length());
}
return value;
}
@Override
public Locale getLocale() {
if (locale != null) {
return locale;
}
return super.getLocale();
}
}
- 過濾器配置
在web.xml中
<!-- 國際化-->
<filter>
<filter-name>i18nFilter</filter-name>
<filter-class>com.xxx.common.web.I18nFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>i18nFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
- 在head.jsp 中添加
<%@ taglib prefix=”s” uri=”/struts-tags” %>
這樣就可以通過訪問國際化資源啦。
過濾器實現代碼來源於
http://showtime520.iteye.com/blog/1042585