Languages
Using some metrics and based on the appeal of Picross HD, the first thing I decided was to localize in 3 languages: German, French, and Japanese.
Contractors
We used odesk to find the people to do the localization and that has been a very good experience. It was really easy to find people to do French and German. It was a little harder finding someone to do a good job on Japanese. However, everyone we ended up working with was responsive, quick, affordable, offered good advice, and did an all around great job. It took about a week to get all 3 translations completed.
How to Localize
Before I connected with the odesk people, I first needed to figure out how we wanted to approach the actual localization and how to get the strings extracted. A great reference for this is on Ray Wenderlich's blog in a Localization article by Sean Berry. I wanted to keep the localization really simple as I didn't want the odesk people to have to have special tools such as resource editors. So I put all the strings into a few files I could send to them:
- description.rtf - Containing the app store description
- help.rtf - Text for the app help
- Localizable.strings - App strings, Game Center Leader board Strings, and in-app store strings
I gathered strings from a few different places:
- From XML puzzle files - Using a XSLT transform (this was a majority of the strings). The name of each puzzle needed to be localized and we have over 400 puzzles in Picross HD.
- From each XIB (resource) file - I did this manually. I didn't want the contractors to have to deal with a resource editor so I just manually added the UILabel and UIButton text into the Localizable.strings file.
- Look for hard coded strings in the app and added the NSLocalizedString(@"english text", nil) macro for each string needing translation.
- (void)viewDidLoad { [super viewDidLoad]; // Localize the labels in this view // for( id foundView in self.rateThisPuzzleButtonView.subviews ) { if( [foundView isKindOfClass:[UILabel class]] ) { UILabel *label = foundView; label.text = NSLocalizedString( label.text, nil ); } } }
In order to do the buttons, I decided to just do those manually as I didn't have that many buttons to do:
[self.puzzleSuccessTryAgainButton setTitle:NSLocalizedString([self.puzzleSuccessTryAgainButton titleForState:UIControlStateNormal],nil) forState:UIControlStateNormal]; [self.puzzleSuccessNextButton setTitle:NSLocalizedString([self.puzzleSuccessNextButton titleForState:UIControlStateNormal],nil) forState:UIControlStateNormal];
I also had to adjust the font and/or button sizes in order to accommodate the length of the German text. This was a little tricky given how some of our buttons worked. I ended up doing a StackOverflow posting once I figured out how to solve button text wrapping issues.
Lessons Learned
Doing three languages at once was a bit much for the first time trying to localize an app. It would have been better to start with just one language. There where several mistakes I made that required me to add more work on the localization teams. Every time I did this, I had to communicate back with 3 different people and it was just more work then getting it right the first time. The types of mistakes I made where:
- When I sent the strings to the localization teams I didn't realize I was missing about 50 puzzles. The XSLT transform I wrote missed some puzzles.
- I should have sent screenshots to the localization team up front as they didn't have enough context to do some of the translations. They ended up doing some redo work once I sent them the screenshots.
- I often use images for the help screens, but I was missing the original layered image for one of the help screens. I ended up spending a few hours recreating a help screen so I could replace the text easily. Save your original layered artwork (especially if it has text in it).
- Images with text == pain. I knew this before, but zero thought had went into the idea we might localize this App when we first wrote it over a year ago. To help this, I wrote some code to dynamically load a localized version of an image file based on the active language.
Overall, this was a very easy effort. It only took about a week of my part-time schedule to go from nothing localized to having three languages and ready for posting to the AppStore. Apple's tools and handling of fonts and languages works great.
Next Steps
This just got released to the AppStore so wish us luck. I will report back when we know more how this experiment went. Ken and I are hoping to see a noticeable uptick and we hope more people enjoy Picross HD in their native language.
Be sure to give Picross HD a try and let us know what you think.
Thanks,
Tod and Ken
Five Lakes Studio, LLC