Skip to content

i18n: translate the 18 never-translated curated pages, and re-sync 12 drifted pages - #1964

Open
bloxster wants to merge 3 commits into
ZecHub:mainfrom
bloxster:i18n/backfill-and-resync-2026-08-15
Open

i18n: translate the 18 never-translated curated pages, and re-sync 12 drifted pages#1964
bloxster wants to merge 3 commits into
ZecHub:mainfrom
bloxster:i18n/backfill-and-resync-2026-08-15

Conversation

@bloxster

Copy link
Copy Markdown
Contributor

What this does

Two things, and the corpus ends up fully current in all 18 locales for the first time.

1. Backfill — 18 curated pages that had never been translated in any language. These were declared as needing translation but never produced: 16 came from #1944 ("Curate the 22 Ironwood-era pages missing from the translation list") and Sapling/Sprout returned via #1946. git log --all --diff-filter=A finds no commit that ever added a translation for any of them, so this is a gap that has existed since the day they were curated, not drift.

Mostly the protocol timeline: Overwinter, Sapling, Blossom, Heartwood, Canopy, NU5, NU6, NU6_1, NU6_2, Ironwood, plus Zakura_Node, ZECD, What_a_Block_Explorer_Can_See, Zecmap, Zallet_Quick_Reference_Guide, Zcash_Engineering_Office_Hours and ZecHub_Hackathon_Builders_Guide.

18 pages × 18 locales = 324 items, 0 failures, 0 held.

2. Re-sync — 12 pages that drifted since the last sync. Three English PRs merged in the meantime (#1948's Tor/I2P rewrite, #1957's Zashi→Zodl rename, and others), leaving 205 stale locale-pages. All re-synced: 205 items, 0 failures, 0 held.

Result

check before after
detect-staleness — missing 324 0
detect-staleness — stale 205 7 (deliberate, below)
check-protected-terms (whole tree) 72 violations passes for all 3,654 translated pages
check-invariants --base holds, 203 pages × 18 locales
menu-titles --check clean
hash-lib tests 38 pass / 0 fail

3,654 = 203 curated pages × 18 locales. Every curated page now exists in every locale and carries every protected term.

The 7 deliberate stale entries

Using_Zcash/Zcash_Mining_Pools.md in de/hi/it/ja/ru/tr/uk keep their base provenance. Its English delta touched only non-translatable content (the /content-images/*.webp URL migration), so diff-aware re-translation reproduces byte-identical output and the agent restamps src alone — which trips change-tracking with "manifest src changed but the translation file did not" (check-invariants.mjs:263), a direction with no escape hatch. The translations are already correct; 9aea0b1b propagated those URLs.

Keeping base provenance understates freshness rather than overstating it. The cost is a loop: they read as stale, the next run re-attempts them, produces byte-identical output, restamps, and fails the gate again — that cycle needed two manual interventions today alone. The durable fix is a verifiable escape hatch comparing the translatable-text projection of English at the two commits and allowing the bump when unchanged; a self-declared manifest flag would not be checkable and shouldn't be used.

One thing worth knowing about how this was verified

The backfill initially failed the scoped gate with 18 introduced violations — all Zingo, on ZECD.md, one per locale. Rather than patch it, I traced it: the base English had 0 occurrences of Zingo, main's has 1, introduced by a9595ae1 (#1957). The backfill had translated that page correctly against the English it had; main moved underneath it. The re-sync commit fixes it properly.

That is the scoped gate from #1958 behaving exactly as intended — a newly added translation missing a required term is precisely what "introduced" should catch, and it caught it before this PR was opened.

Review notes

Machine-translated content is mechanics-reviewed, not linguistically reviewed — nobody can meaning-review 18 languages and this PR doesn't pretend otherwise. What is verified is structure, protected terminology, manifest coherence, and that diff-aware paths changed only the blocks they should. Native-speaker corrections are welcome afterwards; if you hand-fix a translation, record it in tool on that manifest entry, and use edited: true only for a page you intend to maintain by hand — it removes the page from automated sync permanently.

Engine split as usual: 13 locales via LLM (diff-aware where possible), sw/yo/ig via NLLB, ak/ee via GT-static.

…Pools entries

Second occurrence today, and the loop is now demonstrated rather than
predicted. The English delta on Using_Zcash/Zcash_Mining_Pools.md touched
only non-translatable content (the /content-images/*.webp URL migration), so
diff-aware re-translation reproduces byte-identical output and the agent
restamps src alone. check-invariants' change-tracking then fires: 'manifest
src changed but the translation file did not' (check-invariants.mjs:263),
which has no escape hatch.

Reverting the provenance makes those entries read as stale, so the NEXT run
picks them up, produces byte-identical output again, restamps again, and
fails the gate again. That cycle burned two manual interventions today and
will burn one per sync until it is fixed properly.

The durable fix is a verifiable escape hatch: compare the translatable-text
projection of English at the two commits and permit the bump when it is
unchanged. The projection must be conservative in the opposite direction
from normalize-hash — when in doubt REFUSE the bump, since wrongly allowing
one marks a stale translation fresh. Tracked as a follow-up.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant