Çı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:
İş akışı¶
babel.cfg dosyasını oluşturun:
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¶
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.
astkabul ederken yalnızcatokenizeı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:
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:
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-formatbayrağını hiç almaz; dolayısıyla hiçbir harici araç onu doğrulamaz. - Çoğul biçimler tek tek denetlenir.
msgfmt --check-formattam da yukarıdaki dosyayı okur ve0ile çı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.