|
Dokumentation
Demo buchenPlattform
PlattformMCPCLIAPIWorkflows
Leitfäden
Changelog

Lokalisierung

  • Überblick
  • Translation API
  • Lokalisierung für Web-Apps
  • Lokalisierung für mobile Apps
  • iOS mit String Catalogs
  • Android mit strings.xml
  • E-Mail-Lokalisierung
  • Statische Inhalte (z. B. .md, .json)
  • Next.js mit Markdoc
  • Rails mit i18n

Workflows

  • Engine-Setup mit MCP
  • Jira-Triage
  • CI/CD

Android-App-Lokalisierung mit strings.xml

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.

text
app/src/main/res/
  values/              # Default (source) strings
    strings.xml
  values-es/           # Spanish
    strings.xml
  values-fr/           # French
    strings.xml
  values-ja/           # Japanese
    strings.xml

Eine typische strings.xml enthält drei Elementtypen:

xml
<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#

1

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.

2

Node.js prüfen

Die CLI setzt Node.js 18 oder höher voraus:

bash
node -v
3

Android-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:

json
{
  "$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:

bash
cd app/src/main/res
ln -s values values-en

So 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:

json
{
  "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:

bash
export LINGO_API_KEY="your-api-key"
npx lingo.dev@latest run

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

bash
npx lingo.dev@latest run --target-locale es

Pluralformen#

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:

xml
<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:

json
{
  "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:

yaml
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:

bash
npx lingo.dev@latest run --frozen

Füge das vor deinem Build als separaten CI-Schritt hinzu:

yaml
- name: Verify translations
  run: npx lingo.dev@latest run --frozen

Nächste Schritte#

Lokalisierung mobiler Apps
Überblick über alle mobilen Plattformen – iOS, Android, Flutter, React Native
CI/CD-Workflows
Patterns für GitHub Actions, GitLab CI und Bitbucket Pipelines
Glossare
Markennamen und Fachbegriffe von der Übersetzung ausnehmen
Schlüsselsperrung
Bestimmte Werte übernehmen, ohne sie zu übersetzen

War diese Seite hilfreich?

Max PrilutskiyMax Prilutskiy·Aktualisiert vor 3 Monaten·5 Min. Lesezeit