How we shipped 17 languages in Googly Player without English leaking through
Our Android media app lets people pick any of 17 languages regardless of their phone's setting. These are the engineering decisions that keep the picker from failing quietly for the users it was built for.
An in-app language picker is easy to add and easy to get wrong in ways your test devices never show. If the phone is set to English and so is the developer, every screen looks right. The failures belong to the people the picker was built for: someone who cannot find their language because it is listed as Bengali rather than বাংলা, an Arabic screen where a count sits on the wrong side of its label, a Russian plural that reads like a typo.
The worst failure is silent. Publish an Android App Bundle with the default settings and Google Play delivers only the resources for the device's system language. Choose Hindi on a phone set to English and the app keeps rendering in English: no crash, nothing in the logs, nothing to tell anyone it went wrong.
Googly Player, our Android app for videos, music and photos, ships 17 languages through its own picker, entirely independent of the system language. This is how we built it so that none of those failures happen, and which decisions you can copy if you are building the same thing.
Key takeaways
- Every language is listed by its own name in its own script, with the English name underneath, in a searchable list that suggests languages from the device locale.
- The choice is applied process-wide through AppCompatDelegate.setApplicationLocales, so services, notifications and dialogs follow it, not only activities.
- We disable language splits in the App Bundle; without that, Play ships only system-language resources and the picker quietly falls back to English.
- Counts use format strings and plural resources, because concatenation breaks right-to-left word order and Arabic needs six plural forms, Russian four.
Seventeen languages, each listed in its own script
The picker offers English, Hindi, Spanish, Arabic, French, Bengali, Portuguese, Russian, Urdu, Indonesian, German, Japanese, Turkish, Vietnamese, Korean, Italian and Gujarati. Each one appears under its endonym, the name the language uses for itself, written in its own script, as the primary label. The English name sits underneath as a secondary line.
The order of those two lines is the point. Someone looking for their language scans for the word they read every day, not for the name an English speaker would use. A Gujarati reader who has ended up in an English interface by accident, or handed a phone set up by someone else, can find ગુજરાતી without reading a word of English. The English name stays for everyone else: the support person helping over the phone, the relative setting up the device.
| Listed as | English name | Direction |
|---|---|---|
| English | English | Left to right |
| हिन्दी | Hindi | Left to right |
| Español | Spanish | Left to right |
| العربية | Arabic | Right to left |
| Français | French | Left to right |
| বাংলা | Bengali | Left to right |
| Português | Portuguese | Left to right |
| Русский | Russian | Left to right |
| اردو | Urdu | Right to left |
| Bahasa Indonesia | Indonesian | Left to right |
| Deutsch | German | Left to right |
| 日本語 | Japanese | Left to right |
| Türkçe | Turkish | Left to right |
| Tiếng Việt | Vietnamese | Left to right |
| 한국어 | Korean | Left to right |
| Italiano | Italian | Left to right |
| ગુજરાતી | Gujarati | Left to right |
Search, and a Suggested section from the device locale
Seventeen entries is enough to scroll past the one you want, so the list is searchable. Above the full list sits a Suggested section built from the device locale. A phone set to Spanish puts Español within reach before any scrolling; a phone set to Turkish puts Türkçe there.
The suggestion is a shortcut, not a constraint. Because the app's language is entirely independent of the system language, someone with an English phone can still choose Japanese, and someone who reads Urdu at home can keep a German work phone in Urdu for this one app. That independence is the reason the picker exists at all, and it is also what makes the next three engineering decisions necessary rather than optional.
Right-to-left that holds up in Arabic and Urdu
Arabic and Urdu are written right to left, and Googly Player supports both fully. A right-to-left reader starts at the right edge of the screen, and an interface that is translated but not mirrored makes them read every screen against the grain.
The picker itself is where this is easiest to miss. It is a list of mixed scripts, most of them left to right, with two that are not. We anchor the Arabic and Urdu language names correctly within the picker, so العربية and اردو line up the way their readers expect instead of being treated as just more left-to-right text. Right-to-left also changes where numbers sit inside sentences, which is a separate trap we come back to below, because getting the layout right does not fix strings that were assembled in the wrong order in code.
One setting, applied to the whole process
Changing the language for the screen in front of the user is the easy part. A media player has more surfaces than screens. Googly Player plays in the background through a foreground media playback service and shows a media notification, and it raises dialogs on top of whatever is open. If the locale only reaches activities, the notification you see on the lock screen stays in the old language while the app itself has switched.
We apply the choice process-wide through AppCompatDelegate.setApplicationLocales. That one call covers services, notifications and dialogs as well as activities, so the media notification, the playback service and every prompt follow the language the user picked, without each component having to remember to look it up.
On Android 13 and later, the system knows too
Android 13 introduced per-app language settings at the platform level, and on those versions we hand the choice to the platform. The language you pick inside Googly Player also appears under Settings › Apps › Googly Player › Language, and that is the same setting, reachable from either side.
Open the language picker
It works whatever language the phone itself is set to.
Find your language
Search by name or take one from the Suggested section, which is based on the device locale.
Or use system Settings on Android 13+
Go to Settings › Apps › Googly Player › Language to see or change the same choice.
The App Bundle trap: every translation ships in the base APK
Android App Bundles split resources by language by default. Google Play then delivers each device only the language resources matching its system language. For most apps that is a sensible saving, because most apps follow the system language anyway.
For an app with its own picker it is a quiet disaster. The translations exist in the project and pass every test on the developer's machine, but on a user's phone the picker would silently render everything in English, because the requested language's resources were never installed. There is no crash and nothing in the logs. The only signal is a user who picks Bengali and gets English, and who probably just uninstalls.
We deliberately disable language splits in the App Bundle, so every translation ships in the base APK. Every install carries all 17 languages, and switching never depends on resources the phone does not have.
Numbers inside sentences: format, never concatenate
A label with a count in it looks harmless: a heading, the number, done. Written in code as the string "Total Videos: " plus n, the order of label and number is fixed by the developer, in English order, before any translator sees it. In Arabic and Urdu that puts the number on the wrong side of the label.
Every count in Googly Player is formatted instead, from a resource such as "Total Videos: %d". The whole sentence, placeholder included, goes to translation, so each language decides where the number belongs. It is a small discipline that costs nothing at write time and cannot be retrofitted cheaply once concatenated strings are scattered through a codebase.
Plurals: six forms in Arabic, four in Russian
Format strings fix the position of a number but not the words around it. English gets away with a singular and a plural, which tempts developers into a single format string with an s on the end. Other languages need more. Arabic has six grammatical forms for a number and Russian has four, and no single format string can express that.
Googly Player uses proper Android plural resources for every count. The code asks for the right form of a phrase for a given number, and each translation supplies as many forms as its grammar has: six for Arabic, four for Russian. The result is that a count of videos, tracks or photos reads as a native speaker would write it, rather than as a sentence that is technically translated and visibly machine-assembled.
What it runs on, and what to copy
Googly Player is an Android app, and the language support described here is built into the same install: all 17 translations ship in the base APK, so nothing extra is fetched when someone switches. The in-app picker works whatever the system language is. On Android 13 and later the choice also lives in system Settings under the app's own entry, and Arabic and Urdu get full right-to-left layout. The app is built on Material Design 3 and picks up the wallpaper palette through dynamic colour on Android 12 and later.
If you are building an Android app that lets people choose their own language, these are the decisions we would make again:
- List languages by endonym first, English name second, and make the list searchable with suggestions from the device locale.
- Apply the locale with AppCompatDelegate.setApplicationLocales so services, notifications and dialogs follow it.
- Let Android 13 and later own the setting, so it appears under the app in system Settings.
- Disable language splits in the App Bundle, or the picker will silently show English.
- Format every count with a placeholder, and use plural resources for every phrase that depends on a number.
Questions
Does Googly Player's language have to match my phone's language?
No. The in-app picker is entirely independent of the system language. The Suggested section uses your device locale as a starting point, but any of the 17 languages can be chosen on any phone.
Which languages read right to left?
Arabic and Urdu. Both have full right-to-left support, including correctly anchored language names in the picker itself.
Can I change the app's language from Android Settings?
On Android 13 and later, yes. The choice is handed to the platform, so it appears under Settings › Apps › Googly Player › Language as well as inside the app.
Will the media notification switch language too?
Yes. The language is applied process-wide, which covers services, notifications and dialogs, not only the app's screens.
- #Android localisation
- #Android plural resources
- #Googly Player
- #format strings
- #in-app language picker
- #right-to-left Arabic Urdu



Comments