Přeskočit obsah

Úskalí

Tento web je přeložen do pětatřiceti jazyků a každý z nich vznikl provozováním smyčky, kterou tato dokumentace učí. Na poměry oboru je to malý korpus a i tak stačil na to, aby narazil na většinu pastí, kvůli nimž je i18n těžší, než vypadá.

Každá sekce níže je něco, co se tu skutečně pokazilo, jak to tehdy vypadalo a kudy vede hranice mezi tím, co za vás knihovna kontroluje, a tím, co zůstává na vašem úsudku.

Přejmenování proměnné znovu odešle větu k překladu

Msgid je klíč katalogu a jméno interpolace je uvnitř něj. Přesun jedné konstanty do modulového rozsahu a její zapsání velkými písmeny, jak žádá pythonovský styl — author na AUTHOR — změnil Copyright © 2026 {author} · MIT License ve zprávu, kterou žádný katalog nikdy neviděl. Každý překlad toho řádku by prošel znovu fuzzy cyklem, v každém jazyce, kvůli přejmenování, které nezměnilo nic, co by čtenář viděl.

Knihovna vás nezastaví: oba zápisy jsou platná jména zástupných symbolů. Co ale dělá, je, že to jméno stojí za to chránit — interpolace musí být holé jméno, takže tím, co je v klíči katalogu, je slovo, které si překladatel může přečíst, ne výraz.

Zrcadlový případ je bezpečný už z podstaty. Konverze a formátovací specifikace nejsou součástí msgid, takže zpřísnění {amount:,.2f} na {amount:,.0f} nemění žádný klíč a nikde neznehodnotí žádný překlad.

nplurals=2 neznamená dva různé řetězce

Turečtina, maďarština, perština i bengálština deklarují dvě formy množného čísla a ve všech čtyřech jsou obě formy počítané zprávy zcela legitimně týž řetězec — podstatné jméno zůstává po číslovce v jednotném čísle, takže {n} sayfa je správně pro jednu stránku i pro deset. Recenzent, který tu duplicitu „opraví“, překlad rozbije.

Opačná chyba je stejně snadná. Třetí forma lotyštiny existuje jen pro nulu; druhá forma slovinštiny je duál, pro přesně dvě; poslední forma rumunštiny vyžaduje slovo de, které první dvě mít nesmějí. Vyplnit tyto pozice jednotným a množným číslem dá katalog, který je chybný jen pro počty, jež nikdo netestuje.

Hůř, pořadí pozic není sémantické. Velština indexuje svých pět forem tak, že msgstr[0] je obecný případ a msgstr[1] je jednotné číslo. Vyplnění v pořadí, které se nabízí, umístí jednotné číslo tam, kde je najde každá nepočítaná zpráva.

Knihovna si nic z toho nebere na sebe, a přesně o to jde: pravidlo množného čísla cílového jazyka žije v hlavičce jeho vlastního katalogu a pravidlo sjednocení/průniku dovoluje překladu mít víc forem než zdroj, nebo míň. Kontroluje jedinou věc, kterou zkontrolovat lze bez znalosti jazyka — že si každá forma ponechá zástupné symboly, které potřebuje.

Dvě formy mohou být shodné z dobrého důvodu

Irština má pět forem množného čísla a v hlášení o sestavení tohoto webu je několik z nich zapsáno stejně. Není to překlep z kopírování: leathanach začíná na l a ani jedna z počátečních mutací, které irské číslovky spouštějí, se na l nepíše. Formy přesto odvádějí skutečnou práci — kmen se střídá mezi leathanach a leathanaigh a počty nad deset se vracejí k jednotnému číslu — ale žádné podstatné jméno s významem „stránka“ by ten rozdíl neukázalo.

Každá kontrola, která označí duplicitní formy za podezřelé, označí správnou irštinu. Jediným recenzentem je tu člověk, který ten jazyk zná.

Zpráva se může shodovat jen s jedním počtem

Hlášení o sestavení tohoto webu říká, kolik stránek bylo vykresleno a jak dlouho to trvalo. Zápis „Rendered {n} pages in {seconds} seconds“ vypadá neškodně a přeložit se nedá: gettext vybírá jednu formu podle jednoho počtu a tím počtem je n. Slovo seconds by se muselo shodovat s číslem, které mašinerie množného čísla nikdy nevidí.

Náprava spočívá v tom, udělat z druhé veličiny značku jednotky místo slova — a značky jednotek se samy lokalizují: katalogy tohoto webu nesou s, с, ث, שנ׳ a mp a francouzská, španělská a švédská typografie chce před značkou mezeru tam, kde ji angličtina nemá. Nic z toho není věcí knihovny — ale všimnout si, že zpráva potřebuje dvě shody, věcí je, a jediným nástrojem na to je napsat zprávu jinak.

Úprava anglické věty upravuje cizí gramatiku

Úvodní stránka dřív říkala „all ten language editions“. Odstranění čísla — jednoslovná úprava v angličtině, provedená proto, že to číslo pořád zastarávalo — změnilo podmět z množného čísla na jednotné. Španělština, italština, portugalština, ruština, ukrajinština, řečtina, nizozemština a hebrejština musely všechny sloveso znovu shodnout; několik z nich potřebovalo změnit i příčestí.

Úprava zdroje, která v angličtině působí triviálně, triviální dál po proudu není. Označení jako fuzzy, což je přesně to, co pybabel update dělá, je ten mechanismus, který dá každému překladateli šanci si toho všimnout.

Neviditelné rozdíly přežijí každé kopírování

Průvodce cituje diagnostiku obsahující (nаme) — záměrný escape, protože znak, který pojmenovává, je cyrilické а, jež žádný čtenář od latinského nerozezná. Překladatelé tohoto webu ten escape převedli na skutečný znak pětkrát nezávisle na sobě, v pěti různých jazycích, pokaždé s výsledkem stránky, která vypadala správně a správná nebyla.

Tohle knihovna zachytí a je to důvod, proč mají diagnostiky právě takový tvar: zástupný symbol, jehož písmena míchají písma, je hlášen dvakrát, jednou čitelně a jednou escapovaně, protože escapovaná podoba je jediný zápis, který je od sebe odliší. Nezlomitelná mezera uvnitř složených závorek se ze stejného důvodu vypisuje kódovým bodem. Checker katalogů zprávu odmítne dřív, než se stihne dostat do vydání.

Neprázdné neznamená přeložené

Katalog vygenerovaný tak, že se jeho msgid zkopírují do msgstr, projde každou naivní kontrolou: nic není prázdné, nic není fuzzy, množina zpráv sedí přesně. Jedna edice tohoto webu takhle byla několik hodin ve vydání. Stejně tak osm stránek jiné edice, které byly bajt po bajtu kopiemi anglického zdroje — což projde kontrolou porovnávající mezi nimi bloky kódu, protože jde o tentýž soubor.

Ani jedno není něco, co by překladová knihovna mohla vidět. Obojí se dá levně otestovat — ale ne tak, že po každém záznamu budete vyžadovat rozdíl oproti zdroji: OK, názvy produktů, jména osob, zkratky a identifikátory z kódu se překládají samy na sebe a kontrola, která to zakáže, bude navždy vyrábět falešné poplachy.

Měřte místo toho poměr, přes celý katalog nebo celou stránku, a odchylky posílejte člověku. Test tohoto webu dělá přesně to — porovnává řádky prózy každé edice s anglickým zdrojem a selže nad 25 % shodných. Zfalšovaná edice seděla na 87 %; každý poctivý překlad se drží mezi 4 % a 8 %, což je ten malý zbytek řádků, které se legitimně shodují, jako URL a citovaný výstup programu. Ty dvě populace jsou od sebe dost daleko na to, aby práh nemusel být přesný.

Katalog není jediná přeložená věc

Dvě zdejší selhání neměla s gettextem nic společného.

Překlad nadpisu změní kotvu, která se z něj generuje, takže každý odkaz z jiné stránky do té sekce se rozbije — potichu a jen v tom jednom jazyce. Tento web připíná na každý nadpis anglickou kotvu a test odvozuje očekávaný seznam z anglické stránky.

A generátor webu dodává překlady rozhraní pro šedesát osm jazyků, mezi které svahilština ani irština nepatří. Bez nich build nespadne zpět k angličtině; include šablony selže a edici vůbec nelze sestavit. Dva soubory v tomto repozitáři existují právě proto, aby tuto mezeru zaplnily.

I vaše nástroje mají chyby

Krok CI, který tato dokumentace doporučuje k odhalení zastaralých katalogů, pybabel update --check, tuto práci nezvládne u žádného projektu, který používá pgettext nebo npgettext. Na Babelu 2.18.0 hlásí každý katalog s msgctxt jako zastaralý, při každém spuštění. Porovnání probíhá přes Catalog.is_identical, které každou zprávu vyhledá podle klíče, pod nímž je uložena — a u kontextové zprávy je tímto klíčem dvojice (id, context), kterou Catalog.get nepřijímá. Vyhledání nevrátí nic a katalogy nikdy nevyjdou jako shodné:

>>> from babel.messages.catalog import Catalog
>>> c = Catalog(locale="ja")
>>> c.add("Guide", "ガイド", context="navigation")
<Message 'Guide' (flags: [])>
>>> c.is_identical(c)
False

Byla nalezena tady, při pokusu ten krok použít, nahlášena upstreamu a náhradní kontrolu najdete na stránce o produkci.

Obecné poučení je to nepříjemné: brána, která je vždycky červená, je horší než žádná brána, protože ji tým vypne. Ověřte si, že vaše kontrola v CI vůbec může projít, dřív než jí uvěříte, že selže.

K čemu knihovna je, v jedné větě

Většina této stránky je úsudek, který za vás žádný nástroj nepřevezme. Co nástroj umí, je zaručit, že překlad nemůže změnit strukturu věty, kterou překládá — nemůže hodnotu vypustit, vymyslet, přeformátovat ani sáhnout do vašich objektů — a umí to říct větou, podle níž se ten, kdo to má opravit, může zařídit. To je celé, co tato knihovna slibuje, a zbytek tohoto webu je o tom, jak to dodržuje.