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:.2faz 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 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:
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
.pofá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¶
- Válassz egy good first issue címkéjűt egy jól körülhatárolt hozzájáruláshoz.
- Használati kérdéseidet tedd fel a Q&A Discussionsban.
- Az éles gettext-munkafolyamatokat és API-ötleteket hozd az Ideas Discussionsba.
- Pull request nyitása előtt olvasd el a hozzájárulási útmutatót.