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.
| Élement | Taille (px) | Densité (dpi) |
| FeatureGraphic | 1024×500 | 160 |
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’appareil | Dossier | Taille (px) | Densité (dpi) | Max screenshots |
| Téléphone | phoneScreenshots/ | 1080×1920 | 420 | 8 |
| Tablette 7″ | sevenInchScreenshots/ | 800×1280 | 213 | 8 |
| Tablette 10″ | tenInchScreenshots/ | 1600×2560 | 320 | 8 |
⚠️ 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’appareil | Méthode recommandée | Taille native | Max screenshots |
| iPhone 6.7-inch | Simulateur Xcode officiel | générée automatiquement | 10 |
| iPad Pro (12.9-inch) (3rd generation) | Simulateur Xcode officiel | générée automatiquement | 10 |
⚠️ 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.
fr→fr-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.
- Google Play accepte
- Par exemple :
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-inchetiPad 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.



