Einführung#
Androids Standard-Lokalisierung verwendet strings.xml-Dateien, aber viele Entwickler bevorzugen JSON-basiertes i18n für plattformübergreifende Konsistenz. Dieser Guide behandelt beide Ansätze und zeigt dir, wie du robuste Lokalisierung in deiner Android-App implementierst.
Ob du eine neue App entwickelst oder eine bestehende wartest - richtige Internationalisierung (i18n) ist entscheidend, um globale Märkte zu erreichen.
Voraussetzungen#
- Android Studio installiert
- Grundkenntnisse in Kotlin oder Java
- Verständnis des Android-Ressourcensystems
Android Lokalisierungs-Grundlagen#
Der Standard-Ansatz: strings.xml#
Androids eingebautes Lokalisierungssystem verwendet XML-Dateien im res/values-Verzeichnis:
<!-- res/values/strings.xml (Standard/Englisch) -->
<resources>
<string name="app_name">Meine App</string>
<string name="welcome_message">Willkommen, %1$s!</string>
<string name="items_count">%d Artikel</string>
</resources>
Warum JSON für Android i18n?#
JSON-basierte Lokalisierung bietet mehrere Vorteile:
- Plattformübergreifende Konsistenz - Gleiches Format wie iOS, Web und Backend
- Einfachere Automatisierung - JSON ist leichter zu parsen und zu generieren
- Besseres Tooling - Mehr Übersetzungs-Management-Tools unterstützen JSON
- Verschachtelte Strukturen - Übersetzungen hierarchisch organisieren
JSON-basiertes i18n in Android implementieren#
Schritt 1: JSON-Übersetzungsdateien erstellen#
Erstelle deine Übersetzungsdateien im assets-Verzeichnis:
// assets/i18n/de.json
{
"app": {
"name": "Meine App",
"welcome": "Willkommen, {name}!",
"items": {
"one": "{count} Artikel",
"other": "{count} Artikel"
}
},
"buttons": {
"submit": "Absenden",
"cancel": "Abbrechen"
}
}
Schritt 2: Translation Manager erstellen#
// TranslationManager.kt
import android.content.Context
import org.json.JSONObject
import java.util.Locale
object TranslationManager {
private var translations: JSONObject? = null
private var currentLocale: String = "de"
fun init(context: Context, locale: String = Locale.getDefault().language) {
currentLocale = locale
loadTranslations(context)
}
private fun loadTranslations(context: Context) {
try {
val fileName = "i18n/$currentLocale.json"
val jsonString = context.assets.open(fileName)
.bufferedReader()
.use { it.readText() }
translations = JSONObject(jsonString)
} catch (e: Exception) {
// Fallback auf Englisch
val jsonString = context.assets.open("i18n/en.json")
.bufferedReader()
.use { it.readText() }
translations = JSONObject(jsonString)
}
}
fun getString(key: String, params: Map<String, Any> = emptyMap()): String {
val keys = key.split(".")
var current: Any? = translations
for (k in keys) {
current = (current as? JSONObject)?.opt(k)
}
var result = current?.toString() ?: key
// Platzhalter ersetzen
params.forEach { (placeholder, value) ->
result = result.replace("{$placeholder}", value.toString())
}
return result
}
}
Schritt 3: Übersetzungen in der App verwenden#
// MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Übersetzungen initialisieren
TranslationManager.init(this)
// Übersetzungen verwenden
val welcomeText = TranslationManager.getString(
"app.welcome",
mapOf("name" to "Max")
)
// Ergebnis: "Willkommen, Max!"
}
}
Übersetze deine strings.xml
Printf-Platzhalter (%s, %1$s, %d) bleiben stehen. Prozenttext (79% Rabatt) wird als Text übersetzt.
Best Practices für Android i18n#
1. Platzhalter-Schutz#
Verwende immer konsistente Platzhalter-Formate:
| Format | Beispiel | Anwendungsfall |
|---|---|---|
{name} | Hallo, {name}! | Benannte Platzhalter |
%1$s | Hallo, %1$s! | Positionelle Strings |
%d | %d Artikel | Zahlen |
{{var}} | {{count}} Artikel | ICU-Format |
2. Nach Feature organisieren#
{
"auth": {
"login": { ... },
"register": { ... }
},
"settings": {
"profile": { ... },
"notifications": { ... }
}
}
Übersetzungen automatisieren#
Manuelles Übersetzen von JSON-Dateien ist zeitaufwändig und fehleranfällig.
Mit shipglobal.dev#
- Exportiere deine Basis-
de.json-Datei - Lade sie auf shipglobal.dev hoch
- Wähle Zielsprachen (29 verfügbar)
- Lade übersetzte Dateien herunter
Der Service:
- Bewahrt Platzhalter wie
{name}und%1$s - Erhält die JSON-Struktur
- Behandelt Plurale korrekt
- Nutzt Translation Memory für konsistente Updates
Fazit#
JSON-basiertes i18n in Android bietet Flexibilität und plattformübergreifende Konsistenz. Bereit, deine Android-App zu übersetzen? Probiere shipglobal.dev um deine JSON-Dateien automatisch in 29+ Sprachen zu übersetzen.