Internationalisation automatique des noms/titres de Data dans les propriétés de langue

Technique

Présentation par l'exemple d'une (maintenant ancienne) limite de l'API d'internationalisation de JCMS et de l'évolution réalisée pour la contourner afin de traduire le nom/titre d'une donnée dans un message.

Rien ne vaut un exemple, voici les propriétés que l'on va utiliser pour afficher un message (respectivement dans en.prop / fr.prop) :

[en.]msg.missing-isbn: ISBN field of publication {0} is invalid.
[fr.]msg.missing-isbn: Le champ ISBN de la publication {0} est invalide.

 

1. La façon de faire avant

Voici ce que l'on avait l'habitude de faire :

Usage #1 : message à "affichage immédiat"

Pour affichage depuis un JSP ou du Java ayant connaissance de la langue de l'utilisateur.

JSP ou Java dérivant de FormHandler :

  glp("msg.missing-isbn", data.getDataName(userLang));

Java :

  JcmsUtil.glp(userLang, "msg.missing-isbn", data.getDataName(userLang));

Problème : on est obligé d'invoquer getDataName et d'y préciser la userLang sur le dataName, c'est assez verbeux !

 

Usage #2 : message à "affichage à retardement"

Dans du code Java générique qui ne sait pas encore la langue d'affichage (eg : controller status)

  ControllerStatus status = new ControllerStatus(...);
  status.setProp("msg.missing-isbn", data.getDataName(language)); // ??? what is the target language!?
  return status;

Problème : lors de la création d'un ControllerStatus, on ne sait pas dans quelle langue va être affiché le message

Ce problème a également lieu avec l'utilisation des objets LangProperty pour imbriquer des propriétés.

 

2. La bonne pratique depuis JCMS 7.1.2

Grâce à l'évolution JCMS-3144 , plus besoin d'invoquer getDataName() ou de connaître la langue de sortie, il suffit simplement de préciser la donnée en paramètre et la résolution aura lieu automatiquement.

Usage immédiat / JSP ou Java dérivant de FormHandler:

  glp("msg.missing-isbn", data);

Usage immédiat / Java :

  JcmsUtil.glp(userLang, "msg.missing-isbn", data);

Usage retardé / Controller Status :

  ControllerStatus status = new ControllerStatus(...);
  status.setProp("msg.missing-isbn", data);
  return status;

Exemple avec LangProperty

Besoins : 

  • créer un message qui doit être traduit plus tard (car on ne connait pas encore la langue de destination)
  • créer un message qui contient en paramètre un lien vers un autre message (qu'on ne peut pas traduire maintenant vu qu'on ne connait pas la langue, et donc qu'on doit conserver uniquement sa déclaration)

Exemple : 
On veut afficher un message indiquant que la publication n'a pu être enregistré en précisant l'erreur à partir d'un autre message.

Définition des propriétés de langue :

[en.]msg.pub-not-saved: Publication could not be saved due to following error : {0}
[en.]msg.missing-isbn: ISBN field of publication {0} is invalid.
[fr.]msg.pub-not-saved: La publication n'a pu être enregistré à cause de l'erreur suivante : {0}
[fr.]msg.missing-isbn: Le champ ISBN de la publication {0} est invalide.

Utilisation dans le code :

  // Quelquepart dans le code on a constaté une erreur et construit ce message : 
  LangProperty errorProperty = new LangProperty("msg.missing-isbn", data);

  // Les traitements sont finis, on veut maintenant afficher un message récapitulatif :
  glp("msg.pub-not-saved", errorProperty);

Vous pourrez retrouver ici les dernières nouvelles et les retours d'expérience de l'équipe technique Jalios :

  • Points techniques
  • Retours d'expérience
  • Bonnes pratiques
  • Sécurité
  • Méthodologie Etc.

Ainsi que les principales actualités Jalios.