Kihagyás

Teljes üzenetek fordítása
Python t-stringekkel

A gettext-tstrings összeköti a Python 3.14+ t-stringjeit a szokásos gettext-katalógusokkal és a Babel eszközkészletével. Az értékek és a formázás az alkalmazáskódban maradnak; a fordítók teljes üzenetekkel és egyszerű {name} helyőrzőkkel dolgoznak:

import gettext

from gettext_tstrings import Translator

_ = Translator(gettext.translation("messages", localedir="locales"))
name = "Ada"
print(_(t"Hello {name}"))  # with a Japanese catalog: こんにちは Ada

A katalógus a Hello {name} üzenetet tartalmazza. Egy fordítás áthelyezheti vagy megismételheti a {name} helyőrzőt. Ha elhagyja, átnevezi vagy formázást akaszt rá, a katalógus-ellenőrzés jelzi a hibát. Ha egy hibás bejegyzés mégis eljut az éles üzembe, a könyvtár figyelmeztetést naplóz, és összeomlás helyett a forrásüzenetet rendereli.

Irány az ötperces oktatóanyag Hasonlítsd össze az alternatívákat

Alfa · Python 3.14+ · szabványos PO-/MO-katalógusok · nincs harmadik féltől származó futásidejű függőség

Ez a webhely maga is azt gyakorolja, amit dokumentál: minden nyelvi kiadását — a navigációt, a feliratokat és a többes számot kezelő build-jelentést — PO-katalógusokból rendereli maga a gettext-tstrings.

Neked való ez?

Ma illik hozzád, ha az alkalmazásod Python 3.14-en vagy újabbon fut; már használsz gettextet és Babelt, vagy szeretnéd bevezetni a PO-/MO-alapú munkafolyamatukat; és olyan t-string-szintaxist szeretnél, amelynek nevesített helyőrzőit renderelés előtt ellenőrzik.

Még nem illik hozzád, ha Python 3.13-ra vagy régebbire van szükséged; ha stabil Python API-t követelsz meg — ez alfa, és a specifikáció az a része, amely megállapodott —; vagy ha a fordítandó szövegeid szinte mind egy sablonnyelvben élnek, nem Python-forrásban.

Már vannak katalógusaid? Továbbra is működnek. A _("Hello {name}").format(name=name) és a tr(t"Hello {name}") ugyanazt a msgidet állítja elő, tehát a meglévő fordítások túlélik a váltást — a Migráció végigjárja az egész átállást.

Mit mondhat a katalógus

Egy fordítás nem változtathatja meg annak az üzenetnek a szerkezetét, amelyet fordít. Ez az egész ígéret, és ebből következik a webhely minden további része. Egy fordítás átrendezheti vagy megismételheti a {name} helyőrzőt, és átírhat körülötte minden más szót. Nem hagyhatja el a helyőrzőt, nem találhat ki újat, nem nyúlhat rajta keresztül az objektumaidba, és nem aggathat rá saját formázást.

A könyvtár ezt beérkezéskor ellenőrzi — a katalógusok bináris fordításakor —, majd rendereléskor újra: ez a különbség az átnézésen megtalált és a felhasználó által megtalált hiba között.

Most ismerkedsz a gettexttel? Az egész munkafolyamat négy mondatban

A gettext a szoftverek fordításának bevett módja, Pythonban és jóval azon túl is. A kódod megjelöli a fordítandó üzeneteket; egy kinyerő összegyűjti őket egy sablonfájlba (.pot); egy fordító — aki rendszerint nem programozó — nyelvenként kitölt egy katalógusfájlt (.po), amelyből bináris .mo fordul, és ezt tölti be az alkalmazásod futás közben. A fordítófüggvény szokásos neve _, így a _(t"Hello {name}") úgy olvasható: „fordítsd le ezt az üzenetet”. Az oktatóanyag végigjárja a teljes utat — megjelölés, kinyerés, fordítás, bináris fordítás, futtatás — nagyjából öt perc alatt.

Milyen problémát old meg

Az f-string már interpolált, mire bármelyik könyvtár meglátja — az f"Hello {name}" addigra "Hello Ada" lett, egy érték köré eső töredékek fordítása pedig a legtöbb nyelv nyelvtanát tönkreteszi. A t-string (PEP 750) külön tartja a statikus szöveget, a kiértékelt értékeket, a forráskifejezéseket, a konverziókat és a formátumleírókat — pontosan azt a szétválasztást, amelyre egy üzenetkatalógusnak szüksége van. Mit változtat ez a %(name)s, a .format() és a $-stringek mellett?

Azt viszont sem a gettext, sem a Babel nem mondja meg, hogyan lesz egy t-stringből üzenet. Ez a könyvtár meghozza ezt a döntést, leírja verziózott specifikációként, és mellékeli az ellenőrzésére szolgáló konformitási készletet.

A tervezési szabályok

  • Teljes üzeneteket fordítunk, sosem mondattöredékeket.
  • Csak egyszerű változóneveket fogadunk el, amilyen a {name}.
  • A !r és a :.2f az alkalmazás kezében marad, a katalóguson kívül.
  • Megengedjük, hogy a fordítások átrendezzék és megismételjék az ismert helyőrzőket, miközben megakadályozzuk, hogy attribútumokhoz nyúljanak vagy formázást adjanak hozzá.
  • Újrahasznosítjuk a szokásos POT-, PO- és MO-fájlokat, és az őket már olvasó eszközöket.

És a hozzá tartozó lista arról, amihez szándékosan nem nyúl: nem honosítja a számokat, a pénznemeket és a dátumokat — azokat előbb formázd meg, Babellel; nem escape-eli a renderelt kimenetet HTML-hez, shellhez vagy terminálhoz; és nem tudja megítélni, hogy egy fordítás helyes-e, csak azt, hogy a helyőrzői épek-e.

Telepítés

python -m pip install gettext-tstrings

Python 3.14 vagy újabb szükséges. A renderelésnek nincsenek függőségei — csak a standard könyvtár gettext moduljára támaszkodik.

A kinyerés és a katalógus-ellenőrzés Babelen keresztül fut, ezért ezt az extrát oda telepítsd, ahol a pybabel fut: ez rendszerint fejlesztői vagy CI-környezet, nem pedig éles image:

python -m pip install "gettext-tstrings[babel]"

Merre tovább

Kezdd itt — gettext-tapasztalat nélkül is:

  • Oktatóanyag — üres könyvtártól a működő japán fordításig öt lépésben, minden parancs a kimenetével együtt.
  • Miért t-string? — ugyanaz az üzenet négyféleképpen megírva, és hogy a %(name)s, a .format() és a $-stringek külön-külön mit adnak a katalógus kezébe.

Használd — a munkareferenciák:

  • Kézikönyv — a futásidejű API: melyik belépési pontot használd, többes számok, kérésenkénti nyelvek, késleltetett szövegek, és mi történik, ha egy katalógus hibás.
  • Kinyerés — a pybabel-referencia: konfiguráció, saját függvénynevek, és hogy a meglévő eszközök hogyan validálják ingyen ezeket a katalógusokat.
  • Éles üzemben — a ciklus úgy, ahogy egy csapat működteti: a frissítési kör, a fuzzy bejegyzések, a CI-kapuk, a fordítási platformok és a kiszállítás.
  • Migráció — a bevezetés olyan projektben, amelynek már vannak katalógusai, egyszerre egy hívási hely.
  • Fordítóknak — egyetlen oldal annak, aki a .po fájlokat szerkeszti.

Értsd meg — a történettől a megvalósításig:

  • Háttér — miért létezik ez a könyvtár: harminc év gettext, két PEP, és a stdlib-vita, amely válasz nélkül zárult.
  • Buktatók — mi romlott el ténylegesen attól, hogy ezt a webhelyet harmincöt nyelvre fordítottuk, és melyik felét kapja el egy eszköz.
  • Hogyan működik — a PEP 750 sablonobjektumától a renderelt szövegig, és a gyorsítótárak, amelyek olcsóvá teszik az ellenőrzést.

Referencia — a szerződések:

  • API — minden, amit a csomag exportál, egyetlen oldalon.
  • Specifikáció — a t-string ↔ msgid konvenció stabil, verziózott szerződésként, géppel olvasható konformitási készlettel.

Állapot

Csomagverzió 0.1.0a8
API-stabilitás alfa — a Python API még változhat
Specifikáció v1, konformitási készlettel
Python 3.14 és újabb; tesztelve 3.14, 3.14t (szabad szálú) és 3.15 alatt
Babel 2.18 vagy újabb, és csak ott, ahol a pybabel fut
Futásidejű függőségek nincsenek — a standard könyvtár gettext modulja
Katalógusformátum közönséges POT, PO és MO
Változások CHANGELOG

Alfa. A szerződés szándékosan kicsi, és a specifikáció a stabil része; a Python API még mozoghat. Egy stabil kiadás előtt szükség van szélesebb nyelvi fixtúrákra, folyamatos teljesítménykövetésre, olyanok API-átnézésére, akik komolyan használják a gettextet és a Babelt, valamint kompatibilitási tesztekre minden támogatott Python- és Babel-kiadáson.

A hibajegyeket és pull requesteket szívesen fogadjuk — az alfa épp az a szakasz, amikor még érdemes vitatkozni az interfészről.

Csatlakozz a közösséghez