15
votes

(There are similar questions. Some resulted in answers that I've tried and found not to work. Others got no answers, I assume because the querents didn't supply as much detail as I'm about to.)

I started with a storyboard that worked well for my app; the strings it contains are in English. I wanted to add a French localization. I did this:

  • Added a base localization, which transferred MainStoryboard.storyboard from en.lproj to Base.lproj.
  • Added a French localization, which cloned InfoPlist.strings (English) and MainStoryboard.storyboard (Base) into fr.lproj.
  • Changed a couple of strings (titles of segments in a UISegmentedControl) in the French MainStoryboard.storyboard.
  • In the Simulator, set the language to French.
  • Ran the app from Xcode.

Result: This worked; my changed strings showed up in the running application.

But I want to be all fancy. I want to do the French localization using a .strings file. (It's not just a matter of being fancy; the French localization will be turned over to nontechnical translators, who can't be expected to master Interface Builder.) So:

  • Selected the base MainStoryboard.storyboard in the Xcode Project navigator.
  • In the File inspector, under Localization, changed the French localization from "Interface Builder Cocoa Touch Storyboard" to "Localizable Strings."
  • Accepted Xcode's warning that the French storyboard will be discarded in favor of a .strings file, which appears in the Assistant editor.
  • Made the same two edits; there's no question of their being the wrong strings, because they're all commented as IBUISegmentedControl...segmentTitles; and the label text doesn't appear anywhere else in the .strings file.
  • Deleted the existing (working) copy of the app from the simulator.
  • Ran the app.

Result: The view uses the base (originally English) localization, instead of loading the French strings.

This isn't satisfactory. I've tried deleting the app from the simulator, and even deleting the derived-data folder. The bug persists.

As I said, I can't turn a .storyboard file over to a nontechnical translator. How can I get iOS to accept the storyboard localizations from a .strings file?

3
Converting the storyboard to Auto Layout had no effect.Fritz Anderson
A response to another similar question suggested running ibtool on the base storyboard, and using that as a starter for the .strings file instead of the one Interface Builder provided. The two files are identical.Fritz Anderson
Here's another variable: The storyboard has a lot of unreachable scenes: They aren't the initial controller, and they don't have any segues leading into them. (Not my doing; I'll have to speak to the developer who thought this was a good idea.) Could that interfere with .strings localization?Fritz Anderson

3 Answers

9
votes

Here is how I solved it:

in viewDidLoad:

[self.segmentedControl setTitle:NSLocalizedString(@"Title", @"Your localize comment") forSegmentAtIndex:0];

You can do the same for the search placeholder:

[self.searchBar setPlaceholder:NSLocalizedString(@"Your string placeholder", @"Your comment for localizers")];

Then just create a Localizable.strings file and it will work.

7
votes

I had the same problem with my UISegmentedControls. It turns out that there is a bug in iOS 6: .strings storyboard localization won't work on UISegmentedControl text and on UISearchBar placeholders. See this openradar: http://openradar.appspot.com/radar?id=2159402

Have you tried localizing other elements such as UILabels? That should work.

0
votes

For people developing for iOS 7 or higher and searching for the .strings format for a search bar, this is how you should translate the placeholder field for example:

/* Class = "UISearchBar"; normalTitle = "Search for Places"; ObjectID = "F3d-Ir-fni"; */
"F3d-Ir-fni.placeholder" = "Nach Orten suchen";