Internationalisation (i18n) en Swift : NSLocalizedString et String Catalog

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Internationalisation (i18n) en Swift : guide complet pour iOS et macOS

\n\n

L'internationalisation (i18n) est le processus de conception d'une application afin qu'elle puisse être adaptée à différentes langues et régions sans modifications techniques. Dans l'écosystème Apple (iOS, macOS, watchOS, tvOS), les outils de localisation sont intégrés directement dans Swift et Xcode. Dans cet article, nous allons détailler comment utiliser NSLocalizedString et le moderne String Catalog pour créer des applications multilingues.

\n\n

Fondamentaux : NSLocalizedString

\n\n

Le mécanisme de base de l'internationalisation en Swift est la fonction NSLocalizedString. Elle recherche la traduction d'une chaîne dans les fichiers .strings ou .xcstrings (String Catalog).

\n\n
let greeting = NSLocalizedString("hello_world", comment: "Salutation sur l'écran principal")\nprint(greeting) // Affiche la traduction selon la langue de l'appareil
\n\n

Le paramètre comment sert d'indice pour le traducteur. La clé "hello_world" doit être unique dans l'ensemble du projet.

\n\n

Création des fichiers de localisation

\n\n

Dans Xcode, vous pouvez ajouter les langues prises en charge via Project Info > Localizations. Ensuite, pour chaque fichier .strings ou Storyboard, des sous-fichiers de localisation seront créés.

\n\n

Exemple de contenu de Localizable.strings (anglais) :

\n
"hello_world" = "Hello, World!";\n"welcome_message" = "Welcome to our app %@";
\n\n

Version française (Localizable.strings (French)) :

\n
"hello_world" = "Bonjour le monde !";\n"welcome_message" = "Bienvenue dans notre application %@";
\n\n

Formatage des chaînes avec paramètres

\n\n

Pour les chaînes contenant des données dynamiques, utilisez des spécificateurs de format. En Swift, cela peut se faire de deux manières :

\n\n

Méthode 1 : String(format:)

\n
let userName = "Jean"\nlet points = 150\nlet message = String(format: NSLocalizedString("user_score", comment: "Points de l'utilisateur"), userName, points)\nprint(message) // "Jean a obtenu 150 points"
\n\n

Dans le fichier de localisation :

\n
"user_score" = "%@ a obtenu %d points";
\n\n

Méthode 2 : Interpolation de chaînes Swift (iOS 15+)

\n
let message = "\\(userName) a obtenu \\(points) points"
\n

Cependant, cette méthode n'est pas adaptée à la localisation, car l'ordre des mots peut varier selon les langues. Utilisez uniquement String(format:) ou AttributedString avec inflexion.

\n\n

Pluriel (formes plurielles)

\n\n

En français, il existe des règles de déclinaison complexes : "1 fichier", "2 fichiers", "5 fichiers". Pour cela, Apple fournit stringsdict (XML) ou String Catalog avec des règles de pluriel.

\n\n

Exemple stringsdict

\n
<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"\n  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n<dict>\n    <key>files_count</key>\n    <dict>\n        <key>NSStringLocalizedFormatKey</key>\n        <string>%#@files@</string>\n        <key>files</key>\n        <dict>\n            <key>NSStringFormatSpecTypeKey</key>\n            <string>NSStringPluralRuleType</string>\n            <key>NSStringFormatValueTypeKey</key>\n            <string>d</string>\n            <key>one</key>\n            <string>%d fichier</string>\n            <key>few</key>\n            <string>%d fichiers</string>\n            <key>many</key>\n            <string>%d fichiers</string>\n            <key>other</key>\n            <string>%d fichiers</string>\n        </dict>                    

Recommendations