Início > Programação > Três Maneiras de Alterar o Locale de Aplicações JSF

Três Maneiras de Alterar o Locale de Aplicações JSF

Seguem três formas de alterar o Locale de aplicações JSF.

1. Utilizando a tag [f:view]:

Crie um Facelet template e adicione a tag f:view:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
<body>
<f:view locale="en">
    <f:loadBundle basename="br.com.bundle.MyMessageBundle" var="i18n" />
    <h:outputText value="#{i18n.message}" />
</f:view>
</body>
</html>

É possível deixar a escolha do Locale mais dinâmica se você utilizar um ManagedBean encarregado de selecionar o Locale:

<f:view locale="#{localeSwitcherMB.currentLocale}">
(...)
</f:view>

2. Utilizando um PhaseListener:

public class MyPhaseListener implements PhaseListener {

    private static final String key = "locale";

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // do nothing
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        PhaseId currentPhase = event.getPhaseId();
        if (currentPhase == PhaseId.RESTORE_VIEW) {
            viewRoot().setLocale((Locale) sessionMap().get(key));
        } else if (currentPhase == PhaseId.RENDER_RESPONSE) {
            sessionMap().put(key, viewRoot().getLocale());
        }
    }

    private  Map<String, Object> sessionMap() {
        return FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
    }

    private UIViewRoot viewRoot() {
        return FacesContext.getCurrentInstance().getViewRoot();
    }
}
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
	version="2.1">
	<lifecycle>
		<phase-listener>br.com.phase.MyPhaseListener</phase-listener>
	</lifecycle>
</faces-config>

3. Utilizando um MultiViewHandler, como explicado aqui:

public class MyMultiViewHandler extends MultiViewHandler {
	@Override
	public Locale calculateLocale(FacesContext context) {
		HttpSession session = (HttpSession) context.getExternalContext().
                getSession(false);
		Locale locale = null;
		if (session != null) {
			locale = new Locale("SOME_LANGUAGE", "SOME_COUNTRY", "SOME_VARIANT");
			Locale currentLocale = (Locale) session.getAttribute("locale");
			if (!locale.equals(currentLocale)) {
				session.setAttribute("locale", locale);
				br.com.bundle.MyResourceBundle.getInstance().
                                changeBundle(locale);
			}

		}
		return locale;
	}
}
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
	version="2.1">
	<application>
	    <view-handler>br.com.phase.MyMultiViewHandler</view-handler>
	</application>
</faces-config>

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: