SOCORRO ! Internacionalizacao no Spring 2, alguem me ajuda!

Me deem uma luz por favor !!!

Pessoal, tem 4 dias que eu to apanhando igual vaca na horta pra Internacionalizacao no spring. Minha aplicacao consiste em o usuario selecionar a linguagem que ele deseja no seu portal ( pt_BR, en_US … etc ) e com isso fazer com que o spring coloque esse Locale na sessao. Acredito que esse seja um problema comum, mas pesquisei e ja tentei de tudo e nao entendo pq a porcaria do locale nao fica na sessao. Consegui fazer ele funcionar somente a nivel de request. Quando eu volto pra primeira página ele volta com o locale padrao… alguem sabe me dizer pq ??

aqui vao alguns dos trechos de código q estou utilizando:

Uso struts 2, spring 2.5 e maven 2.2.1

Struts.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>

	<constant name="struts.enable.DynamicMethodInvocation" value="false" />
	<constant name="struts.objectFactory" value="spring" />
	<constant name="struts.devMode" value="true" />
	
	
    <package name="locale" extends="struts-default">

      <action name="initPortal" method="init" class="localeAction">
            <result name="input">pages/mainPage.jsp</result>
            <result name="success">pages/mainPage.jsp</result>
        </action>
        
        <action name="changelocale-submit" method="changeLocale" class="localeAction">
            <result name="input">pages/secondPage.jsp</result>
            <result name="success">pages/secondPage.jsp</result>
        </action>
        
       
    </package>

</struts>

Disponibilizo uma lista na mainPage pro cara dar um submit passando um string locale ( trecho ).

mainPage.jsp:

<%@ taglib prefix="s" uri="/struts-tags"%>

...

<br><s:i18n name="messages"><s:text name="site.title" /></s:i18n>

Escolha o locale: 
...
<s:form action="changelocale-submit" >
	...
				<s:select list="locales" name="currentLocale" />
	...

				<s:submit></s:submit>
...
</s:form>

Trecho do meu applicationContext.xml

...
        <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="messages">
		</property>
	</bean>
	
	
	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
			</list>
		</property>
	</bean>
	
	
		<!-- Declare the Interceptor -->
	<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
		<property name="paramName" value="currentLocale" />
	</bean>
		
	<!-- Declare the Resolver -->
	<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver "/>

...

Action ( trecho )


...
public class LocaleAction extends ActionSupport implements Preparable, SessionAware{
	public String currentLocale;
	public Map locales = null;
	public Locale locale = null;
    
	public String init() throws Exception {
		System.out.println("This is the locale injected by spring: "+currentLocale);
		return Action.SUCCESS;
	}
	
	
	public String changeLocale(){
		
		System.out.println("received locale: "+currentLocale);
		locale = new Locale(currentLocale);
		return Action.SUCCESS;
	}

	public void prepare() throws Exception {
		 if (locales == null) {
	        	HashMap<String, String> localeMap = new HashMap<String, String>();
	        	localeMap.put("EN", "English - US");
	        	localeMap.put("BR", "Português - BR");
	        	localeMap.put("ES", "Espanõl - ES");
	            locales = localeMap;
	        }

		
	}

	getters and setters... 
}

Entao é simples. mainPage : submit -> secondPage ( ok ) Internacionalizado. Quando volto pra mainPage atraves do link na secondPage, a internacionalizacao se perde. Como coloco esse locale na sessao ???

secondPage:

<%@ taglib prefix="s" uri="/struts-tags"%>

<br><s:i18n name="messages"><s:text name="site.language" /></s:i18n>
<BR>
<a href="http://localhost:8080/portalAluno-portal/initPortal.action">Link pra mainPage</a>


existe alguma relacao entre o DispatcherServlet do Spring e o Struts 2 ? Devo utiliza-lo junto ao struts 2 ou o struts 2 assume o papel desse DispatcherServlet ?

Bom pra quem se interessar pelo tópico, resolvi o problema criando um interceptador no proprio struts 2. Lendo bastante sobre isso descobri que o DispatcherServlet do Spring invoca os controladores do Spring. Eu estava inicialmente tentando criar um interceptador no Spring, mas não tem como fazer isso ( pelo menos eu nao encontrei depois de 2 semanas pesquisando ) utilizando o Struts ( 1 ou 2 ) pois o Struts assume o controle do MVC e os controladores do Spring estao no MVC do Spring. Dessa forma criei um interceptador no struts da seguinte forma:

Struts.xml

<package name="padrao" extends="struts-default">

		<interceptors>
			<interceptor name="locale" class="br.ufu.portalAluno.portal.interceptors.LocaleInterceptor" />
			<interceptor-stack name="portalStack">
				<interceptor-ref name="locale" />
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>

		<default-interceptor-ref name="portalStack" />

		<action name="initPortal" method="init" class="localeAction">
			<result name="input">pages/mainPage.jsp</result>
			<result name="success">pages/mainPage.jsp</result>
		</action>

		<action name="changelocale-submit" method="changeLocale" class="localeAction">
			<result name="input">pages/secondPage.jsp</result>
			<result name="success">pages/secondPage.jsp</result>
		</action>

...

action:

package br.ufu.portalAluno.portal.interceptors;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import java.util.Locale;
import java.util.StringTokenizer;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;


public class LocaleInterceptor extends AbstractInterceptor {

    private String currentLocale = "";
    private String country = null;
    private String language = null; 
    private Locale locale = null;
    
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {

        HttpServletRequest request = ServletActionContext.getRequest();

        if (request.getParameter("currentLocale") != null){
        	currentLocale = (String) request.getParameter("currentLocale");

            StringTokenizer token = new StringTokenizer(currentLocale,"_");
            
            if(token.hasMoreTokens()){
            	language = token.nextToken();
            }
            if(token.hasMoreTokens()){
            	country = token.nextToken();
            }
                        
            Locale[] locales = Locale.getAvailableLocales();
            for(Locale l: locales) {
                if (l.getLanguage().equals(language) && l.getCountry().equals(country)) {
                    locale = l;
                    Locale.setDefault(locale);
                }
            }
        	
        }
        
        
        if (locale != null)
            ActionContext.getContext().setLocale(locale);
        
        return invocation.invoke();
    }  

}

Minha página tem uma lista de locales na forma pt_BR, us_EN, es_ES e assim por diante…

grande abraco a todos !