Die Lingo.dev CLI übersetzt Android-String-Ressourcen (strings.xml) über eine konfigurierte Lokalisierungs-Engine. Der Bucket-Typ android der CLI versteht <resources>-, <string>-, <string-array>- und <plurals>-Elemente nativ, bewahrt die XML-Struktur und erzeugt für jede Ziel-Sprache die korrekten Pluralkategorien.
Diese Anleitung zeigt dir die Android-Lokalisierung von Anfang bis Ende: CLI konfigurieren, lokal übersetzen und mit GitHub Actions automatisieren, damit Übersetzungen bei jedem Push mit ausgeliefert werden.
Demo-Repository
Klone oder fork lingodotdev/android-app-localization-example, um direkt mitzumachen. Das Repository enthält ein funktionierendes Android-Projekt mit String-Ressourcen, eine Lingo.dev CLI-Konfiguration und einen GitHub-Actions-Workflow.
So funktioniert Android-Lokalisierung#
Android folgt einer Konvention für Ressourcenverzeichnisse, bei der jede Sprache ihr eigenes Verzeichnis values-[locale]/ erhält. Zur Laufzeit lädt das System anhand der Spracheinstellung des Geräts die passende strings.xml.
app/src/main/res/
values/ # Default (source) strings
strings.xml
values-es/ # Spanish
strings.xml
values-fr/ # French
strings.xml
values-ja/ # Japanese
strings.xmlEine typische strings.xml enthält drei Elementtypen:
<resources>
<!-- Simple strings -->
<string name="app_name">My App</string>
<string name="welcome_message">Welcome back!</string>
<!-- String arrays -->
<string-array name="planets">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
</string-array>
<!-- Plurals -->
<plurals name="items_count">
<item quantity="one">%d item</item>
<item quantity="other">%d items</item>
</plurals>
</resources>Die CLI parst alle drei Elementtypen, übersetzt ihren Inhalt über die Lokalisierungs-Engine und schreibt für jede Sprache eigene Dateien in die richtigen Verzeichnisse values-[locale]/.
Voraussetzungen#
Eine Lokalisierungs-Engine erstellen
Bei jedem CLI-Durchlauf werden Inhalte durch eine Lokalisierungs-Engine geschickt – also durch die Konfiguration, die festlegt, welches LLM-Modell, Glossar, Markenstimme und welche Anweisungen gelten. Erstelle sie im Lingo.dev dashboard und generiere einen API-Schlüssel.
Node.js prüfen
Die CLI setzt Node.js 18 oder höher voraus:
node -vAndroid-Projekt einrichten
Dein Projekt braucht eine Standard-strings.xml in app/src/main/res/values/. Android Studio erstellt diese Datei automatisch, wenn du ein neues Projekt anlegst. Wie du Ressourcenverzeichnisse einrichtest, erfährst du im Lokalisierungsleitfaden von Android.
CLI konfigurieren#
Erstelle im Projektstamm eine Datei i18n.json. Der Bucket android weist die CLI an, Android-XML-Ressourcen zu parsen und pro Sprache separate Dateien anzulegen:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr", "de", "ja"]
},
"buckets": {
"android": {
"include": ["app/src/main/res/values-[locale]/strings.xml"]
}
}
}Der Platzhalter [locale] wird zur Laufzeit in jeden konfigurierten Sprachcode aufgelöst. Die CLI setzt deine Ausgangssprache in das Muster ein – mit source: "en" sucht sie also nach values-en/strings.xml. Für Ziel-Sprachen entstehen values-es/strings.xml, values-fr/strings.xml und so weiter.
Das Standard-Sprachverzeichnis überbrücken#
Android speichert Standard-Strings in values/ (ohne Sprachsuffix), die CLI löst [locale] jedoch wörtlich auf und sucht nach values-en/strings.xml. Erstelle einen Symlink, um die beiden Konventionen zu verbinden:
cd app/src/main/res
ln -s values values-enSo sind die Ausgangs-Strings sowohl unter values/strings.xml sichtbar (wo Android sie erwartet) als auch unter values-en/strings.xml (wo die CLI sucht). Committe den Symlink in dein Repository – git verfolgt Symlinks unter macOS und Linux nativ.
Windows
Git unter Windows checkt Symlinks je nach Konfiguration möglicherweise als einfache Textdateien aus. Wenn du Windows nutzt, führe vor dem Klonen git config core.symlinks true aus oder kopiere das Verzeichnis values/ stattdessen nach values-en/.
Mehrere Ressourcendateien
Wenn dein Projekt Strings auf mehrere Dateien verteilt (zum Beispiel strings.xml und arrays.xml), liste sie alle auf. Der Symlink deckt das gesamte Verzeichnis ab, sodass alle Dateien innerhalb von values/ auch über values-en/ erreichbar sind:
{
"buckets": {
"android": {
"include": [
"app/src/main/res/values-[locale]/strings.xml",
"app/src/main/res/values-[locale]/arrays.xml"
]
}
}
}Lokal übersetzen#
API-Schlüssel setzen und CLI ausführen:
export LINGO_API_KEY="your-api-key"
npx lingo.dev@latest runDie CLI liest deine Ausgangs-strings.xml, identifiziert mithilfe der Lockfile nicht übersetzte Einträge, übersetzt das Delta über deine Lokalisierungs-Engine und schreibt die Ergebnisse in die Zielverzeichnisse values-[locale]/. Öffne eine beliebige Zieldatei, um dir die übersetzten Strings anzusehen.
So zielst du während der Entwicklung auf eine bestimmte Sprache:
npx lingo.dev@latest run --target-locale esPluralformen#
Android verwendet <plurals>-Elemente mit CLDR-Mengenangaben (zero, one, two, few, many, other), um Pluralformen abzubilden. Unterschiedliche Sprachen brauchen unterschiedliche Pluralkategorien – Englisch zwei (one und other), Russisch vier und Arabisch sechs.
Die CLI bewahrt die Struktur von <plurals> bei der Übersetzung und erzeugt für jede Ziel-Sprache die richtigen Mengenkategorien. Ein Quelleintrag mit zwei Kategorien:
<plurals name="messages_count">
<item quantity="one">%d new message</item>
<item quantity="other">%d new messages</item>
</plurals>So entstehen für jede Zielsprache die korrekten Kategorien. Die Lokalisierungs-Engine weiß, welche CLDR-Pluralregeln für jede Sprache gelten, und erzeugt nur die Kategorien, die diese Sprache tatsächlich benötigt.
Schlüssel sperren#
Einige String-Werte sollten in allen Sprachen identisch bleiben – etwa Markennamen, API-Endpunkte oder Formatmuster. Mit Schlüsselsperrung kannst du diese Werte ohne Übersetzung übernehmen:
{
"buckets": {
"android": {
"include": ["app/src/main/res/values-[locale]/strings.xml"],
"lockedKeys": ["app_name", "api_base_url"]
}
}
}Gesperrte Schlüssel werden aus der Quelle in alle Zieldateien kopiert, ohne durch die Übersetzungspipeline zu laufen.
Mit GitHub Actions automatisieren#
Füge unter .github/workflows/translate.yml eine Workflow-Datei hinzu, damit bei jedem Push übersetzt wird:
Übersetzungen werden direkt in main committet – ohne Reibungsverluste, ideal für kleine Teams:
name: Translate
on:
push:
branches: [main]
permissions:
contents: write
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Lingo.dev
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}Speichere deinen API-Schlüssel als LINGODOTDEV_API_KEY unter Settings > Secrets and variables > Actions in deinem GitHub-Repository.
Vor dem Deployment prüfen#
Verwende das Flag --frozen als Deployment-Gate, um sicherzustellen, dass keine unübersetzten Strings in Produktion landen. Die CLI beendet sich mit einem Status ungleich null, wenn noch Einträge übersetzt werden müssen:
npx lingo.dev@latest run --frozenFüge das vor deinem Build als separaten CI-Schritt hinzu:
- name: Verify translations
run: npx lingo.dev@latest run --frozen