`
showtime520
  • 浏览: 88524 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

STRUTS 2 国际化并自定义切换语言的问题解决

    博客分类:
  • JAVA
阅读更多
在struts2配置文件struts.xml中添加好国际化拦截器,struts。properties中指定好资源文件后(这2步网上一搜一大把,就不再写),项目的国际化就弄好了。现在把浏览器的语言改成其他语言能顺利国际化访问。

  这一步做好后,我们开始要做自定义国际化切换的功能。这个功能网上搜到的内容都是错误,所以特此在此记录下,以方便后来人。
  网上很多说自定义国际化切换只要修改保存在session中的struts2国际化常量的值“WW_TRANS_I18N_LOCALE”就行了。
  实际上时完全错误,我们先看看struts2国际化的步骤:

    1、判断struts.locale属性(在struts.properties)是否有值,如果有值,将这个值转换为Locale对象保存到ActionContext中。
    2、如果没有设置struts.locale,从浏览器发送的请求报头里获得语言信息,创建Locale对象,保存到ActionContext中。
    3、I18nInterceptor拦截器获取名为request_locale请求参数的值,如果这个值存在则创建以这个值的Locale对象,然后将这个对象作为session的属性(WW_TRANS_I18N_LOCALE)保存,并保存到ActionContext中。


在修改session的WW_TRANS_I18N_LOCALE值和request_locale等无效之后,发现程序始终是只会读取浏览器发送过来的区域信息。估计这是struts2国际化得BUG了。

知道了struts2的原理后,就好解决,我们现在要做的就是用用户自定义切换的国际化区域信息来替代浏览器请求报头里的语言信息。

先写一个过滤器,代码如下:
public class I18nFilter implements Filter {

	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain filterChain) throws IOException, ServletException {
		HttpServletRequest r = (HttpServletRequest) req;
		MyRequestWrapper request = new MyRequestWrapper(r);
		filterChain.doFilter(request, resp);
	}
}

配置为拦截所有请求
<filter>
		<filter-name>i18nFilter</filter-name>
		<filter-class>com.xxx.common.filter.I18nFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>i18nFilter</filter-name>
		<url-pattern>*</url-pattern>
	</filter-mapping>


这个拦截器的关键就是使用httpRequestWrapper,保装request。
这个包装器代码如下:
public class MyRequestWrapper extends HttpServletRequestWrapper {

	private Locale locale = null;

	public MyRequestWrapper(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();
	}

}

这个request包装器主要作用就是从session里获得区域对象,并修改请求报头,从而实现了自定义国际化切换。

如果本方法有问题或者各位有更好的方法,请告知。谢谢
分享到:
评论
2 楼 zhou363667565 2011-07-30  
我把整个流程代码都贴出来   帮帮我  解决!

界面请求Code:

<select name="request_locale" onchange="changeLanguage(this)">
		 						<option value="-1">please select...</option>
		 						<option value="zh_CN">Chinese(Simplified)</option>
		 						<option value="zh_TW">Chinese(Traditional)</option>
		 						<option value="en_US">English(US)</option>
		 						<option value="en">English</option>
		 					</select>

js  Code:
//修改语言
function changeLanguage(obj){
	var url="/wmba/userLoginAction/userLoginAction_changeLanguage.action?locale_language="+obj.value+"&request_locale="+obj.value;
	window.parent.location=url;
}


struts2 Code:
private static final String LANGUAGE="language";//application中key
	private String locale_language;//界面选择的语言
	
	public String getLocale_language() {
		return locale_language;
	}

	public void setLocale_language(String localeLanguage) {
		locale_language = localeLanguage;
	}
public String changeLanguage(){
		writeLanguage();
		return "success";
	}
//写cookie
	public void writeLanguage(){
		HttpServletResponse response=ServletActionContext.getResponse();
		Cookie cookie = new Cookie(LANGUAGE, locale_language);
		cookie.setMaxAge(356*24*60*60);
		response.addCookie(cookie);
	}
//默认初始语言   或是  找用户计算机上的cookie信息
	public String getLanguage(){
		HttpServletRequest request=ServletActionContext.getRequest();
		
		Cookie[] cookies= request.getCookies();
		
		//cookie 中没有语言  默认从application取
		String language=ServletActionContext.getContext().getApplication().get(LANGUAGE).toString();
		
		for(Cookie ck : cookies){
			if(ck.getName().equals(LANGUAGE)&&ck.getValue()!=null&&!"".equals(ck.getValue())){
				logger.debug("cookie------->language:"+ck.getValue());
				language=ck.getValue();
			}
		}
		logger.debug("----------->language:"+language);
		
		ActionContext.getContext().setLocale(new Locale(language));
		
		return language;
	}

没有其它拦截器什么的!只用到了你的那两个类。登陆成功之后就会调用getlanguage()方法,跳转到主界面。还有:有什么好方法让登陆的页面也改变成cookie中语言啊!
1 楼 zhou363667565 2011-07-30  
很强大,正好是我所需要的!我copy了你的代码,试了一下,确实已经达到了自定义切换语言的效果!  我现在的需求是:用户选择语言,保存到用户的计算机中(cookie),以后只要用户不选择语言,默认读取cookie中的语言。现在遇到的问题:打开浏览器登陆之后主界面又回到了浏览器的语言!
struts2:
private static final String LANGUAGE="language";//application中key
//默认初始语言   或是  找用户计算机上的cookie信息
	public String getLanguage(){
		HttpServletRequest request=ServletActionContext.getRequest();
		
		Cookie[] cookies= request.getCookies();
		
		//cookie 中没有语言  默认从application取
		String language=ServletActionContext.getContext().getApplication().get(LANGUAGE).toString();
		
		for(Cookie ck : cookies){
			if(ck.getName().equals(LANGUAGE)&&ck.getValue()!=null&&!"".equals(ck.getValue())){
				logger.debug("cookie------->language:"+ck.getValue());
				language=ck.getValue();
			}
		}
		logger.debug("----------->language:"+language);
		
		ActionContext.getContext().setLocale(new Locale(language));
		
		return language;
	}


用户登录成功就调用该方法,行不通....很郁闷!  求解啊!

相关推荐

    Struts2国际化——自动切换语言

    以下将详细阐述实现Struts2国际化自动切换语言的过程。 1. **资源配置文件**: - `globalMessage.properties`:这是默认的资源配置文件,存放通用的国际化信息。 - `globalMessage_zh_CN.properties`:中文资源...

    struts2国际化语言切换

    以下是实现Struts2国际化语言切换的详细步骤: 1. **创建资源包**: 首先,你需要为每种支持的语言创建一个资源包。资源包通常是以.properties为后缀的文本文件,例如`message_zh_CN.properties`(中文)和`...

    Struts2国际化(可选择语言)

    总的来说,这个例子展示了如何在Struts2框架下实现国际化功能,包括创建资源文件、在Action中获取本地化信息、在JSP中展示以及提供语言切换的界面。通过这样的实现,开发者可以轻松地为不同地区的用户提供定制化的...

    Struts2 国际化 多语言切换

    下面我们将深入探讨如何在Struts2中实现国际化和多语言切换。 **一、国际化(i18n)基础** 国际化是指软件设计时考虑到不同地区的文化差异,使得软件可以通过简单的配置和扩展就能适应各种语言环境。在Java中,我们...

    Struts1 和 Struts 2 国际化全局资源

    4. **动态资源加载**:Struts2允许在运行时动态切换语言,用户可以通过URL参数(如`?lang=en`)或自定义拦截器来更改当前的语言环境。 5. **主题和皮肤**:Struts2还支持主题和皮肤,允许开发者为不同的语言环境...

    struts2框架国际化

    国际化(i18n)是Struts2的一个重要特性,使得应用能够支持多种语言环境,以满足全球用户的语言需求。以下是对Struts2框架国际化实现的详细讲解。 1. **国际化的基本概念** 国际化(Internationalization,简称i18...

    struts2拦截器国际化

    在某些情况下,我们需要在拦截器中处理国际化问题,例如根据用户的选择或浏览器的默认语言动态切换资源包。这时,我们可以编写一个自定义拦截器来实现这一功能: 1. 自定义拦截器中,检查请求头或Cookie以获取用户...

    Struts2数据校验与国际化

    在Struts2应用中,可以通过`&lt;s:text&gt;`标签或Action上下文来访问这些资源包中的字符串,实现动态切换语言。用户可以根据自己的浏览器设置或手动选择语言,系统会自动加载相应语言的资源包。 总结起来,Struts2的数据...

    struts2国际化

    Struts2提供了一个默认的国际化资源文件`struts2-i18n.properties`,其中包含了框架自身的提示信息。开发者可以根据需要覆盖这些默认值,或者为特定的语言创建自定义的资源文件。 4. **Action中的国际化** 在...

    Struts2 国际化 I18N 和Java 国际化

    在Java和Struts2中实现国际化,可以为全球用户提供更友好的用户体验。 首先,我们需要理解Java的国际化机制。Java通过`java.util.ResourceBundle`类来处理国际化。资源库文件通常以`.properties`格式存储,每个文件...

    struts2 国际化

    lang=en_US`)或cookie来指定语言,Struts2可以根据这些信息动态切换Locale。 **三、示例代码** 1. **资源文件**: ```properties # messages_en.properties hello.message=Hello, World! # messages_zh_...

    struts2国际化_i18n

    Struts2是一个非常流行的Java Web框架,用于构建可维护、可扩展且结构良好的应用程序。...这个提供的`i18n`压缩包文件可能包含了示例的资源包和相关的配置文件,可以帮助初学者理解并实践Struts2的国际化实现。

    Struts2国际化转码小工具

    4. **Struts2配置**:在Struts2中,要实现国际化,需要在`struts.xml`配置文件中指定资源包的位置,并在Action类或者JSP页面中使用`getText()`方法来获取对应的本地化字符串。 5. **多语言切换**:通过设置用户的...

    实现struts2国际化支持

    总结来说,实现Struts2的国际化支持涉及到创建和管理资源文件,配置Struts2框架以加载这些文件,以及在Action和视图层正确使用国际化消息。这个过程有助于提高应用的用户体验,让不同地区和语言背景的用户都能舒适地...

    struts国际化的问题

    理解并熟练掌握以上知识点,可以帮助开发者有效地解决Struts中的国际化问题,提供更加全球化且用户体验良好的Web应用。在实际开发中,还需要注意不同文化和地区的语言习惯,以提供更加贴近当地用户的界面。

    Struts国际化完整dome

    开发过程中,可以通过修改浏览器的语言设置或在HTTP请求中手动设置Accept-Language来快速切换语言环境,测试国际化效果。 "StrutsI18N"这个项目应该包含了上述所有步骤的实现,你可以通过阅读代码来了解每一个细节...

    struts2国际化配置文档

    - 如果你想让用户在应用中手动切换语言,可以创建一个Action或URL,接收用户选择的语言代码,并通过`session`或`cookie`存储下来。然后,根据这个代码设置`ActionContext`的locale。 7. **考虑日期和数字格式**: ...

    struts2环境搭建及国际化

    ### Struts2环境搭建及国际化知识点详解 #### 一、Struts2简介与环境搭建 **1.1 Struts2框架概述** Struts2是由Apache软件基金会提供的一个开源的MVC框架,它继承了Struts1的设计理念,并进行了大量的改进和优化...

    自定义struts框架

    8. **国际化与本地化**:Struts支持多语言环境,通过资源文件可以实现应用的国际化。自定义Struts框架时,可能需要考虑如何更便捷地管理和切换不同的语言版本。 9. **依赖注入(DI)**:虽然Struts1不直接支持DI,...

Global site tag (gtag.js) - Google Analytics