SlideShare une entreprise Scribd logo
1  sur  22
Ez18n hands on

   @gdigugli
   @dbaeli
Speakers
    @dbaeli                        @gdigugli
• Chien de berger Agile pour       • Développeur java depuis 1999
                                   • Architecte pour

• Développeur de plus de 30 ans
• Usine logicielles & DevOps       • ILOG - IBM
• Qualité Logicielle                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
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.propert
                                           ies

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


https://developers.google.com/web-toolkit/doc/latest/DevGuideI18n
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
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
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
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
Pattern implémenté
                                            LabelResour ces
                               (com.google .gwt.sample .stockwatcher.client)
                      +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]
                      +changeV alue( value : double [1], pe rcent : double [1] ) : S tring [1]
                      +priceV alue( value : double [1] ) : S tring [1]
                                                         ...




                               «enumeratio n»
                            E LabelSiteBundle                                                  LabelS iteMe ssages
               (com.google .gwt.sample .stockwatcher.client)                         (com.google .gwt.sample .stockwatcher.client)

               MSG_LR




-delegate 1
ResourceBundle                      E LabelSiteBundleTest                                     LabelS iteMe ssages_
(E xternals T ypes)        (com.google .gwt.sample .stockwatcher.client)             (com.google .gwt.sample .stockwatcher.client)
Injection “à la CDI” des bundles
• Afin de permettre l’utilisation indifféremment des deux
  implémentations, il faut passer l’interface @LabelBundle
  aux constructeurs des objets utilisant les messages
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
Rapport CSV des clés i18n
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
mobile et desktop
mobile et desktop
mobile et desktop
On enrichit encore un peu le pattern !
                                                                          LabelMobileMessages_
                                                                 (com.google. gwt.sample.s tockwatcher.client)
                                                                                                                                             Generated.gwt.xml




                                E LabelSiteBundleTest                                    LabelMobileMessages
                                                                                                                                             LabelMessagesFactor y
                    (com.google. gwt.sample.s tockwatcher.client)             (com.google. gwt.sample.s tockwatcher.client)
                                                                                                                                   (com.google. gwt.sample.s tockwatcher.client)
                                                                                                                                   +MSG_LR() : LabelResources [1]



                                                                            LabelResour ces
                                                              (com.google. gwt.sample.s tockwatcher.client)
                                                      +symbol() : S tring [1]
               «enumeration »                         +price() : S tring [1]
            E LabelSiteBundle                         +remove() : S tring [1]                                                            LabelS iteMes sages
(com.google. gwt.sample.s tockwatcher.client)         +lastUpdate( date : S tring [1] ) : S tring [1]                          (com.google. gwt.sample.s tockwatcher.client)
                                                      +change() : S tring [1]
                                                      +add() : S tring [1]
MSG_LR
                                                      +changeV alue( value : double [1], perc ent : double [1] ) : S tring [1]
                                                      +priceV alue( value : double [1] ) : S tring [1]
                                                                                          ...                                                  LabelS iteMes sages_
                                                                                                                                    (com.google. gwt.sample.s tockwatcher.client)


                 -delegate 1
                                                                                 «enumeration »
                    ResourceBundle                                                                                                    E LabelMobile BundleTest
                                          -delegate                        E LabelMobile Bundle
                    (E xternals T ypes)                                                                                      (com.google. gwt.sample.s tockwatcher.client)
                                          1                      (com.google. gwt.sample.s tockwatcher.client)

                                                                 MSG_LR
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);
Une nouvelle permutation GWT pour
        les clients mobiles
Injection des resources mobile et
        desktop avec GWT
Demo StockWatcher




  http://localhost:8080/ez18n/
Idée 1
          Tests 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/
Idée 2
      JSR 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’

Contenu connexe

Similaire à Ez18n hands on - Annotation Processing Tool par l'exemple

L’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketStéphane Legrand
 
Analyse et optimisation des performances du moteur SQL Serveur
Analyse et optimisation des performances du moteur SQL ServeurAnalyse et optimisation des performances du moteur SQL Serveur
Analyse et optimisation des performances du moteur SQL ServeurMicrosoft Technet France
 
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...MongoDB
 
Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !Microsoft Technet France
 
Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !davrous
 
Présentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWTPrésentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWTDNG Consulting
 
JCertif 2012 : Git par la pratique
JCertif 2012 : Git par la pratiqueJCertif 2012 : Git par la pratique
JCertif 2012 : Git par la pratiqueRossi Oddet
 
Gwt fast overview_v1
Gwt fast overview_v1Gwt fast overview_v1
Gwt fast overview_v1David Herviou
 
Comment reprendre un (gros) projet Ruby on Rails
Comment reprendre un (gros) projet Ruby on RailsComment reprendre un (gros) projet Ruby on Rails
Comment reprendre un (gros) projet Ruby on RailsNovelys
 
Au secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsAu secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsantony_guilloteau
 
Cours du soir_gwt
Cours du soir_gwtCours du soir_gwt
Cours du soir_gwtSaid Talibi
 
La qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet CytomineLa qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet CytomineGeeks Anonymes
 
Google Web Toolkit 1.5 Presentation Web Creative Common
Google Web Toolkit 1.5 Presentation Web Creative CommonGoogle Web Toolkit 1.5 Presentation Web Creative Common
Google Web Toolkit 1.5 Presentation Web Creative CommonStéphane Liétard
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipelineNicolas wallerand
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity frameworkDNG Consulting
 
Webschool bourges "le monde de google"
Webschool bourges "le monde de google"Webschool bourges "le monde de google"
Webschool bourges "le monde de google"Webschool Bourges
 
Formation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPFFormation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPFBoubker ABERWAG
 

Similaire à Ez18n hands on - Annotation Processing Tool par l'exemple (20)

L’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacket
 
Analyse et optimisation des performances du moteur SQL Serveur
Analyse et optimisation des performances du moteur SQL ServeurAnalyse et optimisation des performances du moteur SQL Serveur
Analyse et optimisation des performances du moteur SQL Serveur
 
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
 
Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !
 
Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !
 
Présentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWTPrésentation DevoxxFR 2015 sur GWT
Présentation DevoxxFR 2015 sur GWT
 
Devoxx fr
Devoxx frDevoxx fr
Devoxx fr
 
JCertif 2012 : Git par la pratique
JCertif 2012 : Git par la pratiqueJCertif 2012 : Git par la pratique
JCertif 2012 : Git par la pratique
 
Gwt fast overview_v1
Gwt fast overview_v1Gwt fast overview_v1
Gwt fast overview_v1
 
Versioning avec Git
Versioning avec GitVersioning avec Git
Versioning avec Git
 
Comment reprendre un (gros) projet Ruby on Rails
Comment reprendre un (gros) projet Ruby on RailsComment reprendre un (gros) projet Ruby on Rails
Comment reprendre un (gros) projet Ruby on Rails
 
Au secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsAu secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOps
 
Cours du soir_gwt
Cours du soir_gwtCours du soir_gwt
Cours du soir_gwt
 
La qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet CytomineLa qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
La qualité logicielle et l'intégration continue - Cas concret du projet Cytomine
 
Google Web Toolkit 1.5 Presentation Web Creative Common
Google Web Toolkit 1.5 Presentation Web Creative CommonGoogle Web Toolkit 1.5 Presentation Web Creative Common
Google Web Toolkit 1.5 Presentation Web Creative Common
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipeline
 
Gwt final
Gwt finalGwt final
Gwt final
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity framework
 
Webschool bourges "le monde de google"
Webschool bourges "le monde de google"Webschool bourges "le monde de google"
Webschool bourges "le monde de google"
 
Formation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPFFormation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPF
 

Plus de gdigugli

SoftShake 2015 - DomainModel.stream()
SoftShake 2015 - DomainModel.stream()SoftShake 2015 - DomainModel.stream()
SoftShake 2015 - DomainModel.stream()gdigugli
 
Rock solid UI modeling using annotation processing - CodeGeneration 2013
Rock solid UI modeling using annotation processing - CodeGeneration 2013Rock solid UI modeling using annotation processing - CodeGeneration 2013
Rock solid UI modeling using annotation processing - CodeGeneration 2013gdigugli
 
Smart annotation processing - Paris JUG
Smart annotation processing - Paris JUGSmart annotation processing - Paris JUG
Smart annotation processing - Paris JUGgdigugli
 
Smart Annotation Processing - Marseille JUG
Smart Annotation Processing - Marseille JUGSmart Annotation Processing - Marseille JUG
Smart Annotation Processing - Marseille JUGgdigugli
 
JavaOne 2012 - CON11234 - Multi device Content Display and a Smart Use of Ann...
JavaOne 2012 - CON11234 - Multi device Content Display and a Smart Use of Ann...JavaOne 2012 - CON11234 - Multi device Content Display and a Smart Use of Ann...
JavaOne 2012 - CON11234 - Multi device Content Display and a Smart Use of Ann...gdigugli
 
Ez18n crowdsourcing
Ez18n crowdsourcingEz18n crowdsourcing
Ez18n crowdsourcinggdigugli
 
Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernancegdigugli
 
Ez18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellEz18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellgdigugli
 
DevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une applicationDevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une applicationgdigugli
 

Plus de gdigugli (9)

SoftShake 2015 - DomainModel.stream()
SoftShake 2015 - DomainModel.stream()SoftShake 2015 - DomainModel.stream()
SoftShake 2015 - DomainModel.stream()
 
Rock solid UI modeling using annotation processing - CodeGeneration 2013
Rock solid UI modeling using annotation processing - CodeGeneration 2013Rock solid UI modeling using annotation processing - CodeGeneration 2013
Rock solid UI modeling using annotation processing - CodeGeneration 2013
 
Smart annotation processing - Paris JUG
Smart annotation processing - Paris JUGSmart annotation processing - Paris JUG
Smart annotation processing - Paris JUG
 
Smart Annotation Processing - Marseille JUG
Smart Annotation Processing - Marseille JUGSmart Annotation Processing - Marseille JUG
Smart Annotation Processing - Marseille JUG
 
JavaOne 2012 - CON11234 - Multi device Content Display and a Smart Use of Ann...
JavaOne 2012 - CON11234 - Multi device Content Display and a Smart Use of Ann...JavaOne 2012 - CON11234 - Multi device Content Display and a Smart Use of Ann...
JavaOne 2012 - CON11234 - Multi device Content Display and a Smart Use of Ann...
 
Ez18n crowdsourcing
Ez18n crowdsourcingEz18n crowdsourcing
Ez18n crowdsourcing
 
Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernance
 
Ez18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellEz18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshell
 
DevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une applicationDevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une application
 

Ez18n hands on - Annotation Processing Tool par l'exemple

  • 1. Ez18n hands on @gdigugli @dbaeli
  • 2. Speakers @dbaeli @gdigugli • Chien de berger Agile pour • Développeur java depuis 1999 • Architecte pour • Développeur de plus de 30 ans • Usine logicielles & DevOps • ILOG - IBM • Qualité Logicielle  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
  • 3. 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.propert ies • Charger la classe GWT.create(LabelMessages .class); https://developers.google.com/web-toolkit/doc/latest/DevGuideI18n
  • 4. 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
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. Pattern implémenté LabelResour ces (com.google .gwt.sample .stockwatcher.client) +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] +changeV alue( value : double [1], pe rcent : double [1] ) : S tring [1] +priceV alue( value : double [1] ) : S tring [1] ... «enumeratio n» E LabelSiteBundle LabelS iteMe ssages (com.google .gwt.sample .stockwatcher.client) (com.google .gwt.sample .stockwatcher.client) MSG_LR -delegate 1 ResourceBundle E LabelSiteBundleTest LabelS iteMe ssages_ (E xternals T ypes) (com.google .gwt.sample .stockwatcher.client) (com.google .gwt.sample .stockwatcher.client)
  • 9. Injection “à la CDI” des bundles • Afin de permettre l’utilisation indifféremment des deux implémentations, il faut passer l’interface @LabelBundle aux constructeurs des objets utilisant les messages
  • 10. 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
  • 11. Rapport CSV des clés i18n
  • 12. 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
  • 16. On enrichit encore un peu le pattern ! LabelMobileMessages_ (com.google. gwt.sample.s tockwatcher.client) Generated.gwt.xml E LabelSiteBundleTest LabelMobileMessages LabelMessagesFactor y (com.google. gwt.sample.s tockwatcher.client) (com.google. gwt.sample.s tockwatcher.client) (com.google. gwt.sample.s tockwatcher.client) +MSG_LR() : LabelResources [1] LabelResour ces (com.google. gwt.sample.s tockwatcher.client) +symbol() : S tring [1] «enumeration » +price() : S tring [1] E LabelSiteBundle +remove() : S tring [1] LabelS iteMes sages (com.google. gwt.sample.s tockwatcher.client) +lastUpdate( date : S tring [1] ) : S tring [1] (com.google. gwt.sample.s tockwatcher.client) +change() : S tring [1] +add() : S tring [1] MSG_LR +changeV alue( value : double [1], perc ent : double [1] ) : S tring [1] +priceV alue( value : double [1] ) : S tring [1] ... LabelS iteMes sages_ (com.google. gwt.sample.s tockwatcher.client) -delegate 1 «enumeration » ResourceBundle E LabelMobile BundleTest -delegate E LabelMobile Bundle (E xternals T ypes) (com.google. gwt.sample.s tockwatcher.client) 1 (com.google. gwt.sample.s tockwatcher.client) MSG_LR
  • 17. 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);
  • 18. Une nouvelle permutation GWT pour les clients mobiles
  • 19. Injection des resources mobile et desktop avec GWT
  • 20. Demo StockWatcher http://localhost:8080/ez18n/
  • 21. Idée 1 Tests 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/
  • 22. Idée 2 JSR 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’