Adding additional languages to your iPhone app is extremely easy. Below I’ll show you how. But there is one thing that the documentation did not mention, that also cost me a couple of hours.
Step 1: Change all strings to be localizable
You need to go through your code and everywhere you want a string to be localizable you need to change it to use the NSLocalizedString macro. This marks this string to be localized. Also if no localization can be found then the string returned is identical to the first parameter.
// without localization player1Name.placeholder = @"Player 1"; // with localization player1Name.placeholder = NSLocalizedString(@"Player 1", @"Player View"); |
The second parameter is called “comment”, but it’s actually sort of a context for the “Player 1” token. I would use this to uniquely identify the view where it’s used.
Step 2: Generate your Localizable.strings file
The SDK comes with a very useful tool genstrings. This tool scans your code for all instances of NSLocalizedString and pulls these together into a UTF-16 strings file. This file you can send to a translator who will change the replacements, in the end you will have one Localizable.strings file per language.
# in your project directory genstrings Classes/*.m |
The strings file will look like this:
/* Player View */ "Player 1" = "Spieler 1"; /* Player View */ "Player 2" = "Spieler 2"; /* Player View */ "Player 3" = "Spieler 3"; |
All strings on the right side of an equal sign should be changed. If you want to you can aggregate multiple tokens under one header if it is identical, but don’t change the comments because otherwise the NSLocalizedString will not work.
Step 3: Add strings file to your project and make it localizable
Now go into your project and add an empty Localizable.strings file. Right-click on it, Get info, and add localizations for all languages that you want to support. Note that Xcode adds “English” for you, but this is outdated: your locales should use the 2 letter ISO code. en for English, de for German and so on. So after adding those you should remove English.
This will create localization directories under your project directory that are called like de.lproj. Those directories contain all the language-specific variantes of all files for this language. You can even localize images like that.
Step 4: Troubleshoot
That’s all it takes… if you haven’t accidentially change the strings files away from UTF-16. Because then you will find that the build process for your app works fine, but on the device localization will fail to work. If you look into the app bundle your strings file will have been renamed like Localizable.strings.45601. Of course the iphone will be unable to find this file like this and instead use the default localization.
In the info of any strings file you can change and/or force it to UTF-16. Save yourself the pain of not knowing why your pretty new language does not show up. Another reason I found (which nobody warns you about) is those darn semicolons. Should you loose a single one you again don’t see your localization even though the building works fine. Been there, trust me.
In Summary, localization is really simple with Objective C. Seasoned programmers would probably even do step 1 while they are coding. It’s just a little bit more code, but the rest is almost automatic. Now all I need to do is find people who speak French, Spanish and Japanese.
Categories: Recipes
Please check out my two tutorials on Localizations.
Part 1: http://adeem.me/blog/2009/05/09/tutorial-iphone-localization-in-xib-nib-files/
Part 2: http://adeem.me/blog/2009/05/10/tutorial-part-2-localizing-your-iphone-application/
You can work with strings files much better in this online localization tool: https://poeditor.com/. It helps with the strings translation by allowing several translators to work on the same project.