Evolution of Translations Management for Android
Article Summary
Yaroslav T from Revolut reveals how managing translations for 6 apps across 330 modules and 33 languages evolved from a simple library to a custom Gradle plugin. The journey took 7 years and countless iterations.
Revolut's Android team needed to scale their translation workflow as they grew from a single app to a multi-app, multi-module architecture. They partnered with Lokalise for translations but had to completely rethink their engineering approach multiple times to handle the complexity.
Key Takeaways
- Started with Lokalise SDK but hit API limits and performance issues
- Migrated through Python, Groovy, Yaml/Bash/Kotlin before landing on custom Gradle plugin
- Final solution enables parallel downloads and independent module configuration
- Automated CI pipeline prevents merge conflicts and protects older app versions
- Non-transitive R classes solved duplicate strings across 300+ modules
A custom Gradle plugin with conventional configuration replaced fragile Bash scripts, enabling each of 330+ modules to manage translations independently while preventing conflicts and breaking changes.
About This Article
Revolut's codebase spans over 1 million lines of code across 330 modules. Managing translations required flexibility, but their Yaml, Bash, and Kotlin setup was fragile and hard to test. The system also couldn't download translations in parallel.
Yaroslav T's team wrote a custom Gradle plugin in Kotlin. It removed the need for Yaml configs and Bash scripts. Instead, each module could declare its translation needs directly in Gradle configuration blocks.
The plugin made it possible to run unit and integration tests in CI. It eliminated six separate Bash scripts that had to be maintained. Translation downloads across all 330+ modules now run in parallel without duplicating configuration.