Ana içeriğe geç

Çıkarma

Çıkarma, işaretlenmiş her mesajı kaynak kodunuzdan çevirmenler için bir .pot şablonuna toplayan adımdır — öğreticinin döngüsündeki 3. adım. Bu sayfa o adımın referansıdır: yapılandırma, özel işlev adları, katı CI kipi ve sonrasında kataloglarınızı koruyan denetimler.

Çıkarma, babel ekstrasına ihtiyaç duyar:

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

İş akışı

babel.cfg dosyasını oluşturun:

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

Sonra sıradan Babel komutlarını kullanın:

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 her dil için bir kez çalışır; ondan sonra pybabel update her taze şablonu mevcut katalogların içine katlar. Bu yinelenen çevrim — ve fuzzy girdilerinin bir sürüm için ne anlama geldiği — Üretimde sayfasında adım adım anlatılır.

gettext_tstrings çıkarıcısı sıradan _(), gettext() ve ngettext() çağrılarını da işler; böylece tek bir eşleme karışık bir kod tabanını kapsar. _() işlevini, dört standart gettext adını, tr() / ntr() takma adlarını ve ertelenmiş lazy_gettext() / lazy_pgettext() işlevlerini tanır.

Çevirmen yorumlarını -c ile etkinleştirin

pybabel extract, çevirmen yorumlarını yalnızca -c "Translators:" verdiğinizde toplar; tıpkı sıradan gettext çağrılarında olduğu gibi. Onu yazmazsanız çıkarma yine çalışır — yorumlar yalnızca kataloğa hiç ulaşmaz; oysa orada tüm iş akışındaki en ucuz kalite kaldıracıdırlar.

Kendi işlev adlarınızı kaydetmek

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

Bir ini dosyası tek bir dizgi verir, bir TOML eşlemesi bir liste verir ve bir dizginin içinde adları boşluk ya da virgül ayırır. Dört yazım da çalışır.

Seçenekler şunlardır: tr_functions, ntr_functions, gettext_functions, ngettext_functions, pgettext_functions ve npgettext_functions.

-k bir t-string'e ulaşmaz

mytr(t"…") gibi özel bir yardımcının, yukarıdaki seçeneklerden birinde adlandırılması gerekir. Babel'in --keyword mekanizması bir t-string değişmezini okuyamaz; bu yüzden pybabel extract -k mytr hiçbir şey bulmaz ve hiçbir şey söylemez — mesajlar POT'tan düpedüz eksik kalır. -k, yanı sıra çıkarılan sıradan gettext çağrıları için çalışmaya devam eder.

Yalnızca standart argüman sırası desteklenir: önce mesaj; pgettext için bağlam sonra mesaj; npgettext için bağlam, sonra tekil, sonra çoğul.

Yerelde hoşgörülü, CI'da katı

Varsayılan olarak tek bir kötü dosya çalıştırmayı sonlandırmaz:

  • Çıkarıcının reddettiği bir t-string — öznitelik erişimi, bir ifade, yanlış bir argüman — uyarı olarak raporlanır ve atlanır.
  • Ayrıştırılamayan bir dosya aynı şekilde atlanır.
  • ast kabul ederken yalnızca tokenizeın reddettiği bir dosya da öyle — Babel'in kendi geçişi aksi halde bunda iptal olurdu.

Bu, siz düzenleme yaparken elverişli, yapmadığınızda tehlikelidir: atlanan bir mesaj basitçe POT'ta bulunmaz; dolayısıyla hiç çevrilmez ve bunu söyleyen de olmaz. Çıkarmanın bir insan tarafından izlenmediği her yerde eşleme seçeneklerinde strict = true ayarlayın:

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

Yukarıdaki her uyarı böylece sert bir hataya dönüşür. Bunu üretim ayarı, varsayılanı da yerel ayar olarak görün.

Mevcut araç zinciriniz bu katalogları doğrular

Babel, çıkarılan her mesajı standart bir bayrakla işaretler ve zaten çalıştırdığınız araçlarda yer tutucu denetimini etkinleştiren şey o tek satırdır:

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

Bunu こんにちは {nombre} olarak çevirin; hata hiçbir yapılandırma olmadan yakalanır:

$ 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 aynı denetimi Python brace format adıyla belgeler ve ticari platformların aynı bayrağa dayanan kendi yer tutucu QA'ları vardır. Her platformun davranışı kendisine aittir; burada doğrulanan, aşağıdaki iki araçtır.

Bunun üzerine paket bir Babel denetleyicisi kaydeder; böylece pybabel compile, gettext-tstrings işaret yorumunu taşıyan her mesaja belirtimin kurallarını uygular:

$ 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.

Çoğul bir mesaj için işaretçi biçimin adını verir, çünkü Babel'in raporladığı satır numarası msgid'ninkidir ve bir Rusça blokta onun altında üç msgstr vardır:

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

pybabel compile yine de .mo dosyasını yazar

Yukarıdaki hata raporlanır, çıkış durumu 1 olur — ve bozuk katalog yine de derlenir. Bir boru hattının onu sevk etmesini yalnızca o çıkış durumu durdurabilir; CI'ın neyi kapıladığı, buna izin veren derleme adımını gösterir.

İki denetim birbirinin yedeği değildir. Paketin denetleyicisi en az iki durumda daha katıdır:

  • Tek ayraçları kaçışlanmış olan bir msgid (Config {{raw}} only) python-brace-format bayrağını hiç almaz; dolayısıyla hiçbir harici araç onu doğrulamaz.
  • Çoğul biçimler tek tek denetlenir. msgfmt --check-format tam da yukarıdaki dosyayı okur ve 0 ile çıkar; kardeşlerinin koruduğu bir yer tutucuyu düşüren bir biçim orada kabul edilir, burada reddedilir.

msgfmt, yalnızca Python brace format olarak ayrıştırabildiği yer tutucu adlarını denetler; bu yüzden ASCII adlar, zincirdeki her aracın mesajı doğrulayabilmesini sağlar. Kütüphanenin kendisi str.isidentifier() doğru olan her adı kabul eder.

Şablonlar ve diğer araçlar

t-string'ler Python sözdizimidir; dolayısıyla bu kütüphane Python kaynağını kapsar. Şablon dilleri kendi i18n'lerini — Jinja2'nin {% trans %} etiketi, Django'nun şablon etiketleri — ve Babel'in onlar için çıkarıcılarını kullanmaya devam eder. Her şey aynı PO kataloğunu besler; böylece tek bir çeviri iş akışı karışık bir kod tabanını yine kapsar.

pygettext bugün t-string'leri ayrıştıramaz; çıkarmanın Babel üzerinden gitmesinin nedeni budur. Uzlaşım belirtimde yazılıdır; böylece başka bir çıkarıcı ya da gelecekteki bir pygettext onu hedefleyebilir.