Je vous ai parlé dans un article précédent comment utiliser JSTL pour l’internationalisation de votre site Web, en mettant l’accent sur les Resource Bundle (accès aux données des fichiers localisation) et les Locale Java (choix de la localisation).
Ce nouvel article est un peu la suite car il apporte un plus, que je viens d’apprendre récemment (grâce à VALJ qui se reconnaîtra), qui permet de simplifier l’affichage de messages internationalisés qui doivent prendre en compte les accords du singulier et du pluriel, par exemple :
- « Il existe une maison »
- « Il existe plusieurs maisons »

© http://www.getbodysmart.com
Avant
Imaginons ces deux phrases dans un fichier de propriétés correspondant aux clés maison.singulier et maison.pluriel, voici la façon dont j’aurai procédé auparavant pour afficher telle ou telle phrase selon la quantité de maisons donnée par la variable ${nb_maisons} :
<c:choose>
<c:when test="${nb_maisons eq 1}">
<fmt:message key="maison.singulier"/>
</c:when>
<c:otherwise>
<fmt:message key="maison.pluriel"/>
</c:otherwise>
</c:choose>
Visuellement ce n’est pas très élégant, de plus on imagine mal devoir tester plusieurs cas de la même manière pour afficher simplement un texte ou un mot selon son singulier ou son pluriel.
Voici une façon plus élégante en utilisant une classe standard Java, la classe java.text.ChoiceFormat.
ChoiceFormat
Pour faire simple, la classe ChoiceFormat permet de prendre en compte les accords du singulier et du pluriel des messages selon un indice donné au sein même du fichier de propriétés en exploitant la forme {argind, choice, formstyle}
- Le champ argind permet d’utiliser l’argument à l’indice {argind}
- Le mot clé choice permet de d’utiliser la classe ChoiceFormat
- Le champ formstyle est défini par la sous-forme [Limit Index][Limit Behavior][Choice Text]|…
- [Limit Index] désigne l’indice du message associé (un entier)
- [Limit Behavior] désigne des signes de comparaison (# pour l’égal et < > pour les inférieurs et supérieurs)
- [Choice Text] désigne le message à afficher selon le résultat de la comparaison
- Le caractère « | » permet de séparer les différentes valeurs des limites
Après
Ce qui nous donne donc pour l’exemple donné en introduction :
- Au niveau du fichier de propriétés
- Au niveau de la JSP
- L’équivalent Java pur
maison.singulier.pluriel = Il existe {0, choice, 1#une maison|1>plusieurs maisons}
<fmt:message key="maison.singulier.pluriel">
<fmt:param value="${nb_maisons}"/>
</fmt:message>
ResourceBundle messages = ResourceBundle.getBundle("message",new Locale("fr", "FR"));
MessageFormat formatter = new MessageFormat(messages.getString("maison.singulier.pluriel"),new Locale("fr", "FR"));
Object[] messageArguments = { new Integer(2) };
String output = formatter.format(messageArguments);
System.out.println(output); // "Il existe plusieurs maisons"
A présent devoir afficher le singulier ou le pluriel d’un mot n’est plus un problème, cette façon de faire est simple à mettre en place, super pratique et surtout standard.




Les internautes dans le monde