Ez18n hands on - Annotation Processing Tool par l'exemple

22
Ez18n hands on @gdigugli @dbaeli

description

Introduction à i18n avec GWT les ResourceBundle du JDK les MessageFormats du JDK Comment aligner les 2 mondes ? Bénéfices d'une approche unifiée Injection à la CDI des bundles Testes unitaires Rapport CSV des clés i18n Application multi écran Demo slideware : LesFurets.com mobile/desktop On enrichit encore un peu le pattern ! Deffered binding GWT kesako ? Une nouvelle permutation GWT pour les clients mobiles Injection des resources mobile et desktop avec GWT Demo StockWatcher Idée 1 : des tests JUnit pour l'orthographe Idée 2 : un JSR pour les ResourceBundle 2.0

Transcript of Ez18n hands on - Annotation Processing Tool par l'exemple

Page 1: Ez18n hands on - Annotation Processing Tool par l'exemple

Ez18n hands on

@gdigugli

@dbaeli

Page 2: Ez18n hands on - Annotation Processing Tool par l'exemple

Speakers

@dbaeli

• Chien de berger Agile pour

• Développeur de plus de 30 ans

• Usine logicielles & DevOps

• Qualité Logicielle

@gdigugli

• Développeur java depuis 1999

• Architecte pour

• ILOG - IBM

librairie graphique 2D

moteur de règles

• Prima-Solutions

plate-forme de services pour J2EE

code génération de modèle métier

2

Page 3: Ez18n hands on - Annotation Processing Tool par l'exemple

Introduction à i18n avec GWT• N’oublier pas le meta tag<meta http-equiv="content-type" content="text/html; charset=UTF-8">

• Ajouter les fichiers de localisation

LabelMessages_de.properties

• Charger la classe GWT.create(LabelMessages.class);

https://developers.google.com/web-toolkit/doc/latest/DevGuideI18n

Page 4: Ez18n hands on - Annotation Processing Tool par l'exemple

Les ResourceBundles du JDK

• java.util.ResourceBundle La classe qui charge les fichiers properties en fonction de la

locale (par défaut ou en paramètre)

• java.util.Locale L’objet qui désigne la langue courante avec laquelle on charge

les resources internationnaliéses

• Convention de nommage pour les fichiers de traduction• StockWatcherConstants_en_EN.properties

Langue Pays

Page 5: Ez18n hands on - Annotation Processing Tool par l'exemple

Les MessageFormat du JDK

• Inclure les « formats » dans le ResourceBundle• Oblige à manipuler un MessageFormat pour

évaluer l’expression en passant ses paramètres via un tableau

• Gère automatiquement le formatage des paramètres en fonction de la locale (nombre, date)

• Pluralisation, paramètre optionnels …

http://docs.oracle.com/javase/tutorial/i18n/format/messageFormat.html

Page 6: Ez18n hands on - Annotation Processing Tool par l'exemple

Comment aligner les deux mondes

• On ajoute notre propre interface inspirée du pattern GWT

• @Label remplace @DefaultStringValue (GWT)

• @LabelBundle sert de trigger pour des processeurs APT

• Les processeurs APT vont générer: le pattern GWT une implémentation équivalente

basée sur MessageFormat et ResourceBundle

Page 7: Ez18n hands on - Annotation Processing Tool par l'exemple

Bénéfices d’une approche unifiée

• Les messages sont gérés indifféremment pour du code serveur, JSP, servlet et pour le code GWT client

• Le pattern est beaucoup plus agréable que le pattern par défaut J2SE

• Le développeur ne maintient plus de fichiers properties pour la locale par défaut de l’application

Page 8: Ez18n hands on - Annotation Processing Tool par l'exemple

Pattern implémenté

+symbol() : S tring [1]

+price() : S tring [1]

+remove() : S tring [1]

+lastUpdate( date : S tring [1] ) : S tring [1]

+change() : S tring [1]

+add() : S tring [1]

+changeValue( value : double [1], pe rcent : double [1] ) : S tring [1]

+priceValue( value : double [1] ) : S tring [1]. . .

LabelResources

(com.google .gwt.sample .stockwatcher.client)

MSG_LR

«enumeration»

ELabelSiteBundle

(com.google .gwt.sample .stockwatcher.client)

LabelS iteMe ssages

(com.google .gwt.sample .stockwatcher.client)

ELabelSiteBundleTest

(com.google .gwt.sample .stockwatcher.client)

LabelS iteMe ssages_

(com.google .gwt.sample .stockwatcher.client)

ResourceBundle

(Externals T ypes)

-delegate 1

Page 9: Ez18n hands on - Annotation Processing Tool par l'exemple

Injection “à la CDI” des bundles • Afin de permettre l’utilisation indifféremment des deux

implémentations, il faut passer l’interface @LabelBundleaux constructeurs des objets utilisant les messages

Page 10: Ez18n hands on - Annotation Processing Tool par l'exemple

Tests JUnit

• On peut également générer des vérifications sur les labels sous forme de test JUnit:un autre processeur d’annotation génère une série

d’assertion vérifiées à chaque modification de l’interface

Page 11: Ez18n hands on - Annotation Processing Tool par l'exemple

Rapport CSV des clés i18n

Page 12: Ez18n hands on - Annotation Processing Tool par l'exemple

Application web multi écran

• Un seul code

Une version browser mobile

Une version browser desktop et tablettes

• Une CSS custom pour le mobile

• Des libellés simplifiés

• Certains widgets customisés

Boite de dialogue

Sélection des dates

Page 13: Ez18n hands on - Annotation Processing Tool par l'exemple

mobile et desktop

Page 14: Ez18n hands on - Annotation Processing Tool par l'exemple

mobile et desktop

Page 15: Ez18n hands on - Annotation Processing Tool par l'exemple

mobile et desktop

Page 16: Ez18n hands on - Annotation Processing Tool par l'exemple

+symbol() : S tring [1]

+price() : S tring [1]

+remove() : S tring [1]

+lastUpdate( date : S tring [1] ) : S tring [1]

+change() : S tring [1]

+add() : S tring [1]

+changeValue( value : double [1], perc ent : double [1] ) : S tring [1]

+priceValue( value : double [1] ) : S tring [1]. . .

LabelResources

(com.google.gwt.sample.s tockwatcher.c lient)

+MSG_LR() : LabelResources [1]

LabelMessagesFactory

(com.google.gwt.sample.s tockwatcher.c lient)

LabelS iteMes sages_

(com.google.gwt.sample.s tockwatcher.c lient)

ELabelSiteBundleTest

(com.google.gwt.sample.s tockwatcher.c lient)

LabelS iteMes sages

(com.google.gwt.sample.s tockwatcher.c lient)

LabelMobileMessages

(com.google.gwt.sample.s tockwatcher.c lient)

MSG_LR

«enumeration»

ELabelSiteBundle

(com.google.gwt.sample.s tockwatcher.c lient)

ELabelMobile BundleTest

(com.google.gwt.sample.s tockwatcher.c lient)

LabelMobileMessages_

(com.google.gwt.sample.s tockwatcher.c lient)

MSG_LR

«enumeration»

ELabelMobile Bundle

(com.google.gwt.sample.s tockwatcher.c lient)

ResourceBundle

(Externals T ypes)

Generated.gwt.xml

-delegate

1

-delegate 1

On enrichit encore un peu le pattern !

Page 17: Ez18n hands on - Annotation Processing Tool par l'exemple

Deferred Binding GWT kesako ?

• Mécanisme pour générer plusieurs version du code à la compilation ca prend du temps

• GWT génère une permutation par browser supporté, mais on peut enrichir en fonction de différents paramètres user-agent

locale du client

custom• GWT.create(LabelRessources.class);

Page 18: Ez18n hands on - Annotation Processing Tool par l'exemple

Une nouvelle permutation GWT pour les clients mobiles

Page 19: Ez18n hands on - Annotation Processing Tool par l'exemple

Injection des resources mobile et desktop avec GWT

Page 20: Ez18n hands on - Annotation Processing Tool par l'exemple

Demo StockWatcher

http://localhost:8080/ez18n/

Page 21: Ez18n hands on - Annotation Processing Tool par l'exemple

Idée 1Tests JUnit de l’orthographe

• Améliorer le pattern de test unitaire

implémenter une vérification orthographique sous forme de tests JUnit

Utiliser Jazzy et les dictionnaires d’OpenOffice

http://jazzy.sourceforge.net/

Page 22: Ez18n hands on - Annotation Processing Tool par l'exemple

Idée 2JSR pour ResourceBundle 2.0

• Qualité et efficacité du pattern GWT est applicable au JDK

• Proposer une annotation standard pour @Label

• Proposer des processeurs APT standard qui génèrent un pattern semblable à celui présenté

• Injection du pattern avec ServiceLoader pour éviter toute adhérence au code généré

– utilisable en mode ‘une passe’