Internationalisation (i18n) en Kotlin : Guide complet avec exemples
\n\nL'internationalisation (i18n) est le processus de conception et de développement de logiciels permettant de les adapter à différentes langues et régions sans modifier le code source. Dans l'écosystème Kotlin, qu'il s'agisse d'applications Android, de projets serveur avec Ktor ou de solutions multiplateformes avec Kotlin Multiplatform, une implémentation correcte de l'i18n est cruciale pour le succès mondial d'un produit. Dans cet article, nous examinerons les principales approches, outils et bonnes pratiques pour internationaliser les applications Kotlin.
\n\nPourquoi l'i18n est-il important en Kotlin ?
\nKotlin, en tant que langage moderne entièrement compatible avec Java, hérite de toutes les capacités de Java pour la localisation, mais propose également ses propres solutions uniques. Une internationalisation correcte permet de :
\n- \n
- Élargir considérablement l'audience de votre application \n
- Améliorer l'expérience utilisateur pour les locuteurs de différentes langues \n
- Respecter les exigences légales de différents pays (concernant les devises ou les formats de date, par exemple) \n
- Simplifier le processus d'ajout de nouvelles langues à l'avenir \n
Principales approches de l'i18n en Kotlin
\n1. Utilisation de Resource Bundle (approche compatible Java)
\nLa méthode la plus courante et la plus simple consiste à utiliser les ResourceBundle standards et les fichiers de propriétés (.properties). Cette méthode est idéale pour les applications console et les projets serveur en Kotlin.
// messages_en.properties\ngreeting=Bonjour, {0} !\nfarewell=Au revoir\n\n// messages_fr.properties\ngreeting=Bonjour, {0} !\nfarewell=Au revoir\n\nimport java.util.ResourceBundle\nimport java.text.MessageFormat\n\nfun main() {\n val bundle = ResourceBundle.getBundle("messages", Locale("fr"))\n val greeting = MessageFormat.format(bundle.getString("greeting"), "Monde")\n println(greeting) // Affiche : Bonjour, Monde !\n \n println(bundle.getString("farewell")) // Affiche : Au revoir\n}\n\n2. Approche spécifique à Kotlin avec des fonctions d'extension
\nKotlin permet de créer une API plus concise et plus sûre pour la localisation en utilisant des fonctions d'extension et des propriétés déléguées.
\n\nimport java.util.*\nimport kotlin.properties.ReadOnlyProperty\nimport kotlin.reflect.KProperty\n\nclass I18n(private val baseName: String) {\n private val bundle: ResourceBundle\n get() = ResourceBundle.getBundle(baseName)\n \n operator fun provideDelegate(\n thisRef: Any?, \n prop: KProperty<*>\n ): ReadOnlyProperty {\n return ReadOnlyProperty { _, _ -> bundle.getString(prop.name) }\n }\n}\n\nobject Strings {\n val i18n = I18n("messages")\n \n val greeting by i18n\n val farewell by i18n\n}\n\nfun main() {\n // Utilise automatiquement la locale du système\n println(Strings.greeting) // Affiche la valeur correspondante du fichier de propriétés\n println(Strings.farewell)\n} \n\nOutils de localisation en Kotlin
\n1. Kotlin Multiplatform (KMP) et expect/actual
\nPour les projets multiplateformes, Kotlin propose un puissant mécanisme expect/actual, permettant de déclarer une API commune pour l'i18n et de l'implémenter séparément pour chaque plateforme.
// Dans le code commun (commonMain)\nexpect class PlatformStringResources {\n fun getString(key: String, vararg args: Any?): String\n}\n\n// Sur Android (androidMain)\nactual class PlatformStringResources {\n private val context: Context = // obtenir le contexte\n \n actual fun getString(key: String, vararg args: Any?): String {\n val resId = context.resources.getIdentifier(key, "string", context.packageName)\n return context.getString(resId, *args)\n }\n}\n\n// Sur iOS (iosMain)\nactual class PlatformStringResources {\n actual fun getString(key: String, vararg args: Any?): Str Aussi dans la bibliothèque
Diesel pour Rust : guide complet avec exemples
Traitement JSON en Java : bibliothèques et outils pour travailler avec JSON
ORM pour JavaScript (Node.js) : comparaison de Sequelize, TypeORM, Prisma