App Localization Made Easy
My latest app “Ballet Fashion Show” was just released in 21 languages so I thought I’d write up a post on localization.
I get asked occasionally if it’s worth the time and energy to localize your app (all six of my apps are localized in between 8-21 languages)- and the answer is ABSOLUTELY YES!! There’s the thrill of seeing your app and promotional materials in other languages than your own, you get to learn a little bit more about cultures across the globe, and yes, there is a larger market share!
All of my apps have different ratios of domestic vs international popularity- Fairy Fashion Show’s audience is bigger in the USA, but Princess Fashion Show has made a big splash internationally (it’s big over in Italy and France!). I think cultural differences have a big effect. Mermaids seem to be popular worldwide- most cultures seem to be familiar with mermaids. Fairies were tricky though, in the Hindi edition it’s Angel Fashion Show- apparently fairies as we know them don’t really exist in their culture. It’s Elf Fashion Show in several parts of Europe, too- I should have included a Christmassy outfit! 🙂
Another interesting thing that you come across is linguistic roots- you can really see the language families when you see your same phrase translated across 15 languages. Obviously there’s the Latin-based English, German, French, Italian, Spanish, Portuguese, etc. Greek is, well, Greek to me, and the Arabian and Asian languages all look beautiful even if I can’t read them (although I’m pretty good at distinguishing between them!). I figured the Scandinavian languages would be fairly similar, which was true except for Finnish which was delightfully foreign.
A cool perk: you can see how your name is written in all the languages! Magical for the narcissistic developer (me).
So let’s talk about some practical tips. You need to figure out which countries/languages you’d like, get the translations, implement the in-app text and localize the metadata for the various markets. It’s not a quick process but what in app development is? At least it’s pretty easy.
First thing, you need to gather up EVERYTHING you need translated, I recommend keeping it organized in a spreadsheet, Google Docs/Drive is great for this. Be sure to get your app title*, credits, in-game messages and texts, keywords, app description, and a short promotional sentence** translated.
If you want to be prudent and are getting a lot of languages translated, it might be wise to just start with one or two to make sure you have everything and the app runs in another language, in case you forget a phrase or some words (you will).

like this, with all of your languages over and all of your text down. data entry, fun times!
* to localize or not to localize your app title? Translators have deferred to the English titles in the past, saying English titles are common on the app store and if I’d like to keep my branding consistent it is an acceptable practice. However, I’d rather the users be able to understand the title in their native language, so I go with translated. It’s your call.
** Google Play asks you for a short promotional phrase, under 80 characters (for example, “Dress up a Ballerina Paper Doll with Ballet Fashion Show”)
Okay, so now you need to pick your languages. Obviously if you have market research saying your type of app is hot in a certain country, then put it on the list! I’ve also checked lists of the top app buying countries and extrapolated languages from there. Also, you should check and make sure the language you want is available on the markets you’ll be marketing to! Just for your (and let’s face it, my) own reference, here are the languages that some common app markets allow:
Apple: English (US, UK, Australian, Canadian), Chinese (Traditional & Simplified), Danish, Dutch, Finnish, French (and French Canadian), German, Greek, Indonesian, Italian, Japanese, Korean, Malay, Norwegian, Portuguese (Portugal & Brazilian), Russian, Spanish (Spain & Mexico), Swedish, Thai, Turkish, Vietnamese
Google Play: Afrikaans, Amharic, Arabic, Belarusian, Bulgarian, Catalan, Chinese (Simplified & Traditional), Croatian, Czech, Danish, Dutch, English (US & UK), Estonian, Filipino, Finnish, French, German, Greek, Hebrew, Hindi, Hungarian, Indonesian, Japanese, Korean, Latvian, Lithuanian, Malay, Norwegian, Persian, Polish, Portuguese (Brazil & Portugal), Romanian, Romansh, Russian, Serbian, Slovak, Slovenian, Spanish (Spain, Latin America & US), Swahili, Swedish, Thai, Turkish, Ukrainian, Vietnamese, Zulu
Amazon: Arabic, Chinese, Cornish, Czech, Dutch, English, French, German, Greek, Hebrew, Hindi, Italian, Japanese, Kazakh, Korean, Polish, Portuguese, Russian, Spanish, Tagalog and Vietnamese.
Nook: English
And here is a handy link to the language codes used when you detect what the device is set to: http://www.loc.gov/standards/iso639-2/php/code_list.php (you want the ISO 639-1 Code)
It is the internet so I will allow you to find your own translation services, but I will help you figure out how check them. Everyone always snickers when I tell them I pay for translations, assuming I just get Google Translate copy pastes or something wildly inappropriate. But out of over 50 translations I’ve commissioned, only one was a google translate job- most of the translators I hire are pretty cool people and have done a great job. To check if it’s a Google Translate job, run your original text through Google Translate and compare the two. I usually spot- check in a few places to make sure it’s not word for word- similar is fine but you don’t want long strings of identical words/characters. If you’re unsure you can bring up both versions (the translator’s and google’s) in Text Wrangler and run a Diff check.

Blue text means it’s different from Google Translate- most of the first translation was word-for-word the Google Translate. The second had a few similar terms but is obviously very different.
One lone lazy translator just Google Translated and swapped out my app name and smoothed over some grammar. I was so unsure about it so I got the text translated again in the same language from someone else. My suspicions were confirmed when I diff-checked the second, more honest translator’s work.
Similarly, if you want to make sure it says what you want it to say, run it back through Google Translate the other way, back into English. Ideally you want it to sound a little bit broken as the machine won’t be able to pick up natural conversational grammar perfectly. If Google chokes on a word, try an alternate online translator, Bing is my favorite. Sometimes a word just won’t come through and you just have to trust or check with your translator.
(While we’re on the subject, I don’t think machine translations are good to use for app titles or any written texts past a word or two. But, I have used it for a stray forgotten keyword or basic update phrase.)
For actually coding the app in other languages (using Corona SDK of course), I highly recommend this tutorial here: http://www.monkeybin.no/blog/archives/2011/09/18/corona-sdk-localization-made-easy/
Also, my brilliant husband wrote up a handy python script for bringing translations stored in a spreadsheet into the translations.lua file required for this technique.
Instructions for use:
1. Prepare your spreadsheet with the language code on row 1 of each language, and the translations in cells below. (see example screenshot above)
2. Download this zip file, which contains babelfeesh.py, unzip it and put the babelfeesh.py somewhere you’ll remember.
3. Save your spreadsheet as a .csv file with a | delimiter (LibreOffice is freeware that will do this for you) in the same directory as babelfeesh.py.
4. Open up Terminal, navigate to that directory and type this in: python babelfeesh.py the_translation_csv_filename.csv
5. Rename your new file to truncate the date, drop it in your app directory and enjoy! 🙂
Technical challenges in putting the languages in the app itself:
I was worried about Arabic because it is written right to left and my app has an input field, but it turns out native text fields and international/the users default keyboard will take care of that. Also, the device will most likely have at least one default font for each language, so you don’t have to worry about including a Chinese font with a Chinese-localized app. They’re not always pretty, but they’re there. If you have a custom font, check to see what languages it supports- I was pleased to find that my font included tons of languages with all sorts of wild foreign characters. I tried to check out some foreign fonts from their native websites/font makers, but wasn’t able to read the usage rights clearly enough to use them.
Also, opening up the files from the translators was sometimes difficult because of all the different language encodings- I used a combination of Google Docs, Text Edit, Text Wrangler, and Sublime to open them (if it’s still not working, go to preferences and fiddle with the file-opening-encodings settings. Once you paste it into Google Docs though, it does pretty well.
Be sure to define which languages your app uses in your build.settings- that’s where the app stores read your app’s languages.
So! Is anyone still reading? Lol I’ll try to wrap this up.
Entering the metadata in the stores is pretty easy, for the most part it’s some variation of go into the metadata, look for “Add translation” and do so. Most app stores allow localized screenshots* and some allow for localized promo images.
Apple: localized title, desc, keywords, screenshots, update notes
Google Play: localized title (30 chars max), desc, screenshots, icon, promo graphics (1024×500 px, 180×120 px), video, update notes
Amazon: localized titles, desc, keywords, update notes. Metadata can only be entered in US and UK English, French, Italian, German, Spanish and Japanese but they allow to you to note other languages your app uses (list above)
Nook: English only I believe.
*Don’t highly recommend localized screenshots- it is a ton of work getting these translations in and if your internet connection is slow it can take FOREVER. Avoid using text at all in your screenshots if you can get away with it.
Okay so you’ve built it, have they come? Check your downloads by country (App Annie makes this easy) and see what the numbers say. Are you totally popular in one country? Keep that one on the list. If you spent a bunch of time and money localizing for a country that ignores you, probably leave that one off the list for next time.
So this is most of what I know about localization- there is more but I don’t know how much longer I can hold your attention 🙂 If you have found this post helpful or if you want to see an example of all of the above at work, please download my new app “Ballet Fashion Show”, now in 21 languages! (English, French, Italian, German, Spanish, Korean, Japanese, Traditional Chinese, Simplified Chinese, Malay, Thai, Tamil, Arabic, Greek, Portuguese, Danish, Finnish, Dutch, Norwegian and Swedish.)
Ballet Fashion Show Links:
iOS Download Link
Google Play Download Link
Amazon Download Link
Nook Download Link
Youtube Video
Thanks for reading! 🙂
Epilogue: The Little App Titles Under the Icons
One of my apps was rejected for not having the little app title under the icon localized along with the rest of the app. It took a while to figure out but since it is involved I thought I’d add it in here for the complete localization experience package blog post!! Very exciting.
Please note this tutorial is for iOS only. If you need to localize the titles for Android, it’s a slightly different process. Ingemar from the Corona Forums has been kind enough to write out a tutorial on how to localize Android titles, it can be found here. OK, on to the iOS tutorial!
The length of the little title seems to change depending on the width of the characters and the device. It gets more complex once you add in foreign characters, I’ve found it easiest to pick something short and then just test each language to make sure it’s not truncated.
There are several steps to doing this so I’ll make a little list here:
1. build.settings file
You’ll need to define all of your languages in your build.settings file. Use the ISO 639-1 codes you found before and add them in this format:
{
iphone =
{
plist =
{
CFBundleLocalizations =
{
"en",
"es",
"fr",
"de",
"it",
"ko"
},
},
},
}
2. lproj folder for each language
This part seemed a little weird to me but this is how it goes so stay with me here. For each language, create a new folder in the app’s root directory with the language code and “.lproj” extension. One for each language you have.

like this, one for each of your languages
3. InfoPlist.strings file for each language
OK now in each of those folders, make a new file called “InfoPlist.strings”. This file will hold your localized little app title that appears under your icon. Here is the code you’ll need to put in InfoPlist.strings:
CFBundleDisplayName = "Little_Localized_App_Title";
For example, my app Princess Fashion Show is set up like this-
in en.lproj, the InfoPlist.strings file says:
CFBundleDisplayName = "Princess";
in it.lproj, the InfoPlist.strings file says:
CFBundleDisplayName = "Principessa";
in ko.lproj, the InfoPlist.strings file says:
CFBundleDisplayName = "공주 패션쇼";
and so forth.
4. Build and test on every language to make sure it appears.



Congratulations! Your app is now totally localized 🙂
Epilogue part two: Arabic Text in Photoshop
It turns out my Arabic graphic text strings were backwards- whoops!
Be sure to double-check your Arabic strings to make sure they aren’t backwards. All of the Arabic strings in files were ok, but the graphics I made for the titles were backwards. My version of Photoshop (CS4) was not able to handle Arabic text direction. Adobe is aware of this and they released .PSD templates for enabling right-to-left writing. The files and instructions for use can be found here: http://www.adobe.com/support/downloads/detail.jsp?ftpID=4106
Great post! Thanks for the tips! Keep them coming Laura!
I wonder if you could make a detail post on what countries do better (is there some trend between your apps?) And a list of places to get translators who won’t rip you off would be nice too.
Very helpful, thanks!
Great post! You said you hired translators and one of them used google translate. (so bad!). All this leads me to think..did your translators volunter their translation services?
Hey Vito,
Thanks for your comment! No, they weren’t volunteers, I found their services online, hired and paid them all. Fortunately out of over 50 translation jobs I’ve commissioned, only the one was a bust. All of the other translators I worked with were honest and very professional!
Laura
There’s a big movement into language study lately. That’s why you get people learning Japanese by watching jdramas. Thus there’s time spent on ways to immerse passively. All of this is very helpful.
Awesome article Laura! I’ll be using it for sure on my upcoming game!
The python code does not work without the proper indentation of lines, like in the for loops and if statements. Any chance of getting that updated?
Hey Mark,
Thanks for checking out the babelfeesh code- I wasn’t sure anyone was going to get that far! 🙂 Sorry for the indentation issue- I fixed the post to link to a zip file here instead which contains the babelfeesh.py with its proper formatting.
Cheers!
Laura
Very useful tips, Laura.
This article will come in handy for some of our clients who need advice from a developer’s perspective.
Thanks and congratulation for your apps,
Danilo.
DYS Translations.
Hello Laura, and Thank you for this tutorial. I have successfully set up and tested my app localization in iOS, and it works great. But I have not been able to successfully test it on my Android device. When I change my Android language settings then reinstall the app, it’s still in English. Am I missing something on the Android side?
Just following up, apparently, we should use this for getting a proper ISO language id from an Android device:
string.sub(system.getPreference("locale", "language"),1,2):lower()
thank you for this great post!
you should also try turkish, maybe in your next app, lots of potential 😉
[…] If localizing, see my tutorial on how to localize an app […]
Great post. Very representative of the traditional pains of localization. We TOTALLY see the value in mobile localization (especially nowadays with the global app market moving towards globalized flatness).
My cofounders and I have dealt with this process and believe it to be… nonesense.
We’ve worked on a system that allows mobiles teams to simply drop in plugin (couple lines of an SDK) and manage everything from an easy to use dashboard. This includes sourcing translations, reviewing them in context, and pushing copy to end users without having to update a single thing!
Check out Colatris – the mobile localization SDK. Would love to hear how we can help the rest of you with your process, so feel free to ping with questions/ideas.
AJC
[…] on January 11, 2016March 6, 2016 I recently read this blog entry by app developer Laura Tallardy http://lauratallardy.com/app-localization-made-easy/ and I was pleased to see, from a developers’ perspective, how important localisation is for the […]