SlideShare une entreprise Scribd logo
1  sur  23
Télécharger pour lire hors ligne
Traduction des interfaces
de vos applications Cocoa
                 Olivier Halligon, avril 2011
Sommaire
           • Introduction
           • Traduction par la méthode «standard»
Sommaire




           • La traduction automatique
             de votre interface
           • Astuces, pièges à éviter
           • Conclusion
                                  2
Introduction
               • Présentation
                •
Introduction




                    Olivier Halligon

                •   Food Reporter
                                        Food Reporter



               • Objectif
                •   Base de la traduction

                •   Traduction auto de XIB


                                        3
Traduction par la
                                        méthode «standard»
Traduction par la méthode «standard»




                                       • Ressources localisées
                                       • Fichiers «strings»
                                       • Limitations de cette méthode

                                                           4
Ressources localisées
Traduction par la méthode «standard»




                                       • Un dossier «.lproj» par locale
                                         •   Locale = langue + région (en_US, en_UK)

                                       • Dans le dossier .lproj
                                         •   Images

                                         •   XIB

                                         •   Textes


                                                                5
Fichiers «strings»
Traduction par la méthode «standard»




                                       • Textes dans fichier «Localizable.strings»
                                           •   /* Text to say hello */
                                               "greetings" = "Welcome in Food Reporter!";

                                           •   /* Text to say hello */
                                               "greetings" = "Bienvenue sur Food Reporter !";



                                       • NSLocalizedString
                                           •   NSLocalizedString(@"greetings",@"Text to say hello")


                                       •   genstrings
                                           •   Outil de génération des fichiers .strings après analyse du code source




                                                                                   6
En pratique
Traduction par la méthode «standard»




                                       • Macro longue n’incitant pas à l’utiliser
                                       • XIB compliqué pour le traducteur
                                         •   N’a pas forcément Interface Builder (ou ne maîtrise pas l’outil)

                                         •   Préfère un simple fichier texte


                                       • genstrings peu pratique
                                         •   Ajout de texte au fur et à mesure des versions
                                         •   extraction et réinjection de chaînes dans les XIB (par ibtool) peu
                                             pratique


                                                                              7
Limitations de cette méthode
Traduction par la méthode «standard»




                                       • Duplication des XIB
                                        •   Maintenance et évolutions complexe
                                        •   Modifications à répercuter pour chaque langue
                                        •   Compliqué pour le traducteur


                                       • Un XIB unique ?
                                        •   Traduction des éléments un à un par code

                                        •   Nécessite d’avoir un IBOutlet sur chaque élément d’interface




                                                                           8
La traduction automatique
                                                    de votre interface
La traduction automatique de votre interface




                                               • Principe
                                               • Automatisation : éviter le glue code
                                               • Aller plus loin

                                                                     9
Principe
La traduction automatique de votre interface




                                               • Une méthode générique sachant traduire
                                                 chaque type d’élément de l’UI
                                               • Appeler à chaque chargement de XIB
                                               • Appeler sur tous les éléments du XIB

                                                                   10
Automatisation
La traduction automatique de votre interface




                                                But : appeler automatiquement la méthode
                                                                        awakeFromNib

                                               • Sous-classer et surcharger
                                                   • Pas pratique, et lourd à mettre en place
                                               •    Catégories
                                                   • Pas fait pour, et aucune garantie
                                               •    Method Swizzling

                                                                                    11
Automatisation
La traduction automatique de votre interface




                                                Method Swizzling : intervertir deux implémentations

                                                         [obj awakeFromNib];        awakeFromNib { ??? }

                                               Avant                                -(void)myAwakeFromNib {
                                                       [obj myAwakeFromNib];          [self autoL10n];
                                                                                      [self awakeFromNib];
                                                                                    }




                                                         [obj awakeFromNib];        awakeFromNib { ??? }

                                               Après
                                                                                    -(void)myAwakeFromNib {
                                                       [obj myAwakeFromNib];          [self autoL10n];
                                                                                      [self myAwakeFromNib];
                                                                                    }

                                                                               12
Automatisation
La traduction automatique de votre interface




                                               !   Method awakeFromNib = class_getInstanceMethod([NSObject class], @selector(awakeFromNib));
                                               !   Method localizeNibObject = class_getInstanceMethod([NSObject class], @selector(localizeNibObject));
                                               !   method_exchangeImplementations(awakeFromNib, localizeNibObject);



                                                                      Lorsqu’un objet recevera le message awakeFromNib,
                                                                      c’est sa méthode localizeNibObject qui sera exécutée

                                               #define LocalizeIfClass(Cls) if ([self isKindOfClass:[Cls class]]) localize##Cls((Cls*)self)
                                               -(void)localizeNibObject {
                                               ! LocalizeIfClass(UIBarButtonItem);
                                               ! else LocalizeIfClass(UIBarItem);
                                               ! else LocalizeIfClass(UIButton);
                                               ! else LocalizeIfClass(UILabel);
                                               ! else LocalizeIfClass(UINavigationItem);
                                               ! else LocalizeIfClass(UISearchBar);
                                               ! else LocalizeIfClass(UISegmentedControl);
                                               ! else LocalizeIfClass(UITextField);
                                               ! else LocalizeIfClass(UITextView);
                                               ! else LocalizeIfClass(UIViewController);
                                               !
                                               ! [self localizeNibObject]; // actually calls awakeFromNib as we did some method swizzling
                                               }


                                                      Cette méthode va appeler une méthode différente en fonction du type d’élément.

                                                                                                    13
Automatisation
La traduction automatique de votre interface




                                                              Il suffit de traduire chaque type d’objet. Par exemple pour un label:

                                               static inline void localizeUILabel(UILabel* lbl)
                                               { lbl.text = NSLocalizedString(lbl.text); }


                                                                        pour qu’un UILabel soit automatiquement traduit,
                                                             il suffira alors de lui mettre la clé de traduction dans son champ text.


                                                                            De la même manière, pour un UITextField:
                                               static inline void localizeUITextField(UITextField* tf)
                                               { tf.text = NSLocalizedString(tf.text);
                                                 tf.placeholder = NSLocalizedString(tf.placehoder); }



                                                    Si on veut qu’un élément ne soit pas traduit, on peut imaginer rajouter un caractère
                                                    précis devant le texte de cet élément, comme par exemple «$», et dans sa méthode
                                                          de localisation, ne le traduire que s’il ne commence pas par ce caractère.

                                                                                                    14
Aller plus loin
La traduction automatique de votre interface




                                               • Personnalisation possible du code
                                                • Vérifier les oublis de traduction
                                                • Gérer les exceptions (chaînes fictives)
                                                • Gérer les variantes singulier/pluriel
                                                 #define _T(x) NSLocalizedString((x),@"")
                                                 #define _Tf(x,...) [NSString stringWithFormat:_T(x),__VA_ARGS__]
                                                 #define _Tf_n(x,n,...) _Tf( (n<=1)?(x):(x"(+)") , n , ##__VA_ARGS__ )

                                                 NSString* s1 = _Tf_n(@"dish.comments.count",n);
                                                 NSString* s2 = _Tf_n(@"user.dishes.count",n,userName);

                                                 "dish.comments.count" = "%d commentaire";
                                                 "dish.comments.count(+)" = "%d commentaires";

                                                 "user.dishes.count" = "%2$@ a publié %$1d plat";
                                                 "user.dishes.count(+)" = "%2$@ a publié %$1d plats";


                                                                                           15
Les astuces
                                      Les pièges à éviter
Les astuces, les pièges à éviter




                                   • Impacts sur l’interface
                                   • Intégration avec un SI
                                   • Gérer l’ordre des paramètres
                                   • Penser au formattage des nombres
                                   • Suivi de version
                                                      16
Impacts sur l’interface
Les astuces, les pièges à éviter




                                   • Différentes tailles selon la langue
                                   • sizeToFit                                            Push
                                   • Images à taille variable
                                     •   stretchableImageWithLeftCapWidth:topCapHeight:


                                   • Tester !!
                                                                    17
Intégration avec un SI
Les astuces, les pièges à éviter




                                   • Applications utilisant un WebService
                                    • Envoyer la locale au WS
                                    • Utilisation de clés de localizable.strings
                                       dans le retour du WS
                                   • Filtrage de contenu selon la locale
                                                         18
Gérer l’ordre des
                                          paramètres
Les astuces, les pièges à éviter




                                   • 5 green apples
                                    •   NSLog(«%1$d %2$@ %3$@»,n,color,fruit)


                                   • 5 pommes vertes
                                    •   NSLog(«%1$d %3$@ %2$@»,n,color,fruit)




                                                            19
Formattage des
                                                    nombres
Les astuces, les pièges à éviter




                                   •   NSNumberFormatter
                                       •   séparateur de décimales, de milliers
                                       •   monnaie (currency)
                                   •   Utiliser les versions localisées des méthodes
                                       •   localizedStringWithFormat
                                       •   localizedDescription
                                       •   localizedScannerWithString
                                       •   ...


                                                                        20
Suivi de versions
Les astuces, les pièges à éviter




                                   •   Version «live» pendant votre développement

                                   •   Version livrée aux divers traducteurs

                                   •   Versions itératives

                                   •   Attention aux chaînes liées avec le SI

                                       •   Plusieurs versions de votre application en
                                           circulation


                                                               21
Conclusion
             • Traduction d’application se fait en plusieurs
                étapes
Conclusion




               • Internationalisation (i18n) : préparer les traduction (NSLocalizedString, ...)
               • Localisation (L10n) : effectuer les traductions (créer un .strings par locale)
               • Intégration d’une nouvelle langue pas si anodin
             • Méthodes pour faciliter la traduction de
                XIB
               • Evite de multiplier les XIB pour chaque langue
               • Facilite la communication avec vos traducteurs

                                                  22
Olivier Halligon
 olivier@foodreporter.net



          Code Source
http://github.com/AliSoftware




             23

Contenu connexe

En vedette

Will interactive storytelling return to the spotlight?
Will interactive storytelling return to the spotlight?Will interactive storytelling return to the spotlight?
Will interactive storytelling return to the spotlight?Gaëlle Engelberts
 
Terminology overview
Terminology overviewTerminology overview
Terminology overviewKStockwell
 
Terminology Management and Social Media in the Terminology Coordination Unit ...
Terminology Management and Social Media in the Terminology Coordination Unit ...Terminology Management and Social Media in the Terminology Coordination Unit ...
Terminology Management and Social Media in the Terminology Coordination Unit ...TERMCAT
 
Introduction aux webdocs interactifs
Introduction aux webdocs interactifsIntroduction aux webdocs interactifs
Introduction aux webdocs interactifsGaëlle Engelberts
 
4 concepts émergents en éducation : apprentissages nomades, mooc, biens commu...
4 concepts émergents en éducation : apprentissages nomades, mooc, biens commu...4 concepts émergents en éducation : apprentissages nomades, mooc, biens commu...
4 concepts émergents en éducation : apprentissages nomades, mooc, biens commu...Brigitte Pierrat
 
Open Education + MOOC = OPEN MOOC la juste équation
Open Education + MOOC = OPEN MOOC la juste équationOpen Education + MOOC = OPEN MOOC la juste équation
Open Education + MOOC = OPEN MOOC la juste équationSophie TOUZÉ
 
Lexique des-medias-sociaux
Lexique des-medias-sociauxLexique des-medias-sociaux
Lexique des-medias-sociauxMurielle Bruneau
 
Introduction to medical terminology
Introduction to medical terminology   Introduction to medical terminology
Introduction to medical terminology heartstartskills
 
Corpus comparables et traduction assistée par ordinateur, contributions à la ...
Corpus comparables et traduction assistée par ordinateur, contributions à la ...Corpus comparables et traduction assistée par ordinateur, contributions à la ...
Corpus comparables et traduction assistée par ordinateur, contributions à la ...Estelle Delpech
 
1393 Mangelndes Gottvertrauen .... Glaubensschwäche .... Vertrauen zu Gott ...
1393   Mangelndes Gottvertrauen .... Glaubensschwäche .... Vertrauen zu Gott ...1393   Mangelndes Gottvertrauen .... Glaubensschwäche .... Vertrauen zu Gott ...
1393 Mangelndes Gottvertrauen .... Glaubensschwäche .... Vertrauen zu Gott ...Marianne Zipf
 
Traduction Formation Emploi Hammamet
Traduction Formation Emploi HammametTraduction Formation Emploi Hammamet
Traduction Formation Emploi HammametJean-Marie Le Ray
 
Invited speaker, ATALA 2014 Ph. D. Thesis award
Invited speaker, ATALA 2014 Ph. D. Thesis awardInvited speaker, ATALA 2014 Ph. D. Thesis award
Invited speaker, ATALA 2014 Ph. D. Thesis awardEstelle Delpech
 
En attendant le Poisson de Babel
En attendant le Poisson de BabelEn attendant le Poisson de Babel
En attendant le Poisson de Babelsbooth
 
Livre Blanc: Traduction Automatique Gratuite sur Internet
Livre Blanc: Traduction Automatique Gratuite sur InternetLivre Blanc: Traduction Automatique Gratuite sur Internet
Livre Blanc: Traduction Automatique Gratuite sur InternetCGtraduction
 
La traduction (automatique) gratuite sur internet
La traduction (automatique) gratuite sur internetLa traduction (automatique) gratuite sur internet
La traduction (automatique) gratuite sur internetCGtraduction
 
Technologies de La Traduction
Technologies de La TraductionTechnologies de La Traduction
Technologies de La Traductionrashabenmalek
 

En vedette (17)

Will interactive storytelling return to the spotlight?
Will interactive storytelling return to the spotlight?Will interactive storytelling return to the spotlight?
Will interactive storytelling return to the spotlight?
 
Terminology overview
Terminology overviewTerminology overview
Terminology overview
 
Terminology Management and Social Media in the Terminology Coordination Unit ...
Terminology Management and Social Media in the Terminology Coordination Unit ...Terminology Management and Social Media in the Terminology Coordination Unit ...
Terminology Management and Social Media in the Terminology Coordination Unit ...
 
Introduction aux webdocs interactifs
Introduction aux webdocs interactifsIntroduction aux webdocs interactifs
Introduction aux webdocs interactifs
 
4 concepts émergents en éducation : apprentissages nomades, mooc, biens commu...
4 concepts émergents en éducation : apprentissages nomades, mooc, biens commu...4 concepts émergents en éducation : apprentissages nomades, mooc, biens commu...
4 concepts émergents en éducation : apprentissages nomades, mooc, biens commu...
 
Open Education + MOOC = OPEN MOOC la juste équation
Open Education + MOOC = OPEN MOOC la juste équationOpen Education + MOOC = OPEN MOOC la juste équation
Open Education + MOOC = OPEN MOOC la juste équation
 
Lexique des-medias-sociaux
Lexique des-medias-sociauxLexique des-medias-sociaux
Lexique des-medias-sociaux
 
Introduction to medical terminology
Introduction to medical terminology   Introduction to medical terminology
Introduction to medical terminology
 
Corpus comparables et traduction assistée par ordinateur, contributions à la ...
Corpus comparables et traduction assistée par ordinateur, contributions à la ...Corpus comparables et traduction assistée par ordinateur, contributions à la ...
Corpus comparables et traduction assistée par ordinateur, contributions à la ...
 
Fdi
FdiFdi
Fdi
 
1393 Mangelndes Gottvertrauen .... Glaubensschwäche .... Vertrauen zu Gott ...
1393   Mangelndes Gottvertrauen .... Glaubensschwäche .... Vertrauen zu Gott ...1393   Mangelndes Gottvertrauen .... Glaubensschwäche .... Vertrauen zu Gott ...
1393 Mangelndes Gottvertrauen .... Glaubensschwäche .... Vertrauen zu Gott ...
 
Traduction Formation Emploi Hammamet
Traduction Formation Emploi HammametTraduction Formation Emploi Hammamet
Traduction Formation Emploi Hammamet
 
Invited speaker, ATALA 2014 Ph. D. Thesis award
Invited speaker, ATALA 2014 Ph. D. Thesis awardInvited speaker, ATALA 2014 Ph. D. Thesis award
Invited speaker, ATALA 2014 Ph. D. Thesis award
 
En attendant le Poisson de Babel
En attendant le Poisson de BabelEn attendant le Poisson de Babel
En attendant le Poisson de Babel
 
Livre Blanc: Traduction Automatique Gratuite sur Internet
Livre Blanc: Traduction Automatique Gratuite sur InternetLivre Blanc: Traduction Automatique Gratuite sur Internet
Livre Blanc: Traduction Automatique Gratuite sur Internet
 
La traduction (automatique) gratuite sur internet
La traduction (automatique) gratuite sur internetLa traduction (automatique) gratuite sur internet
La traduction (automatique) gratuite sur internet
 
Technologies de La Traduction
Technologies de La TraductionTechnologies de La Traduction
Technologies de La Traduction
 

Similaire à CocoaHeads Rennes #1 : internationalisation

Alphorm.com Formation Le langage Ruby
Alphorm.com Formation Le langage RubyAlphorm.com Formation Le langage Ruby
Alphorm.com Formation Le langage RubyAlphorm
 
CocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeadsRNS
 
Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernancegdigugli
 
Alphorm.com Formation Java, les fondamentaux
Alphorm.com Formation Java, les fondamentaux Alphorm.com Formation Java, les fondamentaux
Alphorm.com Formation Java, les fondamentaux Alphorm
 
Trucs et astuces sur le dévelopment Android
Trucs et astuces sur le dévelopment AndroidTrucs et astuces sur le dévelopment Android
Trucs et astuces sur le dévelopment AndroidThierry-Dimitri Roy
 

Similaire à CocoaHeads Rennes #1 : internationalisation (8)

Alphorm.com Formation Le langage Ruby
Alphorm.com Formation Le langage RubyAlphorm.com Formation Le langage Ruby
Alphorm.com Formation Le langage Ruby
 
CocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & Android
 
GetText / Rails - FR
GetText / Rails - FRGetText / Rails - FR
GetText / Rails - FR
 
GetText / Rails
GetText / RailsGetText / Rails
GetText / Rails
 
Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernance
 
Alphorm.com Formation Java, les fondamentaux
Alphorm.com Formation Java, les fondamentaux Alphorm.com Formation Java, les fondamentaux
Alphorm.com Formation Java, les fondamentaux
 
Cours.langage c
Cours.langage cCours.langage c
Cours.langage c
 
Trucs et astuces sur le dévelopment Android
Trucs et astuces sur le dévelopment AndroidTrucs et astuces sur le dévelopment Android
Trucs et astuces sur le dévelopment Android
 

Plus de CocoaHeadsRNS

CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeadsRNS
 
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 CocoaHeads Rennes #14: iOS7 Controllers Transitions CocoaHeads Rennes #14: iOS7 Controllers Transitions
CocoaHeads Rennes #14: iOS7 Controllers TransitionsCocoaHeadsRNS
 
CocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeadsRNS
 
CocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeadsRNS
 
CocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeadsRNS
 
CocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeadsRNS
 
CocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeadsRNS
 
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeadsRNS
 
CocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeadsRNS
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeadsRNS
 
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeadsRNS
 
CocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeadsRNS
 
Cocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOSCocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOSCocoaHeadsRNS
 
CocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeadsRNS
 
CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeadsRNS
 
CocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeadsRNS
 
CocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeadsRNS
 

Plus de CocoaHeadsRNS (17)

CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubs
 
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 CocoaHeads Rennes #14: iOS7 Controllers Transitions CocoaHeads Rennes #14: iOS7 Controllers Transitions
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 
CocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par Celedev
 
CocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical Record
 
CocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPods
 
CocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock Objects
 
CocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : Notifications
 
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
 
CocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nuls
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6
 
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOS
 
CocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOS
 
Cocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOSCocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOS
 
CocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOS
 
CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4
 
CocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératif
 
CocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central Dispatch
 

CocoaHeads Rennes #1 : internationalisation

  • 1. Traduction des interfaces de vos applications Cocoa Olivier Halligon, avril 2011
  • 2. Sommaire • Introduction • Traduction par la méthode «standard» Sommaire • La traduction automatique de votre interface • Astuces, pièges à éviter • Conclusion 2
  • 3. Introduction • Présentation • Introduction Olivier Halligon • Food Reporter Food Reporter • Objectif • Base de la traduction • Traduction auto de XIB 3
  • 4. Traduction par la méthode «standard» Traduction par la méthode «standard» • Ressources localisées • Fichiers «strings» • Limitations de cette méthode 4
  • 5. Ressources localisées Traduction par la méthode «standard» • Un dossier «.lproj» par locale • Locale = langue + région (en_US, en_UK) • Dans le dossier .lproj • Images • XIB • Textes 5
  • 6. Fichiers «strings» Traduction par la méthode «standard» • Textes dans fichier «Localizable.strings» • /* Text to say hello */ "greetings" = "Welcome in Food Reporter!"; • /* Text to say hello */ "greetings" = "Bienvenue sur Food Reporter !"; • NSLocalizedString • NSLocalizedString(@"greetings",@"Text to say hello") • genstrings • Outil de génération des fichiers .strings après analyse du code source 6
  • 7. En pratique Traduction par la méthode «standard» • Macro longue n’incitant pas à l’utiliser • XIB compliqué pour le traducteur • N’a pas forcément Interface Builder (ou ne maîtrise pas l’outil) • Préfère un simple fichier texte • genstrings peu pratique • Ajout de texte au fur et à mesure des versions • extraction et réinjection de chaînes dans les XIB (par ibtool) peu pratique 7
  • 8. Limitations de cette méthode Traduction par la méthode «standard» • Duplication des XIB • Maintenance et évolutions complexe • Modifications à répercuter pour chaque langue • Compliqué pour le traducteur • Un XIB unique ? • Traduction des éléments un à un par code • Nécessite d’avoir un IBOutlet sur chaque élément d’interface 8
  • 9. La traduction automatique de votre interface La traduction automatique de votre interface • Principe • Automatisation : éviter le glue code • Aller plus loin 9
  • 10. Principe La traduction automatique de votre interface • Une méthode générique sachant traduire chaque type d’élément de l’UI • Appeler à chaque chargement de XIB • Appeler sur tous les éléments du XIB 10
  • 11. Automatisation La traduction automatique de votre interface But : appeler automatiquement la méthode awakeFromNib • Sous-classer et surcharger • Pas pratique, et lourd à mettre en place • Catégories • Pas fait pour, et aucune garantie • Method Swizzling 11
  • 12. Automatisation La traduction automatique de votre interface Method Swizzling : intervertir deux implémentations [obj awakeFromNib]; awakeFromNib { ??? } Avant -(void)myAwakeFromNib { [obj myAwakeFromNib]; [self autoL10n]; [self awakeFromNib]; } [obj awakeFromNib]; awakeFromNib { ??? } Après -(void)myAwakeFromNib { [obj myAwakeFromNib]; [self autoL10n]; [self myAwakeFromNib]; } 12
  • 13. Automatisation La traduction automatique de votre interface ! Method awakeFromNib = class_getInstanceMethod([NSObject class], @selector(awakeFromNib)); ! Method localizeNibObject = class_getInstanceMethod([NSObject class], @selector(localizeNibObject)); ! method_exchangeImplementations(awakeFromNib, localizeNibObject); Lorsqu’un objet recevera le message awakeFromNib, c’est sa méthode localizeNibObject qui sera exécutée #define LocalizeIfClass(Cls) if ([self isKindOfClass:[Cls class]]) localize##Cls((Cls*)self) -(void)localizeNibObject { ! LocalizeIfClass(UIBarButtonItem); ! else LocalizeIfClass(UIBarItem); ! else LocalizeIfClass(UIButton); ! else LocalizeIfClass(UILabel); ! else LocalizeIfClass(UINavigationItem); ! else LocalizeIfClass(UISearchBar); ! else LocalizeIfClass(UISegmentedControl); ! else LocalizeIfClass(UITextField); ! else LocalizeIfClass(UITextView); ! else LocalizeIfClass(UIViewController); ! ! [self localizeNibObject]; // actually calls awakeFromNib as we did some method swizzling } Cette méthode va appeler une méthode différente en fonction du type d’élément. 13
  • 14. Automatisation La traduction automatique de votre interface Il suffit de traduire chaque type d’objet. Par exemple pour un label: static inline void localizeUILabel(UILabel* lbl) { lbl.text = NSLocalizedString(lbl.text); } pour qu’un UILabel soit automatiquement traduit, il suffira alors de lui mettre la clé de traduction dans son champ text. De la même manière, pour un UITextField: static inline void localizeUITextField(UITextField* tf) { tf.text = NSLocalizedString(tf.text); tf.placeholder = NSLocalizedString(tf.placehoder); } Si on veut qu’un élément ne soit pas traduit, on peut imaginer rajouter un caractère précis devant le texte de cet élément, comme par exemple «$», et dans sa méthode de localisation, ne le traduire que s’il ne commence pas par ce caractère. 14
  • 15. Aller plus loin La traduction automatique de votre interface • Personnalisation possible du code • Vérifier les oublis de traduction • Gérer les exceptions (chaînes fictives) • Gérer les variantes singulier/pluriel #define _T(x) NSLocalizedString((x),@"") #define _Tf(x,...) [NSString stringWithFormat:_T(x),__VA_ARGS__] #define _Tf_n(x,n,...) _Tf( (n<=1)?(x):(x"(+)") , n , ##__VA_ARGS__ ) NSString* s1 = _Tf_n(@"dish.comments.count",n); NSString* s2 = _Tf_n(@"user.dishes.count",n,userName); "dish.comments.count" = "%d commentaire"; "dish.comments.count(+)" = "%d commentaires"; "user.dishes.count" = "%2$@ a publié %$1d plat"; "user.dishes.count(+)" = "%2$@ a publié %$1d plats"; 15
  • 16. Les astuces Les pièges à éviter Les astuces, les pièges à éviter • Impacts sur l’interface • Intégration avec un SI • Gérer l’ordre des paramètres • Penser au formattage des nombres • Suivi de version 16
  • 17. Impacts sur l’interface Les astuces, les pièges à éviter • Différentes tailles selon la langue • sizeToFit Push • Images à taille variable • stretchableImageWithLeftCapWidth:topCapHeight: • Tester !! 17
  • 18. Intégration avec un SI Les astuces, les pièges à éviter • Applications utilisant un WebService • Envoyer la locale au WS • Utilisation de clés de localizable.strings dans le retour du WS • Filtrage de contenu selon la locale 18
  • 19. Gérer l’ordre des paramètres Les astuces, les pièges à éviter • 5 green apples • NSLog(«%1$d %2$@ %3$@»,n,color,fruit) • 5 pommes vertes • NSLog(«%1$d %3$@ %2$@»,n,color,fruit) 19
  • 20. Formattage des nombres Les astuces, les pièges à éviter • NSNumberFormatter • séparateur de décimales, de milliers • monnaie (currency) • Utiliser les versions localisées des méthodes • localizedStringWithFormat • localizedDescription • localizedScannerWithString • ... 20
  • 21. Suivi de versions Les astuces, les pièges à éviter • Version «live» pendant votre développement • Version livrée aux divers traducteurs • Versions itératives • Attention aux chaînes liées avec le SI • Plusieurs versions de votre application en circulation 21
  • 22. Conclusion • Traduction d’application se fait en plusieurs étapes Conclusion • Internationalisation (i18n) : préparer les traduction (NSLocalizedString, ...) • Localisation (L10n) : effectuer les traductions (créer un .strings par locale) • Intégration d’une nouvelle langue pas si anodin • Méthodes pour faciliter la traduction de XIB • Evite de multiplier les XIB pour chaque langue • Facilite la communication avec vos traducteurs 22
  • 23. Olivier Halligon olivier@foodreporter.net Code Source http://github.com/AliSoftware 23