Traduction des interfacesde vos applications Cocoa                 Olivier Halligon, avril 2011
Sommaire           • Introduction           • Traduction par la méthode «standard»Sommaire           • La traduction autom...
Introduction               • Présentation                •Introduction                    Olivier Halligon                ...
Traduction par la                                        méthode «standard»Traduction par la méthode «standard»           ...
Ressources localiséesTraduction par la méthode «standard»                                       • Un dossier «.lproj» par ...
Fichiers «strings»Traduction par la méthode «standard»                                       • Textes dans fichier «Localiz...
En pratiqueTraduction par la méthode «standard»                                       • Macro longue n’incitant pas à l’ut...
Limitations de cette méthodeTraduction par la méthode «standard»                                       • Duplication des X...
La traduction automatique                                                    de votre interfaceLa traduction automatique d...
PrincipeLa traduction automatique de votre interface                                               • Une méthode générique...
AutomatisationLa traduction automatique de votre interface                                                But : appeler au...
AutomatisationLa traduction automatique de votre interface                                                Method Swizzling...
AutomatisationLa traduction automatique de votre interface                                               !   Method awakeF...
AutomatisationLa traduction automatique de votre interface                                                              Il...
Aller plus loinLa traduction automatique de votre interface                                               • Personnalisati...
Les astuces                                      Les pièges à éviterLes astuces, les pièges à éviter                      ...
Impacts sur l’interfaceLes astuces, les pièges à éviter                                   • Différentes tailles selon la l...
Intégration avec un SILes astuces, les pièges à éviter                                   • Applications utilisant un WebSe...
Gérer l’ordre des                                          paramètresLes astuces, les pièges à éviter                     ...
Formattage des                                                    nombresLes astuces, les pièges à éviter                 ...
Suivi de versionsLes astuces, les pièges à éviter                                   •   Version «live» pendant votre dével...
Conclusion             • Traduction d’application se fait en plusieurs                étapesConclusion               • Int...
Olivier Halligon olivier@foodreporter.net          Code Sourcehttp://github.com/AliSoftware             23
Prochain SlideShare
Chargement dans…5
×

CocoaHeads Rennes #1 : internationalisation

1 689 vues

Publié le

Slides de la présentation "Traduction automatique et intelligente d'applications Cocoa" de la session des CocoaHeads Rennais du 21 avril 2011. Présentation assurée par Olivier Halligon, créateur de Food Reporter.

Publié dans : Technologie
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 689
Sur SlideShare
0
Issues des intégrations
0
Intégrations
741
Actions
Partages
0
Téléchargements
11
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

CocoaHeads Rennes #1 : internationalisation

  1. 1. Traduction des interfacesde vos applications Cocoa Olivier Halligon, avril 2011
  2. 2. Sommaire • Introduction • Traduction par la méthode «standard»Sommaire • La traduction automatique de votre interface • Astuces, pièges à éviter • Conclusion 2
  3. 3. Introduction • Présentation •Introduction Olivier Halligon • Food Reporter Food Reporter • Objectif • Base de la traduction • Traduction auto de XIB 3
  4. 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. 5. Ressources localiséesTraduction 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. 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. 7. En pratiqueTraduction 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. 8. Limitations de cette méthodeTraduction 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. 9. La traduction automatique de votre interfaceLa traduction automatique de votre interface • Principe • Automatisation : éviter le glue code • Aller plus loin 9
  10. 10. PrincipeLa 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. 11. AutomatisationLa 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. 12. AutomatisationLa 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. 13. AutomatisationLa 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. 14. AutomatisationLa 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. 15. Aller plus loinLa 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. 16. Les astuces Les pièges à éviterLes 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. 17. Impacts sur l’interfaceLes astuces, les pièges à éviter • Différentes tailles selon la langue • sizeToFit Push • Images à taille variable • stretchableImageWithLeftCapWidth:topCapHeight: • Tester !! 17
  18. 18. Intégration avec un SILes 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. 19. Gérer l’ordre des paramètresLes 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. 20. Formattage des nombresLes 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. 21. Suivi de versionsLes 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. 22. Conclusion • Traduction d’application se fait en plusieurs étapesConclusion • 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. 23. Olivier Halligon olivier@foodreporter.net Code Sourcehttp://github.com/AliSoftware 23

×