Skip to main content

Le guide complet de la localisation des applications iOS

De Localizable.strings aux métadonnées App Store : localisez votre application iOS avec Xcode, SwiftUI, Fastlane et la traduction automatisée par IA.

1

Activer la localisation dans Xcode

Ouvrez les paramètres de votre projet Xcode, accédez à Info > Localizations, puis ajoutez les langues que vous souhaitez prendre en charge. Xcode crée automatiquement des répertoires .lproj pour chaque langue.

Xcode Project Settings
// In Xcode:
// 1. Select your project in the navigator
// 2. Go to Info tab > Localizations
// 3. Click + to add languages (e.g., German, Japanese)
// 4. Select which files to localize
//
// Xcode creates .lproj directories automatically:
// en.lproj/Localizable.strings
// de.lproj/Localizable.strings
// ja.lproj/Localizable.strings
La localisation de base sépare votre interface de ses chaînes. Lorsque vous ajoutez une langue, Xcode propose de créer des versions localisées de vos storyboards, XIB et fichiers de chaînes.
2

Créer Localizable.strings

Le fichier de localisation iOS standard utilise des paires clé-valeur séparées par des signes égal, chaque ligne se terminant par un point-virgule. Placez-le dans votre dossier Base.lproj pour la langue source.

Base.lproj/Localizable.strings
// Base.lproj/Localizable.strings

"welcome_title" = "Welcome to MyApp";
"login_button" = "Sign In";
"settings_label" = "Settings";
"greeting" = "Hello, %@!";    // %@ = string placeholder
"item_count" = "%d items";     // %d = integer placeholder
L'absence de points-virgules provoque des échecs silencieux — le fichier se charge sans erreur, mais les traductions sont vides. Assurez-vous également que le fichier est ajouté à la phase de build Copy Bundle Resources de votre cible, sinon il ne sera pas inclus dans le bundle de l'application.
Common .strings Mistakes
// ❌ Common mistakes in .strings files:

// Missing semicolon — file loads but translations are empty
"welcome_title" = "Welcome"

// Unescaped quotes — causes parse error
"message" = "Click "here" to continue";

// ✅ Correct versions:
"welcome_title" = "Welcome";
"message" = "Click \"here\" to continue";
3

Migrer vers les String Catalogs (Xcode 15 et versions ultérieures)

Les String Catalogs (.xcstrings) sont le remplacement moderne d'Apple pour les fichiers .strings. Ils proposent un éditeur visuel dans Xcode, une extraction automatique des chaînes depuis vos vues SwiftUI, ainsi qu'une prise en charge native des pluriels.

Localizable.xcstrings
// Xcode 15+ String Catalog (Localizable.xcstrings)
// Xcode automatically extracts strings from your code
// and manages translations in a visual editor.

// In SwiftUI, strings are automatically localizable:
Text("Welcome to MyApp")
Text("Hello, \(userName)!")

// Mark strings explicitly:
let title = String(localized: "welcome_title")
Les String Catalogs stockent TOUTES les langues dans un seul fichier JSON .xcstrings. En équipe, cela entraîne de fréquents conflits de fusion Git lorsque plusieurs personnes ajoutent des chaînes. Pour les grands projets, envisagez un catalogue par module.
4

Utiliser les chaînes localisées dans SwiftUI et UIKit

La vue Text de SwiftUI localise automatiquement les littéraux de chaîne. UIKit utilise NSLocalizedString. À partir d'iOS 16, l'API moderne String(localized:comment:) offre une syntaxe plus claire avec une prise en charge intégrée du compilateur.

ContentView.swift
import SwiftUI

struct ContentView: View {
    let userName: String

    var body: some View {
        VStack {
            // ✅ SwiftUI auto-localizes string literals
            Text("welcome_title")

            // ⚠️ This does NOT localize (String interpolation)
            // Text("Hello, \(userName)")

            // ✅ Use String(localized:) for dynamic strings
            Text(String(localized: "greeting \(userName)"))

            // ✅ UIKit style (works everywhere)
            let title = NSLocalizedString(
                "settings_label",
                comment: "Settings screen title"
            )

            // ✅ Modern API (iOS 16+)
            let modern = String(
                localized: "welcome_title",
                comment: "Main screen title"
            )
        }
    }
}
Text("Hello \(name)") échoue silencieusement à se localiser lorsque name est une simple variable String. L'interpolation de chaînes de SwiftUI crée une LocalizedStringKey, mais seuls certains types spécifiques (Int, Double, etc.) sont interpolés correctement. Pour les variables String, utilisez String(localized:) afin de construire d'abord la chaîne localisée.
5

Gérer les pluriels

iOS utilise des fichiers .stringsdict pour les règles de pluriel, en prenant en charge toutes les catégories plurielles CLDR : zero, one, two, few, many, other. Les String Catalogs gèrent les pluriels avec un éditeur visuel dans Xcode — bien plus simple que d'écrire du XML stringsdict à la main.

Localizable.stringsdict
<!-- Localizable.stringsdict -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>items_count</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@count@</string>
        <key>count</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>zero</key>
            <string>No items</string>
            <key>one</key>
            <string>%d item</string>
            <key>other</key>
            <string>%d items</string>
        </dict>
    </dict>
</dict>
</plist>

// Usage in Swift:
String(format: NSLocalizedString("items_count", comment: ""),
       itemCount)
Des langues comme l'arabe comptent 6 formes plurielles, le russe en a 3 et le japonais 1. Définissez toujours toutes les catégories CLDR requises par vos langues cibles. Les String Catalogs facilitent cela grâce à leur éditeur visuel de pluriels.
6

Localiser les métadonnées App Store avec Fastlane

Utilisez l'outil deliver de Fastlane pour conserver les métadonnées App Store — nom de l'application, sous-titre, description, mots-clés, notes de version — sous contrôle de version dans votre dépôt, sous forme de fichiers texte organisés par locale.

Terminal
# Install Fastlane
$ gem install fastlane

# Initialize deliver for App Store metadata
$ fastlane deliver init

# Directory structure created:
# fastlane/metadata/
# ├── en-US/
# │   ├── name.txt            # App name (30 chars)
# │   ├── subtitle.txt        # Subtitle (30 chars)
# │   ├── description.txt     # Full description
# │   ├── keywords.txt        # Search keywords (100 chars)
# │   ├── release_notes.txt   # What's New
# │   └── promotional_text.txt
# ├── de-DE/
# │   └── ...
# └── ja/
#     └── ...

# Push metadata to App Store Connect:
$ fastlane deliver
Localisation croisée : l'App Store américain indexe à la fois les mots-clés en anglais et en espagnol. Localiser vos métadonnées en espagnol permet de capter les recherches des utilisateurs hispanophones aux États-Unis sans cibler un marché distinct.
7

Tester votre localisation

Testez le contenu localisé sans changer la langue de votre appareil. Utilisez les surcharges de schéma Xcode pour exécuter l'application dans n'importe quelle langue, les aperçus SwiftUI avec un environnement de locale, et XCUITest avec des arguments de lancement pour les tests automatisés.

Testing Localization
// 1. Xcode Scheme Override:
// Edit Scheme > Run > Options > App Language > Choose language

// 2. SwiftUI Preview with locale:
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environment(\.locale, Locale(identifier: "de"))

        ContentView()
            .environment(\.locale, Locale(identifier: "ja"))

        ContentView()
            .environment(\.locale, Locale(identifier: "ar"))
    }
}

// 3. XCUITest with language override:
let app = XCUIApplication()
app.launchArguments += ["-AppleLanguages", "(de)"]
app.launchArguments += ["-AppleLocale", "de_DE"]
app.launch()
Testez avec l'allemand (les chaînes s'allongent d'environ 30 % par rapport à l'anglais) et le japonais (les chaînes se raccourcissent d'environ 50 %) pour détecter rapidement les problèmes de mise en page. Utilisez la pseudo-localisation d'Xcode pour éprouver vos mises en page sans traductions réelles.

Automatiser la qualité des traductions

Détectez les clés manquantes, les espaces réservés cassés et les problèmes de pluriel avant leur mise en production grâce à i18n-validate. Testez votre interface avec des pseudo-traductions grâce à i18n-pseudo avant l'arrivée des traductions réelles.
8

Automatiser les traductions

Traduisez vos fichiers .strings, .xcstrings et de métadonnées Fastlane grâce à l'IA. Automatisez la traduction des chaînes intégrées à l'application comme des métadonnées App Store pour une présence entièrement localisée.

Terminal
# Translate .strings files
> Translate Base.lproj/Localizable.strings
  to Japanese, German, and Spanish

# Translate App Store metadata too
> Translate fastlane/metadata/en-US/
  to de-DE, ja, es-MX

✓ 6 files translated in 3.2s
Une présence App Store localisée augmente les téléchargements de plus de 30 % sur les marchés non anglophones. Traduisez vos métadonnées en même temps que les chaînes de votre application — c'est la localisation offrant le meilleur retour sur investissement.
+

Bonus : repli de locale intelligent avec LocaleChain

Par défaut, iOS revient à votre langue de développement lorsque la locale exacte d'un utilisateur n'est pas disponible. Un utilisateur pt-BR ne disposant que de traductions pt-PT verra s'afficher l'anglais au lieu du portugais. LocaleChain corrige ce problème grâce à des chaînes de repli configurables.

LocaleChain est un package Swift open source. Voir sur GitHub

Package Dependencies
// Swift Package Manager
// File > Add Package Dependencies >
// https://github.com/i18n-agent/ios-localechain.git
MyApp.swift
import LocaleChain

// In your App init or AppDelegate:
LocaleChain.configure()  // Activates all default chains

// 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: ["es-MX": ["es-419", "es"]]
)

Pièges courants

Erreurs de syntaxe dans les fichiers .strings

L'absence de points-virgules, des guillemets non échappés ou un encodage incorrect provoquent des échecs silencieux. Le fichier se charge, mais les traductions apparaissent vides. Vérifiez toujours vos fichiers .strings avant de les valider dans Git.

L'interpolation de texte SwiftUI ne se localise pas

Text("Hello \(stringVar)") ne se localise pas comme prévu. Utilisez String(localized:) pour les chaînes calculées, ou assurez-vous que les variables interpolées sont du type attendu par LocalizedStringKey.StringInterpolation.

Les widgets/extensions affichent des clés brutes

Les extensions d'application disposent de bundles distincts. Assurez-vous que vos fichiers .strings ou .xcstrings sont ajoutés à la phase Copy Bundle Resources de la cible de l'extension, et pas seulement à celle de l'application principale.

Les traductions manquantes affichent des clés en production

Lorsqu'une clé n'a pas de traduction pour la langue de l'utilisateur, iOS affiche la clé elle-même. Mettez en place une stratégie de langue de repli et testez toutes les locales prises en charge avant la publication.

Structure de fichiers recommandée

Project Structure
MyApp/
├── MyApp.xcodeproj
├── MyApp/
│   ├── Base.lproj/
│   │   ├── Localizable.strings       # Source strings
│   │   └── Localizable.stringsdict   # Plural rules
│   ├── en.lproj/
│   │   └── Localizable.strings
│   ├── de.lproj/
│   │   └── Localizable.strings
│   ├── ja.lproj/
│   │   └── Localizable.strings
│   ├── Localizable.xcstrings          # OR String Catalog
│   └── Info.plist
├── MyAppTests/
├── fastlane/
│   ├── Fastfile
│   └── metadata/
│       ├── en-US/
│       │   ├── name.txt
│       │   ├── description.txt
│       │   └── keywords.txt
│       ├── de-DE/
│       └── ja/
└── Package.swift

Essayez i18n Agent maintenant

Déposez votre fichier de traduction ici

JSON, YAML, PO, XML, CSV, Markdown, Properties

ou cliquez pour parcourir

Langues cibles

Aucune inscription requiseEstimation instantanée

Repli de locale avec ios-localechain

Lorsqu'une clé de traduction est manquante dans une locale régionale comme de-AT, iOS bascule directement vers la langue de développement au lieu de vérifier d'abord la locale parente de.

Terminal
// Swift Package Manager
// https://github.com/i18n-agent/ios-localechain
Configuration
import LocaleChain

LocaleChain.configure(overrides: [
    "de": ["en-GB", "en"],
    "pt-BR": ["pt", "en"],
    "zh-Hant-HK": ["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 →

FAQ sur la localisation iOS