Verskite ištisus pranešimus
su Python t-eilutėmis¶
gettext-tstrings sujungia Python 3.14+ t-eilutes su standartiniais gettext
katalogais ir Babel įrankiais. Reikšmės ir formatavimas lieka programos kode;
vertėjai dirba su ištisais pranešimais ir paprastais {name} vietaženkliais:
import gettext
from gettext_tstrings import Translator
_ = Translator(gettext.translation("messages", localedir="locales"))
name = "Ada"
print(_(t"Hello {name}")) # with a Japanese catalog: こんにちは Ada
Kataloge yra Hello {name}. Vertimas gali {name} perkelti ar pakartoti. Jei
jis vietaženklį pašalina, pervadina ar performatuoja, katalogo tikrinimas
praneša apie klaidą. Jei netinkamas įrašas vis dėlto pasiekia produkciją,
biblioteka užrašo įspėjimą ir atvaizduoja pirminį pranešimą, o ne nulūžta.
Pradėti penkių minučių pamoką Palyginti alternatyvas
Alfa · Python 3.14+ · standartiniai PO/MO katalogai · jokių trečiųjų šalių veikimo meto priklausomybių
Ši svetainė daro tai, ką dokumentuoja: kiekvieną kalbos leidimą —
navigaciją, etiketes ir daugiskaitos formas suprantančią kūrimo ataskaitą —
iš PO katalogų atvaizduoja
pats gettext-tstrings.
Ar tai jums?¶
Tinka jau šiandien, kai jūsų programa veikia su Python 3.14 ar naujesniu; jūs jau naudojate gettext ir Babel arba norite perimti jų PO/MO darbo eigą; ir norite t-eilučių sintaksės su vardiniais vietaženkliais, kurie patikrinami prieš atvaizduojant.
Kol kas netinka, kai jums reikia Python 3.13 ar senesnio; jums reikia stabilios Python API — tai alfa versija, o specifikacija yra nusistovėjusi jos dalis; arba beveik visas jūsų verstinas tekstas gyvena šablonų kalboje, o ne Python pirminiame kode.
Jau turite katalogus? Jie ir toliau veiks.
_("Hello {name}").format(name=name) ir tr(t"Hello {name}") pagamina tą patį
msgid, todėl esami vertimai perėjimą išgyvena — Migracija
pereina visą kelią.
Ką katalogui leidžiama pasakyti¶
Vertimas negali pakeisti verčiamo pranešimo sandaros. Tai ir yra visas
pažadas, o visa kita šioje svetainėje iš jo plaukia. Vertimas gali perstatyti ar
pakartoti {name} ir gali perrašyti kiekvieną aplink jį esantį žodį. Jis
negali vietaženklio praleisti, sugalvoti naujo, prasibrauti pro jį į jūsų
objektus ar prikabinti savo formatavimo.
Biblioteka tai patikrina įeinant — kai katalogai kompiliuojami — ir dar kartą atvaizdavimo metu, o būtent tai skiria klaidą, rastą peržiūros metu, nuo klaidos, kurią randa naudotojas.
Nesate susidūrę su gettext? Visa darbo eiga keturiais sakiniais
gettext yra standartinis būdas programinei įrangai išversti — tiek
Python kalboje, tiek toli už jos ribų. Jūsų kodas pažymi verstinus
pranešimus; ištraukiklis surenka jas į šablono failą (.pot); vertėjas —
paprastai ne programuotojas — užpildo po vieną katalogo failą (.po)
kiekvienai kalbai, o šis sukompiliuojamas į dvejetainį .mo, kurį jūsų
programa įkelia veikimo metu. Įprastas vertimo funkcijos pavadinimas yra
_, todėl _(t"Hello {name}") skaitosi kaip „išversk šį pranešimą“.
Pamoka pereina visą kelią — pažymėti, ištraukti,
išversti, sukompiliuoti, paleisti — maždaug per penkias minutes.
Problema, kurią ji sprendžia¶
F-eilutė būna jau interpoliuota tuo metu, kai ją pamato bet kuri biblioteka —
f"Hello {name}" jau tapo "Hello Ada", o aplink reikšmę esančių nuotrupų
vertimas laužo daugumos kalbų gramatiką. T-eilutė (PEP 750) atskirai
išsaugo statinį tekstą, apskaičiuotas reikšmes, pirminius reiškinius,
konversijas ir formato specifikacijas — o būtent tokio padalijimo ir reikia
pranešimų katalogui.
Ką tai keičia, palyginti su %(name)s, .format() ir
$ eilutėmis.
Tačiau nei gettext, nei Babel nepasako, kaip t-eilutė tampa pranešimu. Ši biblioteka tą pasirinkimą padaro, surašo jį kaip versijuotą specifikaciją ir pateikia atitikties rinkinį, kad tai patikrintų.
Projektavimo taisyklės¶
- Verskite ištisus pranešimus, niekada ne sakinių nuotrupas.
- Priimkite tik paprastus kintamųjų vardus, tokius kaip
{name}. - Palikite
!rir:.2fprogramos kontrolėje, už katalogo ribų. - Leiskite vertimams perstatyti ir kartoti žinomus vietaženklius, kartu neleisdami jiems pasiekti atributų ar pridėti formatavimo.
- Naudokite įprastus POT, PO ir MO failus bei įrankius, kurie juos jau skaito.
Ir atitinkamas sąrašas to, ką ji sąmoningai palieka ramybėje: ji nelokalizuoja skaičių, valiutų ar datų — pirma suformatuokite juos su Babel; ji neekranuoja atvaizduotos išvesties nei HTML, nei apvalkalui, nei terminalui; ir ji negali nuspręsti, ar vertimas teisingas — tik ar jo vietaženkliai nepažeisti.
Diegimas¶
Python 3.14 arba naujesnis. Atvaizdavimas neturi jokių priklausomybių — jis
naudoja standartinės bibliotekos gettext ir nieko daugiau.
Ištraukimas ir katalogų tikrinimas vyksta per Babel, todėl įdiekite šį
priedą ten, kur veikia pybabel, o tai paprastai yra kūrimo arba CI aplinka,
o ne produkcinis atvaizdis:
Kur eiti toliau¶
Pradėkite čia — gettext patirties nereikia:
- Pamoka — nuo tuščio katalogo iki veikiančio japoniško vertimo penkiais žingsniais, kiekviena komanda parodyta su savo išvestimi.
- Kodėl t-eilutės — tas pats pranešimas, parašytas
keturiais būdais, ir tai, ką
%(name)s,.format()bei$eilutės perduoda katalogui.
Naudokite — darbinės žinynų dalys:
- Vadovas — veikimo metu naudojama API: kurią įėjimo vietą rinktis, daugiskaita, kalbos pagal užklausą, atidėtos eilutės ir kas nutinka, kai katalogas klaidingas.
- Ištraukimas —
pybabelžinynas: konfigūracija, savi funkcijų vardai ir tai, kaip jau turimi įrankiai patikrina šiuos katalogus be jokių pastangų. - Realioje aplinkoje — ciklas taip, kaip jį sukioja komanda: atnaujinimo ciklas, fuzzy įrašai, CI vartai, vertimo platformos ir išsiuntimas.
- Migracija — kaip tai perimti projekte, kuris jau turi katalogus, po vieną iškvietimo vietą.
- Vertėjams — vienas puslapis tam, kas redaguoja
.pofailus.
Supraskite — nuo istorijos iki įgyvendinimo:
- Ištakos — kodėl ši biblioteka egzistuoja: trisdešimt metų gettext, du PEP'ai ir standartinės bibliotekos diskusija, užsibaigusi be atsakymo.
- Spąstai — ką iš tikrųjų sulaužė šios svetainės vertimas į trisdešimt penkias kalbas ir kurią pusę to įrankis gali pagauti.
- Kaip tai veikia — nuo PEP 750 šablono objekto iki atvaizduotos eilutės ir podėliai, dėl kurių tikrinimas kainuoja mažai.
Žinynas — kontraktai:
- API — viskas, ką paketas eksportuoja, viename puslapyje.
- Specifikacija — t-eilutės ↔ msgid susitarimas kaip stabilus, versijuotas kontraktas su mašininiu būdu skaitomu atitikties rinkiniu.
Būsena¶
| Paketo versija | 0.1.0a8 |
| API stabilumas | alfa — Python API dar gali keistis |
| Specifikacija | v1 su atitikties rinkiniu |
| Python | 3.14 ir naujesnis; testuota su 3.14, 3.14t (laisvųjų gijų) ir 3.15 |
| Babel | 2.18 arba naujesnis, ir tik ten, kur veikia pybabel |
| Veikimo meto priklausomybės | jokių — standartinės bibliotekos gettext |
| Katalogų formatas | įprasti POT, PO ir MO |
| Pakeitimai | CHANGELOG |
Alfa versija. Kontraktas tyčia mažas, o specifikacija yra stabilioji jo dalis; Python API dar gali keistis. Prieš stabilų leidimą reikia platesnių kalbinių bandymų rinkinių, nuolatinio našumo stebėjimo, API peržiūros iš žmonių, rimtai naudojančių gettext ir Babel, bei suderinamumo testavimo su kiekviena palaikoma Python ir Babel versija.
Problemos ir pull request'ai yra laukiami — alfa yra kaip tik tas metas, kai dėl sąsajos dar verta ginčytis.
Prisijunkite prie bendruomenės¶
- Pasirinkite good first issue aiškiai apibrėžtam indėliui.
- Klauskite apie naudojimą Q&A diskusijose.
- Atneškite produkcines gettext darbo eigas ir API idėjas į Ideas diskusijas.
- Perskaitykite prisidėjimo vadovą, prieš atverdami pull request'ą.