`
handletnyd
  • 浏览: 2773 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

struts2国际化多语言自动切换和手动切换

 
阅读更多
  1. 在struts配置文件当中加入国际化的配置,本文是在struts.xml当中添加的
    <constant name="struts.custom.i18n.resources" value="applicationResource"></constant>

  2. 根据国际化配置当中value的值需要加入与之对应的properties文件,笔者采用中文简体、中文繁体、美国英文作为系统语言所以相应的资源文件命名如下:
中文简体文件名为applicationResource_zh_CN.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 访问国际化资源 作为属性
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics