Mr.AndroidShin / Dev Tools

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:

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:

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.