Tradu mesaje complete
cu t-stringuri Python¶
gettext-tstrings leagă t-stringurile din Python 3.14+ de cataloagele gettext
standard și de uneltele Babel. Valorile și formatarea rămân în codul aplicației;
traducătorii lucrează cu mesaje complete și cu substituenți simpli {name}:
import gettext
from gettext_tstrings import Translator
_ = Translator(gettext.translation("messages", localedir="locales"))
name = "Ada"
print(_(t"Hello {name}")) # with a Japanese catalog: こんにちは Ada
Catalogul conține Hello {name}. O traducere poate muta sau repeta {name}.
Dacă elimină, redenumește sau reformatează substituentul, validarea catalogului
semnalează eroarea. Dacă o intrare invalidă ajunge totuși în producție,
biblioteca jurnalizează un avertisment și randează mesajul sursă, în loc să cadă.
Începe tutorialul de cinci minute Compară alternativele
Alpha · Python 3.14+ · cataloage PO/MO standard · fără dependențe terțe la rulare
Acest sit practică ceea ce documentează: fiecare ediție lingvistică —
navigarea, etichetele și raportul de build conștient de plural — este randată
din cataloage PO de
gettext-tstrings însuși.
Este pentru tine?¶
Se potrivește astăzi dacă aplicația ta rulează pe Python 3.14 sau mai nou; folosești deja gettext și Babel, sau vrei să le adopți fluxul PO/MO; și vrei sintaxă de t-string cu substituenți denumiți, verificați înainte de a fi randați.
Nu se potrivește încă dacă ai nevoie de Python 3.13 sau mai vechi; îți trebuie un API Python stabil — acesta este un alpha, iar specificația este partea lui care s-a așezat; sau dacă aproape tot textul tău traductibil trăiește într-un limbaj de șabloane, nu în sursă Python.
Ai deja cataloage? Ele continuă să funcționeze.
_("Hello {name}").format(name=name) și tr(t"Hello {name}") produc același
msgid, așa că traducerile existente supraviețuiesc trecerii —
Migrare parcurge toată mutarea.
Ce poate spune catalogul¶
O traducere nu poate schimba structura mesajului pe care îl traduce.
Aceasta este toată promisiunea, iar restul sitului decurge din ea. O traducere
poate reordona sau repeta {name} și poate rescrie fiecare alt cuvânt din jurul
lui. Ea nu poate elimina substituentul, nu poate inventa unul nou, nu poate
ajunge prin el la obiectele tale și nu îi poate atașa formatare proprie.
Biblioteca verifică asta la intrare — când sunt compilate cataloagele — și încă o dată la randare, ceea ce face diferența dintre o greșeală găsită la recenzie și una găsită de un utilizator.
Nou la gettext? Întregul flux în patru propoziții
gettext este modul standard în care software-ul ajunge să fie tradus,
în Python și cu mult dincolo de el. Codul tău marchează mesajele
traductibile; un extractor le adună într-un fișier șablon (.pot); un
traducător — de obicei nu un programator — completează câte un fișier
catalog (.po) pe limbă, care este compilat într-un .mo binar pe care
aplicația ta îl încarcă la rulare. Numele convențional al funcției de
traducere este _, așa că _(t"Hello {name}") se citește ca „tradu
mesajul acesta”. Tutorialul parcurge întregul drum —
marchează, extrage, tradu, compilează, rulează — în vreo cinci minute.
Problema pe care o rezolvă¶
Un f-string este deja interpolat până când vreo bibliotecă apucă să îl vadă —
f"Hello {name}" a devenit "Hello Ada", iar traducerea fragmentelor din
jurul unei valori strică gramatica majorității limbilor. Un t-string
(PEP 750) ține separate textul static, valorile evaluate, expresiile sursă,
conversiile și specificațiile de format — exact împărțirea de care are nevoie
un catalog de mesaje.
Ce schimbă asta, în comparație cu %(name)s, .format() și
$-stringurile.
Nimic din gettext sau Babel nu spune însă cum devine un t-string un mesaj. Biblioteca de față face acea alegere, o consemnează ca specificație versionată și livrează suita de conformitate care o verifică.
Regulile de proiectare¶
- Traduce mesaje complete, niciodată fragmente de propoziție.
- Acceptă doar nume simple de variabile, precum
{name}. - Ține
!rși:.2fsub controlul aplicației, în afara catalogului. - Permite traducerilor să reordoneze și să repete substituenții cunoscuți, împiedicându-le totodată să ajungă la atribute sau să adauge formatare.
- Reutilizează fișiere POT, PO și MO obișnuite, și uneltele care le citesc deja.
Și lista pe potrivă a ceea ce lasă în mod deliberat în pace: nu localizează numere, monede sau date — formatează-le întâi, cu Babel; nu escapează ieșirea randată pentru HTML, un shell sau un terminal; și nu poate judeca dacă o traducere este corectă, ci doar dacă substituenții ei sunt intacți.
Instalare¶
Python 3.14 sau mai nou. Randarea nu are dependențe — folosește gettext
din biblioteca standard și nimic altceva.
Extragerea și validarea cataloagelor trec prin Babel, așa că instalează acel
extra oriunde rulează pybabel, ceea ce înseamnă de obicei un mediu de
dezvoltare sau de CI, mai degrabă decât o imagine de producție:
Încotro mai departe¶
Începe aici — fără a presupune experiență cu gettext:
- Tutorial — de la un director gol la o traducere japoneză care rulează, în cinci pași, fiecare comandă arătată cu ieșirea ei.
- De ce t-stringuri — același mesaj scris în patru feluri,
și ce anume dau catalogului
%(name)s,.format()și$-stringurile.
Folosește-l — referințele de lucru:
- Ghid — API-ul de rulare: ce punct de intrare să folosești, plural, limbi per cerere, șiruri amânate și ce se întâmplă când un catalog este greșit.
- Extragere — referința
pybabel: configurare, nume proprii de funcții și felul în care uneltele existente validează gratuit aceste cataloage. - În producție — bucla așa cum o rulează o echipă: ciclul de actualizare, intrările fuzzy, porțile de CI, platformele de traducere și livrarea.
- Migrare — adoptarea acestei biblioteci într-un proiect care are deja cataloage, un loc de apel pe rând.
- Pentru traducători — o singură pagină de dat celui care
editează fișierele
.po.
Înțelege-l — de la istorie la implementare:
- Context — de ce există această bibliotecă: treizeci de ani de gettext, două PEP-uri și discuția din biblioteca standard care s-a închis fără un răspuns.
- Capcane — ce a stricat cu adevărat traducerea acestui sit în treizeci și cinci de limbi, și ce jumătate din asta poate prinde o unealtă.
- Cum funcționează — de la obiectul șablon al PEP 750 până la șirul randat, și cache-urile care fac verificarea ieftină.
Referință — contractele:
- API — tot ce exportă pachetul, pe o singură pagină.
- Specificație — convenția t-string ↔ msgid ca un contract stabil și versionat, cu o suită de conformitate lizibilă de mașină.
Stadiu¶
| Versiunea pachetului | 0.1.0a8 |
| Stabilitatea API-ului | alpha — API-ul Python încă se poate schimba |
| Specificație | v1, cu o suită de conformitate |
| Python | 3.14 și mai nou; testat pe 3.14, 3.14t (free-threaded) și 3.15 |
| Babel | 2.18 sau mai nou, și doar acolo unde rulează pybabel |
| Dependențe la rulare | niciuna — gettext din biblioteca standard |
| Formatul catalogului | POT, PO și MO obișnuite |
| Modificări | CHANGELOG |
Un alpha. Contractul este mic în mod intenționat, iar specificația este partea lui stabilă; API-ul Python încă se poate mișca. Înainte de o lansare stabilă, aici este nevoie de fixture-uri lingvistice mai largi, de urmărire susținută a performanței, de o recenzie de API din partea celor care folosesc gettext și Babel în serios, și de testare a compatibilității pe fiecare versiune suportată de Python și de Babel.
Tichetele și pull requesturile sunt binevenite — un alpha este exact momentul în care încă merită să te cerți despre interfață.
Alătură-te comunității¶
- Alege un good first issue pentru o contribuție bine delimitată.
- Pune întrebări de utilizare în Discuțiile Q&A.
- Adu fluxuri gettext din producție și idei de API în Discuțiile Ideas.
- Citește ghidul de contribuție înainte de a deschide un pull request.