Recevez les mises à jour gratuites du blog par Email : »» Garanti sans spam indésirable ««

JSTL & I18n : Comment changer dynamiquement la langue de votre site

de Mimie le 18 août 2010

Rubrique : Programmation

Offrir la possibilité à l’internaute de changer la langue du site visité est devenu courant, cependant ce n’est jamais fait ni présenté de la même façon. Cet article va vous présenter la façon que j’utilise pour internationaliser les sites web que je conçois.

© http://test.ical.ly

© http://test.ical.ly

JSTL

JavaServer Pages Standard Tag Library (JSTL) est ma librairie fétiche lorsque je développe des JSP. Elle étend la spécification JSP en ajoutant une batterie de taglibs permettant d’effectuer les tâches courantes, comme le travail sur des fichiers XML, l’exécution conditionnelle, les boucles et l’internationalisation. C’est donc naturellement vers elle que je me suis tourné.

L’avantage de cette librairie est qu’elle utilise les classes standard de Java pour la gestion de l’internationalisation. La classe java.util.Locale permet de représenter les spécificités régionales, ainsi que la classe java.util.ResourceBundle pour accéder aux données des fichiers de traduction.

ResourceBundle

Un ResourceBundle permet de gérer un ensemble de fichier *.properties contenant les ressources localisées. Par exemple pour gérer les langues françaises, anglaises et allemandes, on pourrait avoir les fichiers suivants :

  • Message_fr.properties
  • Message_en.properties
  • Message_de.properties

Le Resourcebundle de l’application utilisé par défaut est paramétré dans le fichier web.xml en utilisant cette variable :

<context-param>
	<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
	<param-value>Message</param-value>
</context-param>

Il suffit alors d’alimenter vos fichiers de traduction de la façon suivante (clé=valeur) :

  • pour le fichier de langue française
message.hello=Bonjour
message.bye=Au revoir
  • pour le fichier de langue anglaise
message.hello=Hello
message.bye=Bye
  • pour le fichier de langue allemande
message.hello=Hallo
message.bye=Tschüs

Ensuite pour utiliser les libellés de ces fichiers selon la langue (ou locale) courante depuis vos JSP, il suffit de les appeler par leur code associé en utilisant JSTL de la façon suivante :

<fmt:param value="message.hello"/> ou <fmt:param value="message.bye"/>

Locale

Pour savoir quel ResourceBundle appelé pour récupérer les libellés, JSTL se base sur une constante stockée en session, Config.FMT_LOCALE, voici les façons de la modifier dynamiquement :

  • soit dans votre JSP en utilisant JSTL lui-même :
<fmt:setLocale value="fr" scope="session"/>
  • soit depuis un filtre, une action Struts/Spring, une JSP externe, en modifiant directement la constante Java :
Config.set(session, Config.FMT_LOCALE, locale);
© http://www.info-france-usa.org

© http://www.info-france-usa.org

J’utilise personnellement la deuxième option en modifiant moi-même la Locale de JSTL depuis une action Struts, cette solution a l’avantage de pouvoir être appelée en Ajax.
Je peux ainsi changer la langue du site de façon transparente à l’utilisateur puis simplement recharger la page en cours afin que les libellés passent d’une langue à l’autre.

Le changement de langue d’un site peut donc se faire de la sorte (utilisation de jQuery pour l’appel Ajax) :

  • partie HTML
<body>
...
<img src="votre_drapeau_francais.png" onclick="changeLocale('fr');"/>
<img src="votre_drapeau_anglais.png" onclick="changeLocale('en');"/>
<img src="votre_drapeau_allemand.png" onclick="changeLocale('de');"/>
...
</body>
  • partie JavaScript
<script type="text/javascript">
// permet de changer la langue du site
var changeLocale = function(language) {
	$.ajax({
		   url: ctx + "/locale.do",
		   data: "language=" + language,
		   success: function(msg) {
		     location.reload();
		   }
	});
};
</script>
  • partie Struts
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
     // synch Locale's JSTL
     HttpSession session = request.getSession(true);
     Locale locale = (Locale) Config.get(session, Config.FMT_LOCALE);
     if (locale == null) {
         locale = request.getLocale();
     }
     if (request.getParameter("language") != null) {
         locale = new Locale(request.getParameter("language"));
     }
     Config.set(session, Config.FMT_LOCALE, locale);
     return null;
}

Struts

Si vous souhaitez utiliser l’internationalisation de JSTL sur une application existante utilisant déjà l’internationalisation de Struts, il vous faudra alors synchroniser les Locales de Struts et JSTL en même temps :

    // keep JSTL and Struts Locale's in synch
    HttpSession session = request.getSession(true);
    Locale locale = (Locale) session.getAttribute(Globals.LOCALE_KEY);
    if (locale == null) {
        locale = request.getLocale();
    }
    if (request.getParameter("locale") != null) {
        locale = new Locale(request.getParameter("locale"));
    }
    session.setAttribute(Globals.LOCALE_KEY, locale);
    Config.set(session, Config.FMT_LOCALE, locale);

Cet article a été écrit par :

– qui a déjà rédigé 123 posts sur Des Geeks et des lettres.

Passionné d'informatique et développeur JavaEE de métier, je me consacre principalement à écrire des billets sur les sujets du Web et de la programmation Web. Ce blog est un espace qui me permet de partager mes découvertes avec vous et me sert accessoirement de pense bête !

Contacter l'auteur

Jetez aussi un oeil sur :

{ 3 commentaires… à vous de vous exprimer ! }

1 Greg août 18, 2010 à 17 h 46 min

En effet c’est le genre de trucs très utiles quand on commence son site…

Répondre

2 Mimie août 18, 2010 à 22 h 28 min

C’est naturellement plus simple à mettre en place lorsque le site ou l’application en est à ces débuts car plus on attend et plus ça prend du temps de reprendre chaque libellé du site pour les copier dans les fichiers de propriétés, etc.

Répondre

3 Mimie septembre 26, 2010 à 17 h 05 min

Pour ceux qui souhaitent en apprendre plus sur JSTL voici un site que je consulte régulièrement : http://adiguba.developpez.com/tutoriels/j2ee/jsp/jstl/.

Répondre

Laissez un Commentaire

Article précédent:

Article suivant: