Internationalization + JSF + MyFaces + Tomahawk

5 respostas
viniciusmayer

Olá Pessoal,

Eu estou tentando "internacionalizar" a minha aplicação web e, eu nem sei mais o que eu estou tentando fazer é possível e, estou precisando de umas orientações!

Pois bem, eis o que se segue... A minha aplicação web está "arquiteturada" da seguinte manteira, definição de Layout com Struts Tiles e, framework de renderização das páginas JSFs, Tomahawk. Arquivos de properties:

- br.com.....message.core
-- Messages.properties
---- default language
---- pt_BR - Portuguese (Brazil)
---- es_ES - Spanish (Spain)
---- en_US - English (United States)

Configuração do faces-config.xml:

<application>
<view-handler>org.apache.myfaces.tomahawk.application.jsp.JspTilesViewHandlerImpl</view-handler>
<locale-config>
<default-locale>pt_BR</default-locale>
<supported-locale>pt_BR</supported-locale>
<supported-locale>en_US</supported-locale>
<supported-locale>es_ES</supported-locale>
</locale-config>
<message-bundle>br.com.....message.core.Messages</message-bundle>
</application>

E o JPS "header" do meu site, onde carrego os JavaScript, CSSs e etc e tals, tenho a chamada pro arquivo de Properties:

<f:loadBundle basename="dev.java.net.viniciusmayer.com.message.core.Messages" var="msgs"/>

Bom... Agora, lá vai os "link" que disponibizarei para o cara "escolher" a língua:

<h:form>

<t:commandLink action="#{???}">
<h:outputText value="#{msgs.linguaPortuguese}" title="#{msgs.linguaPortugueseTitle}"/>
</t:commandLink>

<t:commandLink action="#{???}">
<h:outputText value="#{msgs.linguaSpanish}" title="#{msgs.linguaSpanishTitle}"/>
</t:commandLink>

<t:commandLink action="#{???}">
<h:outputText value="#{msgs.linguaEnglish}" title="#{msgs.linguaEnglishTitle}"/>
</t:commandLink>

</h:form>

E é aqui que começam as minhas dúvidas... Primeiro, eu vou ter um BackingBean onde na action de um commandLink executo um método espécifico pra cada língua que troca o Locale?!?! Exemplo:

JSP:
<t:commandLink action="#{bean.spanish}">
<h:outputText value="#{msgs.linguaSpanish}" title="#{msgs.linguaSpanishTitle}"/>
</t:commandLink>
Java:
public String spanish(){
        vr.setLocale(new Locale("es", "ES"));
        return "reload";
    }
Mapeamento do objeto "bean" no faces-config.xml:
<managed-bean>
        <managed-bean-name>bean</managed-bean-name>
        <managed-bean-class>br.com......web.jsf.LinguaBackingBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

Ah!!! O objeto "vr" vem de...

FacesContext context= null;
    ServletContext servletContext= null;
    UIViewRoot vr= null;
    
    /** Creates a new instance of LinguaBackingBean */
    public LinguaBackingBean() {
        context= FacesContext.getCurrentInstance();
        servletContext= (ServletContext) context.getExternalContext().getContext(); 
        vr= context.getViewRoot();
    }
O "return reload" é apenas porque, devida a estrutura do site, preciso que todos os JSP que constituem a página sejam recarregados... Isso tá OK?
<!--navigation-rule>
        <from-view-id>/www/lingua.jsp</from-view-id>
        <navigation-case>
            <from-outcome>reload</from-outcome>
            <to-view-id>/www/</to-view-id>
        </navigation-case>
    </navigation-rule-->

Bueno... Alguém me dá uma "luz" que eu não consegui fazer isso aí funcionar e... Eu não sei se eu estou no caminho certo!

No mais, fico desde já grato pelo tempo dedicado!

Att,
E. Vinicius D. Mayer

5 Respostas

Paulo_Silveira

“nao consegui fazer funcionar”. o que acontece? vem só em ingles? vem um monte de ???

viniciusmayer

Olá Paulo,

Cara, só vem em Inglês!!!

Att,
E. Vinicius D. Mayer

urubatan

tenta o seguinte:
<f:view locale="#{bean.locale}">
… o resto da página
</f:view>

e no teu linguaBackingBean cria uma propriedade locale que vai guardar o locale do usuário :smiley:

viniciusmayer

Hummm…

Removo a seguinte “chamada” do meu JSP:

<f:loadBundle basename="dev.java.net.viniciusmayer.com.message.core.Messages" var="msgs"/>

O código abaixo eu coloco no JPS “header” do meu site, onde carrego os JavaScript, CSSs e etc e tals, como eu havia dito antes… Com o atributo “locale” na tag view do meu JSP “header” conforme código que você disponibilizou!!!

<f:view locale="#{bean.locale}"> ... o resto da página </f:view>

Bom, eu poderia testar também, mudar a minha “chamada”… Fazer assim:

<f:loadBundle basename="#{bean.locale}" var="msgs"/>

Certo!!! Bom… Testo as tuas dicas e depois dou retorno! Fico muitíssimo grato pela atenção!

Att,
E. Vinicius D. Mayer

leod

Caras so aproveitando o topico, usando desta forma:

<f:view locale="#{bean.locale}">
 ... o resto da página
 </f:view>

gera um erro:

exception

org.apache.jasper.JasperException: Exception in JSP: /main.jsp:2

1: <%@ include file="include/taglibs.inc" %>
2: <f:view locale="#{languageMB.locale}">
3: <%@include file="include/header.inc" %>
4: <!--Start div "main"-->
5: <div id="main">


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:512)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

javax.servlet.ServletException: Exception in JSP: /main.jsp:2

1: <%@ include file="include/taglibs.inc" %>
2: <f:view locale="#{languageMB.locale}">
3: <%@include file="include/header.inc" %>
4: <!--Start div "main"-->
5: <div id="main">


Stacktrace:
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:152)
	org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:688)
	org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:658)
	org.apache.jsp.index_jsp._jspService(index_jsp.java:45)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

javax.faces.FacesException: Exception in JSP: /main.jsp:2

1: <%@ include file="include/taglibs.inc" %>
2: <f:view locale="#{languageMB.locale}">
3: <%@include file="include/header.inc" %>
4: <!--Start div "main"-->
5: <div id="main">


Stacktrace:
	org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:422)
	org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234)
	org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:138)
	org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:688)
	org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:658)
	org.apache.jsp.index_jsp._jspService(index_jsp.java:45)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Vo colocar meus arquivos so para vcs entenderem oq eu estou fazendo:

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE faces-config PUBLIC
    "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
    "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>
	<application>
	<view-handler>org.apache.myfaces.application.jsp.JspViewHandlerImpl</view-handler>
		<locale-config>
			<default-locale>pt_BR</default-locale>
			<supported-locale>pt_BR</supported-locale>
			<supported-locale>en_US</supported-locale>
		</locale-config>
		<message-bundle>com.speedborras.I18n.bundle.Messages</message-bundle>
	</application>
	<managed-bean>
		<managed-bean-name>
		userMB</managed-bean-name>
		<managed-bean-class>
		com.speedborras.managebeans.UserMB</managed-bean-class>
		<managed-bean-scope>
		request</managed-bean-scope>
	</managed-bean>
	<managed-bean>
		<description>
		ManageBean of Global Navegation</description>
		<managed-bean-name>
		globalMB</managed-bean-name>
		<managed-bean-class>
		com.speedborras.managebeans.GlobalMB</managed-bean-class>
		<managed-bean-scope>
		request</managed-bean-scope>
	</managed-bean>
	<managed-bean>
		<description>
		ManageBean of Internationalization</description>
		<managed-bean-name>
		languageMB</managed-bean-name>
		<managed-bean-class>
		com.speedborras.managebeans.LanguageMB</managed-bean-class>
		<managed-bean-scope>
		session</managed-bean-scope>
	</managed-bean>
	
	<navigation-rule>
		<display-name>Login</display-name>
		<from-view-id>/user_login.jsp</from-view-id>
		<navigation-case>
			<from-outcome>success</from-outcome>
			<to-view-id>/main.jsp</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-outcome>failure</from-outcome>
			<to-view-id>/user_login.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
		<display-name>Signup</display-name>
		<from-view-id>/signup.jsp</from-view-id>
		<navigation-case>
			<from-outcome>success</from-outcome>
			<to-view-id>/signup_confirm.jsp</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-outcome>failure</from-outcome>
			<to-view-id>/signup.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
	<description>Global Navigation</description>
	<display-name>Global</display-name>
	<from-view-id>*</from-view-id>
	<navigation-case>
		<description>If the outcome is "login", jump to login.jsp.</description>
		<display-name>Login</display-name>
		<from-outcome>login</from-outcome>
		<to-view-id>/user_login.jsp</to-view-id>
	</navigation-case>
	<navigation-case>
		<description>If the outcome is "logout", jump to logout.jsp.</description>
		<display-name>Logout</display-name>
		<from-outcome>logout</from-outcome>
		<to-view-id>/user_logout.jsp</to-view-id>
	</navigation-case>
	<navigation-case>
		<description>If the outcome is "home", jump to main.jsp</description>
		<display-name>Home</display-name>
		<from-outcome>home</from-outcome>
		<to-view-id>/main.jsp</to-view-id>
	</navigation-case>
	</navigation-rule>
	
</faces-config>

taglibs.inc

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>

header.inc

<f:loadBundle basename="com.speedborras.I18n.bundle.Messages" var="msg"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-gb" xml:lang="en-gb">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Language" content="pt-br" />
<meta http-equiv="imagetoolbar" content="no" />
<title><h:outputText value="#{msg.page_title}" /></title>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<link href="<h:outputText value="#{msg.path_domain}" />/template/style/sb_style.css" rel="stylesheet" type="text/css" media="screen" />
Criado 29 de setembro de 2006
Ultima resposta 26 de dez. de 2006
Respostas 5
Participantes 4