Pāriet uz saturu

Ekstrakcija

Ekstrakcija ir solis, kas savāc no jūsu pirmkoda katru atzīmēto ziņojumu .pot veidnē tulkotājiem — pamācības cikla 3. solis. Šī lapa ir uzziņa par šo soli: konfigurācija, pielāgoti funkciju nosaukumi, stingrais CI režīms un pārbaudes, kas pēc tam sargā jūsu katalogus.

Ekstrakcijai vajadzīgs papildinājums babel:

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

Darbplūsma

Izveidojiet babel.cfg:

[gettext_tstrings: **.py]
encoding = utf-8

Tad lietojiet parastās Babel komandas:

pybabel extract -F babel.cfg -c "Translators:" -o locales/messages.pot .
pybabel init -i locales/messages.pot -d locales -l ja
pybabel compile -d locales

init tiek palaists vienreiz katrai valodai; pēc tam pybabel update ielok katru svaigo veidni esošajos katalogos. Šis atkārtojošais cikls — un tas, ko tā fuzzy ieraksti nozīmē laidienam — ir izstaigāts lapā Produkcijā.

gettext_tstrings ekstraktors apstrādā arī parastos _(), gettext() un ngettext() izsaukumus, tāpēc viens attēlojums sedz jauktu kodabāzi. Tas atpazīst _(), četrus standarta gettext nosaukumus, tr() / ntr() aizstājvārdus un atliktos lazy_gettext() / lazy_pgettext().

Ieslēdziet tulkotāju komentārus ar -c

pybabel extract savāc tulkotāju komentārus tikai tad, ja padodat -c "Translators:" — tieši tāpat kā parasto gettext izsaukumu gadījumā. Ja to nepadodat, ekstrakcija joprojām strādā — komentāri vienkārši nekad nenonāk katalogā, kur tie ir lētākā kvalitātes svira visā darbplūsmā.

Savu funkciju nosaukumu reģistrēšana

[gettext_tstrings: **.py]
tr_functions = tr translate
ntr_functions = ntr
[[mappings]]
method = "gettext_tstrings"
pattern = "**.py"
tr_functions = ["tr", "translate"]
ntr_functions = ["ntr"]

Ini fails dod vienu virkni, TOML attēlojums dod sarakstu, un virknes iekšienē nosaukumus atdala vai nu atstarpes, vai komati. Visi četri pieraksti darbojas.

Opcijas ir tr_functions, ntr_functions, gettext_functions, ngettext_functions, pgettext_functions un npgettext_functions.

-k nesniedzas līdz t-virknei

Pielāgots palīgs, tāds kā mytr(t"…"), ir jānosauc kādā no augšminētajām opcijām. Babel --keyword mehānisms nespēj nolasīt t-virknes literāli, tāpēc pybabel extract -k mytr neatrod neko un nesaka neko — ziņojumu POT failā vienkārši nav. -k joprojām darbojas parastajiem gettext izsaukumiem, kas tiek ekstrahēti līdzās.

Atbalstīta ir tikai standarta argumentu secība: vispirms ziņojums; pgettext gadījumā konteksts, tad ziņojums; npgettext gadījumā konteksts, tad vienskaitlis, tad daudzskaitlis.

Iecietīgs lokāli, stingrs CI vidē

Pēc noklusējuma viens slikts fails neizbeidz visu izpildi:

  • T-virkne, ko ekstraktors noraida — piekļuve atribūtiem, izteiksme, nepareizs arguments —, tiek ziņota kā brīdinājums un izlaista.
  • Fails, ko neizdodas parsēt, tiek izlaists tāpat.
  • Tāpat arī fails, ko atsakās pieņemt tikai tokenize, kamēr ast to pieņem un uz kura paša Babel gājiens citādi pārtrauktu darbu.

Tas ir ērti, kamēr jūs rediģējat, un bīstami, kad ne: izlaists ziņojums vienkārši nav POT failā, tāpēc tas nekad netiek iztulkots un neviens to nepasaka. Iestatiet attēlojuma opcijās strict = true visur, kur ekstrakciju nevēro cilvēks:

[gettext_tstrings: **.py]
encoding = utf-8
strict = true
[[mappings]]
method = "gettext_tstrings"
pattern = "**.py"
strict = true

Tad katrs augšminētais brīdinājums kļūst par smagu kļūmi. Uzskatiet to par produkcijas iestatījumu, bet noklusējumu — par lokālo.

Jūsu esošā rīkkopa validē šos katalogus

Babel atzīmē katru ekstrahēto ziņojumu ar standarta karogu, un tieši šī viena rinda aktivizē vietturu pārbaudi rīkos, ko jūs jau tā palaižat:

#. gettext-tstrings
#: app.py:4
#, python-brace-format
msgid "Hello {name}"
msgstr ""

Iztulkojiet to kā こんにちは {nombre}, un kļūda tiek noķerta bez jebkādas konfigurācijas:

$ msgfmt --check-format -o /dev/null locales/ja/LC_MESSAGES/messages.po
locales/ja/LC_MESSAGES/messages.po:25: a format specification for argument
'name' doesn't exist in 'msgstr'
msgfmt: found 1 fatal error

Weblate dokumentē to pašu pārbaudi kā Python brace format, un komerciālajām platformām ir sava vietturu kvalitātes kontrole, kas balstās uz to pašu karogu. Katras platformas uzvedība ir tās pašas ziņā; abi zemāk minētie rīki ir tie, kas šeit ir pārbaudīti.

Papildus tam pakotne reģistrē Babel pārbaudītāju, tāpēc pybabel compile piemēro specifikācijas likumus katram ziņojumam, kas nes gettext-tstrings marķiera komentāru:

$ pybabel compile -d locales -l ja
error: locales/ja/LC_MESSAGES/messages.po:24: translation does not match the
source placeholders: {name} is missing; {nombre} is not in the source message
1 errors encountered.

Daudzskaitļa ziņojumam norāde nosauc formu, jo Babel ziņotais rindas numurs ir msgid rindas numurs, bet krievu blokam zem tā ir trīs msgstr:

error: locales/ru/LC_MESSAGES/messages.po:31: msgstr[1]: translation does not
match the source placeholders: {n} is missing

pybabel compile .mo failu tik un tā ieraksta

Augstāk redzamā kļūda tiek ziņota, izejas statuss ir 1 — un sabojātais katalogs tomēr tiek kompilēts. Tikai šis izejas statuss var neļaut konveijeram to piegādāt; Ko CI aiztur parāda būvēšanas soli, kas to izdara.

Abas pārbaudes nav lieks dublējums. Pakotnes pārbaudītājs ir stingrāks vismaz divos gadījumos:

  • Msgid, kura vienīgās figūriekavas ir atsoļotas (Config {{raw}} only), nekad nesaņem python-brace-format karogu, tāpēc to nevalidē neviens ārējs rīks.
  • Daudzskaitļa formas tiek pārbaudītas pa vienai. msgfmt --check-format nolasa tieši to pašu failu, kas augstāk, un iziet ar 0; forma, kas nomet vietturi, kuru tās māsas patur, tur tiek pieņemta, bet šeit noraidīta.

msgfmt pārbauda tikai tos vietturu nosaukumus, ko spēj noparsēt kā Python brace formātu, tāpēc ASCII nosaukumi ļauj ziņojumu validēt katram ķēdes rīkam. Pati bibliotēka pieņem jebkuru str.isidentifier() nosaukumu.

Veidnes un citi rīki

T-virknes ir Python sintakse, tāpēc šī bibliotēka sedz Python pirmkodu. Veidņu valodas turpina lietot savu i18n — Jinja2 {% trans %}, Django veidņu tagus — un Babel ekstraktorus tām. Viss barojas vienā un tajā pašā PO katalogā, tāpēc viena tulkošanas darbplūsma joprojām sedz jauktu kodabāzi.

pygettext šodien nespēj parsēt t-virknes, un tieši tāpēc ekstrakcija notiek caur Babel. Konvencija ir pierakstīta specifikācijā, lai to varētu mērķēt cits ekstraktors vai nākotnes pygettext.