Internationalisierung von Kotlin-Anwendungen: Wie man sich in Sprachen nicht verheddert

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

Warum Ihre Anwendung noch heute Internationalisierung braucht

\n\n

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

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

Grundlagen der i18n in Kotlin: Vom Einfachen zum Komplexen

\n\n

Ressourcendateien: Das Fundament der Lokalisierung

\n\n

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

\n\n

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

Im Code greifen wir über context.getString() darauf zu:

\n\n
val userName = "Alexej"\nval message = context.getString(R.string.welcome_message, userName)\n// Ergebnis: "Willkommen, Alexej!" (oder "Welcome, Alexey!" auf Englisch)
\n\n

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

\n\n

Arbeit mit Pluralformen (Mehrzahl)

\n\n

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

In Android gibt es dafür <plurals>:

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

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

\n\n

Internationalisierung in Kotlin Multiplatform (KMP)

\n\n

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

Architektur für KMP

\n\n

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

Implementierung für Android:

Blogs

Buchempfehlungen