218. Každý jazyk webu je odvozen z anglického buildu a překladové paměti
Kontext
Dne 2026-10-19 majitel nařídil, aby majordomus.dev byl od té chvíle vždy plně vícejazyčný — alespoň česky a anglicky — s přepínačem jazyka a aby každý jazyk byl odvozen, vyvozen a přeložen automaticky: „Nechci udržovat dvě jazykové verze; musí to fungovat automaticky, odvozeně, vyvozeně, prismaticky.“
Web měl tehdy 2 137 stránek a asi 880 000 slov, téměř všechna generovaná z anglických záznamů (plán, dokumenty, pravidla, rozhodnutí, registr), a čtyři ručně psané české stránky připuštěné project.english-only v2 (ADR 0077). Na stole byly tři způsoby, jak jej učinit dvojjazyčným:
- Druhý strom obsahu (
*.cs.mdvedle každé stránky, vícejazyčný režim Zoly). Každý generátor by zapisoval dvakrát, každá šablona by potřebovala klíčované řetězce a data, která šablony čtou (site/data/generated/*.json), by se stále vykreslovala anglicky. Jsou to „dvě jazykové verze“, které majitel odmítl, jen psané stroji místo lidí. - Překlad při buildu, dotazem na model během
scripts/site-build. Build by přestal být čistou funkcí stromu: dva buildy jednoho commitu by se lišily, CI by potřebovalo přihlašovací údaje a výpadek modelu by shodil web. - Průchod sestavenými stránkami a paměť přeložených segmentů — zvoleno.
Rozhodnutí
-
Angličtina je jediný zdroj. Nikdo nepíše stránku v jiném jazyce. Čtyři ručně psané české stránky zůstávají, jak jsou, a do české kopie se přenášejí beze změny.
-
Každý další jazyk je průchod nad sestaveným anglickým webem. Po Zole, průchodu přístupnosti a diagramech spouští
scripts/site-buildnástrojscripts/lib/site-i18n.mjsnad každou stránkou, kterou zapsal. Stránka se rozřeže na segmenty: každý souvislý úsek vloženého obsahu mezi hranicemi bloků a každý atribut, který čtenář vidí (title, alt, aria-label, popis stránky). Kód,pre,kbd, SVG a vše označenétranslate="no"nikdy segmentem není. Kopie pod/<lang>/je anglická stránka, v níž je každý segment, který paměť zná, nahrazen, každý interní odkaz míří na svůj protějšek,<html lang>a kanonická URL jsou nastaveny, přidány alternativyhreflanga odhaleno oznámení o strojovém překladu. Protože průchod čte vykreslené HTML, pokrývá šablony, generovaná data i obsah stejně: nic, co by šablona musela udělat, aby byla přeložena, neexistuje. -
Paměť je klíčována angličtinou, ne stránkou.
site/i18n/<lang>/memory/*.jsonldrží{k, en, <lang>}na segment,khash angličtiny, v níž je vložené značkování nahrazeno číslovanými zástupnými symboly (<t1>…</t1>,<t2/>pro kód a obrázky). Stejná slova ve dvou šablonách jsou jedna položka; href, který se stránku od stránky liší, je nerozděluje. Změněný anglický segment má nový klíč, takže se zastaralý překlad nikdy neobslouží — segment se vrátí k angličtině, dokud není přeložen znovu. -
Překlad je připuštěn jen se strukturou svého zdroje.
admissiblevyžaduje každý zástupný symbol právě jednou, vnořený jako v angličtině;scripts/site-translate importarunodmítnou cokoli jiného. Překladatel může přeskládat slova, nikdy vypustit odkaz nebo kód. -
Překlad je samostatný, automatický krok mimo build. Build uvádí, co paměti chybí, v
target/site-i18n/missing.jsons počtem stránek, na nichž je každý segment, a zveřejňuje své pokrytí na/<lang>/i18n.json.scripts/site-translate run --adapterse ptá modelu přes adaptéry poradců z ADR 0098 aexport/importnesou dávky překladatelům mimo proces (podagenti relace). Glosář a styl, které překladatel dostává, žijí vsite/i18n/<lang>/guide.json. -
Paměť je adresována obsahem čtenáři, takže
project.english-onlyv4 připouštísite/i18n/<lang>/jako vydání: adresář říká svůj jazyk vedition.tomlascripts/ci/english-only-allow.txtjej deklaruje s tímto jazykem a důvodem.
Důsledky
- Nový jazyk je jeden řádek v
site/i18n/languages.json, průvodce,edition.tomla běh překladu. Žádná šablona, generátor ani stránka se nemění. - Pokrytí se měří, ne tvrdí. Hlásí se při každém buildu; kontrola, která odmítne regresi a poté cokoli pod úplným pokrytím, je další krok tohoto rozhodnutí.
- Každá změna anglického textu stojí překlad segmentů, které změnila. Náklady jsou úměrné změně, protože nezměněné segmenty si ponechávají své klíče.
- Překlad je strojový a říká to na každé přeložené stránce, s odkazem na originál.
- Vyhledávání, sitemap a řetězce JavaScriptu webu zatím nejsou přeloženy; leží mimo stránky, které tento průchod čte.