Pāriet uz saturu

Tulkojiet pilnus ziņojumus
ar Python t-virknēm

gettext-tstrings savieno Python 3.14+ t-virknes ar standarta gettext katalogiem un Babel rīkiem. Vērtības un formatējums paliek lietotnes kodā; tulkotāji strādā ar pilniem ziņojumiem un vienkāršiem {name} vietturiem:

import gettext

from gettext_tstrings import Translator

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

Katalogs satur Hello {name}. Tulkojums drīkst {name} pārvietot vai atkārtot. Ja tas vietturi nomet, pārdēvē vai pārformatē, katalogu validācija ziņo par kļūdu. Ja nederīgs ieraksts tomēr nonāk produkcijā, bibliotēka ieraksta brīdinājumu un renderē avota ziņojumu, nevis avarē.

Sākt piecu minūšu pamācību Salīdziniet alternatīvas

Alfa · Python 3.14+ · standarta PO/MO katalogi · nav trešo pušu izpildlaika atkarību

Šī vietne praktizē to, ko dokumentē: katrs valodas izdevums — navigācija, uzraksti un daudzskaitli ievērojošā būvējuma atskaite — tiek renderēts no PO katalogiem ar paša gettext-tstrings palīdzību.

Vai tas ir domāts jums?

Piemērots jau šodien, ja jūsu lietotne darbojas uz Python 3.14 vai jaunāka; jūs jau lietojat gettext un Babel vai gribat pārņemt to PO/MO darbplūsmu; un jūs gribat t-virkņu sintaksi ar nosauktiem vietturiem, kas tiek pārbaudīti pirms renderēšanas.

Vēl nav piemērots, ja jums vajadzīgs Python 3.13 vai vecāks; jums nepieciešams stabils Python API — šī ir alfa versija, un specifikācija ir tā daļa, kas ir nostabilizējusies; vai gandrīz viss jūsu tulkojamais teksts atrodas veidņu valodā, nevis Python pirmkodā.

Jums jau ir katalogi? Tie turpina strādāt. _("Hello {name}").format(name=name) un tr(t"Hello {name}") rada vienu un to pašu msgid, tāpēc esošie tulkojumi pārmaiņu pārdzīvo — Migrācija izstaigā visu pāreju.

Ko katalogs drīkst pateikt

Tulkojums nespēj mainīt tā ziņojuma struktūru, kuru tas tulko. Tāds ir viss solījums, un no tā izriet viss pārējais šajā vietnē. Tulkojums drīkst {name} pārkārtot vai atkārtot un drīkst pārrakstīt katru citu vārdu tam apkārt. Tas nedrīkst vietturi nomest, izdomāt jaunu, caur to sniegties jūsu objektos vai pievienot tam savu formatējumu.

Bibliotēka to pārbauda ceļā iekšā — kad katalogi tiek kompilēti — un vēlreiz renderēšanas brīdī, un tieši tā ir atšķirība starp kļūdu, kas atrasta pārskatīšanā, un kļūdu, ko atrod lietotājs.

Vai gettext jums ir jaunums? Visa darbplūsma četros teikumos

gettext ir standarta veids, kā programmatūra tiek tulkota — gan Python, gan tālu aiz tā. Jūsu kods atzīmē tulkojamos ziņojumus; ekstraktors savāc tās veidnes failā (.pot); tulkotājs — parasti nevis programmētājs — aizpilda vienu kataloga failu (.po) katrai valodai, kas tiek kompilēts binārā .mo failā, ko jūsu lietotne ielādē izpildlaikā. Tulkošanas funkcijas ierastais nosaukums ir _, tāpēc _(t"Hello {name}") lasās kā “iztulko šo ziņojumu”. Pamācība izstaigā visu ceļu — atzīmēt, ekstrahēt, iztulkot, kompilēt, palaist — aptuveni piecās minūtēs.

Problēma, ko tas risina

F-virkne ir jau interpolēta brīdī, kad to ierauga kāda bibliotēka — f"Hello {name}" ir kļuvis par "Hello Ada", un fragmentu tulkošana ap vērtību lauž gramatiku lielākajā daļā valodu. T-virkne (PEP 750) tur statisko tekstu, aprēķinātās vērtības, avota izteiksmes, konversijas un formāta specifikācijas atsevišķi — un tieši tāds dalījums ir vajadzīgs ziņojumu katalogam. Ko tas maina, salīdzinot ar %(name)s, .format() un $-virknēm.

Tomēr ne gettext, ne Babel nepasaka, kā t-virkne kļūst par ziņojumu. Šī bibliotēka izdara šo izvēli, pieraksta to kā versionētu specifikāciju un piegādā atbilstības komplektu, lai to pārbaudītu.

Dizaina noteikumi

  • Tulkot pilnus ziņojumus, nekad ne teikumu fragmentus.
  • Pieņemt tikai vienkāršus mainīgo nosaukumus, tādus kā {name}.
  • Paturēt !r un :.2f lietotnes kontrolē, ārpus kataloga.
  • Ļaut tulkojumiem pārkārtot un atkārtot zināmos vietturus, vienlaikus liedzot tiem sniegties pie atribūtiem vai pievienot formatējumu.
  • Izmantot parastos POT, PO un MO failus un rīkus, kas tos jau lasa.

Un tam atbilstošais saraksts ar to, ko tas apzināti atstāj mierā: tas nelokalizē skaitļus, valūtas vai datumus — noformatējiet tos vispirms ar Babel; tas neekranē renderēto izvadi HTML, čaulai vai terminālim; un tas nespēj spriest, vai tulkojums ir pareizs, tikai to, vai tā vietturi ir neskarti.

Instalēšana

python -m pip install gettext-tstrings

Python 3.14 vai jaunāks. Renderēšanai nav atkarību — tā izmanto standarta bibliotēkas gettext un neko citu.

Ekstrakcija un katalogu validācija notiek caur Babel, tāpēc instalējiet šo papildinājumu visur, kur darbojas pybabel, kas parasti ir izstrādes vai CI vide, nevis produkcijas attēls:

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

Kurp doties tālāk

Sāciet šeit — pieredze ar gettext netiek prasīta:

  • Pamācība — no tukša direktorija līdz strādājošam tulkojumam japāņu valodā piecos soļos, katra komanda parādīta kopā ar tās izvadi.
  • Kāpēc t-virknes — viens un tas pats ziņojums, uzrakstīts četros veidos, un tas, ko katalogam pasniedz %(name)s, .format() un $-virknes.

Lietojiet — darba uzziņas:

  • Ceļvedis — izpildlaika API: kuru ieejas punktu lietot, daudzskaitļi, valodas katram pieprasījumam, atliktās virknes un tas, kas notiek, kad katalogs ir kļūdains.
  • Ekstrakcijapybabel uzziņa: konfigurācija, pielāgoti funkciju nosaukumi un tas, kā jau esošie rīki validē šos katalogus bez papildu pūlēm.
  • Produkcijā — cikls tā, kā to izpilda komanda: atjaunināšanas cikls, fuzzy ieraksti, CI vārti, tulkošanas platformas un piegāde.
  • Migrācija — šī pārņemšana projektā, kuram jau ir katalogi, pa vienai izsaukuma vietai.
  • Tulkotājiem — viena lapa, ko iedot tam, kurš rediģē .po failus.

Izprotiet — no vēstures līdz implementācijai:

  • Priekšvēsture — kāpēc šī bibliotēka pastāv: trīsdesmit gadi gettext, divi PEP un standarta bibliotēkas diskusija, kas noslēdzās bez atbildes.
  • Kļūmes — ko šīs vietnes tulkošana trīsdesmit piecās valodās patiešām salauza un kuru pusi no tā rīks spēj noķert.
  • Kā tas darbojas — no PEP 750 šablona objekta līdz renderētai virknei un kešatmiņām, kas padara pārbaudi lētu.

Atsauce — kontrakti:

  • API — viss, ko pakotne eksportē, vienā lapā.
  • Specifikācija — konvencija t-virkne ↔ msgid kā stabils, versionēts kontrakts ar mašīnlasāmu atbilstības komplektu.

Statuss

Pakotnes versija 0.1.0a8
API stabilitāte alfa — Python API vēl var mainīties
Specifikācija v1 ar atbilstības komplektu
Python 3.14 un jaunāks; testēts ar 3.14, 3.14t (brīvpavedienu) un 3.15
Babel 2.18 vai jaunāks, un tikai tur, kur darbojas pybabel
Izpildlaika atkarības nav — standarta bibliotēkas gettext
Katalogu formāts parastie POT, PO un MO
Izmaiņas CHANGELOG

Alfa versija. Kontrakts ir apzināti mazs, un specifikācija ir tā stabilā daļa; Python API vēl var mainīties. Pirms stabila laidiena tam nepieciešami plašāki valodu fixture komplekti, ilgstoša veiktspējas uzraudzība, API pārskats no cilvēkiem, kuri gettext un Babel lieto nopietni, un savietojamības testi visos atbalstītajos Python un Babel laidienos.

Problēmziņojumi un pull request ir gaidīti — alfa ir tieši tas brīdis, kad par saskarni vēl ir vērts strīdēties.

Pievienojieties kopienai