genstrings et localisation
Math
Membre
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.
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.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 : 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 : 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.
Merci beaucoup. Ca marche nickel.
J'avoue ne pas comprendre pourquoi genstrings n'a pas une fonction de fusion. M'enfin.
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.
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.
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 !
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?
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