Arborescence des screenshots multilingues – App Store & Play Store

Les captures d’écran sont un élément essentiel de la présentation d’une application sur les stores mobiles.
Elles influencent directement la conversion, la crédibilité et la qualité perçue de ton produit.
Pour garantir une diffusion fluide et conforme, il est crucial d’adopter une arborescence structurée, des tailles cohérentes, et des captures localisées pour chaque langue.


Structure générale

Chaque store a ses propres règles :

  • Play Store (Android) : captures d’écran classées par type d’appareil, avec des tailles et densités précises.
  • App Store (iOS) : captures classées par format d’écran Apple, générées via les simulateurs officiels Xcode
  • Multilingue → chaque langue possède son propre dossier (fr-FR, en-US, es-ES, etc.).

Play Store (Android)

Arborescence type

/android/
├── fr-FR/
│   └── images/
│       ├── FeatureGraphic.png
│       ├── phoneScreenshots/
│       │   ├── 01_home.png
│       │   ├── 02_features.png
│       │   └── ...
│       ├── sevenInchScreenshots/
│       │   ├── 01_home.png
│       │   └── ...
│       └── tenInchScreenshots/
│           ├── 01_home.png
│           └── ...
│
└── en-US/
    └── images/
        ├── FeatureGraphic.png
        ├── phoneScreenshots/
        ├── sevenInchScreenshots/
        └── tenInchScreenshots/

Le Feature Graphic

Le FeatureGraphic.png est le visuel principal du Play Store.
Il s’affiche en haut de la fiche produit et dans certaines zones promotionnelles du store.

ÉlementTaille (px)Densité (dpi)
FeatureGraphic1024×500160

C’est souvent le premier visuel vu par l’utilisateur : soigne le design, évite les textes trop petits et garde une cohérence visuelle avec tes screenshots.

Tailles et densités recommandées pour les screenshots Android

Type d’appareilDossierTaille (px)Densité (dpi)Max screenshots
TéléphonephoneScreenshots/1080×19204208
Tablette 7″sevenInchScreenshots/800×12802138
Tablette 10″tenInchScreenshots/1600×25603208

⚠️ Si tu dépasses 8 captures par dossier, Google Play bloquera le déploiement

Nommage des fichiers

Le Play Store trie les fichiers par ordre alphabétique.
Pour contrôler l’ordre d’affichage, numérote systématiquement les fichiers

01_home.png
02_features.png
03_profile.png
04_settings.png

Les préfixes numériques (01_, 02_, etc.) sont obligatoires pour garantir une séquence visuelle cohérente.


App Store (iOS)

Arborescence type

/ios/
├── fr-FR/
│   └── images/
│       ├── iPhone 6.7-inch_01.png
│       ├── iPhone 6.7-inch_02.png
│       ├── iPad Pro (12.9-inch) (3rd generation)_01.png
│       ├── iPad Pro (12.9-inch) (3rd generation)_02.png
│       └── ...
│
└── en-US/
    └── images/
        ├── iPhone 6.7-inch_01.png
        ├── iPad Pro (12.9-inch) (3rd generation)_01.png
        └── ...

Limites et méthode de génération

Type d’appareilMéthode recommandéeTaille nativeMax screenshots
iPhone 6.7-inchSimulateur Xcode officielgénérée automatiquement10
iPad Pro (12.9-inch) (3rd generation)Simulateur Xcode officielgénérée automatiquement10

⚠️ N’utilise jamais de captures redimensionnées manuellement : Apple exige des fichiers générés depuis les simulateurs correspondant à la taille d’écran.

Astuce

Les formats iPhone 6.7-inch et iPad Pro (12.9-inch) couvrent presque tous les appareils iOS modernes.

Nommage des fichiers

iPhone 6.7-inch_01.png
iPad Pro (12.9-inch) (3rd generation)_01.png

❗️Respecte scrupuleusement la casse, les espaces et les parenthèses.


Structure multilingue complète

/screenshots/
├── android/
│   ├── fr-FR/
│   ├── en-US/
│   └── es-ES/
└── ios/
    ├── fr-FR/
    ├── en-US/
    └── es-ES/

Importance des screenshots localisés

Les stores affichent automatiquement les images selon la langue de l’utilisateur.
Créer des captures localisées et traduites améliore la compréhension et la conversion.

Mappage des locales (langues et dossiers)

Le mappage des locales est la brique clé qui garantit que les screenshots générés automatiquement correspondent aux formats de langues réellement supportés par le store sur lequel tu publie

Pourquoi ce mappage est essentiel

  • Il permet de convertir les locales du projet (.arb) vers les formats de locales officiels utilisés par chaque store (ex. frfr-FR).
  • Il sert lors de la génération automatique des dossiers de screenshots localisés pour les outils comme Fastlane, CI/CD, ou les scripts internes.
  • Il évite les erreurs de build et de déploiement dues à une langue non supportée sur la plateforme cible.
  • ⚠️ Les listes de langues supportées diffèrent entre le Play Store et l’App Store.
    • Par exemple :
      • Google Play accepte es-419 (Espagnol Amérique latine), non supporté par Apple.
      • L’App Store supporte fr-CA (Français Canada), non reconnu directement par Google Play.

Ce mappage garantit que tu génères uniquement des dossiers de langues compatibles avec le store cible.

Code source complet du mappage des locales

/// Bibliothèque partagée pour mapper les locales du projet aux formats
/// attendus par le Google Play Store et l'App Store Connect.
/// C'est la source de vérité unique pour la logique de mappage.

// ===========================================================================
// LOGIQUE POUR APP STORE CONNECT (IOS)
// ===========================================================================

const Map<String, String> _appleLocaleMapping = {
  'en': 'en-US', 'en-GB': 'en-GB', 'en-CA': 'en-CA', 'fr': 'fr-FR', 'fr-CA': 'fr-CA',
  'es': 'es-ES', 'es-MX': 'es-MX', 'de': 'de-DE', 'it': 'it',
  'pt': 'pt-PT', 'pt-BR': 'pt-BR', 'zh': 'zh-Hans', 'zh-CN': 'zh-Hans', 'zh-HK': 'zh-Hant',
  'zh-TW': 'zh-Hant', 'ja': 'ja', 'ko': 'ko', 'ru': 'ru', 'ar': 'ar-SA',
  'nl': 'nl-NL', 'sv': 'sv', 'fi': 'fi', 'da': 'da', 'no': 'no', 'tr': 'tr',
  'pl': 'pl', 'id': 'id', 'th': 'th', 'vi': 'vi', 'he': 'he', 'ms': 'ms',
  'ro': 'ro', 'cs': 'cs', 'sk': 'sk', 'hr': 'hr', 'uk': 'uk', 'hi': 'hi',
  'el': 'el', 'ca': 'ca', 'et-EE': 'et', 'uk-UA': 'uk',
};

const Set<String> _appStoreSupportedLocales = {
  'ar-SA', 'ca', 'cs', 'da', 'de-DE', 'el', 'en-AU', 'en-CA', 'en-GB', 'en-US',
  'es-ES', 'es-MX', 'fi', 'fr-CA', 'fr-FR', 'he', 'hi', 'hr', 'hu', 'id', 'it',
  'ja', 'ko', 'ms', 'nl-NL', 'no', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk',
  'sv', 'th', 'tr', 'uk', 'vi', 'zh-Hans', 'zh-Hant', 'et'
};

String? toAppleLocale(String locale) {
  if (_appleLocaleMapping.containsKey(locale)) {
    final appleLocale = _appleLocaleMapping[locale]!;
    return _appStoreSupportedLocales.contains(appleLocale) ? appleLocale : null;
  }
  if (_appStoreSupportedLocales.contains(locale)) return locale;
  return null;
}

// ===========================================================================
// LOGIQUE POUR GOOGLE PLAY (ANDROID)
// ===========================================================================

const Map<String, String> _playLocaleMapping = {
  'af': 'af', 'am': 'am', 'bg': 'bg', 'ca': 'ca','lv': 'lv',
  'hr': 'hr', 'et': 'et', 'el': 'el-GR', 'lt': 'lt', 'ms': 'ms', 'ro': 'ro',
  'sr': 'sr', 'sk': 'sk', 'sl': 'sl', 'sw': 'sw', 'fil': 'fil', 'cs': 'cs-CZ',
  'th': 'th', 'uk': 'uk', 'vi': 'vi', 'zu': 'zu', 'gu': 'gu', 'kk': 'kk', 'pa': 'pa',
  'sq': 'sq', 'ur': 'ur', 'ar': 'ar', 'id': 'id', 'in': 'id',
  'fr': 'fr-FR', 'en': 'en-US', 'es': 'es-ES', 'pt': 'pt-BR', 'zh': 'zh-CN',
  'sv': 'sv-SE', 'ta': 'ta-IN', 'te': 'te-IN', 'tr': 'tr-TR', 'de': 'de-DE',
  'fi': 'fi-FI', 'hi': 'hi-IN', 'hu': 'hu-HU', 'is': 'is-IS', 'it': 'it-IT',
  'ja': 'ja-JP', 'ko': 'ko-KR', 'nl': 'nl-NL', 'no': 'no-NO', 'pl': 'pl-PL',
  'ru': 'ru-RU', 'da': 'da-DK', 'az': 'az-AZ', 'be': 'be', 'bn': 'bn-BD',
  'eu': 'eu-ES', 'fa': 'fa-IR', 'gl': 'gl-ES', 'he': 'iw-IL', 'hy': 'hy-AM',
  'ka': 'ka-GE', 'km': 'km-KH', 'kn': 'kn-IN', 'ky': 'ky-KG', 'lo': 'lo-LA',
  'mk': 'mk-MK', 'ml': 'ml-in', 'mn': 'mn-MN', 'mr': 'mr-in', 'my': 'my-MM',
  'ne': 'ne-NP', 'si': 'si-LK', 'en-US': 'en-US', 'en-GB': 'en-GB', 'zh-HK': 'zh-HK',
  'zh-CN': 'zh-CN', 'zh-TW': 'zh-TW', 'es-419': 'es-419', 'es-ES': 'es-ES',
  'fr-CA': 'fr-CA', 'fr-FR': 'fr-FR', 'pt-BR': 'pt-BR', 'pt-PT': 'pt-PT',
};

const Set<String> _playSupportedLocales = {
  'be','ar','af','az','de','am','en-US','en-GB','bg','ca','zh-HK','zh-CN','zh-TW',
  'ko','hr','da','es-419','es-ES','et','fi','fr-CA','fr-FR','el','si','hi','hu','id','in',
  'is','it','ja','lv','lt','ms','nl','mk','my','ne','no','pl','pt-BR','pt-PT','ro','ru',
  'sr','sk','sl','sv','sw','ka','km','kn','ky','lo','mn','mr','fil','cs','th','tr','uk',
  'vi','zu','gu','kk','pa','sq','ta','te','ur','bn','eu','fa','gl','he','hy','ml'
};

String? toPlayLocale(String locale) {
  final normalizedLocale = locale.replaceAll('_', '-');
  if (_playLocaleMapping.containsKey(normalizedLocale)) {
    return _playLocaleMapping[normalizedLocale];
  }
  if (_playSupportedLocales.contains(normalizedLocale)) {
    return normalizedLocale;
  }
  return null;
}

Bonnes pratiques

  • Maintiens ton mappage des locales à jour (locale_mapping.dart) pour générer des screenshots uniquement dans les langues réellement supportées par chaque store.
  • Respecte le format des dossiers de langues (fr-FR, en-US, etc.).
  • Numérote les fichiers Android (01_, 02_, etc.).
  • Utilise les simulateurs Xcode officiels pour iOS.
  • Sur iOS, limite-toi à iPhone 6.7-inch et iPad Pro (12.9-inch) pour couvrir la majorité des cas.
  • Soigne ton Feature Graphic : c’est souvent le premier visuel vu par l’utilisateur.
  • Génère des captures localisées pour chaque langue supportée.
  • Ne dépasse jamais les limites :
    • 8 images max / dossier Android
    • 10 images max / format iOS
  • Teste toujours tes visuels sur les devices correspondants avant déploiement.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *