Skoči na vsebino

Ozadje

Ta knjižnica stoji na stičišču dveh dolgih zgodb — ene o tem, kako se programska oprema prevaja, in ene o tem, kako Python interpolira nize —, ki sta se leta 2025 končno presekali in nato obtičali natanko tam, kjer bi bil potreben majhen, premišljen dogovor. Ta stran pripoveduje obe, s povezavami na vire, ker je zasnovne odločitve tega spletišča laže presojati, kadar vidite vprašanja, na katera odgovarjajo.

Ekosistem gettexta

GNU gettext je od sredine devetdesetih način, kako se prevaja prosta programska oprema: nize v kodi označite, izvlecite jih v predlogo, prevajalcem izročite po eno katalogno datoteko na jezik, kompilirajte, naložite med izvajanjem. Okoli te zanke je zrasel cel ekosistem — urejevalniki PO, procesi pregledovanja in prevajalske platforme, ki vse govorijo isti format datotek —, Python pa v svoji standardni knjižnici že več kot dve desetletji prinaša modul gettext. Izvajalna polovica prevajanja nikoli ni bila težava.

Neurejena polovica je bila zmeraj videz niza v katalogu. Sporočilo %(name)s prevajalcem izroči sintakso printf, ki jo en sam izbrisan znak spremeni v sesutje v produkciji; sporočilo .format() katalogu izroči dostop do atributov na živih objektih. (Zakaj t-nizi prehodi oboje, z odpovedmi na ogled.) F-nizi — sintaksa, ki jo danes največ pythonske kode postavlja na prvo mesto — pa pri tem sploh ne morejo sodelovati: ko jih zagleda katera koli knjižnica, so že dokončani nizi. Ljudje kljub temu poskušajo, dovolj pogosto, da Babelov sledilnik težav te poskuse zbira (#594, #715); odpoved je strukturna, ne manjkajoča zmožnost.

Dva PEP-a z desetletjem vmes

Leta 2015 sta Alyssa Coghlan in Nick Humrich napisala PEP 501 in v njem predlagala interpolacijske predloge, katerih prvi navedeni motiv je bil i18n — »providing a cleaner syntax for i18n translation«, kot pravi PEP sam. Predlog je bil odložen, med drugim zato, ker je razprava pokazala, da primer i18n nosi znatne dodatne premisleke, ki jih preprostejši primeri rabe nimajo.

Desetletje pozneje je PEP 750 — delo Jima Bakerja, Guida van Rossuma, Paula Everitta, Koudaija Aona, Lysandrosa Nikolaouja in Davea Pecka — zamisel oživil kot t-nize, bil sprejet aprila 2025 in oktobra 2025 prispel v Python 3.14. PEP 501 je bil zatem umaknjen njemu v prid. Ena podrobnost je za to stran pomembna: i18n ni med navedenimi motivi PEP 750. PEP je mehanizem posplošil — tip predloge, ki ga lahko uporabi katera koli knjižnica — in vprašanje prevajanja pustil natanko tam, kjer ga je desetletje prej odložil PEP 501: odprto.

Tako je imel jezik od Pythona 3.14 dalje natanko tisto podatkovno strukturo, ki jo katalog sporočil potrebuje, in nobenega dogovora, kako naj se kot taka uporablja.

Razprava o standardni knjižnici

Dva meseca pred izidom 3.14 je Adrian Mönnich (ThiefMaster, vzdrževalec projekta Indico) predlagal, naj se ta vrzel zapre kar v standardni knjižnici: nit Support t-strings in gettext na discuss.python.org, odprta avgusta 2025, je prišla skupaj z delujočim pull requestom, ki je podporo t-nizom dodajal tako v gettext kot v pygettext.

Nit je vredno prebrati v celoti, saj na dan prinese vsako težko vprašanje, na katero je morala ta knjižnica pozneje odgovoriti:

  • Kaj sme biti interpolacija? Samo preprosto ime ali tudi atributi in klici z izpeljanim imenom ograde? Vsak odgovor menja udobnost za stabilnost msgidov in varnost kataloga.
  • Kaj zahtevajo množinske oblike, kadar se množinski sistem ciljnega jezika razlikuje od izvornega?
  • Je gettext sploh pravi cilj? Barry Warsaw — ki je med nastajanjem PEP 750 zagovarjal, da t-nizi za i18n niso primerni — je kot prijaznejše orodje pokazal na svoj flufl.i18n in njegov slog $-nizov; drugi so zagovarjali, naj se gettext v celoti pusti za sabo v prid novejšim sistemom, kot je Fluent.
  • In metavprašanje: kar koli standardna knjižnica izda, se tako rekoč nikoli več ne more spremeniti. Dogovor s toliko odprtimi izbirami je tvegano zamrzniti že v prvem poskusu.

Soglasja ni bilo. Prijava v CPythonu je bila zaprta kot »not planned«, pull request pa oktobra 2025, nekaj dni po izidu 3.14, zaprt brez združitve. Zmožnost je v jeziku obstajala; dogovor ni imel doma.

Zakaj najprej paket

To je vrzel, ki jo je ta projekt sklenil zapolniti zunaj standardne knjižnice, in sicer na premišljeno stavo: dogovor dozori hitreje tam, kjer lahko prosto verzionira in si podporo prisluži primer za primerom, standardna knjižnica — ki mora biti pravilna že prvič — pa je kraj, kjer naj bi se dogovor iztekel, ne kjer naj bi se izdeloval.

Konkretno: vsako sporno vprašanje iz niti ima tukaj zapisan odgovor, vsakega na svoji strani:

  • Interpolacije so samo preprosta imena, da msgidi ostanejo stabilni in smiselni — vodnik prikaže pravilo, Kako deluje pa razloge.
  • Oblikovanje ostane povsem zunaj kataloga (Zakaj t-nizi).
  • Množina sledi pravilu unije in preseka, ki dovoli, da se množinski sistem ciljnega jezika razlikuje od izvornega (specifikacija §4).
  • Pokvarjen katalog se vrne na izvorno besedilo, namesto da bi se sesul, in s tem ohrani gettextov lastni dogovor (vodnik).
  • Celoten dogovor pa je verzionirana specifikacija s strojno berljivo zbirko testov skladnosti — napisana tako, da bi jo druga izvedba, vključno s prihodnjo v standardni knjižnici, lahko prevzela nespremenjeno in z njo sodelovala.

Razprava se ni končala in ta projekt je v njej udeleženec, ne razsodba o njej. Če imate produkcijske izkušnje z gettextom, ki zadevajo te izbire, se razprava nadaljuje v isti niti in v razpravah tega repozitorija.

Časovnica

Kdaj Kaj se je zgodilo
sredina 1990-ih GNU gettext vzpostavi delovni proces PO/POT/MO, ki ga prevajalci in platforme govorijo še danes.
2015 PEP 501 predlaga interpolacijske predloge z i18n kot prvim motivom; odložen.
2016 F-nizi prispejo v Python 3.6 — interpolacija dobi svojo sintakso, prevajanje pa je ne more uporabiti.
jul. 2024 PEP 750 predlaga t-nize.
apr. 2025 PEP 750 sprejet; PEP 501 umaknjen njemu v prid.
avg. 2025 Odpre se nit Support t-strings in gettext, skupaj s pull requestom v standardni knjižnici.
okt. 2025 Python 3.14 prinese t-nize; prijava v standardni knjižnici se zapre kot not planned.
2026 gettext-tstrings izide kot alfa, s specifikacijo v1 in njeno zbirko testov skladnosti.