Offrez-vous les deux auteurs du blog, Greg et Mimie ==> Ils créent votre site et le référencent pour vous !

JSTL & I18n : Utilisation de ChoiceFormat pour la gestion du singulier et du pluriel

de Mimie le 15 décembre 2010

Rubrique : Programmation

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

© 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 :

  1. Au niveau du fichier de propriétés
  2. maison.singulier.pluriel = Il existe {0, choice, 1#une maison|1>plusieurs maisons}

  3. Au niveau de la JSP
  4. <fmt:message key="maison.singulier.pluriel">
    	<fmt:param value="${nb_maisons}"/>
    </fmt:message>
    
  5. L’équivalent Java pur
  6. 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.

Cet article a été écrit par :

– qui a déjà rédigé 130 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

Laissez un Commentaire

Article précédent:

Article suivant: