Internationalisierung (i18n) in Kotlin: Vollständiger Leitfaden mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Internationalisierung (i18n) in Kotlin: Vollständiger Leitfaden mit Beispielen

\n\n

Internationalisierung (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\n

Warum ist i18n in Kotlin wichtig?

\n

Kotlin, 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
\n\n

Wichtige Ansätze für i18n in Kotlin

\n

1. Verwendung von Resource Bundle (Java-kompatibler Ansatz)

\n

Die 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.

\n\n
// messages_en.properties\ngreeting=Hello, {0}!\nfarewell=Goodbye\n\n// messages_ru.properties\ngreeting=Привет, {0}!\nfarewell=До свидания
\n\n
import 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\n

2. Kotlin-spezifischer Ansatz mit Erweiterungsfunktionen

\n

Kotlin ermöglicht die Erstellung einer prägnanteren und typsicheren API für die Arbeit mit Lokalisierung mithilfe von Erweiterungsfunktionen und delegierten Eigenschaften.

\n\n
import 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\n

Tools für die Lokalisierung in Kotlin

\n

1. Kotlin Multiplatform (KMP) und expect/actual

\n

Fü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.

\n\n
// В общем коде (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                    

Empfehlungen