[AspectJ] Puis-je espérer localiser (internationaliser) des objets métiers de la manière suivante ?
Bonjour,
J'ai un site web sur lequel les internautes peuvent venir de plusieurs lieux étrangers avec des langues distinctes, bien sûr.
Pas de problème pour le site web : ça gère, comme on dit.
Je me suis aussi dépatouillé pour que les services EJB invoqués reçoivent aussi les locales choisies par l'internaute (une liste ordonnée de ses préférences comme : [en_US, de, fr_CA, fr]), afin que s'ils ont des messages à lui retourner, ils les fassent dans l'une des langues qu'il attend, en fonction du mieux qu'ils sont capables.
Le problème vient des objets métiers.
Car, classiquement, ils n'ont qu'un constructeur sans argument et se doivent de le garder, sauf à en passer – au long cours – par une grande variétés de problèmes annexes, connexes, et contrariants.
Cependant, parmi mes objets métiers, certains émettent des messages. Un objet Email, par exemple, est capable d'auto-contrôler la justesse de construction de son adresse et de renvoyer le message qui explique pourquoi elle est mal formée.
Et j'ai aussi quelques enum "à ressources", c'est à dire qu'ils sont associés à des clefs de propriétés liées à des bundles pour renvoyer, le cas échéant, une description de ce qu'ils représentent.
Et le problème, bien entendu, c'est qu'un POJO construit avec son constructeur sans argument, eh bien, il ne peut se mettre qu'en Locale.Default, et donc fera l'importun qui continuera à parler en français à un internaute toltèque venu inopinément dans le Ratanakiri septentrional, et espérant de nous qu'on lui parle dans une variante en sonnets.
Il ne m'est pas possible de déléguer la création des messages finaux à la seule interface web, parce que :
- il y en a beaucoup.
- la construction des messages peut réclamer des éléments dont le contenu n'est connu qu'à un instant précis et ne l'est plus dans l'interface web. Les messages paramétrés sont souvent dans ce cas et ne peuvent être faits qu'au bon moment, dans une couche logicielle donnée, lorsque que l'interprétation d'une situation est claire, l'environnement bien connu, et permet de décrire parfaitement ce qui se passe.
- un certain nombre de messages ne sont pas émis par moi, mais des API tierces parties, localisables, mais dont je ne peux pas prévoir à l'avance tous les messages qu'elles sont capables de produire.
Il m'a semblé possible de résoudre le problème ainsi :
Un certain nombre d'objets métiers vont devenir éligibles à la localisation en implémentant une interface Localisable, qui contiendra :
Code:
1 2
| public Locales getLocales(); // où Locales extends ArrayList<Locale>, et représente les choix de l'internaute dans l'ordre de ses préférences.
public void setLocales(Locales locales); |
Et je voudrais par une ou plusieurs règles AspectJ (ou un autre moteur de POA, s'il y en a un de meilleur ?!) définir un comportement qui serait celui-ci :
à l'issue de la construction d'un objet qui implémente l'interface Localisable, si la classe qui a provoqué sa construction implémente aussi cette interface, alors il est exécuté un :
Code:
objetCréé.setLocales(objetDemandantLaCréation.getLocales());
Est-ce possible ?
En vous remerciant,
Grunt.