- 在struts配置文件当中加入国际化的配置,本文是在struts.xml当中添加的
<constant name="struts.custom.i18n.resources" value="applicationResource"></constant>
- 根据国际化配置当中value的值需要加入与之对应的properties文件,笔者采用中文简体、中文繁体、美国英文作为系统语言所以相应的资源文件命名如下:
中文繁体文件名为applicationResource_zh_TW.properties
美国英文文件名为applicationResource_en_US.properties
资源文件命名格式:filename_language_country.properties.
特别注意上述中文字体资源即含有_zh
的文件,因为JAVA要求.properties文件不允许包含非ASCII(请自行上网查阅ASCII字符包括哪些字符,
主要是英文和一些常见的符号,而中文等字符不属于ASCII字符)字符,所以对于中文,需要将中文转换为UNICODE编码的字符,并用/u+UNICODE编码来表示中文。
笔者采用JDK自带的native2ascii将中文转换(PS:转换的源文件编码格式是需要与IDE规定的一致,不然直接添加会是乱码,也可以产生之后直接复制就不会了,
或者参考文章----JDK自带的native2ascii工具完全揭密)
3.需要国际化的硬文字全部配置好了之后,到页面进行替换笔者采用<s:text name=""/>标签显示的,以下为样例代码
<%@ taglib prefix="s" uri="/struts-tags" %> <s:text name="helpCentral"/> <s:text name="welcome"> <s:param> <s:text name="visitor"/> </s:param> </s:text>
<s:text name=""/>标签当中name属性的值为配置文件当中的key值helpCentral=\u5e2e\u52a9\u4e2d\u5fc3(PS:帮助中心)
第二个复合标签<s:text
name=""></s:text>里面<s:param></s:param>是对其传参数,配置文件当中的格式是
welcomeVisitor=\u60a8\u597d\uff01{0}(PS:您好!)
visitor=\u6e38\u5ba2(PS:游客)
第一个参数对于{0},第二个参数对应{1},依次类推
当全部替换好了,已经实现了自动识别浏览器语言格式,并国际化显示。可以使用IE浏览器改变语言设置就可以看到效果了,步骤如下:
4.提供手动设置显示的语言
一、添加struts相应的配置文件,本文为struts_lang.xml如下:
<?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> <package name="lang" namespace="/lang" extends="json-default"> <!-- 语言设置 --> <action name="lang_*" class="langAction"><!-- 路径为上面的name+此处的name格式,本文为lang/lang_zh_CN.action class为处理action --> <result type="redirect">${goBackUrl}</result><!-- 返回success时候重定向 goBackUrl为action中的全局变量需要有get、set方法--> <result name="tip">/WEB-INF/product/pro_tip.jsp</result> </action> </package> </struts>
将其添加到struts.xml默认配置文件当中
<include file="struts_lang.xml"></include>
二、编写action类
/** * @Title: LangAction.java * @Package net.tgx.action.lang * @Description: TODO(用一句话描述该文件做什么) * @author Administrator * @date 2014-12-10 上午10:13:17 * @version V1.0 */ package net.tgx.action.lang; import java.util.Locale; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import com.opensymphony.xwork2.ActionSupport; /** * @ClassName: LangAction * @Description: TODO(类注释) * @author Administrator * @date 2014-12-10 上午10:13:17 * @version V1.0 * */ @Service("langAction") @Scope("prototype") public class LangAction extends ActionSupport implements ServletRequestAware{ /** * @Fields serialVersionUID : TODO(第一行显示地方) */ private static final long serialVersionUID = -3855583705013387679L; private HttpServletRequest request; private String goBackUrl; @Override public String execute() throws Exception { // TODO execute() method String uri = request.getRequestURI();//获得请求路径 this.goBackUrl = request.getHeader("Referer");//获得上一个页面路径作为跳转返回 System.out.println("--------------langAction execute start........"+uri); System.out.println("--------------langAction execute goBackUrl........"+goBackUrl); uri = uri.substring(uri.indexOf("_")+1, uri.lastIndexOf('.')); String param[] = uri.split("_"); if(null==param||param.length!=2){ request.setAttribute("tip", "语言链接异常,非法访问"); return "tip"; } String lang = param[0]; String country = param[1]; Locale locale=new Locale(lang,country.toUpperCase()); request.getSession().setAttribute("WW_TRANS_I18N_LOCALE",locale);//将设置好的语言放入session key为WW_TRANS_I18N_LOCALE中 System.out.println("-------------33--------"+request.getSession().getAttribute("WW_TRANS_I18N_LOCALE")); return super.execute(); } @Override public void setServletRequest(HttpServletRequest arg0) { // TODO setServletRequest request = arg0; } public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } public String getGoBackUrl() { return goBackUrl; } public void setGoBackUrl(String goBackUrl) { this.goBackUrl = goBackUrl; } }
5.笔记:Struts2国际化的运行机制
在Struts 2中,我们可以通过ActionContext.getContext().setLocale(Locale arg)(PS:笔者测试并未通过),可以设置用户的默认语言。不过,这种方式完全是一种手动方式,而且需要编程实现。为了简化设置用户默认语言环境,Struts
2提供了一个名i18n的拦截器(Interceptor),并且将其住注册在默认的拦截器栈中(defaultStack)。i18n拦截器在执行Action方法前,自动查找请求中的一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数,并转换成Locale对象,并将其设为用户默认的Locale(代表语言/国家环境)。除此之外,i18n拦截器还会将上面生成的Locale对象保存在用户Session的名为“WW_TRANS_I18N_LOCALE”的属性中。一旦用户Session中存在一个名为“WW_TRANS_I18N_LOCALE”的属性,则该属性指定的Locale将会作为浏览者的默认Locale。如果采用传名为request_locale的参数方式只要发出类似下面的请求即可:
http://localhost:8080/lang/lang_set.action?request_locale=zh_CN
action变成如下即可:
@Override public String execute() throws Exception { // TODO execute() method this.goBackUrl = request.getHeader("Referer");//获得上一个页面路径作为跳转返回 System.out.println("-------------33--------"+request.getSession().getAttribute("WW_TRANS_I18N_LOCALE")); return super.execute(); }
<s:text/>标签参考struts2 访问国际化资源 作为属性