Internationalisation (i18n) en Swift : guide complet pour iOS et macOS
\n\nL'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\nFondamentaux : NSLocalizedString
\n\nLe 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).
let greeting = NSLocalizedString("hello_world", comment: "Salutation sur l'écran principal")\nprint(greeting) // Affiche la traduction selon la langue de l'appareil\n\nLe paramètre comment sert d'indice pour le traducteur. La clé "hello_world" doit être unique dans l'ensemble du projet.
Création des fichiers de localisation
\n\nDans 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.
Exemple de contenu de Localizable.strings (anglais) :
"hello_world" = "Hello, World!";\n"welcome_message" = "Welcome to our app %@";\n\nVersion française (Localizable.strings (French)) :
"hello_world" = "Bonjour le monde !";\n"welcome_message" = "Bienvenue dans notre application %@";\n\nFormatage des chaînes avec paramètres
\n\nPour 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\nMéthode 1 : String(format:)
\nlet 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\nDans le fichier de localisation :
\n"user_score" = "%@ a obtenu %d points";\n\nMéthode 2 : Interpolation de chaînes Swift (iOS 15+)
\nlet message = "\\(userName) a obtenu \\(points) points"\nCependant, 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.
Pluriel (formes plurielles)
\n\nEn 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\nExemple 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>