Warum Ihre Anwendung noch heute Internationalisierung braucht
\n\nStellen Sie sich vor: Sie haben eine tolle Kotlin-Anwendung geschrieben – praktisch, schnell, mit einer schönen Benutzeroberfläche. Aber alle Texte darin sind auf Russisch. Ein Benutzer aus Berlin oder Tokio öffnet Ihr Produkt und... schließt es nach 10 Sekunden wieder. Warum? Weil er kein Wort versteht. Internationalisierung (i18n) ist nicht nur das „Übersetzen von Schaltflächen“, sondern eine Brücke zwischen Ihrem Code und Millionen von Benutzern weltweit.
\n\nIn diesem Artikel werden wir uns ansehen, wie Sie die Internationalisierung von Kotlin in Projekte jeder Größenordnung integrieren können: von Android-Anwendungen bis hin zu Serverdiensten mit Ktor. Sie erfahren, wie Sie typische Fehler vermeiden, wie Sie Kotlin Multiplatform für gemeinsame Logik nutzen und warum „magische Zeichenketten“ böse sind.
\n\nGrundlagen der i18n in Kotlin: Vom Einfachen zum Komplexen
\n\nRessourcendateien: Das Fundament der Lokalisierung
\n\nDer zuverlässigste Weg, die Lokalisierung einer Kotlin-Anwendung zu organisieren, besteht darin, alle Zeichenkettenliterale in separate Ressourcendateien auszulagern. In Android Studio sind dies die standardmäßigen strings.xml, aber für reines Kotlin (Backend, Desktop) können wir .properties oder JSON verwenden.
Beispiel für Android:
\n\n// res/values/strings.xml (Russisch – Standard)\n<resources>\n <string name="app_name">Meine App</string>\n <string name="welcome_message">Willkommen, %s!</string>\n <string name="points">Sie haben %d Punkte</string>\n</resources>\n\n// res/values-en/strings.xml (Englisch)\n<resources>\n <string name="app_name">My App</string>\n <string name="welcome_message">Welcome, %s!</string>\n <string name="points">You have %d points</string>\n</resources>\n\nIm Code greifen wir über context.getString() darauf zu:
val userName = "Alexej"\nval message = context.getString(R.string.welcome_message, userName)\n// Ergebnis: "Willkommen, Alexej!" (oder "Welcome, Alexey!" auf Englisch)\n\nBeachten Sie: Wir verwenden %s für Zeichenketten und %d für Zahlen. Verketten Sie Zeichenketten niemals manuell – im Japanischen oder Arabischen kann die Wortstellung abweichen.
Arbeit mit Pluralformen (Mehrzahl)
\n\nDie russische Sprache ist bekannt für ihre komplexen Deklinationsregeln: 1 балл, 2 балла, 5 баллов. Im Englischen ist es einfacher: 1 point, 2 points. Die Internationalisierung von Kotlin muss dies berücksichtigen.
\n\nIn Android gibt es dafür <plurals>:
// strings.xml\n<plurals name="points_count">\n <item quantity="one">%d Punkt</item>\n <item quantity="few">%d Punkte</item>\n <item quantity="many">%d Punkte</item>\n <item quantity="other">%d Punkte</item>\n</plurals>\n\n// Im Code\nval points = 3\nval text = resources.getQuantityString(R.plurals.points_count, points, points)\n// "3 Punkte"\n\nFür serverseitiges Kotlin können Sie die Bibliothek icu4j verwenden oder einen eigenen einfachen Resolver schreiben. Die Hauptregel: Harten Sie niemals Texte mit Zahlen im Code.
Internationalisierung in Kotlin Multiplatform (KMP)
\n\nWenn Sie eine plattformübergreifende Anwendung mit Kotlin Multiplatform schreiben, wird die Aufgabe komplexer. Gemeinsamer Code hat keinen Zugriff auf Android-Ressourcen. Die Lösung: Verwenden Sie eine gemeinsame Schnittstelle und plattformspezifische Implementierungen.
\n\nArchitektur für KMP
\n\nWir erstellen eine expect-Klasse im common-Modul:
\n\n// commonMain\nexpect class StringProvider {\n fun getString(key: String, vararg args: Any): String\n}\n\n// Verwendung im gemeinsamen Code\nclass Greeting(private val strings: StringProvider) {\n fun greet(name: String): String {\n return strings.getString("welcome", name)\n }\n}\n\nImplementierung für Android: