开发国际化的应用程序时,有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中,通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过,由于这是一个比较普遍的应用场景(Scenario),所以Struts 2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptor chain)中。它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。
下面开始简单的演示一下:
Locales类,后续待用JavaBean
package jp.co.ricoh.action.i18n; import java.util.HashMap; import java.util.Locale; import java.util.Map; public class Locales { public Map<String,Locale> getLocales(){ Map<String,Locale> locales = new HashMap<String,Locale>(); locales.put("American English", Locale.US); locales.put("Simplified Chinese", Locale.CHINA); return locales; } }
在struts.xml中添加
<action name="I18nAction" class="jp.co.ricoh.action.i18n.I18nAction">
<result>/i18n/i18n.jsp</result>
</action>
下面i18n.jsp的内容:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <script type="text/javascript"> function langSelecter_onChanged(){ document.langForm.submit(); } </script> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Internationalization</title> </head> <body> <s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"></s:set> <s:bean name="jp.co.ricoh.action.i18n.Locales" id="locales"></s:bean> <form action="I18nAction" name="langForm" style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;"> Language: <s:select label="Language" list="#locales.locales" listKey="value" listValue="key" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE" name="request_locale" id="langSelecter" onchange="langSelecter_onChanged()" theme="simple"/> </form> <s:text name="helloworld"></s:text> </body> </html>
在浏览器中敲入:
http://localhost:8080/ricoh/i18n/i18n.jsp
<!--StartFragment -->
选择“American English”
<!--StartFragment -->
-------------------------------------------------------------------------
package jp.co.ricoh.action.i18n; import com.opensymphony.xwork2.ActionSupport; public class I18nAction extends ActionSupport { /** * */ private static final long serialVersionUID = -6713811430767941801L; @Override public String execute() throws Exception { // TODO Auto-generated method stub return super.execute(); } }