Est-il possible de mettre à jour les chaînes d'un storyboard localisé?

226

J'ai localisé une partie de mon application en créant un storyboard base.lproj et 3 fichiers de chaîne pour cela. C'était il y a un mois et après cela, j'ai ajouté un nouveau contrôleur de vue à l'application, mais les boutons et les étiquettes de ce contrôleur n'apparaissent pas dans les fichiers de chaîne

Est-il possible de mettre à jour ces 3 fichiers de chaîne joints au story-board ou je dois ajouter de nouvelles traductions de chaînes par programmation en utilisant NSLocalizableString et Localizable.strings?

GeLB
la source

Réponses:

264

Il y a deux options:

Option 1

Xcode peut «recharger» le fichier en le convertissant en un type de fichier [Story Builder Cocoa Touch Storyboard] ou un type de fichier [Localizable Strings] .

  1. Sélectionnez votre fichier de storyboard de base dans le Navigateur du projet
  2. Recherchez la section Localisation dans l'inspecteur de fichiers
  3. Si votre fichier est actuellement un [Localizable Strings], remplacez-le par [Interface Builder Cocoa Touch Storyboard] ou vice-versa.
  4. Xcode aurait dû convertir votre storyboard dans la version actuelle, tout en préservant vos anciens efforts de localisation. Ici, vous pouvez rétablir le type de fichier d'origine si vous le souhaitez.

Option 2

Utilisez ibtool pour extraire les chaînes de votre storyboard.

  1. Ouvrez l'application Terminal

  2. Localisez votre répertoire Base.lproj

  3. Utilisez cette ligne pour extraire les chaînes:

    ibtool MainStoryboard.storyboard --generate-strings-file file_name.strings

  4. Une fois qu'ibtool a extrait les chaînes dans file_name.strings, vous pouvez les copier et les coller dans votre fichier .strings d'origine

Visitez pour plus d'informations: https://conac.cc/business/columns/localization_guide_ios

Tha Leang
la source
1
J'ai essayé l'option 1, mais changer le type de fichier de [Localizable Strings] en [Interface Builder Cocoa Touch Storyboard] entraîne toujours un crash de Xcode 5.0.1. La raison pourrait être que - parce que je n'étais pas au courant des possibilités ci-dessus - j'ai édité les fichiers de localisation du storyboard à la main plus tôt.
Reinhard Männer
16
L'option 1 fonctionne. Mais vous devez passer de "Localisable .." à "interface ...", puis de nouveau!
João Nunes
3
L'option 1 ne fonctionne pas pour moi en utilisant XCode 6.0.1. Lorsque vous essayez de convertir mon fichier .strings en .interfacebuilder, XCode demande si les fichiers doivent être convertis. Les fichiers sont créés sur le système de fichiers, mais les fichiers de chaîne restent et contiennent les anciennes valeurs.
Bit rebondissant
53
Pour moi, l'option 1 a remplacé toutes les chaînes déjà traduites par des chaînes anglaises. J'ai dû ajouter une fois de plus la traduction.
Mihail Velikov
5
L'option 1 semble très instable dans Xcode 7. Parfois, cela fonctionne, parfois non. Parfois, il remplace à nouveau au hasard certaines de mes chaînes déjà traduites par des versions anglaises.
Adam Johns
76

Découvrez BartyCrouch , il résout parfaitement votre problème. Il est également open source , activement entretenu et peut être facilement installé et intégré dans votre projet.


Installez BartyCrouch via Homebrew :

brew install bartycrouch

Sinon, installez-le via Mint :

mint install Flinesoft/BartyCrouch

Mettez à jour progressivement vos fichiers Storyboards / XIBs Strings:

$ bartycrouch update

Cela fera exactement ce que vous cherchiez.


Afin de garder vos fichiers Storyboards / XIBs Strings mis à jour au fil du temps, je recommande fortement d'ajouter un script de build (instructions sur la façon d'ajouter un script de build ici ):

if which bartycrouch > /dev/null; then
    bartycrouch update -x
    bartycrouch lint -x
else
    echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch"
fi

En plus de mettre à jour progressivement vos fichiers Storyboards / XIBs Strings, cela vous assurera également que vos Localizable.stringsfichiers restent à jour avec les clés nouvellement ajoutées dans le code en utilisant NSLocalizedStringet affichent des avertissements pour les clés en double ou les valeurs vides.

Assurez-vous de vérifier BartyCrouch sur GitHub ou cet article détaillé pour plus d'informations.

Jeehut
la source
1
Hou la la! Cet outil est tout simplement incroyable. Cela nécessite plus de votes positifs!
ph1lb4
1
bel outil - plus de copier / coller manuel de nouveaux textes d'étiquette dans des fichiers * .strings (... et d'oublier la traduction de toute nouvelle étiquette comme avant) ... Merci beaucoup!
iKK
existe-t-il un module similaire pour les projets OBJC?
rickrvo
2
C'est la réponse que nous recherchons. Ce devrait être la réponse acceptée.
Juanjo
3
Je ne comprends pas pourquoi après 6 ans depuis que cette question est posée et cette solution inégale est toujours requise pour que cela fonctionne dans Xcode. Apple aurait dû y travailler.
huggie
57

Vous pouvez ajouter manuellement une clé dans votre fichier de localisation. Vous pouvez trouver l'objet clé en le sélectionnant dans l'éditeur de storyboard. Jetons un coup d'œil à Object-IDl'inspecteur d'identité. Il semble comme"nwc-b2-19c"

Sur votre mise à jour de localisation ou ajoutez une traduction. Par exemple :

"nwc-b2-19c.title" = "Translated title";
Sébastien REMY
la source
8
pense que c'est l'approche la moins risquée
Nicolas Manzini
Mais certains objets ne sont pas affichés dans le fichier .string. Parce qu'ils ne sont pas connectés. Alors, à ce moment-là, que puis-je faire?
Mihir Oza
existe-t-il un moyen de le sélectionner via un nom et pas seulement l'ID généré automatiquement?
cocoseis
Pour un UILabel, son: "YeB-ap-Wkw.text" = "Mon texte d'étiquettes";
ioopl
30

Celui-ci n'est pas pour tout le monde, mais il ne nécessite aucun outil supplémentaire dans le terminal et il est facile pour les petites modifications manuelles. (Ne tenez pas compte de cela lorsque vous souhaitez automatiser votre processus.)

Étape 0: configuration de la langue du storyboard

  • Base (avec textes anglais)
  • Anglais (le fichier de chaînes localisable n'existe pas car le fichier de base est anglais)
  • autres langues (fichiers de chaînes localisables)

configuration de base

Cette étape n'est effectuée qu'une seule fois.

Maintenant, quand j'ajoute quelque chose au storyboard, je fais ce qui suit

Étape 1: ajouter le fichier de chaînes localisables en anglais

Ajouter l'anglais

marquez simplement l'élément de campagne en anglais.

Cela crée un tout nouveau fichier de chaînes localisables en anglais avec toutes les lignes

Étape 2: copiez les nouveaux éléments de campagne dans les autres fichiers de langue

et les traduire

Étape 3: démarquez l'anglais, supprimez le fichier de chaînes localisables correspondant

le fichier n'était nécessaire que pour obtenir les nouveaux éléments de campagne

C'est un processus simple et rapide, tout se fait dans l'éditeur de storyboard

Éditer:

Ce processus fonctionne très bien avec de petits story-boards. Par exemple, j'ai un projet basé sur des onglets et j'ai un storyboard pour chaque onglet.

Recherchez «référence du storyboard» pour trouver des didacticiels.

Bon exemple: référence Storyboard dans Xcode, où devrions-nous l'utiliser?

Ainsi, chaque petit storyboard n'a que quelques chaînes à localiser.

Gerd Castan
la source
génial! Avez-vous également trouvé une idée sur la façon de supprimer les éléments supprimés?
Tobe
@Tobe Si vous divisez votre storyboard comme je le suggère ci-dessus, il est vraiment facile de repérer les chaînes qui ne sont plus utilisées.
Gerd Castan
15

Enfin, ma solution était (rudimentaire mais efficace) de copier les traductions précédentes et de les coller dans un nouveau fichier créé en décochant et en cochant la case Langue de localisation.

Cela serait utile dans certains cas comme le mien lorsque vous ne devez modifier qu'un ou deux textes.

jpl850
la source
Cela préserverait-il les identifiants et autres tout le temps? J'ai fait un test et cela a semblé fonctionner, mais cela pourrait être un désastre si l'identifiant changeait.
ullstrm
Je pense que oui, je l'ai fait plusieurs fois sans aucun problème.
jpl850
1
Les ID sont attribués lorsque vous avez supprimé les éléments de l'interface utilisateur. Ils sont indépendants de la localisation car ils sont affectés par le storyboard. Il n'y aura donc aucun effet sur les identifiants.
iBug
Merci iBug pour l'explication =)
jpl850
14

Je pense que la meilleure façon est d'utiliser les localisations d'exportation / importation intégrées:

  1. Dans Project Navigator, choisissez votre dossier de projet
  2. Choisissez Éditeur> Exporter pour la localisation,
  3. Toutes les traductions laissées à leur place et XCode ajoutent automatiquement les chaînes manquées. De plus, avant l'importation, vous pouvez modifier .xliff dans XLIFF Editor (par exemple, en ligne - http://xliff.brightec.co.uk ) et vous n'avez pas besoin de le faire dans XCode.
  4. puis Editeur> Importer les localisations et choisissez le fichier .xliff enregistré.

PS Si vous ne souhaitez pas modifier dans XLIFF Editor et que vous avez ignoré l'étape 3, XCode ne peut pas enregistrer de nouvelles chaînes. Dans ce cas, ouvrez .xliff dans XLIFF Editor, ré-enregistrez sans modifications et importez un nouveau fichier.

Igor
la source
1
+1 Manière simple et appropriée de travailler avec la localisation. De plus, c'est la manière préférée d'être Apple
Jurasic
1
En utilisant Xcode 7.3.1, dans un exemple de projet déjà localisé, j'ai changé une étiquette (de "un texte" à "un texte de base") et j'ai ajouté une nouvelle étiquette. J'ai exporté pour la localisation, j'ai touché le fichier .xliff (sans changement) et l'ai à nouveau importé. Dans le fichier Main.strings, la ligne de commentaire de l'étiquette modifiée a été mise à jour /* Class = "UILabel"; text = "a basic text"; ObjectID = "HFW-aN-MTb"; */, mais la nouvelle étiquette n'est PAS créée dans le fichier Main.strings. J'ai ensuite édité le fichier .xliff pour ajouter une traduction pour la nouvelle étiquette. Je l'ai importé à nouveau. La nouvelle étiquette est maintenant insérée dans le fichier Main.strings.
duthen
+1 mais il y a un bug que j'ai découvert. Lors de l'ajout de nouveaux éléments, ils ne sont pas dans un fichier exporté (comme le dit duthen). Mais quand je fais une exportation juste après (sans modification du storyboard), tous les éléments ajoutés sont, étonnamment, inclus. Faites donc une exportation deux fois. Le second comprendra tous les nouveaux éléments. Merci Apple!
Viktor Kucera
6

Lorsque vous cliquez dans votre storyboard, Main.storyboard par exemple ... Sur le côté droit, vous pouvez voir le menu de localisation (voir l'image ci-jointe). Si vous décochez et revérifiez une langue, le fichier sera à nouveau généré. Donc, je copie généralement le contenu, je génère à nouveau le fichier, puis je colle le contenu que j'ai copié et déjà traduit.

C'est la façon dont j'utilise pour mettre à jour le dictionnaire.

entrez la description de l'image ici

J. Fdez
la source
Avec Xcode 10, si vous utilisez git, il met en évidence les différences!
Ricardo Ruiz Romero
Oui, c'est possible ... maintenant mon fichier est plus gros qu'à cette date et je le fusionne avec la version du référentiel après l'avoir à nouveau généré.
J.Fdez
5

J'ai un énorme storyboard avec beaucoup de cordes là-bas. Deux langues basent l'anglais et un autre arabe. La tâche consistait à ajouter des champs et des étiquettes au storyboard et à ajouter leur localisation sans aucun script ni NSLocalizableStrings.

Pour moi, aidé ensuite:

Premièrement : assurez-vous que vous disposez de git pour éviter des changements inattendus.

  1. Accédez à l'écran cible dans xcode et appuyez sur Editor-> Export For Localization.... Enregistrez l' ar.xliff fichier quelque part.
  2. Télécharger XLIFF Edtior .
  3. Ouvrez le fichier ar.xliff et apportez des modifications.
  4. Importez ce fichier dans xcode. Terminé! Vous avez mis à jour le fichier de chaînes de storyboard.
Nik Kov
la source
Pour que cela fonctionne, sélectionnez d'abord le projet ou la cible dans l'éditeur de projet Xcode.
Chuck Boris
4

Il existe une application, un outil en ligne de commande d'Apple nommé AppleGlot, qui prend en charge la localisation incrémentielle. Je ne l'ai pas encore essayé, mais il ressemble exactement à l'outil que vous avez recherché (il y a quelque temps).

tilo
la source
L' appleglotoutil fonctionne avec les ensembles d'applications finaux. Il s'agit d'une approche complètement différente pour les applications de traduction.
Flovdis
1
Quelque chose ne va pas avec une "approche différente", ou qu'est-ce qui cause le downvote?
tilo
Besoin de rechercher AppleGlot dans ce lien maintenant.
NSDeveloper
4

Voici un script pour extraire des chaînes de storyboards et xibs, et les fusionner avec les traductions existantes.

Pour exécuter le script automatiquement lorsque vous générez un projet, placez-le dans le répertoire racine de votre projet et ajoutez une phase Exécuter le script avec la ligne suivante à une phase de génération cible dans les paramètres de votre projet.

./mergegenstrings.py PathToSourceDir

Ou vous pouvez exécuter le script sur Terminal manuellement lorsque vous le souhaitez.

Le script s'exécute ibtoolcomme Tha Leang a répondu. Il s'exécute également genstringspour extraire et fusionner les chaînes marquées d'un NSLocalizedStringdans votre code source. Le script est basé sur un script de cet article , qui fusionne les chaînes après l'exécution genstrings.

Yoichi Tagaya
la source
pouvez-vous fournir plus d'informations sur la façon de l'utiliser?
user023
1
J'ai ajouté un commentaire à l'essentiel. J'espère que ça aide. gist.github.com/yoichitgy/29bdd71c3556c2055cc0
Yoichi Tagaya
Merci, fonctionne parfaitement pour moi. Si quelqu'un a des problèmes avec les autorisations, cela pourrait être utile: stackoverflow.com/questions/9850936/…
iCode
Ce script fonctionne très bien pour les fichiers de storyboard Main.strings, mais semble écraser mes traductions Localizable.strings dans Xcode 7.
Adam Johns
3

L'approche la plus simple et la moins risquée consiste à copier simplement l'ID d'objet à partir du storyboard et à ajouter une nouvelle clé pour la clé dans le fichier localisé comme dans l'exemple ci-dessous:

1: Copiez l'ID d'objet comme ci-dessous à partir du storyboard pour le composant:

entrez la description de l'image ici

2: Ajoutez une nouvelle clé dans un fichier localisé comme ci-dessous:

"DjF-dn-0ay.text" = "Borrar datos y restablecer";

Remarque: Cette approche est très moins risquée si vous souhaitez mettre à jour seulement quelques composants, sinon vous pouvez recréer un fichier localisé pour le storyboard.

Alok
la source
Merci pour votre réponse!!!!!. J'ai une question à poser, dans mes projets, je n'ai pas créé de sortie pour certains labels, boutons ... Si j'utilise objectID pour ces boutons et labels est-ce suffisant?
Harikarthick K
3

Xlifftool est disponible en tant qu'application Mac et fonctionne bien. Il montre toutes les chaînes et objets traduisibles de info.plist, les chaînes localisables et le storyboard.

Téléchargez-le ici pour le mac: https://itunes.apple.com/lv/app/xlifftool/id1074282695?mt=12

Étape 1: dans Xcode, sélectionnez votre dossier de projet dans le navigateur de projet. Sélectionnez ensuite Editeur / Exporter pour la localisation ...

Vos chaînes traduisibles seront incluses dans un fichier xliff sous la langue que vous avez sélectionnée pour la localisation dans Xcode.

Étape 2: Ouvrez ce fichier avec xlifftool et traduisez ou mettez à jour vos traductions qui ont été faites précédemment.

Étape 3: Ensuite, téléchargez à nouveau dans votre projet avec l'éditeur / Importer les localisations ...

TM Lynch
la source
Une autre alternative pour macOS est Loca Studio . Semblable à Xlifftool, l'application peut ouvrir le résultat de l'éditeur d'action Xcode -> Exporter pour la localisation. Il dispose de fonctionnalités de filtrage et de recherche plus avancées, ainsi que de vérifications automatiques de l'assurance qualité. (divulgation complète: je suis le développeur principal).
guru_meditator
0

Ceci est mon moyen facile de mettre à jour le nouveau texte du storyboard ou xib vers la chaîne de localisation

1- utilisez ce script http://tredje.se/dev/trouble/?x=entry:entry150917-204052

2- Sélectionnez votre chaîne de localisation que vous souhaitez mettre à jour et passez votre chaîne de langue de "Chaîne de localisation" à "Storyboard de générateur d'interface"

3- Remettez-le en place :)

Terminé.

entrez la description de l'image ici

Fadi Abuzant
la source
Il modifie le fichier en Storyboard du générateur d'interface, mais encore une fois après 1 ou 2 secondes, il le rétablit en chaînes localisables et aucun ajout aux chaînes localisables pour le nouveau texte d'affichage
Mujahid Latif
@MujahidLatif J'utilise ce pod en ce moment, il est vraiment utile pour moi et il peut mettre à jour les localisations du storyboard et Localization.String comme le fera github.com/Flinesoft/BartyCrouch
Fadi Abuzant
0

Option 1
Xcode peut «recharger» le fichier en le convertissant en un [Interface Builder Cocoa Touch Storyboard]type de fichier ou un [Localizable Strings]type de fichier.

Sélectionnez votre fichier de storyboard de base dans le Navigateur du projet Recherchez la section Localisation dans l' inspecteur de fichiers . Si votre fichier est actuellement un [Localizable Strings], remplacez-le par [Interface Builder Cocoa Touch Storyboard]ou vice versa.
Xcode aurait dû convertir votre storyboard dans la version actuelle, tout en préservant vos anciens efforts de localisation. Ici, vous pouvez rétablir le type de fichier d'origine si vous le souhaitez.

Option 2
Utilisez ibtoolpour extraire les chaînes de votre storyboard.

Ouvrez l'application Terminal
Recherchez votre Base.lprojrépertoire
Utilisez cette ligne pour extraire les chaînes:

ibtool MainStoryboard.storyboard --generate-strings-file file_name.strings

Une fois qu'ibtool a extrait les chaînes dans file_name.strings, vous pouvez les copier et les coller dans votre .stringsfichier d' origine .

Amplework Software Pvt. Ltd.
la source