IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Aide Internationalisation JSF 2.0


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Par défaut Aide Internationalisation JSF 2.0
    Bonsoir,

    Je suis entrain de tester un petit exemple sur l'internationalisation des applications web et je tombe sur un problème c'est que lorsque je sélectionne la langue ciblé au départ et je fais une navigation vers une autre page, cette dernière garde toujours la langue par défaut et ne change pas. Je voudrais bien que vous m'aidiez s'il vous plait à propose de ce problème.

    Voici mes pages :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?xml version="1.0" encoding="UTF-8"?>
    <!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:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          >
     
        <h:body>
     
        	<h1>JSF 2 internationalization example</h1>
     
    		<h:form>
     
    			<h3>
    				<h:outputText value="#{msg['welcome.jsf']}" />
    			</h3>
     
    			<h:panelGrid columns="2">
     
    				<h:commandLink action="re" value="go" />
    				Language : 
    				<h:selectOneMenu value="#{language.localeCode}" onchange="submit()"
    					valueChangeListener="#{language.countryLocaleCodeChanged}">
       					<f:selectItems value="#{language.countriesInMap}" /> 
       				</h:selectOneMenu>
     
    			</h:panelGrid>
     
     
     
    		</h:form>
     
        </h:body>
    </html>

    et la page auquel je fais une navigation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?xml version="1.0" encoding="UTF-8"?>
    <!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:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          >
     
        <h:body>
     
        	<h1>JSF 2 internationalization example</h1>
     
    		<h:form>
     
    			<h3>
    				<h:outputText value="#{msg['welcome.jsf']}" />
    			</h3>
     
    			<h:panelGrid columns="2">
     
     
     
     
     
    			</h:panelGrid>
     
     
     
    		</h:form>
     
        </h:body>
    </html>

    Faces-config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?xml version="1.0" encoding="UTF-8"?>
    <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_0.xsd"
        version="2.0">
         <application>
         	<locale-config>
         		<default-locale>en</default-locale>
         	</locale-config>
    		<resource-bundle>
    			<base-name>com.mkyong.welcome</base-name>
    			<var>msg</var>
    		</resource-bundle>
         </application>
     
     
     
     
         <navigation-rule>
    		<from-view-id>/default.xhtml</from-view-id>
    		<navigation-case>
    			<from-outcome>re</from-outcome>
    			<to-view-id>/test.xhtml</to-view-id>
    			<redirect />
    		</navigation-case>
    	</navigation-rule>
    </faces-config>

    Bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
     
    import java.io.Serializable;
    import java.util.LinkedHashMap;
    import java.util.Locale;
    import java.util.Map;
     
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import javax.faces.context.FacesContext;
    import javax.faces.event.ValueChangeEvent;
     
    @ManagedBean(name="language")
    @SessionScoped
    public class LanguageBean implements Serializable{
     
    	private static final long serialVersionUID = 1L;
     
    	private String localeCode;
     
    	private static Map<String,Object> countries;
    	static{
    		countries = new LinkedHashMap<String,Object>();
    		countries.put("English", Locale.ENGLISH); //label, value
    		countries.put("Chinese", Locale.SIMPLIFIED_CHINESE);
    	}
     
    	public Map<String, Object> getCountriesInMap() {
    		return countries;
    	}
     
     
    	public String getLocaleCode() {
    		return localeCode;
    	}
     
     
    	public void setLocaleCode(String localeCode) {
    		this.localeCode = localeCode;
    	}
     
     
    	public void countryLocaleCodeChanged(ValueChangeEvent e){
     
    		String newLocaleValue = e.getNewValue().toString();
     
    		//loop a map to compare the locale code
            for (Map.Entry<String, Object> entry : countries.entrySet()) {
     
            	if(entry.getValue().toString().equals(newLocaleValue)){
     
            		FacesContext.getCurrentInstance()
            			.getViewRoot().setLocale((Locale)entry.getValue());
     
            	}
            }
     
    	}
     
    }

    Merci

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    La tout ce que tu as fait, c'est créer un bean qui stocke une locale. Il te manque une partie fondamentale: dire à JSF que cette locale, il doit l'utiliser pour ses ressource bundle. Tout ce que tu as fait dans le action listener, c'est la changer pour le viewRoot, c'est à dire, pour la page actuelle. Pour l'appliquer sur chaque page, il faut faire ceci, dans chaque page:




    Ca se fait comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8"?>
    <!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:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          >
       <f:view locale="#{language.getLocale}">
    Je vois où t'as repris le code mais, franchement, vu la qualité de ce code (parcourir les map via des entrySet alors qu'on connait déjà la nouvelle valeur, supporer que getViewRoot change la locale de l'utilisateur alors que ça ne change que celle de la requête) et celle des quelques autres billets que j'ai regardé, je ne ferais pas trop confiance à ce blog, il pue l'amateurisme et l'incompétence. J'ai pas le courage de tout corriger le bean, mais l'internationalisation c'est facile:
    1) bean session qui contient la Locale (objet Locale, pas un pseudo code comme dans l'exemple)
    2) des tags f:view qui référencent cette locale
    3) un petit formulaire pour changer cette locale via un combobox

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Par défaut
    J'ai essayé de changer un petit peux mais ça marche pas voilà ce que j'ai fait :

    Bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    package com.mkyong;
     
     
    import java.util.Locale;
    import javax.faces.context.FacesContext;
    import javax.faces.event.ActionEvent;
     
     
     
    public class LanguageBean  {
     
    	private Locale currentLocale = FacesContext.getCurrentInstance()
    			.getViewRoot().getLocale();
     
    	public Locale getCurrentLocale() {
    		return currentLocale;
    	}
     
     
    	public void setCurrentLocale(Locale newLocale) {
    		FacesContext.getCurrentInstance().getViewRoot().setLocale(newLocale);
    		this.currentLocale = newLocale;
    	}
     
    	public void changeLocale(ActionEvent ae) {
    		String id = ae.getComponent().getId();
    		Locale newLocale = null;
     
    		Locale[] locales = Locale.getAvailableLocales();
    		for (int i = 0; newLocale == null && i < locales.length; i++) {
    			if (locales[i].getCountry().equals(id)) {
    				newLocale = locales[i];
    			}
    		}
    		if (newLocale == null) {
    			newLocale = Locale.getDefault();
    		}
    		setCurrentLocale(newLocale);
    	}
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <?xml version="1.0" encoding="UTF-8"?>
    <!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:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:ui="http://java.sun.com/jsf/facelets">
     
    <h:body>
     
    	<h1>JSF 2 internationalization example</h1>
     
     
     
     
     
     
    	<f:view locale="#{language.currentLocale}">
     
    		<f:loadBundle basename="com.mkyong.ChangeLocaleRB_fr" var="change" />
     
    		<h:outputText
    			value="#{change.currentLocale}" />
    		<br />
     
     
     
    		<h:form>
     
    			<h:commandLink id="FR" value="#{change.french}"
    				actionListener="#{language.changeLocale}" />
    			<br />
    			<h:commandLink id="US" value="#{change.english}"
    				actionListener="#{language.changeLocale}" />
    			<br />
    		</h:form>
    	</f:view>
     
    </h:body>
    </html>
    faces-config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?xml version="1.0" encoding="UTF-8"?>
    <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_0.xsd"
        version="2.0">
         <application>
         	<locale-config>
         		<default-locale>en</default-locale>
         	</locale-config>
    		<resource-bundle>
    			<base-name>com.mkyong.welcome</base-name>
    			<var>msg</var>
    		</resource-bundle>
         </application>
     
     
     
     
         <managed-bean>
    		<managed-bean-name>language</managed-bean-name>
    		<managed-bean-class>com.mkyong.LanguageBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    		</managed-bean>
     
     
     
    </faces-config>

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    C'est moche d'utiliser l'ID

    blague à part: rajoute des messages dans ton code, pour voir si

    1) on rentre bien dans l'eventlistener
    2) l'id contient bien ce que tu pense.
    3) tu dois comparer te valeur avec la valeur de locale.getLanguage, pas locale.getCountry
    4) tu dois définir dans ton faces-config les available-locale. Là il n'y a rien de configuré donc, a priori, il n'y a pas d'autre language que "en" disponible.

    Au fait, la javadoc recommande cette méthode pour comparer les langues:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (locale.getLanguage().equals(new Locale("he").getLanguage()))

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Par défaut
    Au fait j'ai modifié mon bean et mon faces-Config mais toujours le même résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?xml version="1.0" encoding="UTF-8"?>
    <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_0.xsd"
        version="2.0">
         <application>
         	<locale-config>
         		<default-locale>en</default-locale>
         		<supported-locale>fr</supported-locale>
         	</locale-config>
    		<resource-bundle>
    			<base-name>com.mkyong.ChangeLocaleRB_en</base-name>
    			<var>msg</var>
    		</resource-bundle>
         </application>
     
     
     
     
         <managed-bean>
    		<managed-bean-name>language</managed-bean-name>
    		<managed-bean-class>com.mkyong.LanguageBean</managed-bean-class>
    		<managed-bean-scope>session</managed-bean-scope>
    		</managed-bean>
     
     
     
    </faces-config>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    package com.mkyong;
     
     
    import java.io.Serializable;
    import java.util.Locale;
    import javax.faces.context.FacesContext;
    import javax.faces.event.ActionEvent;
     
     
     
    public class LanguageBean implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
     
     
    	private Locale currentLocale = FacesContext.getCurrentInstance()
    			.getViewRoot().getLocale();
     
    	public Locale getCurrentLocale() {
    		return currentLocale;
    	}
     
     
    	public void setCurrentLocale(Locale newLocale) {
    		FacesContext.getCurrentInstance().getViewRoot().setLocale(newLocale);
    		System.out.println(newLocale);
    		this.currentLocale = newLocale;
    	}
     
    	public void changeLocale(ActionEvent ae) {
    		String id = ae.getComponent().getId();
    		Locale newLocale = null;
     
    		Locale[] locales = Locale.getAvailableLocales();
    		for (int i = 0; newLocale == null && i < locales.length; i++) {
    			if (locales[i].getCountry().equals(id)) {
    				newLocale = locales[i];
    			}
    		}
    		if (newLocale == null) {
    			newLocale = Locale.getDefault();
    		}
    		setCurrentLocale(newLocale);
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <?xml version="1.0" encoding="UTF-8"?>
    <!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:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:ui="http://java.sun.com/jsf/facelets">
     
    <h:body>
     
    	<h1>JSF 2 internationalization example</h1>
     
     
     
     
     
     
    	<f:view locale="#{language.currentLocale}">
     
    		<f:loadBundle basename="com.mkyong.ChangeLocaleRB_fr" var="change" />
     
    		<h:outputText
    			value="#{change.currentLocale}" />
    		<br />
     
     
     
    		<h:form>
     
    			<h:commandLink id="FR" value="#{change.french}"
    				actionListener="#{language.changeLocale}" />
    			<br />
    			<h:commandLink id="US" value="#{change.english}"
    				actionListener="#{language.changeLocale}" />
    			<br />
    		</h:form>
    	</f:view>
     
    </h:body>
    </html>
    et j'ai vérifié le bon fonctionnement des méthode lorsque je clique sur français ça m'affiche dans la console fr_FR et lorsque je clique sur anglais es_US

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <f:loadBundle basename="com.mkyong.ChangeLocaleRB_fr" var="change" />
    Est-ce que ce _fr est normal?

    Parce que là, si tu sélectionne anglais, le code va chercher dans

    com.mkyong.ChangeLocaleRB_fr_en_us.properties
    com.mkyong.ChangeLocaleRB_fr_en.properties
    com.mkyong.ChangeLocaleRB_fr.properties


    et non pas

    com.mkyong.ChangeLocaleRB_en_us.properties
    com.mkyong.ChangeLocaleRB_en.properties
    com.mkyong.ChangeLocaleRB.properties

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. aide en JSF/Primefaces
    Par siempre dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 11/10/2011, 12h00
  2. aide hibernate jsf
    Par Sara_lilian dans le forum JSF
    Réponses: 11
    Dernier message: 23/02/2010, 11h51
  3. Réponses: 9
    Dernier message: 01/02/2010, 20h12
  4. aide sur jsf+jbpm SVP
    Par belha00 dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 17/04/2009, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo