lingo push

Zuletzt aktualisiert: letzte Woche · 8 Min. Lesezeit

Übertragen Sie Quelldateien an die Engine und starten Sie einen Übersetzungslauf. Der Befehl endet, sobald der Lauf übermittelt wurde — übergeben Sie --wait, um auf den Abschluss zu warten und die Ergebnisse auf den Datenträger zu schreiben, oder holen Sie sie später mit lingo pull ab.

text
lingo push [patterns...] [--key <pattern>] [--force] [--backfill-missing] [--yes] [--wait] [--estimate]

Standardverhalten — Delta-Push#

Ohne Argumente läuft lingo push im reinen Delta-Modus:

  1. Hash für jede Quelldatei berechnen, die auf die files-Patterns der Konfiguration passt
  2. Jeden Hash mit der Lockfile abgleichen, um geänderte Quellen zu ermitteln
  3. Erstellen Sie einen Lauf auf der Engine und vermerken Sie ihn im Laufstatus
  4. Laden Sie geänderte Quelldateien hoch, starten Sie den Lauf und beenden Sie den Vorgang

Mit --wait passiert statt des Beendens Folgendes:

  1. Warten, bis der Durchlauf abgeschlossen ist
  2. Ausgabedateien auf den Datenträger schreiben
  3. Die neuen Quell-Hashes in die Lockfile übernehmen

Ohne --wait führt lingo pull die Schritte 5–7 später aus. Die Ausnahme ist ein Lauf, den die Engine bereits als abgeschlossen meldet; in diesem Fall lädt push ihn sofort herunter — mit oder ohne --wait.

Wenn sich seit dem letzten erfolgreichen Push keine Quelle geändert hat, beendet sich der Befehl direkt mit ✓ Nothing to push. — ohne Server-Roundtrip und ohne Token-Verbrauch.

Argumente und Flags#

Positionsargument: patterns... — Scoped Push#

bash
lingo push docs/en/about.md
lingo push 'docs/en/**/*.md' 'locales/en.json'

Beschränkt den Push auf bestimmte Dateien (müssen auf Patterns passen, die bereits in .lingo/config.json definiert sind). Schaltet den Befehl in den Scoped-Modus:

  • Kein Abgleich mit vorherigen Quellen — jede passende Quelle gilt als im Scope, auch wenn sie unverändert ist.
  • Serverseitiges No-op für Ziele, die bereits mit passenden Quell-Hashes existieren — die Engine überspringt sie und die CLI meldet sie als gecacht.

Nutze das, wenn du genau eine aktualisierte Datei übersetzen möchtest, ohne das gesamte Projekt neu zu hashen, oder wenn du eine einzelne Seite mit --force neu übersetzen willst.

--key <pattern>#

bash
lingo push --key auth.login
lingo push --key auth.login --key billing.plan
lingo push --key "auth.*"

Nur die Schlüssel neu übersetzen, die ein Muster erfasst, sie mit der vorhandenen Übersetzung zusammenführen und alle anderen Schlüssel bytegenau unverändert lassen. Wiederholbar — ein --key pro Muster.

Ein Schlüsselbereich ignoriert den Diff der Quelle. Daher wird ein Schlüssel auch dann neu übersetzt, wenn sich sein Quelltext nie geändert hat. Genau darum geht es bei diesem Flag: Es ist der unterstützte Weg, nach einer Formulierungsänderung, einem Modellwechsel oder einer Glossar-Aktualisierung gezielt einige Strings neu zu übersetzen, ohne für den Rest der Datei zu zahlen.

--force fügt daneben nichts weiter hinzu und unterdrückt die Bestätigungsabfrage für die gesamte Datei.

Was mit jedem Schlüssel geschieht#

In --key genanntIn der Übersetzung vorhandenErgebnis
jajaneu übersetzt
janeinübersetzt und hinzugefügt
neinjavorhandene Übersetzung bleibt erhalten
neinneinwird gar nicht geschrieben

Die letzte Zeile unterscheidet einen Schlüsselbereich von einem normalen Push. Ein Schlüssel, der seit deinem letzten vollständigen Push in der Quelle hinzugekommen ist, wird nicht als Quelltext in die Übersetzung übernommen — er bleibt außen vor, und erst das nächste normale lingo push übersetzt ihn.

Wie ein Muster übereinstimmt#

MusterErfasst
auth.loginauth.login und auth.login.title — niemals auth.login_url
authauth und der gesamte Teilbaum darunter — niemals authority
"auth.*"alles unter auth, einschließlich auth.login_url, aber nicht auth
"auth*"das Obige plus authority — ganz ohne Grenze

Ein Muster passt entweder exakt auf einen Schlüssel, als Präfix mit Abschluss an einer .-, /-, -- oder [-Grenze oder als Glob. Array-Mitglieder sind über die eckige Klammer erreichbar, daher erfasst nav.items nav.items[0].title.

Globs in Anführungszeichen setzen. Deine Shell erweitert sie zuerst: In zsh bricht ein unquotiertes --key auth.* entweder mit no matches found ab oder wird — wenn zufällig eine Datei wie auth.json im Verzeichnis liegt — stillschweigend zu diesem Dateinamen. Ein kommagetrennter Wert ist keine Liste: --key "a,b" ist ein einzelnes wörtliches Muster, das auf nichts passt. Wiederhole stattdessen das Flag.

Was abgelehnt wird#

Ein Schlüsselbereich meldet und überspringt Fälle, statt stillschweigend mehr zu tun, als du angefordert hast:

  • Eine Sprache ohne vorhandene Übersetzung. Es gibt nichts, womit zusammengeführt werden könnte. Daher wird die Sprache genannt und übersprungen — übersetze sie einmal mit --backfill-missing und verwende danach --key.
  • Formate, bei denen kein Schlüssel fehlen darf — Dokumentformate, deren Schlüssel sich verschieben, sobald das Dokument bearbeitet wird, sowie xcode-stringsdict, deren Pluralkategorien die Datei braucht, damit sie gültig bleibt. Formate enthält die vollständige Liste. Diese Dateien werden mit einer Warnung ausgeschlossen, sodass ein Push sie trotzdem mit Schlüssel-Wert-Dateien mischen kann. Pushen Sie sie ohne --key.
  • Ein Bereich, der nichts erfasst hat, weist ausdrücklich darauf hin, statt den Durchlauf als bereits aktuell zu melden.

Positionsbezogene Elemente behalten ihren Quelltext auch innerhalb eines Bereichs — Array-Elemente, Android-<string-array>-Einträge, <plurals>-Mengen — denn das Entfernen eines Elements würde alle übrigen neu nummerieren.

Die Lockfile wird nicht aktualisiert#

Ein schlüsselbezogener Durchlauf übersetzt nur einen Teil einer Datei und lässt den Quell-Hash in der Lockfile daher absichtlich unverändert. Alles andere, was sich in dieser Datei geändert hat, bleibt weiter ausstehend, und das nächste normale lingo push nimmt es mit.

--force / -f#

bash
lingo push docs/en/about.md --force

Alle passenden Ziele neu übersetzen, vorhandene Übersetzungen ignorieren und den serverseitigen Cache umgehen. Begrenze den Umfang — mit positionsbezogenen Mustern oder --backfill-missing — außer du meinst wirklich das gesamte Projekt: Ein unqualifiziertes lingo push --force übersetzt jedes konfigurierte Muster neu, und nur die Bestätigung unten steht noch dazwischen.

Bei einem Projekt, das noch nie übersetzt wurde, gibt es nichts zu überschreiben – --force bringt dort also keinen Mehrwert. Greifen Sie stattdessen zu --backfill-missing. Das ist generell die sicherere Wahl: Es füllt ausschließlich Lücken und fordert nie zu etwas auf.

Standardmäßig fragt --force vor dem Ausführen nach einer Bestätigung:

text
! --force will retranslate every target for pattern(s): docs/en/about.md and
  overwrite existing translations. Continue? (Yes, retranslate / Cancel)

Übergib --yes / -y, um die Abfrage zu überspringen (CI-freundlich).

Wenn du nur ein paar Strings statt ganzer Dateien neu übersetzen willst, greif zu --key — berechnet werden nur die Schlüssel, die du angibst.

--backfill-missing#

bash
lingo push --backfill-missing

Alle Ziele übersetzen, die über alle konfigurierten Patterns hinweg noch nicht existieren. Entspricht einem Scoped Push über alle Konfigurations-Patterns, erzeugt aber nur Dateien, wenn sie fehlen. Nutze das nach dem Hinzufügen einer neuen Sprache zu targetLocales oder beim ersten Push eines neuen Projekts.

Mit --force kombinieren, um alles von Grund auf neu zu übersetzen:

bash
lingo push --backfill-missing --force --yes

--yes / -y#

Überspringt die Bestätigungsabfrage für --force. Ohne --force hat das keine Wirkung, und zusammen mit --key ebenfalls nicht — ein Schlüsselbereich fragt nie nach, weil er nur die Schlüssel anfasst, die du angegeben hast.

--wait / -w#

bash
lingo push --wait

Warten Sie, bis der Lauf abgeschlossen ist, schreiben Sie die Ergebnisse und aktualisieren Sie die Sperrdatei — alles mit einem einzigen Befehl. Ohne diese Option beendet sich push, sobald der Lauf übermittelt wurde, und lingo pull holt die Ergebnisse ab. Nutzen Sie sie in CI immer dann, wenn ein späterer Schritt die Übersetzungen committet.

Während des Wartens ist Strg+C unbedenklich: Die Übersetzung läuft auf dem Server weiter, und lingo pull hängt sich wieder an den Lauf an.

--estimate#

bash
lingo push --estimate
lingo push 'docs/en/**/*.md' --estimate

Die voraussichtlichen Kosten dieses Push-Vorgangs ausgeben und ohne zu übersetzen beenden. Die CLI durchläuft die komplette Push-Pipeline – Hashing, Delta und Upload der Quell-Bytes –, damit der Server das exakte Delta berechnen kann, und lässt anschließend die Engine den Durchlauf bepreisen, statt ihn zu starten. Es wird nichts übersetzt, geschrieben oder abgerechnet; die Sperrdatei und Ihre Zieldateien bleiben unberührt.

Die Werte sind Schätzungen, keine verbindlichen Angebote. --estimate lässt sich mit Bereichen sowie mit --key / --force / --backfill-missing kombinieren, sodass du genau den Push kalkulieren kannst, den du gleich ausführen willst.

Wenn sich an den Quelldateien nichts geändert hat, bricht --estimate mit ✓ Nothing to push. vorzeitig ab – genau wie ein regulärer Push.

Wenn für dieselben Quellen bereits ein Durchlauf läuft, schlägt --estimate fehl, statt einen nur halb gestarteten Durchlauf zu bepreisen:

text
Error: Cannot estimate: existing group lrg_a8c... is already in 'running' state. Change a source file or wait for the run to finish.

Ausgabe#

Bei Erfolg meldet push den übermittelten Lauf:

text
Pushing source files to localization engine…
✓ Run lrg_a8c... submitted. Run lingo pull to download results when it finishes.

Mit --wait wird gemeldet, was geschrieben wurde:

text
Pushing source files to localization engine…
✓ Run lrg_a8c...: localized 12 target file(s), 4 already up-to-date, uploaded 1 new artifact(s).

Die Zusammenfassung gliedert sich wie folgt:

  • N Zieldatei(en) lokalisiert — die Engine hat neue Übersetzungen erzeugt und die CLI hat sie geschrieben.
  • N bereits aktuell — serverseitige Cache-Treffer (Quelle stimmte überein, Ziel wurde wiederverwendet).
  • N neue Artefakt(e) hochgeladen — Quellen, die der Engine bisher noch nicht bekannt waren (binäre/große Inhalte werden einmal gespeichert und danach referenziert).

Bei einem Fehler für ein einzelnes Ziel (mit --wait) gibt die CLI den Fehler für jedes fehlgeschlagene Ziel aus und endet mit einem Nicht-Null-Status — nützlich für CI:

text
✓ Run lrg_a8c...: localized 10 target file(s).
  2 target(s) failed:
    locales/de.json: rate limit on engine; retry later
    locales/fr.json: timeout

Mit --estimate:

text
Estimating push cost…
› Estimated cost: ~$1.87 (12 target(s), ~48,000 output tokens — estimate, not a quote)
  de: ~$0.9350 (6 target(s), ~24,000 tokens)
  fr: ~$0.9350 (6 target(s), ~24,000 tokens)
  4 target(s) already up-to-date — no cost.
✓ Estimate complete — nothing was translated. Run `lingo push` to start the translation.

Retry-Semantik#

Die Sperrdatei wird nur aktualisiert, wenn ein Lauf abgeschlossen ist. Wenn der Lauf fehlschlägt oder abgebrochen wird, bleiben die Quell-Hashes in der Sperrdatei unverändert, sodass der nächste lingo push dieselbe Differenz erneut versucht — ganz ohne manuelles Zurücksetzen.

Ein Lauf kann abgeschlossen sein, obwohl einzelne Ziele fehlschlagen (z. B. wenn für eine Sprache ein Timeout auftritt). Push schreibt dann alles, was erfolgreich war, vermerkt die neuen Quell-Hashes und endet mit einem Nicht-Null-Status — ein einfaches lingo push greift diese Ziele also nicht noch einmal auf. Starten Sie sie mit einem eingegrenzten Push der betroffenen Quelldateien erneut (lingo push <pattern>).

Wenn die Engine einen Fehler meldet, bevor überhaupt eine Übersetzung stattfindet (Authentifizierung, Validierung), wird nichts geschrieben und die Lockfile bleibt unverändert.

Häufige Patterns#

CI: Übersetzen beim Merge#

yaml
- run: lingo push --backfill-missing --yes --wait
- run: git add . && git commit -m "chore: refresh translations" && git push

--backfill-missing ist die sichere Standardeinstellung: Es überschreibt nichts und füllt nur Lücken. --wait hält den Schritt an, bis die Übersetzungen geschrieben wurden, damit der Commit-Schritt auch etwas zum Committen hat.

Ein paar Strings neu übersetzen#

bash
lingo push --key auth.login --key billing.plan --wait

Genau diese Schlüssel nach einer Formulierungsänderung neu übersetzen und alle anderen Schlüssel in der Datei unangetastet lassen.

Einzeldatei-Iteration#

bash
lingo push docs/en/onboarding.md -f -y

Nur eine Quelle nach einer größeren Textänderung neu übersetzen. Für schnelle Iterationen die Abfrage überspringen.

Neue Sprache hinzufügen#

Nach dem Erhöhen von targetLocales in .lingo/config.json:

bash
lingo push --backfill-missing

Übersetzt den gesamten Bestand in die neue Sprache, ohne vorhandene Übersetzungen neu zu erzeugen.