8.4 实现用户自行选择语言环境
许多网站都会提供一个语言选择下拉列表,让用户选择语言。当用户选择自己所需的语言环境后,整个Web应用都将采用该语言环境。通过Struts 2能够很方便地实现该功能。
8.4.1 新建下拉列表
许多网站都会提供一个语言选择下拉列表,让用户选择语言。利用Struts 2的国际化支持可以很容易地实现这一功能。首先新建语言环境选择页“select.jsp”,该页面包含一个下拉列表,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title><s:text name="title"/></title> <script language="javascript"> function selectsubmit(){ document.form1.submit(); } </script> </head> <body> <form action="select.action" method="post" name="form1"> <! -- 下拉列表 --> <select name="languageSelect" onchange="selectsubmit(); "> <! -- 选项1 --> <option value="choose" selected="selected"> <s:text name="form.choose"></s:text> </option> <! -- 选项2 --> <option value="en_US"> <s:text name="form.option1"></s:text> </option> <! -- 选项3 --> <option value="zh_CN"> <s:text name="form.option2"></s:text> </option> <! -- 选项4 --> <option value="zh_TW"> <s:text name="form.option3"></s:text> </option> </select> </form> <s:text name="message"></s:text> </body> </html>
8.4.2 新建全局资源文件
下拉列表中的选项显示文本是通过读取国际化资源文件来得到,所以必须提供国际化资源文件。这里选择中文简体、中文繁体、美国英语3种语言环境供用户选择,所以必须提供相应的国际化资源文件。
❑ 第一个资源文件:Resource_en_US.properties。
form.choose = Please choose your language form.option1 = English form.option2 = Simplified_Chinese form.option3 = Traditional_Chinese message = Hello World! title = English
❑ 第二个资源文件:Resource_zh_CN.properties。
form.choose =请选择语言的种类 form.option1 =英文 form.option2 =简体中文 form.option3 =繁体中文 message =你好世界 title=中文页面
使用native2ascii命令来处理转换成Unicode编码。
form.choose = \u8bf7\u9009\u62e9\u8bed\u8a00\u7684\u79cd\u7c7b form.option1 = \u82f1\u6587 form.option2 = \u7b80\u4f53\u4e2d\u6587 form.option3 = \u7e41\u4f53\u4e2d\u6587 message = \u4f60\u597d\u4e16\u754c title=\u4e2d\u6587\u9875\u9762
❑ 第三个资源文件:Resource_zh_TW.properties。
form.choose = 请选择语言的种类 form.option1 =英文 form.option2 =简体中文 form.option3 =繁体中文 message =你好世界 title =繁体中文
使用native2ascii命令来处理转换成Unicode编码。
form.choose = \u8acb\u9078\u64c7\u8a9e\u8a00\u7684\u7a2e\u985e form.option1 = \u82f1\u6587 form.option2 = \u7c21\u9ad4\u4e2d\u6587 form.option3 = \u7e41\u9ad4\u4e2d\u6587 message = \u4f60\u597d\u4e16\u754c title = \u7e41\u9ad4\u4e2d\u6587
8.4.3 新建及配置Action
新建Action,该Action对用户提交的选项值进行判断,根据判断结果设定语言环境,代码如下所示。
package net.hncu.struts2.action; import java.util.Locale; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class SelectAction extends ActionSupport { private String languageSelect; public String getLanguageSelect() { return languageSelect; } public void setLanguageSelect(String languageSelect) { this.languageSelect = languageSelect; } public String execute() throws Exception { Locale locale = null; //判断用户选择的语言环境 if("en_US".equals(languageSelect)) { locale = Locale.US; } else if("zh_CN".equals(languageSelect)){ locale = Locale.SIMPLIFIED_CHINESE; } else if("zh_TW".equals(languageSelect)){ locale = Locale.TRADITIONAL_CHINESE; } //设置语言环境 ActionContext.getContext().setLocale(locale); return SUCCESS; } }
在“struts.xml”文件中配置该Action,以及定义处理结果与视图资源之间的关系。如果Action返回success,那么页面将跳转到语言选择页“select.jsp”。
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <! -- struts为配置文件根元素--> <struts> <! -- 定义资源文件baseName --> <constant name="struts.custom.i18n.resources" value="Resource"></constant> <package name="struts2" extends="struts-default"> <! -- 定义select的Action,其实现类为net.hncu.struts2.action.LanguageAction --> <action name="select" class="net.hncu.struts2.action.SelectAction"> <! -- 定义处理结果与视图资源之间的关系--> <result name="success">/select.jsp</result> </action> </package> </struts>
8.4.4 测试用户自行选择的语言环境
打开浏览器,浏览语言环境选择页“select.jsp”,页面默认显示简体中文,如图8.15所示。
通过下拉列表选择语言环境为英文,这时语言环境被设置成美国英语,所以页面将显示为英文页面,如图8.16所示。
图8.15 页面默认显示为简体中文
图8.16 选择语言环境为英文
通过下拉列表选择语言环境为繁体中文,这时语言环境被设置成繁体中文,所以页面将显示为繁体中文页面,如图8.17所示。
图8.17 选择语言环境为繁体中文
8.4.5 在下拉列表中显示当前选择语言
上面这个示例成功地实现了用户自行选择语言环境这一功能,但是有一个地方还不够完善。每次选择完语言环境后,下拉列表都是显示“请选择语言的种类”这个选项。
下面就来实现在下拉列表中显示当前选中的语言。在下拉列表中要默认选择某项,只需设置其selected属性为selected即可。根据这一点,可以通过接受用户提交的参数来决定设置哪个选项被默认选择。
在JSP中接受参数以及判断都会有大量的JavaScriplet代码,可以使用Struts 2的<s:if>标签来进行判断,使用#parameters.×××来接受参数,修改代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title><s:text name="title" /></title> <script language="javascript"> function selectsubmit(){ if(document.all("languageSelect").value! ="choose"){ document.form1.submit(); } } </script> </head> <body> <form action="select.action" method="post" name="form1"> <select name="languageSelect" onchange="selectsubmit(); "> <option value="choose"> <s:text name="form.choose"></s:text> </option> <option value="en_US" <s:if test="#parameters.languageSelect[0] == ' en_US' "> selected="selected" </s:if>> <s:text name="form.option1"></s:text> </option> <option value="zh_CN" <s:if test="#parameters.languageSelect[0] == ' zh_CN' "> selected="selected" </s:if>> <s:text name="form.option2"></s:text> </option> <option value="zh_TW" <s:if test="#parameters.languageSelect[0] == ' zh_TW' "> selected="selected" </s:if>> <s:text name="form.option3"></s:text> </option> </select> </form> <s:text name="message"></s:text> </body> </html>
通过下拉列表选择语言环境为英文,这时语言环境被设置成美国英语,所以页面将显示为英文页面。同时在下拉列表中显示了当前选择的语言环境,如图8.18所示。
通过下拉列表选择语言环境为简体中文,这时语言环境被设置成简体中文,所以页面将显示为简体中文页面。同时在下拉列表中显示了当前选择的语言环境,如图8.19所示。
通过下拉列表选择语言环境为繁体中文,这时语言环境被设置成繁体中文,所以页面将显示为繁体中文页面。同时在下拉列表中显示了当前选择的语言环境,如图8.20所示。
图8.18 选择语言环境为英文
图8.19 选择语言环境为简体中文
图8.20 选择语言环境为繁体中文
8.4.6 使用Struts 2的i18n拦截器改写案例
前面是通过在Action中设置用户的默认语言从而实现用户自行选择语言功能的。但是这种方式是通过手动实现的,如果需要提供更多的语言选择,那么就必须在Action中进行更多的判断,代码就非常繁琐了。
这里可以自定义拦截器,这样可以在多个Action中使用了。这里无需手动自定义拦截器,因为Struts 2已经给提供了一个用于国际化的i18n拦截器。
<interceptors> ... <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/> ...
i18n拦截器在执行Action之前,先查找请求参数中是否存在一个名为request_locale的参数。如果存在该参数,拦截器将其参数值转换成一个Locale对象,并将其设为默认的语言环境。
利用这一点可以修改下拉列表的name属性值为request_locale,并配置下拉列表中的选项的value为其对应的国家/语言代码,修改代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title><s:text name="title" /></title> <script language="javascript"> function selectsubmit(){ if(document.all("request_locale").value! ="choose"){ document.form1.submit(); } } </script> </head> <body> <form action="select.action" method="post" name="form1"> <select name="request_locale" onchange="selectsubmit(); "> <option value="choose"> <s:text name="form.choose"></s:text> </option> <option value="en_US" <s:if test="#parameters.languageSelect[0] == ' en_US' "> selected="selected" </s:if>> <s:text name="form.option1"></s:text> </option> <option value="zh_CN" <s:if test="#parameters.languageSelect[0] == ' zh_CN' "> selected="selected" </s:if>> <s:text name="form.option2"></s:text> </option> <option value="zh_TW" <s:if test="#parameters.languageSelect[0] == ' zh_TW' "> selected="selected" </s:if>> <s:text name="form.option3"></s:text> </option> </select> </form> <s:text name="message"></s:text> </body> </html>
在“struts.xml”文件中配置用户语言选择请求,这里只用到了i18n拦截器而并没有使用Action,所以可以不用提供Action实现类。为了让所有的JSP页面都能得到Struts 2处理,可以使用通配符号来定义Action的name。定义其返回结果为/{1}.jsp,表示跳转到同路径下的同名的JSP页面,比如请求页面为“select.jsp”,那么处理完成后跳转的结果页面也是“select.jsp”。
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <! -- struts为配置文件根元素--> <struts> <! -- 定义资源文件baseName --> <constant name="struts.custom.i18n.resources" value="Resource"></constant> <package name="struts2" extends="struts-default"> <! -- 使用通配符号来定义Action的name --> <action name=" * "> <! -- 定义处理结果与视图资源之间的关系--> <result>/{1}.jsp</result> </action> </package> </struts>
打开浏览器,浏览语言环境选择页“select.jsp”。通过下拉列表选择语言环境为英文,这时语言环境被设置成美国英语,所以页面将显示为英文页面。同时在下拉列表中显示了当前选择的语言环境。
通过下拉列表选择语言环境为简体中文,这时语言环境被设置成简体中文,所以页面将显示为简体中文页面。同时在下拉列表中显示了当前选择的语言环境。
通过下拉列表选择语言环境为繁体中文,这时语言环境被设置成繁体中文,所以页面将显示为繁体中文页面。同时在下拉列表中显示了当前选择的语言环境。
通过测试可以看出,通过Sturts 2的i18n拦截器成功实现了用户自行选择语言环境功能。