Une fois les termes récupérables, il s’agissait de définir comment FormBuilder allait récupérer ces derniers pour les afficher.
Les contraintes sont les suivantes :
- Garder l’ancien fonctionnement (sans les termes de traductions) ;
- Faire en sorte de simplifier au maximum l’utilisation des classes FormBuilder (FormBuilderForm, FormBuilderField, etc.) ;
- Éviter d’avoir à écrire systématiquement la clé du terme et si possible centraliser cela (plus pratique en cas de changement).
Pour satisfaire la première contrainte, la réflexion a été la suivante : Un terme est associé à une propriété. Si le terme n’existe pas cela signifie que nous avons à faire à une propriété du formulaire non traduite.
Il a été envisagé de stocker la clé directement dans la propriété cependant ce faisant, il était possible d’obtenir des conflits de clés si les termes n’étaient pas suffisamment cadrés/structurés. De ceci est ressortie la troisième contrainte.
Il a donc été choisi de centraliser la création des clés afin d’avoir une standardisation de celles-ci. Cela permet également d’éviter d’avoir à stocker les clés des termes.
Il également a été choisi de faire en sorte que lorsque le développeur récupère une propriété quelconque d’un formulaire, celle-ci soit directement dans la bonne langue. Ce choix permet d’éviter de modifier toute la logique préexistante mais uniquement les entités de base, NHibernate (ex. Form) et non NHibernate (ex. FormBuilderForm).
En résumé, les propriétés des objets FormBuilder ont été modifiées de façon à vérifier si leur terme de traduction existe. Si tel est le cas, le terme est récupéré et la bonne traduction est retournée en fonction du contexte et si cela n’est pas le cas, le contenu de la propriété est retourné (comportement avant l’internationalisation).
Figure 6 - Classes pour la standardisation des termes
FormBuilderTranslationTerm (Artionet.IceCube.Interfaces)
Figure 7 - Classe "FormBuilderTranslationTerm"
Cette classe permet de récupérer les clés standardisées des termes de traductions utilisés pour la traduction des formulaires.
Contraintes :
- Longueur des clés, limitée en base de données (255 caractères)
Deux énumérations sont nécessaires :
- FormBuilderElement : Liste les éléments FormBuilder ayant des attributs pouvant être traduits.
Figure 8 - Enumération "FormBuilderElement"
- FormBuilderAttribute : Liste les attributs traduisibles pour les éléments.
Dans cette énumération, l’attribut « Undefined » va permettre de récupérer un terme de traduction « générique ». Ceci est utilisé afin d’identifier tous les termes concernant un champ particulier ou encore un formulaire par exemple.
Figure 9 - Enumération "FormBuilderAttribute"
Ainsi que la classe « FormBuilderTranslationElement » qui permet de définir la structure hiérarchique entre les différents éléments ainsi que les propriétés traduisibles qui leur sont attribués.
Figure 10 - Classe "FormBuilderTranslationElement"
Cette dernière classe est utilisée dans le constructeur par défaut de la classe « FormBuilderTranslationTerm ». Si un élément ou un attribut devait être ajouté comme étant traduisible, le constructeur devra être modifié afin d’y être ajouté.
Figure 11 - Hiérarchie des termes avec exemples
Implémentation
Voici un exemple d’implémentation pour la récupération d’un terme sur une propriété d’un objet FormBuilder, en l’occurrence l’élément « Field », attribut « Title » sur la classe « FormField » (la classe « FormBuilderField » possède également cette implémentation).
Les codes suivants montre comment les classes décrites précédemment sont utilisées afin de mettre en pratique la logique choisie.
Avant modification :
/// <summary>
/// Field's label
/// </summary>
public virtual string Title { get; set; }
Après modification :
/// <summary>
/// Storage for title (backward compatibility, before I18N)
/// </summary>
private string _Title;
/// <summary>
/// Field's label
/// </summary>
public virtual string Title
{
get
{
return Term.Get(string.Format(FormBuilderTranslationTerm.Instance.Get(FormBuilderElement.Field, FormBuilderAttribute.Title), FormId, Id), _Title, TermType.FormBuilder);
}
set
{
_Title = value;
}
}
La description XML Hibernate des entités n’a pas été modifiée.