
Le guide complet de la localisation d'applications Android
De strings.xml aux métadonnées du Play Store : localisez votre application Android avec Kotlin, Jetpack Compose, Fastlane et la traduction automatisée par IA.
Configurez votre projet Android pour la localisation
Android utilise une convention basée sur des dossiers pour la localisation. Vos chaînes par défaut se trouvent dans res/values/strings.xml, et les chaînes traduites vont dans des dossiers spécifiques à chaque locale, comme res/values-de/, res/values-ja/, etc.
// Android project structure for localization:
// res/
// ├── values/ ← Default (fallback) locale
// │ └── strings.xml
// ├── values-de/ ← German
// │ └── strings.xml
// ├── values-ja/ ← Japanese
// │ └── strings.xml
// └── values-es/ ← Spanish
// └── strings.xml
//
// Folder naming: values-{language} or values-{language}-r{Region}
// Examples: values-pt-rBR, values-zh-rCN, values-zh-rTWCréez strings.xml
Les ressources de chaînes Android utilisent du XML avec des éléments '<string>' à l'intérieur d'une racine '<resources>'. Utilisez %s pour les espaces réservés de chaînes, %d pour les entiers, et %1$s/%2$s pour les arguments positionnels que les traducteurs peuvent réorganiser.
<!-- res/values/strings.xml -->
<resources>
<string name="welcome_title">Welcome to MyApp</string>
<string name="login_button">Sign In</string>
<string name="settings_label">Settings</string>
<string name="greeting">Hello, %s!</string> <!-- %s = string -->
<string name="item_count">%d items</string> <!-- %d = integer -->
<string name="app_name" translatable="false">MyApp</string>
</resources><!-- ❌ Common mistakes in strings.xml: -->
<!-- Unescaped apostrophe — crashes XML parser silently -->
<string name="message">It's a great day</string>
<!-- Missing from default values/strings.xml — app crashes -->
<!-- (only exists in values-de/strings.xml) -->
<!-- ✅ Correct versions: -->
<string name="message">It\'s a great day</string>
<!-- Or wrap in double quotes: -->
<string name="message">"It's a great day"</string>Gérer les pluriels
Android utilise des éléments '<plurals>' avec des attributs quantity : zero, one, two, few, many, other. Chaque langue cible peut nécessiter des catégories différentes — l'arabe utilise les 6, le russe a besoin de few/many, le japonais n'utilise que other.
<!-- res/values/strings.xml -->
<resources>
<plurals name="items_count">
<item quantity="zero">No items</item>
<item quantity="one">%d item</item>
<item quantity="other">%d items</item>
</plurals>
</resources>
<!-- Usage in Kotlin: -->
<!-- val text = resources.getQuantityString(
R.plurals.items_count,
count, // selects plural form
count // format argument
) -->Utilisation dans le code : Kotlin et Jetpack Compose
Android traditionnel utilise getString(R.string.key) et resources.getQuantityString(). Jetpack Compose utilise stringResource(R.string.key) et pluralStringResource(). Les deux résolvent la traduction correcte selon la locale de l'appareil à l'exécution.
// Traditional Android (Activity/Fragment)
val title = getString(R.string.welcome_title)
val greeting = getString(R.string.greeting, userName)
val items = resources.getQuantityString(
R.plurals.items_count, count, count
)
// Jetpack Compose
@Composable
fun WelcomeScreen(userName: String, itemCount: Int) {
// ✅ stringResource — Compose-aware, triggers recomposition
Text(text = stringResource(R.string.welcome_title))
// ✅ With format arguments
Text(text = stringResource(R.string.greeting, userName))
// ✅ Plurals — count passed TWICE
Text(text = pluralStringResource(
R.plurals.items_count,
itemCount, // selects plural form
itemCount // format argument
))
}Tableaux de chaînes et chaînes formatées
Utilisez '<string-array>' pour les listes ordonnées (par exemple, les options d'une liste déroulante, les étapes d'intégration). Utilisez des arguments de formatage positionnels (%1$s, %2$d) dans les chaînes formatées afin que les traducteurs puissent réorganiser les mots sans casser la structure de la phrase.
<!-- res/values/strings.xml -->
<resources>
<!-- String array for dropdown/list -->
<string-array name="sort_options">
<item>Most Recent</item>
<item>Most Popular</item>
<item>Price: Low to High</item>
<item>Price: High to Low</item>
</string-array>
<!-- Positional format args for reordering -->
<string name="welcome_message">
Hello %1$s, you have %2$d new messages
</string>
<!-- Translators can reorder: -->
<!-- %2$d neue Nachrichten für %1$s -->
</resources>Localisez les métadonnées Google Play avec Fastlane
Utilisez la commande supply de Fastlane pour gérer les métadonnées du Play Store — titre, description courte, description complète et journaux des modifications — sous forme de fichiers texte brut organisés par locale dans votre dépôt.
# Install Fastlane
$ gem install fastlane
# Initialize supply for Play Store metadata
$ fastlane supply init
# Directory structure created:
# fastlane/metadata/android/
# ├── en-US/
# │ ├── title.txt # App name (50 chars)
# │ ├── short_description.txt # Short desc (80 chars)
# │ ├── full_description.txt # Full desc (4000 chars)
# │ └── changelogs/
# │ └── default.txt # What's New
# ├── de-DE/
# │ └── ...
# └── ja-JP/
# └── ...
# Push metadata to Play Store:
$ fastlane supplyAutomatisez la localisation de votre fiche Play Store
Oubliez le copier-coller manuel. Traduisez le titre, la description et les notes de version de votre fiche Play Store dans plus de 175 locales, en tenant compte des limites de caractères.
Découvrez l'intégration Google PlayTester votre localisation
Testez avec le changement de locale de l'émulateur, les aperçus Compose avec un LocaleList personnalisé, et les pseudo-locales dans les options pour les développeurs. Utilisez resConfigs dans Gradle pour retirer les ressources de locales indésirables des bibliothèques tierces.
// 1. Emulator: Settings > System > Language > Add language
// 2. Compose Preview with locale:
@Preview
@Composable
fun WelcomePreview() {
val config = Configuration(resources.configuration).apply {
setLocale(Locale("de"))
}
val localContext = LocalContext.current
val localizedContext = localContext.createConfigurationContext(config)
CompositionLocalProvider(
LocalContext provides localizedContext
) {
WelcomeScreen()
}
}
// 3. Restrict library locales in build.gradle.kts:
android {
defaultConfig {
// Only include locales you actually translate
resourceConfigurations += listOf("en", "de", "ja", "es", "fr")
}
}
// 4. Enable pseudolocales in Developer Options:
// en-XA (accented) — detects hardcoded strings
// ar-XB (RTL) — tests layout mirroringAutomatiser la qualité des traductions
Automatiser les traductions
Traduisez vos fichiers strings.xml, vos pluriels, vos tableaux de chaînes et vos métadonnées Fastlane Supply grâce à l'IA. Automatisez la traduction des chaînes intégrées à l'application comme des métadonnées du Play Store pour une présence entièrement localisée.
# Translate strings.xml files
> Translate res/values/strings.xml
to Japanese, German, and Spanish
# Translate Play Store metadata too
> Translate fastlane/metadata/android/en-US/
to de-DE, ja-JP, es-ES
✓ 6 files translated in 3.2sPlugin Android Studio disponible
Traduisez les ressources XML Android directement depuis votre IDE grâce au plugin i18n Agent pour IntelliJ / Android Studio.
Bonus : repli de locale intelligent avec LocaleChain
Le repli des ressources Android est contrôlé par le système d'exploitation. Lorsque les traductions pt-BR sont manquantes, Android ignore complètement pt-PT et affiche l'anglais. LocaleChain intercepte les recherches de chaînes et parcourt une chaîne de repli configurable — les utilisateurs régionaux voient ainsi la traduction disponible la plus proche.
LocaleChain pour Android est une bibliothèque Kotlin open source. Voir sur GitHub
// build.gradle.kts (app module)
dependencies {
implementation("com.i18nagent:locale-chain-android:0.1.0")
}// 1. Application.onCreate() — configure chains once
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
LocaleChain.configure()
}
}
// 2. BaseActivity — wrap context per Activity
open class BaseActivity : AppCompatActivity() {
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(LocaleChain.wrap(newBase))
}
}
// pt-BR user with only pt-PT translations?
// → Shows Portuguese instead of falling back to English
// Custom overrides for your specific locales:
LocaleChain.configure(
overrides = mapOf("es-MX" to listOf("es-419", "es"))
)Pièges courants
Les chaînes par défaut manquantes provoquent des plantages
Les découpages linguistiques des App Bundles cassent le changement de langue dans l'application
Mises en page RTL cassées
Contamination des ressources par les bibliothèques
Structure de fichiers recommandée
MyApp/
├── app/
│ └── src/main/
│ ├── res/
│ │ ├── values/
│ │ │ ├── strings.xml # Default (source) strings
│ │ │ └── plurals.xml # Plural rules
│ │ ├── values-de/
│ │ │ └── strings.xml
│ │ ├── values-ja/
│ │ │ └── strings.xml
│ │ └── values-es/
│ │ └── strings.xml
│ ├── java/com/example/myapp/
│ └── AndroidManifest.xml
├── fastlane/
│ └── metadata/android/
│ ├── en-US/
│ │ ├── title.txt
│ │ ├── short_description.txt
│ │ ├── full_description.txt
│ │ └── changelogs/default.txt
│ ├── de-DE/
│ └── ja-JP/
├── build.gradle.kts
└── settings.gradle.ktsTraduisez également :
Essayez i18n Agent maintenant
Déposez votre fichier de traduction ici
JSON, YAML, PO, XML, CSV, Markdown, Properties
ou cliquez pour parcourir
Langues cibles
Repli de locale avec locale-chain-android
Lorsqu'une clé de traduction est manquante dans une locale régionale comme pt-BR, Android passe directement au dossier de ressources par défaut au lieu de vérifier d'abord la locale parente pt.
implementation("com.i18nagent:locale-chain-android:0.1.0")import com.i18nagent.localechain.LocaleChain
LocaleChain.configure(
overrides = mapOf(
"pt-BR" to listOf("pt", "en"),
"zh-Hant-HK" to listOf("zh-Hant", "zh", "en"),
)
)Consultez notre guide de repli de locale pour découvrir la liste complète des frameworks pris en charge et les 75 chaînes intégrées. Learn more →