Bonjour,

Mon site web supporte trois langues et la langue française est sélectionnée par défaut.
Si un internaute arrive avec un navigateur en langue étrangère, la page sera affichée dans la langue correcte.

Cependant, je n'ai pas trouvé le moyen de permettre au visiteur de changer la langue pour sa session, dans le cas où il souhaiterait en sélectionner une autre.


Voici ce que j'ai constaté:

1) <h:view locale="..." > fonctionne pour une constante seulement.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
<h:view>
<f:loadbundle baseName="MonBundle" var="msg" />
Affiche la langue associée au navigateur de l'utilisateur, pour peu qu'elle soit paramétrée dans le fichier de configuration.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
<h:view locale="en">
<f:loadbundle baseName="MonBundle" var="msg" />
Forcera l'anglais, mais:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
<jsp:useBean id="langue" class="java.lang.String" scope="page" />
<jstl:set var="langue" value="en" />
 
<!-- La langue d'affichage sera: ${langue} -->
<h:view locale="#{langue}">
<f:loadbundle baseName="MonBundle" var="msg" />
n'a strictement aucun effet et ne passe pas en langue anglaise, bien qu'un commentaire <!-- La langue d'affichage sera: en --> soit là pour attester que l'attribut langue a une bonne valeur.


2) Il existerait un moyen d'agir au travers d'un bean, mais pour la seule page affichée et depuis un seul endroit.

J'ai mené de nombreuses recherches sur Internet. La résolution la plus fréquente qui m'est proposée consiste à:

a) Ecrire une ligne:
<h:commandLink id="en" action="mystere" actionListener="#{l.changerLocale}" immediate="true">Anglais</h:commandLink>

b) Créer une classe implémentant la méthode changerLocale. La déclarer dans le fichier de configuration comme managedBean, puis par jsp:useBean dans la jsp.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
public String changerLocale(ActionEvent e) 
{
   String langue = e.getComponent().getId();
 
   FacesContext context = FacesContext.getCurrentInstance();
   context.getViewRoot().setLocale(langue);
   return null;
}
Mais:
- Ca ne changerait la locale que pour la page en cours.
- Le contenu d'action doit mener à un emplacement déjà énuméré, enventuellement la page actuelle: il faut l'avoir défini dans la navigation.


Mon problème:
1) Comment faire qu'un changement de langue soit pris en compte pour l'ensemble de la session utilisateur?

2) Comment faire pour que l'ensemble des liens de changement de langue (l'ensemble des commandLink) soient implémentés dans un tag (.tag)? C'est à dire: n'importe quel site de mon l'application change ainsi la langue de la session? Ce qui me pose un souci dans le cas présent, c'est l'obligation de désigner une action... dont je n'ai pas vraiment besoin.


Solutions?
Il soit très probable que j'ai un problème de compréhension quelque-part, et très certainement un "bug" dans mon principe de résolution, ce qui fait que je trouve le changement de langue via JSF pour le moment très fastidieux, au point que je n'arrive pas à l'exploiter.
Je n'imagine plus que des solutions de contournement! Et encore, sans trop savoir si elles me seraient accessibles...

a) Mon site existait en Struts où tout se résolvait d'un <jstl:setLocale ...>. Pourrais-je overrider JSF par son biais? J'ai peur que non!

b) Dois-je faire un filtre de requête, via une servlet, pour forcer la locale? Est-ce seulement possible? Et cela bypassera t-il JSF?


En vous remerçiant de votre assistance,