JSF Internacionalização não fica na Sessão

5 respostas
T

Boa Noite galera, estou tento um problema com jsf e internacionalização:
1) Setei o idioma default como sendo português, mas continua me abrindo primeiro o inglês.
2) Criei o botão para selecionar o idioma, e funciona perfeito. Porém quando saio da página e vou para outra o idioma volta para Inglês...

segue o código que adicionei:

faces-config.xml
<application>   
        <resource-bundle>
            <base-name>br.com.canivel.messages.messages</base-name>
            <var>msg</var>
        </resource-bundle>
        <locale-config>
            <default-locale>pt</default-locale>
            <supported-locale>en</supported-locale>
        </locale-config>
        <message-bundle>
            br.com.canivel.messages.messages
        </message-bundle>      
    </application>

criei os arquivos messages_en.properties e messages_pt.properties

criei o controller LocaleController.java
package br.com.canivel.face.controller;
import java.io.Serializable;
import java.util.Locale;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;

@Named
@SessionScoped
public class LocaleController implements Serializable {
    
    private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();

    public Locale getLocale() {
        return locale;
    }

    public String getLanguage() {
        return locale.getLanguage();
    }

    public void changeLanguage(String language) {
        locale = new Locale(language);
        FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
        
    }
}
template baseAdmin.xhtml
<html lang="#{localeController.language}"
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <f:view locale="#{localeController.language}">
        <h:head>
            <ui:include src="mainHead.xhtml" />
            <title>Canivel Commerce - <ui:insert id="title" name="title"> Administration</ui:insert></title>
        </h:head>
        <h:body>
            <ui:include src="header.xhtml"></ui:include>
            <ui:insert name="content"></ui:insert>
            <ui:include src="footer.xhtml"></ui:include>
        </h:body>
    </f:view>
</html>
header.xhtml
<ul>
                                        <li> <h:form style="border:none; background:none;" prependId="false"><h:commandLink action="#{localeController.changeLanguage('pt')}" value="#{msg.portuguese}" /></h:form> </li> 
                                        <li> <h:form style="border:none; background:none;" prependId="false"><h:commandLink action="#{localeController.changeLanguage('en')}" value="#{msg.english}" /></h:form> </li>
                                   </ul>

Alguem sabe porque o idioma não fica setado na sessão?

OBrigado

5 Respostas

T

alguem tem alguma idéia para me ajudar… passei o final de semana pesquisando e nada…

Uma outra coisa estranha que encontrei, como está abrindo inglês por default(sei lah porque, pois setei o default para Português) eu clico em português ele muda o texto certinho, depois clico em outro página e o menu continua em portugues, quando clico em outra página ele mata a sessao e volta pra ingles… é sempre na segunda página em diante que volta para o default…

muito loko… :shock:

plz help

T

to pirando aqui galera… plz alguem me ajuda

T

achei o bug galera…

joguei o managedbean direto no faces-config e tire os annotations do controller… agora porque isso aconteceu… sei lah parece bug mesmo

F
Meu caro, estou tendo um problema parecido, porém é que quando mais de um usuário acessa meu sistema o último idioma selecionado acaba se tornando o default pra todos os outros usuarios.. Como faço pra garantir que o idioma selecionado seja mantido em cada sessão?? seguem códigos abaixo..
private static Locale currentLocale = Locale.getDefault();
    
    
    
	public void englishLocale() {
		UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
		currentLocale = Locale.US;
		viewRoot.setLocale(currentLocale);
                Locale.setDefault(currentLocale);
	}

	public void portugueseLocale() {
		UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
		currentLocale = new Locale("pt", "BR");
		viewRoot.setLocale(currentLocale);
                Locale.setDefault(currentLocale);
	}

	public Locale getCurrentLocale() {
		return currentLocale;
	}
        


    /**
     * @return the locale
     */
    public static ResourceBundle getResourceBundleMensagens() {
        Locale locale = currentLocale;
        
        return ResourceBundle.getBundle(MESSAGES, locale);
    }

isso fica dentro do bean que guarda tudo da sessão.. abaixo segue o código da página jsf

&lt;f:view locale="#{SessionBean1.currentLocale}"&gt;
e os comandos da pagina para alterar o idioma
&lt;div id="selecionaIdioma" class="grid_4" &gt;
                <li   >
                    <b>
                        &lt;h:outputFormat value="  #{msg['lang.selecionar']}  "/&gt;
                    </b>
                </li>
                <li  >
                    &lt;h:commandLink  action="#{SessionBean1.portugueseLocale}" onclick="submit()" title="#{msg['lang.portugues']}"&gt;
                        &lt;h:graphicImage value="../resources/img/bandeiraBrasil.png"/&gt;
                    &lt;/h:commandLink&gt;
                    &lt;h:outputText value="  "/&gt;
                    &lt;h:commandLink action="#{SessionBean1.englishLocale}" onclick="submit()" title="#{msg['lang.ingles']}"&gt;
                        &lt;h:graphicImage value="../resources/img/bandeiraEUA.png" /&gt;
                    &lt;/h:commandLink&gt;
                </li>
            &lt;/div&gt;
Desde já agradeço.
F

Resolvido.. segue abaixo implementação feita no próprio SessionBean:

private String locale=FacesContext.getCurrentInstance().getViewRoot().getLocale().toString();  
      
    public String getLocale(){  
        return this.locale;  
    }  
      
    public void setLocale(String locale){  
        this.locale = locale;  
    }  
      
    public void setLanguage(ActionEvent event){  
        String localeId = event.getComponent().getId();  
        FacesContext context = FacesContext.getCurrentInstance();  
        UIViewRoot viewRoot = context.getViewRoot();  
        viewRoot.setLocale(new Locale(localeId));  
        locale = localeId;  
    }
Assim cada usuário acessa seu próprio locale... aí a chamada para os properties de idiomas ficou assim também centralizada no SessionBean1:
public static ResourceBundle getResourceBundleMensagens() {
        
        Locale localeAtual = FacesContext.getCurrentInstance().getViewRoot().getLocale();
        if(localeAtual==null){
        getResourceBundleMensagens();
            //System.out.println("deu vazio, retornou pra tentar novamente");
        }
        return ResourceBundle.getBundle(MESSAGES, localeAtual);
    }
agora está funcionando 100%..

ajudou muito esse forum:

[url]http://www.mkyong.com/jsf2/jsf-2-internationalization-example/[/url]

Nas Jsps coloquei o seguinte :

&lt;f:view locale="#{SessionBean1.locale}"&gt;

E no jspf de cabeçalho coloquei o seguinte para fazer a alteração dos idiomas:

<li   >
                    <b>
                        &lt;h:outputFormat value="  #{msg['lang.selecionar']}  "/&gt;
                    </b>
                </li>
                <li  >
                    &lt;h:commandLink id="pt_BR" actionListener="#{SessionBean1.setLanguage}"  action="gotoHomePedagogico" title="#{msg['lang.portugues']}"&gt;
                        &lt;h:graphicImage value="../resources/img/bandeiraBrasil.png"  /&gt;
                    &lt;/h:commandLink&gt;
                    &lt;h:outputText id="espacoEntreIdiomasIndex" value="  "/&gt;
                    &lt;h:commandLink id="en_US" actionListener="#{SessionBean1.setLanguage}" action="gotoHomePedagogico" title="#{msg['lang.ingles']}"&gt;
                        &lt;h:graphicImage value="../resources/img/bandeiraEUA.png" /&gt;
                    &lt;/h:commandLink&gt;
                </li>
Criado 17 de setembro de 2011
Ultima resposta 17 de out. de 2012
Respostas 5
Participantes 2