Gianni Costanzi
Gianni Costanzi

Reputation: 6104

How to sync localized storyboards' strings after modifying storyboard in Xcode 5

I'm just starting to look at IOS Apps' localization in XCode 5 and I've tried to add an Italian Localization: Adding Italian Localization

Xcode 5 automatically generates the Main.strings file with a single entry, for the only label I've put within the Main.storyboard file:

/* Class = "IBUILabel"; text = "Label"; ObjectID = "PeT-4z-NSf"; */
"PeT-4z-NSf.text" = "Etichetta";

XCode 5 generated file

If I later modify the Main.storyboard file adding a new button to the view, then how should I tell Xcode 5, if possible, to add missing localization strings to the Main.strings file? Should I add a new entry by hand by looking at the Object ID field in Interface Builder (it works, but I don't know if this is how it is meant to update storyboards' localization)? Can I run something like genstrings on the Main.storyboard file to extract all the labels' text and add the new ones to the localized Main.strings files?

Upvotes: 42

Views: 25080

Answers (8)

Cihat Gündüz
Cihat Gündüz

Reputation: 21478

Check out ReMafoX, it's a Mac app that perfectly solves your problem. It can be easily installed and integrated within your project, watch this video for a detailed walkthrough.

Alternatively, if you prefer an open-source CLI tool without a GUI, you can also use BartyCrouch.


Install BartyCrouch via Homebrew:

brew install bartycrouch

Alternatively, install it via Mint:

mint install Flinesoft/BartyCrouch

Incrementally update your Storyboards/XIBs Strings files:

$ bartycrouch update

This will do exactly what you were looking for.


In order to keep your Storyboards/XIBs Strings files updated over time I highly recommend adding a build script (instructions on how to add a build script here):

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

In addition to incrementally updating your Storyboards/XIBs Strings files this will also make sure your Localizable.strings files stay updated with newly added keys in code using NSLocalizedString and show warnings for duplicate keys or empty values.

Make sure to checkout BartyCrouch on GitHub for additional information.

Upvotes: 20

Foti Dim
Foti Dim

Reputation: 1371

Tested with Xcode 11, you can simply deselect the language. enter image description here

Do not delete the file on disk. enter image description here

And then choose to use the existing file. enter image description here

The old translations will be kept and the new keys will be added.

Upvotes: -1

Amrit Sidhu
Amrit Sidhu

Reputation: 1950

There are two options:

Option 1

Xcode can "reload" the file by converting the file to either an [Interface Builder Cocoa Touch Storyboard] file type or a [Localizable Strings] file type.

Select your base storyboard file from the Project Navigator Find the Localization section in the File Inspector If your file is currently a [Localizable Strings], change it to [Interface Builder Cocoa Touch Storyboard] or vice-versa. Xcode should have converted your storyboard to the current version, while preserving your old localization efforts. Here you can change the file back to the original file type if you would like.

Option 2

Use ibtool to extract the strings in your storyboard.

Open the Terminal application Locate your Base.lproj directory Use this line to extract the strings:

ibtool MainStoryboard.storyboard --generate-strings-file file_name.strings After ibtool extracts the strings to file_name.strings, you can copy and paste it to your original .strings file

Upvotes: 0

tryp
tryp

Reputation: 1120

Another way is to do it manually by selecting on the storyboard the field to translate. Go to the "Identity Inspector" and copy the Object ID (something like HP8-op-SmX).

identity inspector

After that, open the storyboard langage file (Main.strings, most cases) and past the Object ID. Depending your needs, you just have to add .text or .placeholder.

   "HP8-op-SmX.placeholder" = "My translated placeholder text";
   "HP9-op-VvD.text" = "My translated text";

Save, clean & build. It's a little bit painful but can save a lot of time if you only need to translate few things.

Upvotes: 6

Quinn Taylor
Quinn Taylor

Reputation: 44769

With Xcode 6+, ideally developers should not have to manually manage strings files. Use XLIFF export to automatically gather development language strings to send to translators, and then use XLIFF import to update the strings files with translations.

https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LocalizingYourApp/LocalizingYourApp.html#//apple_ref/doc/uid/10000171i-CH5-SW9

Another option is to use ibtool --export-strings-file directly.

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/ibtool.1.html

Upvotes: 2

olik79
olik79

Reputation: 1412

Using Xcode 6 the following worked for me:

I changed the localization for a language from "Localizable Strings" to "Interface Builder ..." like suggested at the SO question posted by h.orim. However the setting did not change, it still was set to "Localizable Strings". The next step now is to do that again, so Xcode will find the Storyboard it just created and show a prompt asking if it should be used or replaced. Now click on "Use file" instead of "Replace", otherwise the same will happen again.

Now you should have a localized Storyboard in the desired language. After you now switch back to "Localizable Strings" you will have a file containing all current strings used in the storyboard with your previous translations still in place.

Upvotes: 6

Rahav
Rahav

Reputation: 1875

The file that Xcode does not update automatically (at least 5.x version didn't) is the app's Localizable Strings. You can build a fresh file from Main.storyboard as follows:

In the project Navigator (the leftmost pane) click on the Main.storyboard file. In the Utilities pane (the rightmost pane) click on Show the File inspector icon. It is the leftmost icon in blue in the image below:

File inspector is the leftmost icon.

On the right pane that will appear, one of the sections will be Localization:

Localization section

Uncheck the English (Localizable Strings) row and in the window that will pop-up check the Delete localized resource files from disk and click the Remove button (you do not have to check delete, in which case Xcode will ask for a permission to override it when you build it next).

Then check English (Localizable Strings) again to build it from scratch.

Upvotes: 19

Trond
Trond

Reputation: 41

You can use a script called UpdatStoryboardStrings for this!
Get it here: https://github.com/AppliedIS/iOSL10n
Intructions for use: http://blog.appliedis.com/2013/05/22/localization-of-an-xcode-ios-app-part-2/

Upvotes: 4

Related Questions