Des astuces à  la localization

Bonjour à  tous,

c'est un sujet sûrement déjà  évoqué, mais dont je n'arrive pas à  retrouver la trace via la recherche.
Je me pose des questions quant aux principes de localizations d'applications.
Pour l'instant je suis parti sur un fichier que j'ai toujours appelé "DEFINES.h".. il y est bourré de #define en tout genre, (notamment pour les clés de préférences).

J'hésite cependant à  y placer aussi la localization. Comme par exemple:
<br />#define ALERT_QTSTREAMINGERROR_TITLE			NSLocalizedString(@&quot;Streaming Error&quot;, @&quot;Alert title for a possible streaming error from QuickTime&quot;);<br />


Seulement, à  la longue j'ai peur que ça devienne assez monstrueux.
Il semblerait qu'Apple utilise une autre technique qui serait de directement placer NSLocalizedString() un peu partout dans son code comme par exemple

<br />[myButton setTitle:NSLocalizedString(@&quot;MYBUTTON_SOMETHING_TITLE&quot;, @&quot;Description..&quot;)];<br />


Ainsi le localizable.strings donnerait:

/* Description.. */
"MYBUTTON_SOMETHING_TITLE" = "Traduction ici";




Quelle solution utiliseriez-vous?

Réponses

  • tabliertablier Membre
    novembre 2010 modifié #2
    Je ne comprends pas ton problème de localisation! Apple à  prévue à  peu près tout le nécessaire pour faire cela. Et il existe des logiciels qui en tiennent compte comme "Localise" ou également "iLocalize".
    En gros, et par langue de localisation 1 dossier "laLangue.lproj" qui contient: des fichiers nib et/ou des fichier .strings. dans la langue "laLangue"
    Au chargement de l'application le fichier nib chargé est celui de la langue actuelle indiquée dans les préférences système. Pour les phrases hors nib il existe les méthodes du genre "NSLocalizedStringFromTable(..)" qui vont chercher dans les bons fichiers .strings.

    Eventuellement tu télécharges mon vieux tutoriel "Cacao" dans lequel il y a un exemple Français + Anglais. Sinon tu cherches des exemples sur le web il devrait y en avoir.

    Et à  la fin, il reste un vrai problème: Il faut traduire correctement les phrases dans une langue étrangère, sans faire de contre-sens ou d'erreur. Et ça ce n'est pas de la tarte!!

    NB: Tu trouveras la vieille version de Localise en faisant une recherche avec "Utilitaire de localisation"
  • 23:39 modifié #3
    Je connais le principe de fonctionnement je te rassure.
    Mon seul soucis c'est de savoir comment procéder à  la mise en place dans le code. Je sais très bien créer un Localizable.strings, le localizer en différentes langues. Le seul "problème" auquel je me heurte c'est à  l'utilisation de NSLocalizedString().

    Comme je l'ai expliqué à  mon premier post, je me demande quelle solution serait la mieux. Faudrait-il utiliser des #define ou directement mettre NSLocalizedString(@SOMETHING,@description) à  chaque fois que j'en ai besoin.

    Exemple concret, j'ai des boutons sur différentes interfaces qui auront probablement le même titre "Download".
    La question est, faut-il que je rajoute #define LOC_BUTTON_ACTION_DOWNLOAD NSLocalizedString(@Download, @Title for the download button) dans mon "DEFINES.h" et donc par la suite de retrouver "Download" = "Download"; dans le localizable.strings.
    Ainsi, il me suffirait de faire [myButton setTitle:LOC_BUTTON_ACTION_DOWNLOAD];.
    L'autre solution consisterait à  faire [myButton setTitle:NSLocalizedString(@DOWNLOAD_ACTION_TITLE, @Description here)]; et cette fois le Localizable.strings aurait "DOWNLOAD_ACTION_TITLE" = @Download;

    Je sais pas si c'est clair...
  • AliGatorAliGator Membre, Modérateur
    novembre 2010 modifié #4
    Moi ce que je suis le plus en plus tenté de faire avec mes projets c'est ça
    #define _T(x) NSLocalizedString(@#x,@&quot;&quot;)
    

    [myBytton setTitle:_T(LOC_BUTTON_ACTION_DOWNLOAD)];
    

    &quot;LOC_BUTTON_ACTION_DOWNLOAD&quot; = &quot;Download&quot;;
    


    Comme ça j'utilise NSLocalizedString mais avec une version courte T(x) sans mettre les guillemets ni les descriptions etc, plus concis.
  • tabliertablier Membre
    novembre 2010 modifié #5
    Si, c'est plus clair! Tu veux savoir comment généralement font les programmeurs en espérant que la méthode la plus utilisée sera la plus pratique.
    Je dirais qu'il n'y a pas de méthode universellement reconnue.
    Pour ma part, je sépare les phrases en deux types: celles à  localiser et les autres. Ce qui me donne deux fichiers .strings nommés avecLoc.strings et sansLoc.strings. Puis j'écris dans une catégorie de NSApplication, deux méthodes appelées avecLoc et sansLoc. exemple de sansLoc:
    - (NSString *)sansLoc:(NSString *)laKlef
    { if (laKlef== nil) return @";" ;
    if ([laKlef length] == 0) return @";" ;
    return  NSLocalizedStringFromTable(laKlef, @sansLoc, nil) ;
    }
    A noter que sansLoc.strings est sans localisation.
    L'appel se fait alors de la même manière dans tout les objets: [NSApp sansLoc:@maclef], ou [NSApp avecLoc:@autreclef]
    Je n'utilise les #define que si l'appel est fait un grand nombre de fois.
    #define noLoc(A) [NSApp sansLoc:A]
    #define wzLoc(A) [NSApp avecLoc:A]
    et si l'appel fait toujours référence à  la même clef j'utilise un #define spécifique:
    #define  laHauteur  [NSApp avecLoc:@laHauteur]

    Probablement que cette méthode ne convient pas à  tout le monde et elle est probablement inadaptée pour certain projet.
  • AliGatorAliGator Membre, Modérateur
    23:39 modifié #6
    Ce que je fais aussi (je publierai le code un de ces 4 quand j'aurais 2mn) c'est que j'ai un code qui me localise automatiquement tous les XIB lorsqu'ils se désarchivent, sans avoir aucune ligne de code à  mettre pour demander la localisation
    (ça se fait tout seul à  partir du moment où vous incluez mon fichier AutoXibL10n.m dans le projet, donc aucune ligne à  rajouter dans votre code c'est top :D)
  • 23:39 modifié #7
    Intéressant!
    ça évite effectivement de réécrire NSLocalizedString.... à  chaque fois.. Je vais opter pour ça je pense :)
    Merci à  vous
  • muqaddarmuqaddar Administrateur
    23:39 modifié #8
    dans 1290255616:

    Ce que je fais aussi (je publierai le code un de ces 4 quand j'aurais 2mn) c'est que j'ai un code qui me localise automatiquement tous les XIB lorsqu'ils se désarchivent, sans avoir aucune ligne de code à  mettre pour demander la localisation
    (ça se fait tout seul à  partir du moment où vous incluez mon fichier AutoXibL10n.m dans le projet, donc aucune ligne à  rajouter dans votre code c'est top :D)


    Ah bein oui...

    Comme j'aime pas multiplier les XIB pour la localisation, je mets des outlets même sur les intitulés de champs de labels pour pouvoir utiliser NSLocalizedString. Mais ça fait + de code, mais moins de Xibs...

    Sinon, je mets directement le texte en anglais dans le NSLocalizedString : la vraie clé c'est le texte en anglais. Je n'ai pas besoin de traduire mes strings dans les fichiers anglais... Et si il y a un oubli de strings dans un .strings, au pire, c'est le texte en anglais qui s'affiche, et pas le nom de la clé... qui peut ne vouloir rien dire ?



  • tabliertablier Membre
    23:39 modifié #9
    Sinon, je mets directement le texte en anglais dans le NSLocalizedString : la vraie clé c'est le texte en anglais.
    C'est une bonne solution, encore faux-t-il avoir un anglais correct, sinon parfait! ce n'est pas mon cas et vu les traductions que me fait Paul mon ami anglais, ce n'est pas demain que ça changera!
    Comme j'aime pas multiplier les XIB pour la localisation, je mets des outlets même sur les intitulés de champs de labels
    ça m'arrive aussi, mais c'est parfois un peu longuet!!
    Ce que je fais aussi (je publierai le code un de ces 4 quand j'aurais 2mn) c'est que j'ai un code qui me localise automatiquement tous les XIB lorsqu'ils se désarchivent, sans avoir aucune ligne de code à  mettre pour demander la localisation
    ça parait intéressant. si je comprends bien, une seule série de nib/xib et les phrases sont prises dans les fichiers .strings. Est-ce que ça marche également si on change la langue par défaut et que l'on relance l'application sans fermer-réouvrir la session?

  • AliGatorAliGator Membre, Modérateur
    23:39 modifié #10
    Alors mon code aujourd'hui je ne l'ai testé que pour iPhone, pas encore pour OSX.
    J'avais également contacté Guillaume Cerquant qui avais commencé le même principe pour mettre en commun nos idées, et faire un truc propre, et qui marche aussi avec les objets Cocoa/OSX et pas que CocoaTouch/iOS... mais on a juste pas eu le temps de le faire

    Mais oui le principe c'est qu'on met la chaà®ne que l'on veut dans le XIB (dans les texts des labels, dans les titres des boutons, tout ça) et quand le XIB est chargé, il passe automatiquement tous ces textes à  la moulinette NSLocalizedString (comme si on avait fait un IBOutlet monLabel vers un UILabel, et qu'on faisait par code [tt]monLabel.text = NSLocalizedString(monLabel.text,@";");[/tt] sauf que là  on a pas besoin d'avoir des IBOutlets pour tous les éléments)

    Y'a un seul petit problème à  ce jour avec ce code c'est qu'il n'est pas exécuté dans le simulateur iPhone/iPad (je sais pas pourquoi, la méthode awakeFromNib qui fait tout le boulot magique toute seule, elle n'est pas appelée dans le contexte du simulateur, étrange) donc dans le simu on voit les textes non traduits, mais sur le device aucun souci ça marche direct tout seul...

    Bref c'est encore en tests (même si je l'utilise en prod dans l'appli qu'on fait) mais du coup on a gagné du temps pour la i18n !
  • SmySmy Membre
    23:39 modifié #11
    dans 1290255296:

    Moi ce que je suis le plus en plus tenté de faire avec mes projets c'est ça
    #define _T(x) NSLocalizedString(@#x,@&quot;&quot;)
    



    Très bonne idée, je vais m'en inspirer !

    dans 1290257623:

    Comme j'aime pas multiplier les XIB pour la localisation, je mets des outlets même sur les intitulés de champs de labels pour pouvoir utiliser NSLocalizedString. Mais ça fait + de code, mais moins de Xibs...


    Je fais la même chose, je trouve ça plus clair.

    dans 1290257623:

    Sinon, je mets directement le texte en anglais dans le NSLocalizedString : la vraie clé c'est le texte en anglais.


    Je faisais ça sur mon premier projet, mais ce n'est pas très propre et surtout source de bugs quand tu travailles sur les versions suivantes qui nécessitent des modifications de textes...
Connectez-vous ou Inscrivez-vous pour répondre.