lingo push

Max PrilutskiyCEO a spoluzakladatelUpdated před 16 dny · 6 min read

Odešle zdrojové soubory do engine, počká na dokončení běhu a zapíše výstupy na disk.

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

Výchozí chování — delta push#

Bez argumentů lingo push běží v režimu pouze delta:

  1. Vypočítá hash každého zdrojového souboru odpovídajícího vzorům files v konfiguraci
  2. Porovná každý hash s lockfile a zjistí, které zdroje se změnily
  3. Nahraje změněné zdroje jako běh do engine
  4. Počká na dokončení běhu
  5. Zapíše výstupy na disk
  6. Uloží nové hashe zdrojů do lockfile

Pokud se od posledního úspěšného push nezměnil žádný zdroj, příkaz se ukončí rovnou s ✓ Nothing to push. — bez komunikace se serverem a bez spotřeby tokenů.

Argumenty a přepínače#

Poziční: patterns... — omezený push#

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

Omezí push na konkrétní soubory (musí odpovídat vzorům, které už jsou v .lingo/config.json). Přepne příkaz do omezeného režimu:

  • Bez porovnání s předchozím stavem zdrojů — každý odpovídající zdroj se bere jako součást scope, i když se nezměnil.
  • No-op na straně serveru pro cíle, které už existují a mají odpovídající hashe zdrojů — engine je přeskočí a CLI je nahlásí jako cache.

Použijte, když chcete přeložit právě jeden aktualizovaný soubor bez přepočítávání hashů celého projektu nebo když chcete znovu přeložit jednu stránku pomocí --force.

--key <pattern>#

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

Znovu přeloží jen klíče, na které se pattern vztahuje, sloučí je do existujícího překladu a všechny ostatní klíče ponechá bajtově beze změny. Opakovatelné — jeden --key na pattern.

Rozsah klíčů ignoruje diff zdroje, takže i klíč, jehož zdrojový text se vůbec nezměnil, se přeloží znovu. Právě o to u tohoto příznaku jde: je to podporovaný způsob, jak po úpravě formulace, změně modelu nebo aktualizaci glosáře znovu přeložit jen pár řetězců, aniž byste platili za zbytek souboru.

--force vedle sebe nic nepřidává a potlačí výzvu k potvrzení pro celý soubor.

Co se stane s jednotlivými klíči#

Uvedený v --keyPřítomný v překladuVýsledek
anoanoznovu přeložen
anonepřeložen a přidán
neanostávající překlad zachován
nenevůbec se nezapíše

Právě poslední řádek odlišuje rozsah klíčů od běžného push. Klíč přidaný do zdroje od vašeho posledního úplného push se do překladu jako zdrojový text nepřenese — vynechá se a přeloží ho až další běžný lingo push.

Jak pattern odpovídá#

PatternZahrne
auth.loginauth.login a auth.login.title — nikdy auth.login_url
authauth a celý jeho podstrom — nikdy authority
"auth.*"všechno pod auth, včetně auth.login_url, ale ne auth
"auth*"všechno výše uvedené plus authority — bez jakékoli hranice

Pattern odpovídá klíči přesně, jako prefix končící na hranici ., /, - nebo [, případně jako glob. K členům pole se dá dostat přes hranici se závorkami, takže nav.items zahrne nav.items[0].title.

Globy dávejte do uvozovek. Váš shell je jinak rozbalí jako první: v zsh holý --key auth.* buď skončí chybou no matches found, nebo — pokud je v adresáři zrovna soubor jako auth.json — se tiše změní na jeho název. Hodnota oddělená čárkami není seznam: --key "a,b" je jeden doslovný pattern, který neodpovídá ničemu. Místo toho příznak zopakujte.

Co odmítá#

Rozsah klíčů věci nahlásí a přeskočí, místo aby tiše udělal víc, než jste chtěli:

  • Jazyk bez existujícího překladu. Není do čeho slučovat, takže se jazyk vypíše a přeskočí — nejdřív ho jednou přeložte pomocí --backfill-missing, potom použijte --key.
  • Formáty, u kterých nelze vynechat klíč — formáty dokumentů, u nichž se klíče změní hned po úpravě dokumentu, a xcode-stringsdict, jejichž kategorie množného čísla soubor potřebuje, aby zůstal platný. Úplný seznam najdete v části Formáty. Tyto soubory se přeskočí s upozorněním, takže push je stále může kombinovat se soubory klíč–hodnota. Pushněte je bez --key.
  • Rozsah, který neodpovídal ničemu, to oznámí, místo aby běh vykázal jako už aktuální.

Poziční členové si ponechávají zdrojový text i v rámci rozsahu — prvky pole, položky Android <string-array>, počty <plurals> — protože odstranění jednoho z nich by přečíslovalo všechny ostatní.

Neupravuje lockfile#

Běh s rozsahem klíčů překládá jen část souboru, takže záměrně nechává hash zdroje v lockfilu beze změny. Všechno ostatní, co se v souboru změnilo, tak zůstává nevyřízené a příští běžný lingo push to zachytí.

--force / -f#

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

Znovu přeloží každý odpovídající cíl, ignoruje všechny existující překlady a obejde cachování na straně serveru. Omezte to rozsahem — pomocí pozičních patternů nebo --backfill-missing — pokud opravdu nemáte na mysli celý projekt: samotné lingo push --force znovu přeloží každý nakonfigurovaný pattern a jediná věc, která tomu stojí v cestě, je potvrzení níže.

U projektu, který se ještě nikdy nepřekládal, není co přepsat, takže --force tam nepřinese nic navíc — místo toho sáhněte po --backfill-missing. A obecně je to i bezpečnější návyk: jen doplňuje mezery a nikdy se na nic neptá.

Ve výchozím nastavení si --force před spuštěním vyžádá potvrzení:

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

Předejte --yes / -y, pokud chcete potvrzení přeskočit (vhodné pro CI).

Když chcete znovu přeložit jen pár řetězců místo celých souborů, sáhněte po --key — zaplatíte jen za klíče, které uvedete.

--backfill-missing#

bash
lingo push --backfill-missing

Přeloží každý cíl, který ještě neexistuje, napříč všemi nakonfigurovanými vzory. Je to ekvivalent omezeného push nad všemi vzory z konfigurace, ale vytvoří jen soubory, které chybí. Použijte po přidání nového jazyka do targetLocales nebo při prvním push nového projektu.

Zkombinujte s --force, pokud chcete vše přeložit znovu od nuly:

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

--yes / -y#

Přeskočí výzvu k potvrzení pro --force. Bez --force nemá žádný efekt a vedle --key také ne — rozsah klíčů nikdy potvrzení nevyžaduje, protože se vždy týká jen klíčů, které jste uvedli.

--estimate#

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

Vypíše orientační cenu tohoto push a skončí bez překladu. CLI projde celý push pipeline — hashování, delta i nahrání zdrojových bytů — aby server mohl naplánovat přesnou delta, a pak místo spuštění požádá engine o ocenění běhu. Nic se nepřeloží, nezapíše ani nevyúčtuje; lockfile i vaše cílové soubory zůstanou beze změny.

Hodnoty jsou odhady, ne cenové nabídky. --estimate lze kombinovat s rozsahem i s --key / --force / --backfill-missing, takže si můžete nacenit přesně ten push, který se chystáte spustit.

Pokud se žádný zdroj nezměnil, --estimate se stejně jako běžný push ukončí hned s ✓ Nothing to push..

Pokud už pro stejné zdroje běh probíhá, --estimate skončí chybou, místo aby ocenil už napůl spuštěný běh:

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

Výstup#

Při úspěchu:

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

Souhrn se dělí na:

  • Lokalizováno N cílových souborů — engine vytvořil nové překlady a CLI je zapsalo.
  • N už je aktuálních — zásahy serverové cache (zdroj odpovídal, cíl se znovu použil).
  • N nových artefaktů nahráno — zdroje, které engine ještě neviděl (binární/velký obsah se uloží jednou a pak se už jen odkazuje).
  • N cílů přeskočeno (místní úpravy) — místní hashe cílů se liší od lockfile. Pokud je chcete přepsat, spusťte znovu s --force.

Při selhání jednotlivých cílů CLI vypíše chybu pro každý neúspěšný cíl a skončí s nenulovým návratovým kódem — užitečné pro CI:

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

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

Sémantika opakování#

Lockfile se aktualizuje až po plně úspěšném běhu. Částečné selhání (např. timeout jednoho jazyka) ponechá hashe zdrojů v lockfile beze změny, takže další lingo push zopakuje stejný diff — bez ručního resetu.

Pokud engine selže ještě před zahájením překladu (ověření, validace), nic se nezapíše a lockfile zůstane beze změny.

Běžné vzory#

CI: překlad při merge#

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

--backfill-missing je bezpečná výchozí volba: nic nepřepisuje, jen doplňuje chybějící položky.

Znovu přeložit pár řetězců#

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

Po úpravě formulace znovu přeloží přesně tyto klíče a všechny ostatní klíče v souboru nechá beze změny.

Práce s jedním souborem#

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

Znovu přeložte jen jeden zdroj po větší změně textu. Pro rychlou iteraci přeskočte potvrzení.

Přidání nového jazyka#

Po navýšení targetLocales v .lingo/config.json:

bash
lingo push --backfill-missing

Přeloží celý korpus do nového jazyka, aniž by znovu překládal stávající.