How to Localize an Application
When developing an application or website for an audience from different countries, it is necessary to think in advance about how localization will be implemented.
In the past, I have encountered custom-made systems for localizing language labels in almost every company. I have nothing against custom solutions, but only when there is time, resources, and a need for it. When resources are limited, such as when you’re independently building an open source pet project in your free time or a startup looking for its Product Market Fit, spending time on non-focus activities is harmful.
I agree that translations can be done in code, but there is a difficulty with transmitting and updating language files (if you involve someone for help). This is where the category of Localization Management Platforms comes into play.
What is a Localization Management Platform?
Usually, these are SaaS products that allow you to translate language labels within their service. Typically, all of these services already have:
- Convenient UI/UX;
- Automatic translation of labels with machine translation;
- The ability to order paid translation directly in the cloud (when you need a meaningful translation, but you’re too lazy to look for a translator);
- Notifications of what is left to translate;
- The ability to invite various roles to localization: translator, QA, proofreader;
- and many other perks.
Sounds good, right?
Examples of such services: localize, poeditor, crowdin, weglot, globallink, transifex, …
Which translation platform is the best to choose?
I won’t dwell on reviewing popular services, as they can be easily found on YouTube. Instead, I will focus on a specific case: you are an indie developer who is creating an open source product for fun, or your product is not yet generating profits, and you want to expand your user base through localization.
I have a pet project that I am slowly developing and experimenting with different technologies and approaches. I don’t want to spend a lot of money on experiments, so I am looking for services that offer their services for free for open source projects, or self-hosted versions.
After watching several reviews of localization systems, I decided to go with crowdin.
Why Crowdin?
Crowdin seems like a good choice for several reasons. Firstly, they offer a free account for one private project with up to 60,000 words. For public projects, there are no limits on the number of projects or words. This is particularly great for open-source projects, as you can use Crowdin’s translation system separately from your source code, making localization much easier and expanding the possibilities for adding new languages.
Another great advantage of Crowdin is the direct synchronization with your repository. The service opens pull requests with language file changes and automatically pulls in the latest changes from your repository. This saves a lot of time and effort.
Finally, Crowdin supports many different language file formats, including JSON. This makes it a flexible and versatile option for many projects.
How to connect Crowdin to your project?
- Register on Crowdin;
- Create a project in it;
- Set up integration with Github;
- Create a configuration file
My configuration file crowdin.yml
looks like this:
files:
- source: /src/i18n/ru-RU/index.js
translation: /src/i18n/%locale%/%original_file_name%
Here it is visible which file is the language source and the path where translations should be located. The full set of options can be viewed here.
After completing the setup and adding a new language or updating translations, the service will carefully create the necessary files and pull request to the main branch. You will only need to review the changes and accept the PR.
Crowdsourcing for translations
If you create a public project, you can invite community members (or your spouse) to contribute to translations, so that work on translations can be done faster and asynchronously from development. The service allows you to “approve” suggested changes from other contributors.
The project’s public page may look like this:
Translated by ChatGPT