Internationalisierung (i18n) in Kotlin: Vollständiger Leitfaden mit Beispielen
\n\nInternationalisierung (i18n) ist der Prozess des Entwerfens und Entwickelns von Software, der es ermöglicht, sie an verschiedene Sprachen und Regionen anzupassen, ohne Änderungen am Quellcode vorzunehmen. Im Kotlin-Ökosystem, sei es für Android-Apps, Serverprojekte mit Ktor oder plattformübergreifende Lösungen mit Kotlin Multiplatform, ist die korrekte Implementierung von i18n entscheidend für den globalen Erfolg eines Produkts. In diesem Artikel betrachten wir die wichtigsten Ansätze, Tools und Best Practices für die Internationalisierung von Kotlin-Anwendungen.
\n\nWarum ist i18n in Kotlin wichtig?
\nKotlin, als moderne und vollständig mit Java kompatible Sprache, erbt alle Java-Fähigkeiten zur Lokalisierung, bietet aber auch eigene, einzigartige Lösungen. Eine korrekte Internationalisierung ermöglicht:
\n- \n
- Eine deutliche Erweiterung der Zielgruppe Ihrer Anwendung \n
- Eine verbesserte Benutzererfahrung für Sprecher verschiedener Sprachen \n
- Die Einhaltung gesetzlicher Anforderungen verschiedener Länder (z. B. bezüglich Währungen oder Datumsformaten) \n
- Die Vereinfachung des Prozesses zum Hinzufügen neuer Sprachen in der Zukunft \n
Wichtige Ansätze für i18n in Kotlin
\n1. Verwendung von Resource Bundle (Java-kompatibler Ansatz)
\nDie gebräuchlichste und einfachste Methode ist die Verwendung der standardmäßigen ResourceBundle und Eigenschaftendateien (.properties). Diese Methode eignet sich ideal für Konsolenanwendungen und Serverprojekte in Kotlin.
// messages_en.properties\ngreeting=Hello, {0}!\nfarewell=Goodbye\n\n// messages_ru.properties\ngreeting=Привет, {0}!\nfarewell=До свидания\n\nimport java.util.ResourceBundle\nimport java.text.MessageFormat\n\nfun main() {\n val bundle = ResourceBundle.getBundle("messages", Locale("ru"))\n val greeting = MessageFormat.format(bundle.getString("greeting"), "Мир")\n println(greeting) // Выведет: Привет, Мир!\n \n println(bundle.getString("farewell")) // Выведет: До свидания\n}\n\n2. Kotlin-spezifischer Ansatz mit Erweiterungsfunktionen
\nKotlin ermöglicht die Erstellung einer prägnanteren und typsicheren API für die Arbeit mit Lokalisierung mithilfe von Erweiterungsfunktionen und delegierten Eigenschaften.
\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 // Автоматически использует локаль системы\n println(Strings.greeting) // Выведет соответствующее значение из файла свойств\n println(Strings.farewell)\n} \n\nTools für die Lokalisierung in Kotlin
\n1. Kotlin Multiplatform (KMP) und expect/actual
\nFür plattformübergreifende Projekte bietet Kotlin einen leistungsstarken expect/actual-Mechanismus, mit dem eine gemeinsame API für i18n deklariert und für jede Plattform separat implementiert werden kann.
// В общем коде (commonMain)\nexpect class PlatformStringResources {\n fun getString(key: String, vararg args: Any?): String\n}\n\n// В Android (androidMain)\nactual class PlatformStringResources {\n private val context: Context = // получаем контекст\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// В iOS (iosMain)\nactual class PlatformStringResources {\n actual fun getString(key: String, vararg args: Any?): Str Auch in der Bibliothek
Arbeiten mit CSV in TypeScript: Bibliotheken und Codebeispiele
Kryptographie in Kotlin: Verschlüsselung und Hashing
Dependency Injection Container für Go (Golang) — wire, dig, fx
HTTP-Client für Java: Überblick über die Top-Bibliotheken (Java 11, Apache, OkHttp, Retrofit)
PyNaCl – Kryptografie-Bibliothek für Python