Reviewing App Translation Services: How to Make Your App Truly Global
Developing a unique, interesting Android application is requires one set of skills, but marketing your application requires another set of skills. There are many ways to spread the word about your great app or game, including posting on our very own Apps and Games forum or submitting your app to XDA Labs, but eventually you’ll reach a point where growth seems to slow down and you have no idea what to do next.
One way to expand an app’s marketability is to release it with support for different locales. However, this creates its own suite of challenges, as most of us are not fluent in two, or even more, languages. So then how do you go about translating your application?
I have gathered a few options available to developers, some free and some paid, and will walk you through how to use these services to translate your application so that you can reach a wider audience. Here are some of the different methods I have found:
The first two options, Crowdin and JITT, are crowd-sourced translation services and it should be noted that Crowdin features a paid option as well. Google Translator Kit allows you to use the power of Google’s translation engine to automatically translate your app’s strings into a plethora of different languages, while Jet Brains Android String to CSV converter allows you to quickly export your app’s strings into a CSV file that you can easily share with third-parties to help translate.
JITT uses a command line plugin that enables you to source your translations from the community. It’s a nifty idea that can help save a lot of time and money, encourage your users to contribute back to the app they love, and do some promotion of the app at the same time through word of mouth. I had quite a bit of trouble using the system, and it appears to be a bit rough around the edges which tends to give me the feeling that its not quite finished.
I created an app to test the translating service and I had a few problems with the website not showing the app I created. Once I got the site to work, I was a bit lost as to what to do next. The instructions kept asking me to point Jitter (the python script for JITT) to the root of my application, and let it do the rest. There are no instructions at this stage on exactly how I point anything at anything and “let it do the rest”. I found an extra link to more detailed instructions and worked out how to use the Python command, which was not quite as simple as point it and forget. You need all the API keys and Secrets that are generated for your app in the website. I uploaded my strings.xml file from my android test app, and then tried to use the rest of the site to do my translations; however all the other linked pages in the site were blank, just showing banner and titles of JITT’s site.
I used the command line interface which is built on Python to upload my files for translation to JITT.IO, and I found that out of the box this method didn’t work either, as I was missing some libraries to make the commands work. I am not sure if this was an issue on my local machine or a general issue. Eventually I got it working, but as you can tell its not a very intuitive application. Below are some screenshots of JITT.IO showing the login, app creation and the errors I ran into – hopefully this might help others work through similiar issues.
After working through all the instructions a few times I worked out I needed to create links to my files for others to translate. The command refers to “User Id’s” which I figured meant you had to have a JITT.IO account in order to help out. It turns out this is not true, and you can just use anyone’s email address. You need to supply the API key, link token and locale as well to create these links. Once you have them created (which by the way I cant find out how to do without using Python) you can paste them into a browser and get a page like the following.
Your user can then type in the correct words in their locale for each of the text that is displayed. I noted that I had 13 strings for translation but the links to pages only made 5 translations available. I worked out that the strings for translating are randomly picked from the file. I guess this helps for someone to quickly fill in a few translations, but to constantly have to refresh the page to get new words is a bit awkward. Each time you refresh you are given a new set of strings to translate and thankfully it doesnt repeat ones you have already completed. Still, why do I have to refresh my page over and over again to get all my phrases translated? I guess this works if you have loads of people to work on the translation, but this isnt the case all the time. My second problem with this page is that once you have completed all 5 translations you are given a big fat button to save your work – NEATO! -but clicking it visually changes the bottom of the page to green, and that’s it. The page doesnt refresh, you dont get more strings, not much visually changes and you cant tell if anything happened. I then went and started generating links for lots of locales — half of them didnt display what I was translating into and the other half said that I had completed my translation already.
On the admin side, you can view the current users doing your translations and the status of your work to be translated — well, you should be able to see that information… but you cant. I had lots of tabs open with links to different locales at the same time, and I never once saw any changes in the pages Users or Status. Also, when I created links for my translations in the Jitter python app, none of the locales showed up in the resources page.
I have to say this might be a nice idea, but it has been poorly executed. JITT.IO sorely lacks usability and functionality to be actually useful to developers. It constantly had problems with pages not working and it’s very awkward to use. I was very frustrated and annoyed at the software on several occasions. I wouldnt recommend using this until the developer puts a bit more effort into the application and irons out the major functionality issues, at the very least.
Crowdin is a crowd-source translation management system where you create an account and upload your files, but the cheapest account is $19 per month. Personally, I think this price barrier will deter most independent developers. It’s not until a project is relatively successful that a developer should consider sustaining a $20 per month cost, however, that’s not to say that Crowdin isn’t worth the money.
With Crowdin, you can have many projects and many files being translated at once, depending on your subscription plan. You have the option to use professional translation agencies or invite others that you know (such as the community) to collaborate on your project. There are a number of reports and statuses that you can monitor on your translation project to keep up to date with how the translation is going, and the whole site really feels like it’s geared towards a major translation project of thousands of strings for multiple projects. It also provides APIs for use with your continuous build systems giving you the ability to be notified if a translation has been completed so you can then use your own scripts to pull the completed files.
There is a tab dedicated to integrations that allow Crowdin to integrate with whatever system you feel most comfortable with such as the command line, GitHub, Bitbucket, Zendesk, WordPress and more.
If you make your project public, other people can find it and offer translations to you. I found my own project and noticed that there are automatic suggestions for my project that appear underneath my original text as well. I was able to translate my simple words to my chosen languages and then download the files for use in my Android project.
One nice touch is a single button that allowed me to “Download Latest” versions of all my files. Crowdin named the download after my project name (much better than Google Translator Kit) and inside was a similar structure to GTK – with each file inside a folder that is named after the language code. Crowdin takes about the same amount of effort as GTK but is a lot more polished, and with a little work the APIs would allow you to put translations into your CI framework. The main difference is the cost though; you are paying $19 per month at minimum to use the service, and you have to still pay for translations on top if you use any of the professional services, unless you can find some community members to help you out.
There’s a lot to like in Crowdin and I think for bigger applications with lots of strings or larger development teams, Crowdin would be a good fit, but for 1 to 5 person development teams with smaller sized projects, Crowdin seems too expensive and possibly a little too complicated as well.
Google Translator Kit
Google Translator Kit (GTK) requires you to upload a file that you would like to be translated, then select one or more languages that you wish your file to be translated into. GTK then asks if you want to use a translator service, which costs money, or (hidden in the bottom) is an option to translate the document yourself.
Once you have your file uploaded you can click on each individual language you wish to translate and then GTK opens a new browser window for editing that language. The window is very busy for my tastes and a little daunting at first glance as it basically splits the window in two where the left half is your original text and the right half is the translated text. GTK automatically translates all of the words (using Google Translate) that it can match up for you which is a nice touch, so I had machine translations for German, Spanish, Italian and Chinese for my application.
Since my application is a super simple test application for translations, GTK was able to find the appropriately translate its strings, which will likely not be the case depending on the complexity of the text in your app. My Appname, which is not an English word, was left as the original in all languages. From here you can edit the Google Translate made suggestions, or add your own. A nice touch is the ability to invite other people to collaborate on your translations with you. Basically, the GTK interface becomes like a Google Docs document with multiple people collaborating to edit it and add comments as they see fit. (Note that they cannot modify the original words in any way though.)
Once you have completed your translations for each language, you then mark it as complete. Then, when you have finished working with your files you can download them and re-insert them back into your application. You can filter the files (if you haven’t completed all language translations) and download only a select few such as those marked completed. There are also some settings you can modify under the settings menu to change a few defaults.
One thing I didn’t like about the download option was that it created a zip file named “Archive.zip”, to me this is such a weird name and has no reference to my project or even to the fact that it contains a bunch of translated files. The structure inside the Archive.zip file makes a bit more sense as each file is contained inside a folder with the language shortcode as the name – ‘es’ for spanish, ‘de’ for german, and so on – and inside that folder you’ll find the file with the original name but with translated text.
I should note that the GTK service only works with a subset of file types, though. For example, I couldn’t upload a CSV file extracted from the Jet Brains plugin below which is a bit of a bummer. I did however upload the raw strings.xml file from my project, but this means that I will have to do some work to get the translated texts back into the Android Studio format. One interesting thing I noticed was that the GTK seems to have native support for iOS applications, as it lists “Apple iOS Applications (.STRINGS)” as a valid file type with no mention of Android applications’ strings.xml files at all. In fact, XML isn’t listed as a valid file type anywhere, although it seemed to work just fine when I uploaded the file from my project.
GTK seems like a useful tool for collaborative translation; the ability to have multiple people working on the same document, splitting up the languages so you can focus on the languages that are most important to market. You can mark complete to hide work that is complete or not so important to help keep the team focused and the interface clean.
I found the auto-translation of words a real plus for those on a small team with limited resources. On the other hand, I didn’t like the name of the downloaded file, and for working on Android applications the whole process is a bit cumbersome. To recap, firstly, having to extract out the files from your project to upload them, and then once you have translated the files you need to download them and import them back into your Android project again.
One way to smoothen out this process is to get Android Studio to create the folder structure for you by using the Translations Editor, although the process is a bit too easy to screw up and too long to go back and forth often. What makes this process stand out even more is that there is an option in Android Studio for Translations, but this even takes you to the same translate.google.com domain but instead of the toolkit it takes you to a manager. The process is nearly the same as GTK but this time even suggests to use XML files from your Android project. Once you have selected the files and languages you are sent to a page whereby you can select a paid option only! There is no option for translating strings yourself, which is surprising since Google has an entire system built and yet developers are given links to paid options that bypass the free system already in place.
Jet Brains Plugin
This plugin is compatible with a veritable smorgasbord of IDEs as the following list shows: IntelliJ IDEA, PhpStorm, WebStorm, PyCharm, RubyMine, AppCode, CLion, Gogland, DataGrip, Rider, and Android Studio. LiewJunTung is the developer behind this plugin, and its project page has an explanation of how to install the plugin, however I found simply searching for the plugin under “Android Studio -> Preferences -> Plugins” was enough to find and install it.
Once it’s installed, you can find the plugin under “Tools > Android XML-CSV Parser.” The plugin is very simple to use, you basically point it at your project and it will extract the strings.xml file and convert it to a CSV version that you can use with Microsoft Excel, Google Sheets, or another spreadsheet program.
I found the plugin fairly straight forward to use, but with a few little caveats. First, it’s best to create all the languages that you want to translate in Android Studio beforehand. This makes it easier to work with the CSV file on the other end. If you simply extract the strings.xml file without adding in any extra languages, the plugin will output just a plain file with only the base locale (for me that’s English). Trust me, after going down the wrong path, it’s much simpler to specify the locales in Android Studio (you can add more later) and then extract the strings.xml file to CSV than to to try and add in the locales to an already extracted CSV file.
Here’s a quick step by step process to export your strings.xml file into a CSV:
- Open the plugin by accessing it from the Tools menu.
- Make sure you have “XML to CSV” selected in the top tab of the plugin.
- Point the plugin to your Android projects res folder (something like /AndroidStudioProjects/AppName/app/src/main/res). However, I noticed that if just pointed the plugin to your application’s root folder it worked fine as well.
- Select a location that you want to save the CSV file to.
- Click ‘OK’ and your file is created.
You can now open and edit the CSV file to your heart’s content, or send it to a friend that can help translate to another language. Once you are done, you can then re-import it back into your project – just remember to EXPORT your file back as CSV. I noted that some programs (Numbers in OSX) will save the file as their default filetype which converts the file into something other than CSV, which means the plugin is unable to read the file to import it back into your project.
Here’s the process to re-import the updated files into your Android application project once again:
- Open the plugin via the Tools menu.
- This time make sure you have the CSV to XML tab selected in the top of the plugin screen.
- Locate your newly translated CSV file in the first box.
- Locate your project and navigate to the res folder. BE VERY careful here as the plugin performs no validation on your project or which directory you chose. It simply converts your CSV back into the Android folder structure and will dump that structure where ever you tell it to.
This can make a big mess inside your project if you are not careful. I found that I actually had to specify the folder above my res folder, otherwise the plugin creates another res folder inside my existing res folder.
You can rinse and repeat those steps as many times as required to complete your translations. Just be very mindful when you are re-importing your translated CSV file back into your project. Make sure that you choose the right location!
Overall this is a useful, simple plugin for translation work, but it doesn’t actually do any translations for you compared to other services and there are a few bugs/issues with the plugin that you need to be aware of otherwise it can make a mess of your project folder structure. However, it does enable you to quickly and accurately export your strings.xml file into a format that is much easier to translate or send to other people to help you translate.
XDA’s Localization Forum
If you are unable or unwilling to pay for one of the professional app translation services and are opting for one of the crowd-sourced services, then you may be asking yourself: how do I find people willing to help translate my app? For starters, building a dedicated base of users is paramount, especially one that is willing to frequently send you feedback. Posting your app on our Android Apps and Games forum and becoming active on your thread is one good way to get a loyal fan base, for starters.
Once you’ve built up a sizable user base, you can start reaching out to them through unobtrusive methods (please don’t bombard people’s inboxes or notifications) such as by posting on or updating your XDA thread. If you would like to keep your XDA thread clean and dedicate a new thread to your app’s translation, consider posting on our Localization forum.
Help with Translation
If you have a favorite app that you would like to see in your native language, as you can see there are a few crowd-sourcing options to help out developers that don’t require you to know anything about development and hopefully get said application moving towards a native translation. First you should contact the developers themselves to see if any translation projects are already underway, or suggest your developer use some of the above options. If the developer already has a project running, then maybe you can help out with the existing one. Once the developer has set up a translation project, you can help by translating the strings one by one in your native languages. Just remember to be polite and offer to help out rather than being pushy and trying to force a developer to get their work translated!
Feature image credits: The Content Wrangler\\Nitish Singh