I realized after the last post that I was probably not using the terms internationalization and localization very precisely. I certainly know the difference, especially after spelunking the Apple docs, but internationalization is just too much of a mouthful. Nevertheless, I’ll try to do better from here on.

After making the decision to start with German, I researched 5 translation services. I promised myself not to overanalyze things, and in the spirit of shipping, go a bit more on gut than becoming mired in the idiosyncrasies of picking the absolutely perfect vendor. After a bit of high-level searching, my short list became:

Drilling in a bit, I immediately ruled out Smartling and iBabbleon because they do not specialize in apps. I’ve learned over the years that regardless of what I’m trying to get done, I always end up happier with the results when I hire a specialist.

After a bit more drilling, I disqualified Icanlocalize based on 1) no mention of a project manager to deal with all of the inevitable details of working with the translator, and 2) it was the cheapest, and by a lot. I rarely do well when selecting the low-cost option. It ends up being more work for me and ultimately costing more.

That left Tethras and Applingua. They priced out equally at $0.18US/word. Both included project management. Both appeared to have very good tech to manage the process. Applingua even tests the translation on device, which in the end caused me to go with Tethras. I didn’t want the hassle of resending new builds as I hacked my way through fixing the inevitable problems of trying to jam 10 pounds of German into 5-pound UILabels.

With Tethras selected, I made a cup of coffee and started reading the Apple Internationalization/Localization docs. Within 5 minutes, I realized I was dangerously close to falling into a coma. So in lieu of the Apple docs, I went with this document as my guide. A a bit dated, but the fundamentals are all there in one easy-to-read place.

Next was a long scrape through my source files adding NSLocalizedString macros. I ended up creating a TextExpander snippet ‘nnsl’ = ‘NSLocalizedString(‘ to speed things along.

Note to self: Use NSLocalizedString in every new project from the start and get it out of the way.

I created NextPage 6 years ago, and the Xcode project file hasn’t always fared well during Xcode upgrades. To wit, ‘Base Internationalization’ had somehow become checked in my project settings, but for some reason I didn’t have a Base.lproj dir, nor a de.lproj after I added the German localization. Forutnately, simply selecting my main xib file (yes, no storyboards in NextPage) and localizing it for German with File Inspector created both directories. I then proceeded to localize the rest of the xibs with File Inspector.

In about 6 hours I was finished making the modifications. I created a Localizable strings file by running the following from my project directory:


Initially, this resulted in lots of messages like this:

Ambiguous comments are apparently frowned upon by genstrings. Not liking the warning messages, I fixed up my comments and reran genstrings until everything was clean.

Second Note to Self: Just make the NSLocalizedString comment argument identical to the key and get on with life.

Tethras allows only a single file to be uploaded at a time, but happily that can be a zip file. I zipped all of my strings files together and sent them up. Within a few seconds, the Tethras backend had exploded the files, counted the unique words to be translated, and presented a price. A few clicks later, I was checked out of the shopping cart and ready for translation. Almost.

I immediately received an email asking for additional localization instructions. Here are the sorts of things they required, along with my answers:

Official App Name: NextPage 3
App Name Translation: Do not translate the app name  /* This is branding thing */
Translation Style: Informal
Translation Tone: Cheerful   /* “Scary Clown” was not an option */
Target Age Group: Adults
Genre: Music
Description: NextPage is sheet music manager. Musicians load their music PDF files into the app and can then arrange them into set lists. Then, they can page back/forth through the music during live performance by simply tapping, swiping, or using a wireless foot pedal. The app provides markup/annotation tools, a metronome, and other features for practicing and playing live.
App Store URL: <provided>
Additional Instructions:

After submitting all of that, I quickly received a second email saying everything was set to go, and that my expected delivery date was within 2 days.

The next day, I received several questions from the translator via the Tethras portal regarding the context of some of the text. I replied quickly, and by the next morning the entire job of 2,200 words was complete. Delivery on time, as promised.

I downloaded the strings files, rebuilt the app, and was both pleasantly surprised and a bit chagrined. The pleasant surprise was that the translator hadn’t botched the syntax in any of the strings files. They were perfect. The chagrin came when I saw how the verbosity of the German language had wreaked havoc on some of my design. Also, I discovered that I had missed 4 xibs and had forgotten to include the text needed for the App Store IAP entry. I uploaded those for translation and turned my attention to the newly discovered design issues.

Most times, simply widening of the UIButton or UILabel took care of the problem. I already had AutoLayout in place, which ended doing a lot of the heavy lifting for me, but sometimes I did have to help it along. A few other problems ensued.

No Room at the Inn – Variation 1

The German translation of some entries in my Settings menu were being truncated:

Settings Truncated

The answer was to let UITableViewCell handle things by adding:

Settings Code

which resulted in joy:

Settings After

No Room at the Inn – Variation 2

NextPage provides markup tools, and each tool normally provides a hint on its usage in the center of the top toolbar.  In German, some of the hint translations overlapped UIBarButtonItems on either side.


Fixing this required some code to display the hint via UIAlertController when the text exceeded a certain length, like so:


A compromise to be sure, but certainly not the end of the world.  Taking a huge amount of time to attempt a redesign that preserved the original look simply wasn’t worth it. I’ve never gotten a 5-star review for the markup tips.


Testing also revealed that I had neglected to localize the CSS and image files included by the HTML files I use for documentation inside the app. Not a big deal to fix, but a detail that was not obvious from the various docs I had read.


Tackling German first has probably exposed all of the edge cases where size matters. I’m thinking French, Spanish, and all the rest should require little or no additional work.

I was very pleased with Tethras and recommend them. I think Applingua would be a fine choice also, and I would consider using them for more complex projects requiring a lot testing on devices I don’t have. The payoff just wasn’t there on this particular project.

NextPage has been in the App Store since 2010, and was not a localized app from the start. It was my second app, and quite frankly, while I’m not xenophobic, I never gave other languages even a thought because I was solving my own (musical) problems in pure Tony Stark fashion.

Nearly six years later, however, I’ve answered enough support emails with Google Translate to realize that it was high time to add international support. I’d thought about it before, but got spooked over the amount of work required vs. the expected return on investment. I’d localized my first app (circa 2009) for Spanish, and I still remember the pain, but not a lot a revenue in return. Nevertheless, my gut’s been telling me it’s the right thing to do based on the support emails, and, that I should start with Spanish.

Fact Checking my Gut

A quick check of NextPage’s lifetime sales stats in iTunes Connect showed that 21% of sales have come from outside the US, broken down as follows:


  1. Was it time to localize? Yes
  2. Should I start with Spanish? No.

So my gut was half right. Since the UK is already covered, it would appear the Germany is my next most successful market. German. The one language all the Ray Wenderlich tutorials warn you about. <sigh> Well, I converted to AutoLayout in Version 3, so fingers crossed, all will be well.


After months of mental weeping and gnashing of teeth, I’ve decided to take the next version of NextPage (NP3) from a paid to a free-to-try model.


The decision was not easy because I feel very strongly that software should not be free. In all true business transactions a exchange of value takes place. If it doesn’t, it’s a hobby activity or perhaps an act of charity, but it’s clearly not a business transaction. At the Release Notes conference1 last fall, I was impressed (and later haunted) by David Smith’s comments about dealing with things as they are. If a paid-up-front model is barrier to getting your work into the marketplace, and ultimately limiting your success, then you need to figure out how to remove the barrier rather than whine about it.2

NP3 will be a new app in the store for two reasons. First, it is a live performance app for musicians. I’ve made a number of major changes and the risk of undiscovered bugs will naturally be higher in the .0 release. The price of ruining someone’s performance is higher than the loss of reviews and ratings with a new app id. I am willing to pay the latter price, but not the former. And as we all know, should NP3 have serious issues, I won’t be able to get a fix through App Review fast enough. By letting NP2 live alongside NP3, my most conservative users can have a saftey net to fall back on should the worst happen during the NP3 launch period. How long NP2 will remain in the store I have yet to decide.

Second, I don’t have sufficient business justification to build out the plumbing required to grandfather 5 years worth of customers who paid full price and upon upgrade, would suffer a downgrade to 1 set list and 5 songs. It seems better to simply start with a clean slate. Also, I have long term users who have not paid a dime since they bought the app in 2010 for $5. I think it’s only fair they experience an upgrade event.

As hinted to above, NP3 will be fully functional and free to download, but with limits: 5 songs in the song library, 1 set list, and 3 songs in that set list. I feel that will be enough to let a musician decide whether NP3 fits their needs. While the app remains in free mode, the button I normally use for “Leave Feedback” will say “Unlock Everything”, or something like that, and send them into the in-app purchase workflow. The goal is to encourage a purchase, while also eliminating support emails from folks who have not paid for the app. The purchase workflow will also be triggered when the user tries to go beyond the 3 limits. I’m still mulling over the final upgrade price, but it will be north of $10, and possibly $20.

I build software with the solitary goal of helping people be better at what they do. If a paid-up-front model is limiting my ability to do that, and it appears that it may be, then I owe it to my audience to at least try other ways to get my work in front of them.

  1. You really need to go to this one.

  2. Paraphrase mine.

My Take-aways from Release Notes #1

October 30, 2015

Attending a conference typically requires both money and time. It’s always an investment in yourself, and sometimes, it’s also an investment in your buiness. So how much should the return on that investment be? I’m not talking about the value of the friendships that you make – those are priceless – what I’m interested in […]

Read the full article →

Regarding Recent Apple Outages

March 27, 2015

There didn’t seem to be a whole lot of ire in the indie community after the outages of iTunes and the App Store this week and earlier this month. I’d like to think it was because we all realize that Apple is like any other IT shop and is going to suffer occasional downtime – […]

Read the full article →

Synergy Autostart Instructions

March 21, 2015

Synergy is a KVM app that I use to control my two iMacs. Highly Recommended. Perhaps because I come from an AUTOEXEC.BAT heritage, figuring out how to autostart Synergy on OS X was definitely non-trivial and full of rabbit trails. I finally made up my mind to figure it out this afternoon, and the ultimate recipe that worked for me was […]

Read the full article →

Why I’m Not Buying The New MacBook

March 13, 2015

This post first appeared on //ScottKantner.com, which is another blog of mine that covers different topics. I wanted to share it with you also because it’s relevant here. I’ve modified it a bit and added an Easter Egg that will only be appreciated by readers in the iOS community. I’ve been in the market for a new laptop […]

Read the full article →

The Business Value of Auto Layout

March 2, 2015

I’ll admit it. I’ve been running away, hiding from, and trying to just plain ignore Auto Layout, hoping it would go away. Despite having successfully pulled off numerous Jack Bauer-style maneuvers to escape it, I’m finally having to face into Auto Layout. It feels a lot like the final “Hello Beastie” scene in Dead Man’s […]

Read the full article →

Native Versus Web

February 18, 2015

Writing for TechRepublic, Matt Assay recently opined that while it seems everyone wants to build an app, not everyone should. By “everyone”, he means businesses, not app developers. Whether you agree or disagree with his points, a few are worth thinking about as we consider our app business efforts. Native apps aren’t always the right […]

Read the full article →

Xcode Tips[0]

February 16, 2015

Three handy Xcode tips from Brent Simmons @ inessential.com Clean Build Folder Show Callers pasteboard for Find window

Read the full article →