App Store Connect: Can't change Primary Locale to nl-NL — 19 historical versions blocked by missing screenshots, API returns 409

I'm trying to change an app's Primary Language in App Store Connect from de-DE to nl-NL and hitting a state I can't resolve through any interface available to me.

Environment

  • App Store Connect (web UI) and App Store Connect API v1

Problem UI: App Information → Primary Language → nl-NL → Save fails with: "Primary Locale couldn't be saved because you must first provide all the required screenshots for each version in this language."

API: PATCH /v1/apps/1669670490 with attributes.primaryLocale = "nl-NL" returns HTTP 409: ENTITY_ERROR.ATTRIBUTE.INVALID.INVALID_STATE.MISSING_SCREENSHOTS_PRIMARY_LOCALE

Error detail contains an unsubstituted placeholder: "...you must first provide all the required @@LANGUAGE_VALUE@@ screenshots..."

What I've verified

  • Current live version (3.7.6) and current editable version (3.7.11) both have complete nl-NL screenshot sets for all required device sizes (6.9" iPhone, 13" iPad). No Watch app, iMessage extension, Custom Product Pages, In-App Events, or IAPs.
  • Enumerated all 23 versions via the API (1.0 → 4.1.0). 19 of them have an nl-NL appStoreVersionLocalization (with real historical description/keywords/support URL) but zero nl-NL screenshots attached.
  • Tried POSTing an nl-NL screenshot set to one historical version (4.1.0) directly via the API to confirm this isn't just a UI restriction. Also returns 409 ENTITY_ERROR.ATTRIBUTE.INVALID.INVALID_STATE — historical versions are locked against edits (including screenshots) at the API level, not just the UI.

Question Since these historical versions can't be edited through any supported interface, is there a documented way to satisfy or bypass the "screenshots for each version" check for locked historical versions when changing Primary Locale? Filed as case 20000130035264 with Developer Support, who pointed me here for the technical side.

Please submit a bug report with screenshots of the issues you're seeing, especially the error with the placeholder text.

This is what I see when I try to update the primary language:

However, I have media uploaded for the "Dutch" language in the new version that is ready for submissions and the existing prod version.

Just a few ideas.

  • What are the languages defined ? May be it is missing in something else than dutch.

  • Have you checked that you have an nl.lproj file defined in Settings ?

  • Did you try to set the primary language from the dutch page (not German) ?

@Claude31 @Frameworks EngineerThanks for putting those ideas out there :D

  • When we took over the app it had English and German, so I wanted to add dutch and make it the primary language since the app is only available in Dutch and English. I've checked the other languages and made sure that we have media for all of them on the highest resolution display
  • This was something I was not aware of, we use Expo, so what I did was add some lines to the app.config that would then later generate the nl.lproj file. I will try this new bundle later, and I will follow-up on this with you.
{
    locales: {
      en: './locales/en.json',
      nl: './locales/nl.json'
    },
    build: {
      ....
      infoPlist: {
        CFBundleLocalizations: ['en', 'nl'],
        CFBundleAllowMixedLocalizations: true
      }
 }
  • I've tried to do it from the other languages and nothing helped there.

@Claude31 No luck on the changes to the expo config

@tomgreef are you sure that this change creates an nl.lproj directory with Root inside ?

This is what I see in Xcode, but we create the ios folder from Expo in CI/CD, so this is a local build I made @Claude31

@tomgreef so you have the infoPlist, but I do not see Root files.

Here is what I get in my projects:

I think that's expected in my case. From what I can tell those Root.strings inside each <lang>.lproj belong to a Settings.bundle, which localizes the app's pane in iOS Settings.app. We don't ship a Settings bundle (Expo doesn't generate one by default), so the only thing in our en.lproj / nl.lproj is InfoPlist.strings, which is what the CFBundleLocalizations change produced.

I did rebuild and re-upload with the localization config in place, and App Store Connect still rejects the primary locale change with the same error, so I don't think the binary side is what's being validated here.

Coming back to the original issue: the 409 is MISSING_SCREENSHOTS_PRIMARY_LOCALE raised against historical appStoreVersions (19 of our 23 versions have an nl-NL localization with description and keywords, but no screenshots attached). Those versions are locked against edits at the API level too, not just in the UI, so there's no interface I can use to attach screenshots to them. That looks like metadata state that no new build can change.

App Store Connect: Can't change Primary Locale to nl-NL — 19 historical versions blocked by missing screenshots, API returns 409
 
 
Q