i18n: translation pipeline (all languages) - #19015
Conversation
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
✅ Deploy Preview for ethereumorg ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
🔎 First-pass review — ✅ Looks mergeableRoutine intl pipeline output: 608 files across The 5 failed task combos noted in the description (3× Gemini Analysis
|
Fixes found by deterministic sweeps and 24 per-language review agents against PR 19015.
Build-breaker: `<p>` collapsed to `<p></p>` in zero-knowledge-proofs for bn/hi/ko/mr/ta/te/tr/ur, orphaning the following `</p>` and failing the MDX compile. This was the red Netlify deploy.
Fleet-wide repairs, all 24 locales:
- energy-consumption: the closing `>` of two source autolinks moved ahead of the file extension, producing `>).pdf>)` - 48 dead links and visible junk text. PR-introduced.
- roadmap/glamsterdam: the incremental merge deleted the whole `{#will-my-smart-contracts-change}` FAQ section. Restored verbatim from the pre-PR blob, with the anchor English carries.
- roadmap/glamsterdam: of the six changes in English commit 0e42e1a, four propagated and two prose clauses did not - the alert still read H2 2026 instead of Q4 2026, and the network-resilience intro still claimed "democratize liquidity" instead of the current stakers clause. Both replaced with per-locale lines.
- roadmap/glamsterdam: removed the leftover `# Title {#glamsterdam}` h1 that English dropped in the h1-to-frontmatter.title migration. Both layouts render frontmatter.title, so these locales were printing the page title twice. No inbound links to the anchor.
- Restored the `<QuizWidget>` component (and `<Divider />` where English has one) at the end of eight pages. The quiz strings were already fully translated in every locale, so only the component line was missing and the quizzes rendered nowhere outside English.
- Removed 13 ghost duplicate blocks in glamsterdam for ar/es/fr/pt-br/ru/tr/vi.
Glossary and semantic fixes, corrected toward the ETHGlossary term the locale already used elsewhere:
- cs: `gas` rendered as the literal `plyn` in 42 sites across five files, while cs common.json had it right. Unrelated Czech words and the literal natural-gas line left untouched.
- sw: `client` rendered `mteja` (customer) in 31 sites where the glossary mandates `kiteja`, with noun-class concord.
- bn: two corrupted words that destroyed a negation - transactions claimed view/pure calls do require gas, payments garbled "no regulatory bureaucracy".
- The "actor" polyseme resolved to a film performer in bn/hi/mr/ur; mr `miners` rendered as `khanij` (mineral); pl `receipt` as a till receipt; fr `creneau` reverted to `slot`; es untranslated `banks` and `Merge`; es/it `gatekeeper` collapsed onto `intermediario`; ko/zh-tw sense errors; ta cross-script contamination (a Bengali word inside Tamil prose).
- Restored nine dropped internal links in cs/pl/sw/vi transactions and ru bridges.
Verified: 200/200 markdown compile clean, 72/72 JSON valid with full key parity, href and anchor sets match English, and scoped production builds pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Adds four patterns to the review knowledge base and the per-language record for all 24 locales. - 49: a JSX component added to an English page is never propagated to any locale. `<QuizWidget>` was missing from 192 files while the quiz strings were fully translated everywhere. Detect by diffing per-component counts against English; repair by hand is safe since the block needs no translation. - 50: the angle-bracket autolink corruption in pattern 3 also appears as a moved `>` rather than a dropped one. A naive regex finds nothing because the URL itself contains parens; grep for the `>).ext>)` tell instead. The MDX compiler does not flag it, so it ships silently. - 51: one English commit can propagate its structural edits and silently drop its prose edits. Four of six changes landed in all 24 locales while two single-clause prose edits did not, so "the big restructure came through" is not evidence the small edits did. Also records that repair choice hinges on the stale line count, not the pattern, and that resuming a finished per-language agent for one exact line is cheaper than a mode=full re-run. - 52: balanced `<strong>` count mismatches in SOV and RTL locales are correct, not defects. The discriminator is direction: more than English and balanced is legitimate word-order redistribution, fewer is a real dropped emphasis. 26 false positives avoided this run. Also records the PR 19015 summary (fleet average 8.4 pre-fix, per-locale scores, what each locale needed) and notes that the leftover h1 still affects community/grants, contributing/adding-videos and whitepaper outside this PR's scope. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
myelinated-wackerow
left a comment
There was a problem hiding this comment.
Translation Quality Review
PR: #19015
Branch HEAD: 7b18724724
Languages: all 24
Files reviewed: 200 markdown + 72 JSON
Date: 2026-08-10
Fixes: Critical fixes applied and committed to this branch (8387c4aced)
The Netlify build was red on arrival. Root cause: <p> collapsed to <p></p> in zero-knowledge-proofs/index.md in 8 locales, orphaning the following </p>. Fixed; 200/200 markdown now compile clean and scoped production builds pass.
Deterministic sweeps ran before the review fleet and found every structural defect; none was surfaced first by an agent. The 24 per-language agents then supplied the judgment layer and the per-locale replacement prose.
Fleet-wide defects fixed (all 24 locales)
| Defect | Scope | Introduced by this PR |
|---|---|---|
<p></p> MDX build-breaker |
8 locales | yes |
>).pdf>) autolink corruption, 48 dead source links |
24 locales | yes |
{#will-my-smart-contracts-change} FAQ section deleted by the incremental merge |
24 locales | yes |
Stale H2 2026 (English says Q4) and stale "democratize liquidity" clause |
24 locales | yes |
<QuizWidget> / <Divider /> never propagated |
192 files, 8 pages | pipeline gap |
Leftover # Title {#glamsterdam} h1 rendering the page title twice |
24 locales | pre-existing |
| Ghost duplicate blocks | 13 blocks, 7 locales | pre-existing |
Of the six changes in English commit 0e42e1a2ee, four propagated to all 24 locales and two single-clause prose edits did not, so a clean structural diff was not evidence the small edits landed.
The <QuizWidget> gap is worth a pipeline fix: the quiz strings were already fully translated in every locale, so only the component invocation was missing and those quizzes rendered nowhere outside English.
Scores
| Language | Score | Notes |
|---|---|---|
| ru | 9.6 | cleanest of the fleet; only a dropped root link |
| zh | 9.4 | zero 智慧合约 regressions |
| bn | 9.1 | two corrupted words had destroyed negations |
| fr | 9.0 | créneau reverted to slot; bare L1/L2 nav strings |
| zh-tw | 9.0 | zero 智慧合約 regressions; fee_recipient direction inverted |
| hi | 8.9 | actor polyseme |
| pl | 8.8 | receipt as a till receipt |
| pt-br | 8.8 | h1 duplication, stale clauses |
| id | 8.7 | glossary compound in common.json |
| it | 8.7 | layer 2 (L2) casing; gatekeeper collapse |
| ko | 8.7 | exposure flattened to "invest" |
| tr | 8.6 | three competing stablecoin forms |
| mr | 8.5 | miners rendered as "mineral" |
| ja | 8.4 | glossary-covered brands left in Latin |
| te | 8.4 | Geth left Latin; nav label vs page title |
| uk | 8.4 | two headings collapsed onto one rendering |
| vi | 8.4 | dropped fork links; exposure sense |
| de | 8.3 | Yellowpaper; du/Sie split |
| es | 7.7 | untranslated banks/Merge; gatekeeper collapse |
| ur | 7.5 | glossary-AVOID لین دین; actor polyseme |
| cs | 7.4 | gas as literal plyn in 42 sites |
| ta | 7.4 | cross-script contamination; shared key; trade-offs |
| ar | 7.2 | glossary root; brand transliterations |
| sw | 6.2 | client as "customer" in 31 sites |
Fleet average 8.4 (pre-fix).
Glossary and semantic fixes applied (103 replacements)
Every fix corrects toward the ETHGlossary term the locale already used elsewhere, with a cross-file disagreement inside this PR as corroboration.
- cs
gasrendered as literalplynin 42 sites across five files, whilecommon.jsonhad it right. ETHGlossary's own cs note mandates the loanword. Unrelated Czech words (plynulejší,plynout) and the literal natural-gas flaring line left untouched. - sw
client(software) renderedmteja(customer) in 31 sites where the glossary mandateskiteja; two files got it right in one line and wrong in the next. Fixed with noun-class concord. - bn two corrupted words that destroyed a negation:
transactionsclaimed view/pure calls do require gas;paymentsgarbled "no regulatory bureaucracy". - actor polyseme resolved to a film performer in bn/hi/mr/ur.
- mr
minersrenderedखनिज(mineral), producing "minerals must use computing hardware". - pl
receiptasparagon(till receipt) in bothreceipts_rootrows. - fr
slotreverted from the glossary formcréneau; bareL1/L2in two nav strings. - es untranslated
banksandMerge; es/itgatekeepercollapsed ontointermediario(middleman). - ko
exposureflattened to "invest"; zh-twfee_recipientdescribed as the payer. - ta a Bengali word inside Tamil prose (cross-script contamination).
- te/ar/mr
zero-knowledge proofnav labels disagreeing with their own page titles. - Nine dropped internal links restored in cs/pl/sw/vi
transactionsand rubridges.
Deliberately left for a native-speaker pass
These are agent-flagged criticals I did not fix, because the correction is LLM-authored prose in a script I cannot verify and hand-patching non-Latin content risks silent Unicode-composition drift.
- ja / ar / ur ETHGlossary-covered brand names left in Latin in
learn-quizzes.jsonandpage-what-is-ethereum.json(Optimism, Arbitrum, Aave, MakerDAO, Facebook, Twitter, Geth, ZK-STARK), while the same files transliterate other brands correctly. - ur the glossary-AVOID form
لین دینfor "transaction fee" in 4 sites;وٹالک بوٹیرنvs the corpus-standard spelling. - ta
shared keyusingவிசைwhere the bare glossary entry isதிறவுகோல்;trade-offsusing the swap sense. - hi
non-trusted setuprendered with the "untrustworthy" reading that ETHGlossary'strustlessnote warns against. - tr the stale
sabit paraform still in 6 sites ofpayments. - de du/Sie split across
learn-quizzes.jsoncategories; es tú/usted split across the file set.
Confirmed clean, and false positives worth not re-reporting
Clean fleet-wide: JSON validity 72/72, full key parity, ICU placeholders, rich-text tag sets, zero HTML-PLACEHOLDER leaks, no untranslated English prose chunks (vi's historical failure mode absent), no ticker or domain typos, no transliterated domains, no PoW/PoS or validator/miner inversions.
Not defects, do not flag next time: 26 <strong> count mismatches in SOV and RTL locales are legitimate word-order redistributions of a bolded verb+object, rendered through t.rich which accepts repeated tags. The discriminator is direction, not count.
Still outstanding outside this PR's scope: the same leftover h1 affects community/grants, contributing/adding-videos and whitepaper in 51 further files.
Knowledge base updated in 7b18724724 with four new patterns (component propagation gap, the moved-> autolink variant, structural-vs-prose partial propagation, and the SOV <strong> false positive) plus the per-language record for all 24 locales.
-- Opus 5
Removes the leading `# Ethereum grants {#ethereum-grants}` from all 24 translated `community/grants/index.md`. English dropped it in the h1-to-frontmatter.title migration (d9f62fb) and the locales kept it, so those pages rendered the title twice.
Preconditions verified before touching anything: all 24 manifests are current against English (`hasEnglishChanged` returns false), and the pages are otherwise fully translated - heading counts, anchor sets and internal link sets all match English exactly once the stray h1 is removed, with no untranslated English prose.
Note the anchor is not load-bearing here: English no longer contains `#ethereum-grants` either, so the one inbound deep link (`community/events/organizing/index.md`) was already dead on the English site. This change makes the locales consistent with English rather than introducing a break.
Left alone deliberately, both fail the same preconditions:
- `contributing/adding-videos` (24 locales): manifests are current but the translations are missing the `{#step-4}` heading and the `/stories/` link. The stray h1 masks the loss by keeping the heading count at 14, so this needs a real section repair, not an h1 strip.
- `whitepaper` (pt-br, zh, zh-tw): no manifest exists at that path for these three locales, and they are also missing `{#long-term-supply-growth-rate-percent}` and the `/` link.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
myelinated-wackerow
left a comment
There was a problem hiding this comment.
Follow-up to the review above, now at 585282e2fd.
Removed the leftover # Ethereum grants {#ethereum-grants} h1 from all 24 translated community/grants/index.md. English dropped it in the h1-to-frontmatter.title migration and the locales kept it, so those pages were rendering the title twice.
Checked before touching it: all 24 manifests are current against English, and heading counts, anchor sets and internal link sets match English exactly once the stray h1 is gone. The anchor is not load-bearing - English no longer has it either, so the single inbound deep link was already dead on the English side.
Two sibling pages were deliberately left alone because they fail the same check: contributing/adding-videos (24 locales are missing the {#step-4} heading and the /stories/ link) and whitepaper (pt-br/zh/zh-tw have no manifest at that path). Both need a real repair rather than an h1 strip.
Pipeline gap behind the missing quiz components is now tracked in #19031.
-- Opus 5

Automated Translations
This PR contains translations managed by the intl pipeline.
Each run appends a summary below.
Run: 2026-08-07 07:23:55 UTC
5 task(s) failed:
public/content/developers/docs/consensus-mechanisms/pos/index.md(fr): Gemini returned no content (finishReason=RECITATION). This file/language combination may be triggering content filters.public/content/developers/docs/smart-contracts/testing/index.md(es): Gemini returned no content (finishReason=RECITATION). This file/language combination may be triggering content filters.public/content/whitepaper/index.md(pt-br): Gemini returned no content (finishReason=RECITATION). This file/language combination may be triggering content filters.public/content/whitepaper/index.md(zh): Output validation failed after 3 attempts: Suspiciously short: 389 chars vs 1571 English charspublic/content/whitepaper/index.md(zh-tw): Output validation failed after 3 attempts: Suspiciously short: 387 chars vs 1571 English charsRerun the failed combinations: