genstrings et localisation

MathMath Membre
22:51 modifié dans API AppKit #1
Bonjour à  tous  :),

J'ai découvert récemment l'outil genstrings qui permet de générer automatiquement les fichiers .strings à  partir des .m. C'est très très pratique mais le problème est que si je génère une fois les .strings, que j'effectue les différentes traductions, que je rajoute du code dans mon appli et que je génère à  nouveau les fichiers de localistion je perd mes traductions...

genstrings ne fait apparement pas de fusion des fichiers, est-ce normal ?

Y a bien l'option -a mais c'est pas tellement une solution. Dans le man il est écrit : "Allows the output to be appended to the old output files. However, -a causes the results to be appended to the end of the old file and not merged." donc si -a ne 'merge' pas, sans -a ça devrait le faire ?

Mat.

Réponses

  • AliGatorAliGator Membre, Modérateur
    22:51 modifié #2
    J'ai déjà  utilisé genstrings et voilà  les 2 solutions que je te propose, avec une nette préférence pour la 2e :

    1. Découper son fichier .strings en plusieurs fichiers séparés, en utilisant NSLocalizedStringFromTable et non pas simplement NSLocalizedString.
    Quand on a plein de nouvelles chaines à  rajouter, au moment de coder on dit que ces nouvelles chaines sont dans une autre table. Comme ça genstrings génère ces nouvelles chaines dans un fichier .strings séparé.
    --> Mais cela oblige à  chaque modification de version de mettre ses NSLocalizedStringFromTable avec un nom de table différent, et au bout de 15 évolutions ça commence à  faire beaucoup.

    2. Utiliser diff pour récupérer uniquement les lignes ajoutées entre l'ancienne et la nouvelle version. Après quelques essais et lectures de pages man, voilà  la commande magique que j'utilise :
    diff -a --suppress-common-lines -n Localizable.strings.old Localizable.strings | sed /^a/d
    
    Cette commande a pour effet de lister les différences entre l'ancien (Localizable.strings.old) et le nouveau (Localizable.strings) fichier strings, en supprimant les lignes communes (donc ne gardant que les ajouts et suppressions), le "-n" étant là  pour choisir un format de sortie qui nous arrange (concis). Le pipe avec la commande sed a pour simple objectif de supprimer toutes les lignes commençant par un "a", qui sont les lignes mises par diff pour indiquer que c'est un ajout.

    Cette commande magique va donc te sortir uniquement les ajouts entre l'ancien et le nouveau fichier. + des lignes du genre "d10 2" si tu as des chaines qui ont été supprimées entre l'ancienne et la nouvelle version (en l'occurence ici : 2 lignes à  partir de la ligne 10).

    Conclusion, tu peux te faire un petit script shell du genre :
    #!/bin/sh<br /><br />mv Localizable.string Localizable.strings.old<br />genstrings *.m<br />diff -a --suppress-common-lines -n Localizable.strings.old Localizable.strings | sed /^a/d &gt;Localizable.strings.new
    
    La première commande renomme l'ancien Localizable.strings en Localizable.strings.old pour la mettre de côté, la 2e commande génère un nouveau Localizable.strings, la dernière te liste uniquement les nouveautés (ajouts entre ancienne et nouvelle version en comparant les fichiers) dans le fichier Localizable.strings.new. Tu n'a plus qu'à  traduire juste ces chaines dans le localizable.strings.new ! (et tu peux ensuite copier-coller ces chaines à  la fin du Localizable.strings.old, pour avoir ta nouvelle version).

    J'admet que c'est pas très pratique, mais vu que de toute façons une fois le .strings généré il faut l'éditer pour justement taper ces traductions, c'est toujours mieux que rien.
  • MathMath Membre
    22:51 modifié #3
    Cool 

    Merci beaucoup. Ca marche nickel.

    J'avoue ne pas comprendre pourquoi genstrings n'a pas une fonction de fusion. M'enfin.



  • AliGatorAliGator Membre, Modérateur
    22:51 modifié #4
    Oui enfin c'est aussi ce que je te disais : de toutes façons une fois que tu as généré ton fichier strings, il te faut l'ouvrir pour le modifier, pour justement traduire les chaà®nes dans les différentes langues.

    Alors bon s'il proposait une fusion par exemple ne rajouter au fichier que les chaines qui n'y sont pas encore, ben il faudrait ensuite que tu cherches dans ton fichier quelles sont les chaines que tu as traduites et quelles sont celles pour lesquelles tu dois te taper la traduction.

    Alors qu'avec ma solution, tu as dans un fichier uniquement les chaines dont il te reste la traduction à  faire parce qu'elles sont nouvelles. Et ce n'est qu'après cette étape où il t'a généré un fichier avec uniquement les chaines nouvelles et que tu les as traduites que la fusion est nécessaire... mais du coup elle se résume à  un simple copier-coller ;)

    Par contre ils auraient pu en effet faire en sorte, à  défaut de "merge"/fusion, d'intégrer dans genstrings cette possibilité de générer dans un fichier à  part uniquement les chaines qui manquent. Au lieu de devoir utiliser diff ensuite. M'enfin bon.
  • GreensourceGreensource Membre
    juillet 2009 modifié #5
    Super, c'est pile poil ce que je cherchais!
    Mais on est d'accord, ton script c'est un exemple, les ressources .strings doivent ce trouver à  la racine du projet dans un .lproj?

    [edit] Tu ne connaà®trais pas une façon de viré les lignes avec les "d10 2" de ton exemple? Parce que sans ça, il suffirais de coller en fin du fichier .old le fichier .new Et ensuite de faire un renommage.
  • AliGatorAliGator Membre, Modérateur
    22:51 modifié #6
    Comme dit plus haut les lignes genre "d10 2" sont introduites par diff.
    On peut les jarter avec une commande "sed" sur le même principe que j'ai utilisé ce dernier pour jarter les lignes commençant par "a", pourquoi pas.

    Mais l'idéal c'est de garder cette information de côté et d'en tenir compte. C'est à  dire de supprimer les lignes correspondantes de ton fichiers Localizable.strings final, quand tu fais la fusion : tu supprimes les lignes mentionnées avec un "dX Y" puisqu'elles ont été supprimées entre la version old et la new, et tu copies/colles les autres lignes (mentionnées par une lignes "aX" avant, sauf que ces lignes "aX" je les ai justement masquées via la commande sed)

    Après, la solution n'est pas parfaite...

    Cependant depuis j'ai aussi apris à  utiliser FileMerge en ligne de commande (voir l'Aide Apple dans le menu Aide de l'application FileMerge, y'a un topic dessus), ce qui permet plutôt que d'utiliser "diff" et d'avoir une version texte d'utiliser FileMerge et donc un outil graphique pour faire la fusion entre le old et le new... Et c'est quand même bien plus convivial !
  • GreensourceGreensource Membre
    22:51 modifié #7
    En effet FileMerge peut grandement aidé. Je vais sûrement faire comme cela.

    Ce que je voulais dire, c'est que dans le fichier .new, toutes les lignes qui contient une key déjà  présente dans le .old ne servent à  rien. Mais elles empêche de concaténer les deux fichiers. J'ai l'impression qu'on s'était mal compris non?

    Avec sed, on peut dire de supprimer la ligne en dessous de tel ou tel symbole?
  • AliGatorAliGator Membre, Modérateur
    22:51 modifié #8
    Oui on peut, il suffit d'ajouter la ligne suivante au "pattern space" (= ligne ligne en cours de test et qui correspond à  la regex mise avant) avant d'exécuter la commande "d" (qui supprime le pattern space).
    Donc au lieu de juste mettre la commande "d", faut mettre "N" (qui ajoute la next line au pattern space) avant "d". Et mettre des accolades du coup puisqu'il y a plusieurs commandes.

    Enfin bon faudrait que je me replonge dedans, là  c'est pas trop ma priorité ce soir :P
Connectez-vous ou Inscrivez-vous pour répondre.