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
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
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);
Jetez aussi un oeil sur :
- JSTL : Utilisation des constantes Java sans scriptlet
- JSTL & I18n : Utilisation de ChoiceFormat pour la gestion du singulier et du pluriel
- Struts : comment renvoyer des données JSON en AJAX
- Struts : comment récupérer nos JSP en AJAX
- MySQL : Enregistrement et récupération d’images pour afficher dans une JSP




Affichez votre portrait
{ 3 commentaires… à vous de vous exprimer ! }
En effet c’est le genre de trucs très utiles quand on commence son site…
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.
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/.