How Googly Player Handles 17 Languages, Including the Android Settings That Break Them Silently

Seventeen languages, two writing directions, and one App Bundle setting that decides whether any of it reaches the device. Here is how our media app gets localisation right.

Binary Buddies · 5 min read · 0 views
Evening over a city of lit windowsA night skyline under a crescent moon, with lanterns strung across a balcony and headphones and a steaming cup resting on the rail.

Localising an Android app tends to fail quietly. The language picker works on the developer's phone and passes every check, and then, for people who install the app from Play, it renders everything in English. There is no crash and nothing in the logs. Elsewhere, a count lands on the wrong side of its label in Arabic, and a Russian plural reads as if a machine wrote it.

None of these are translation problems. The strings can be perfect. They are build settings, platform calls and string-formatting habits, and each one is invisible until someone reading Urdu or Arabic opens the app and sees it get their language wrong.

Googly Player is our Android app for videos, music and photos, and it ships a full in-app language picker covering 17 languages. This is how we built it, and what each decision prevents. If you are shipping your own app to multilingual users, or deciding whether we are the team to build one, these are the details that matter.

Key takeaways

  • The app's language is chosen inside the app, independently of the phone's system language, and it applies everywhere: activities, services, notifications and dialogs.
  • Language splits are disabled in the App Bundle. Without that, the picker silently falls back to English for users who install from Play.
  • Arabic and Urdu get full right-to-left support, and numbers are formatted into strings, never concatenated, so they sit on the correct side of the label.
  • Plurals use real plural resources, because Arabic needs six grammatical forms for a number and Russian needs four.

Seventeen languages, chosen inside the app

Googly Player's language picker is independent of the system language. A phone can be set to English while the media app on it runs in Hindi or Bengali, or the other way round. The choice belongs to the person using the app, not to whoever configured the device.

  • English
  • Hindi (हिन्दी)
  • Spanish (Español)
  • Arabic (العربية)
  • French (Français)
  • Bengali (বাংলা)
  • Portuguese (Português)
  • Russian (Русский)
  • Urdu (اردو)
  • Indonesian (Bahasa Indonesia)
  • German (Deutsch)
  • Japanese (日本語)
  • Turkish (Türkçe)
  • Vietnamese (Tiếng Việt)
  • Korean (한국어)
  • Italian (Italiano)
  • Gujarati (ગુજરાતી)

The list covers several scripts and two writing directions, which is why the engineering below exists at all. Supporting Latin-script languages alone would have hidden most of these problems. Arabic and Urdu read right to left, Arabic and Russian have plural systems that English-shaped code cannot express, and Japanese, Korean, Hindi, Bengali and Gujarati each need their own script rendered correctly next to everything else in the picker.

17languages in the in-app picker
2right-to-left languages: Arabic, Urdu
6plural forms Arabic needs
4plural forms Russian needs

A picker people can read in their own script

Each language is listed by its endonym, its own name written in its own script, as the primary label, with the English name underneath. Someone looking for Bengali sees বাংলা first. Someone who reads only English, perhaps setting the app up for a relative, still sees Bengali beneath it. A list written only in English would ask people to recognise their own language by a foreign name, which is the opposite of what a language picker is for.

The picker is searchable, and it opens with a Suggested section based on the device locale. In most cases the language a person wants is already near the top before they type anything. With 17 entries, the search field is not decoration: it is the quickest route for anyone whose language is further down the list, and the Suggested section covers the common case without making them scroll.

Sunrise over layered hillsA sun rising behind layered hills, with birds crossing the sky, mist drifting over the valley and reeds moving in the foreground.

Arabic and Urdu, right to left

Arabic and Urdu get full right-to-left support. Layout mirroring is the obvious part, and Android does much of it for you if your layouts are written to allow it. The less obvious part is the picker itself, where right-to-left and left-to-right names sit in the same list. We anchor each language name correctly, so العربية and اردو align as right-to-left text should, rather than being pushed to the wrong edge by an interface laid out in English.

That detail is small, but it is the first thing an Arabic or Urdu reader sees when they look for their language. A misaligned endonym tells them, before they have changed a single setting, that the app was not really built with them in mind. Getting it right in the picker is how the rest of the localisation earns trust.

One setting for the whole process

The language choice is applied process-wide through AppCompatDelegate.setApplicationLocales. That matters because an app is not only its activities. A language setting applied screen by screen leaves services, notifications and dialogs behind, still speaking whatever the system language happens to be.

For a media app this is not an edge case. Background playback on modern Android runs as a foreground service with a media notification; Googly Player declares FOREGROUND_SERVICE, FOREGROUND_SERVICE_MEDIA_PLAYBACK and, on Android 13 and later, POST_NOTIFICATIONS for exactly that. The notification is often the part of the app people look at most while music plays, so it has to follow the chosen language too.

On Android 13 and later, the choice is also handed to the platform, so it appears in system Settings under Settings › Apps › Googly Player › Language. People can change the app's language from either place, and the two stay consistent because there is only one setting underneath.

How the language choice reaches the whole appThe in-app picker passes the choice to setApplicationLocales, which applies it to activities, services, notifications and dialogs; on Android 13 and later the platform also holds the choice in system Settings.In-app language pickersetApplicationLocalesActivitiesServicesNotificationsDialogsAndroid 13+: also in system Settings
One call carries the language to every part of the app, and on Android 13 and later the system keeps the same choice.

The App Bundle setting that decides whether any of this works

Play builds per-device APKs from an App Bundle, and by default it splits resources by language. A device whose system language is English receives English resources and nothing else. That is efficient for an app that only follows the system language. For an app with its own picker it is fatal: the person chooses Hindi, the Hindi strings were never delivered to the device, and Android falls back to the default.

The failure mode is what makes it dangerous. Nothing crashes. Nothing appears in the logs. The picker simply renders everything in English, and a build installed straight from your machine, which carries every resource, will never show you the problem. We deliberately disable language splits in Googly Player's App Bundle, so every translation ships in the base APK and every language in the picker is present on every device.

Language splits enabled versus disabledWith language splits enabled, Play delivers only system-language resources and the picker renders English with no crash and nothing in the logs. With splits disabled, every translation ships in the base APK and the picker shows the chosen language.Language splits enabledOnly system-language resourcesPicker renders EnglishNo crash, nothing in logsLanguage splits disabledEvery translation in base APKPicker shows chosen language
The same picker, two bundle settings: only the right-hand path delivers the languages it offers.

Numbers belong inside the format string

Every count in Googly Player is formatted, never concatenated. A label is written as "Total Videos: %d", not as "Total Videos: " + n. In English the two produce the same output, which is exactly why concatenation survives code review.

In Arabic and Urdu it does not. Concatenation glues the number to a fixed end of the string, and in a right-to-left sentence that puts it on the wrong side of the label. A format string keeps the number as a placeholder inside the sentence, so each translation decides where it goes and the text reads naturally in both directions. The fix costs nothing when the code is first written; finding and changing every concatenated count later is the expensive version.

Concatenated versus formatted countsConcatenating a label and a number puts the number on the wrong side in Arabic and Urdu; a format string with a placeholder lets each translation place the number.Concatenated"Total Videos: " + nWrong side in Arabic, UrduFormatted"Total Videos: %d"Number placed by translation
The placeholder version lets each language put the number where its own grammar and direction need it.

Plurals: six forms in Arabic, four in Russian

A format string solves placement, but not grammar. English gets away with a singular and a plural. Arabic needs six grammatical forms for a number, and Russian needs four. No single format string can express that, however carefully it is written, because the words around the number change with the number itself.

Googly Player uses proper plural resources for every counted label. Each language supplies as many forms as its grammar requires, and Android picks the right one for the actual count at runtime. The code asks for a count of videos; the resource for that language decides what the sentence looks like. That keeps grammar where it belongs, in the translations, and keeps the code identical across all 17 languages.

Plural forms needed for a numberA bar chart: Arabic needs six grammatical plural forms for a number and Russian needs four.Plural forms a number needsArabic6Russian4
Bar lengths are to scale: Arabic needs six forms of a counted phrase and Russian four, which is why counts use plural resources.

What it needs and how to use it

Googly Player is an Android app. The in-app picker works independently of the system language, and on Android 13 and later the choice is also registered with the platform, so it shows up in system Settings. Because we ship through Play as an App Bundle with language splits disabled, every one of the 17 languages is on the device from the moment the app is installed. Nothing is downloaded when you switch.

  1. Open the language picker

    Each entry shows the language in its own script, with the English name underneath.

  2. Pick from Suggested, or search

    The Suggested section is based on your device locale; the search field finds anything else in the list.

  3. Use the app in that language

    The choice applies across the whole app, including playback notifications and dialogs, with full right-to-left layout for Arabic and Urdu.

  4. On Android 13 or later, change it from Settings too

    Go to Settings › Apps › Googly Player › Language. It is the same setting as the one in the app.

If you are building your own app, the lessons carry over directly: apply the locale process-wide, disable language splits, format every count, and use plural resources from the first string. These are the decisions we make by default when we build Android software for clients, because each one is cheap to get right at the start and expensive to discover after launch.

Questions

Does choosing a language in Googly Player change my phone's language?

No. The in-app picker is independent of the system language. On Android 13 and later the choice also appears in the app's own entry in system Settings, but it only affects Googly Player.

Will notifications and background playback follow the language I choose?

Yes. The language is applied process-wide through AppCompatDelegate.setApplicationLocales, so services, notifications and dialogs follow it as well as the main screens.

Why do some apps' language pickers only ever show English?

A common cause is App Bundle language splits. Play then delivers only the system-language resources, and the picker falls back to English with no crash and nothing in the logs. We disable language splits so every translation ships in the base APK.

Which languages are right to left?

Arabic and Urdu. Both get full right-to-left support, including correctly anchored names in the language picker and counts formatted so numbers sit on the correct side of their labels.

  • #Android localization
  • #Android plural resources
  • #Googly Player
  • #RTL support Android
  • #in-app language picker
  • #setApplicationLocales

Comments

Add a comment
Sign in with Google to join the conversation