Debugging log · App Bundle
My app shipped in English only — and the translations were right there
This one cost me the better part of two days, so I'm writing it down. I had an app fully translated across a dozen languages. Every res/values-xx folder was in place, the strings were correct, and on my own phone in debug it switched languages perfectly. Then I released the App Bundle, changed my phone to Korean, installed from the Play track — and got English. Not a fallback here and there. Everything, in English.
The short version: Google Play splits an App Bundle by language and delivers only the resources for the device's locale. When that split misbehaves, the device falls back to your base (English) strings. Turning language splitting off in build.gradle makes every language ship together and fixes it.
What I wasted time on first
Because it worked in debug, my instinct was that the translations themselves were broken. They weren't. Here's what I checked that turned out to be fine — so you can skip it:
- The
values-xxfolders. All present, correctly named, no typos in the locale qualifiers. - The device locale. The phone really was set to another language; other apps localized correctly.
- Missing keys. Every string existed in every language file. This wasn't a per-string fallback.
- Debug builds. A debug APK installs every resource at once, so it localizes fine — which is exactly why the bug hides until you go through a bundle.
That last point is the trap. A debug build is a single APK with all languages inside, so it can never reproduce the problem. The bug only appears once Play takes your .aab and splits it.
The actual cause: per-language splitting
An Android App Bundle isn't what lands on the user's device. Play generates split APKs from it and delivers only the ones the device needs — including a language split that ships just the device-locale strings to keep the download small. In theory the right language arrives; in practice, if that split doesn't get applied the way you expect, the device is left with only the base resources, which for most of us means English.
The fix: turn language splitting off
The reliable fix is to tell the bundle not to split by language, so every translation is packaged together. In your module's build.gradle:
android {
bundle {
language {
// Don't split by language — ship every locale in the base
enableSplit = false
}
}
}
After this, the released build carries all languages and localizes correctly regardless of how Play assembles the splits. The trade-off is a slightly larger download, since users get every language instead of just theirs. For an app with normal-sized string files that difference is tiny, and correct localization is worth far more than a few kilobytes.
One more thing that bit me: resource shrinking
While chasing this I also hit resource stripping removing localized resources it thought were unused. If you're minifying, make sure shrinking isn't eating your translations. Building with minifyEnabled false confirmed the strings survived; if you keep minification on, verify your keep rules so localized resources aren't dropped.
How to verify before you ship again
Don't trust a debug build here. Reproduce the real delivery instead:
- Upload to an internal or closed testing track and install through Play, then switch your device language. That's the true end-to-end test.
- Or generate the split APKs locally from your
.aabwith bundletool and install the set, so you exercise the same splitting Play does — not a single universal APK, which papers over the bug.
Rule of thumb: if localization works in debug but not from a release bundle, suspect the language split first — not your translation files.
This is the war-story version. For the tight, copy-paste reference, see the companion guide below.