Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
fe367d3
i18n(ar): LLM translation
wackerow Aug 7, 2026
57311ac
i18n(bn): LLM translation
wackerow Aug 7, 2026
22bbd2c
i18n(cs): LLM translation
wackerow Aug 7, 2026
c5a08c9
i18n(de): LLM translation
wackerow Aug 7, 2026
dd0b479
i18n(es): LLM translation
wackerow Aug 7, 2026
6530778
i18n(fr): LLM translation
wackerow Aug 7, 2026
d633202
i18n(hi): LLM translation
wackerow Aug 7, 2026
3c2f117
i18n(id): LLM translation
wackerow Aug 7, 2026
e17dfd2
i18n(it): LLM translation
wackerow Aug 7, 2026
7ba26ae
i18n(ja): LLM translation
wackerow Aug 7, 2026
e48bd72
i18n(ko): LLM translation
wackerow Aug 7, 2026
087403e
i18n(mr): LLM translation
wackerow Aug 7, 2026
a5cb64d
i18n(pl): LLM translation
wackerow Aug 7, 2026
8dc2b08
i18n(pt-br): LLM translation
wackerow Aug 7, 2026
2cc8595
i18n(ru): LLM translation
wackerow Aug 7, 2026
420c6ae
i18n(sw): LLM translation
wackerow Aug 7, 2026
e8b06e2
i18n(ta): LLM translation
wackerow Aug 7, 2026
c019637
i18n(te): LLM translation
wackerow Aug 7, 2026
c4815c9
i18n(tr): LLM translation
wackerow Aug 7, 2026
e7595e5
i18n(uk): LLM translation
wackerow Aug 7, 2026
638e4a5
i18n(ur): LLM translation
wackerow Aug 7, 2026
ae9b030
i18n(vi): LLM translation
wackerow Aug 7, 2026
498c8d6
i18n(zh): LLM translation
wackerow Aug 7, 2026
5553999
i18n(zh-tw): LLM translation
wackerow Aug 7, 2026
c90d6f7
i18n: sanitize translation output
wackerow Aug 7, 2026
a1a5dee
i18n: merge tmp-intl/run-0807-0459 into intl/pending-dev
wackerow Aug 7, 2026
d06182b
Merge remote-tracking branch 'origin/dev' into intl/pending-dev
myelinated-wackerow Aug 10, 2026
8387c4a
fix(i18n): repair pipeline defects in import
myelinated-wackerow Aug 10, 2026
7b18724
docs(intl-review): record PR 19015 findings
myelinated-wackerow Aug 10, 2026
585282e
fix(i18n): drop leftover h1 from grants page
myelinated-wackerow Aug 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
48 changes: 48 additions & 0 deletions .claude/translation-review/known-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -668,3 +668,51 @@ Reviewers: on any virtue-becomes-harm construction ("transparency into exposure"
- **The plasma retranslations are a net upgrade with consistency debt.** ru replaced non-glossary forms throughout (`офф-чейн`, `ролл-апы`, `обязательства по состоянию`, `вайтпейпер`) and restored 3 missing heading anchors + 1 link; vi has zero glossary deviations across 60 matched terms. Both then split load-bearing vocabulary inside the one fresh file — ru: Mainnet, contract/smart-contract, block producer; vi: funds (3 forms), malicious (2), data unavailability (2), cryptographic proof (2), rollup (3). Full-file retranslation trades old wrong terms for new inconsistent ones; budget review attention accordingly (#33's collateral-drift warning applies to terminology, not just tense).
- **#41 recurred:** `accounts/index.md` shipped translated content in all 24 locales with `source.json` bumped to 2026-07-30 and `translation.json` still reading 2026-06-18. Record-keeping only, per #41 — the incremental gate never reads `translation.json`.
- **`kontrat` vs `sözleşme` in tr is not a defect.** The restored heading reads `Kontrat hesapları` while the body says `Sözleşme adresi`; ETHGlossary has both `contract account => kontrat hesabı` (compound) and `contract => Sözleşme` (bare), so the mix is exactly what the glossary prescribes. Do not auto-normalize it — see #30 for the inverse failure.

### 49. A JSX component added to an English page is NEVER propagated to any locale (CRITICAL — pipeline coverage gap)

When a component with no translatable text is appended to an English page, the pipeline does not carry it into any locale. PR #19015: `<QuizWidget quizKey="..." />` (and the `<Divider />` above it, where present) was added to 8 English pages by the quiz-expansion effort and was missing from **all 24 locales on all 8 pages — 192 files**. The quiz *strings* were fully translated in every locale (`learn-quizzes.json`, full key parity for all 8 quizzes), so the only thing missing was the one-line component invocation: every non-English reader silently lost the end-of-page quiz.

The pipeline **can** carry the component — 217 already-translated files elsewhere in the tree contain `<QuizWidget>` — so this is an incremental-propagation gap on newly added components, not a policy.

**Detect deterministically:** per file, diff the count of each `<Component` between English and each locale. A component present in English and absent in 24/24 locales is a coverage gap, never per-language error (the same logic as #29's extraction gap).

**Repair by hand is correct and safe:** the block requires zero translation. Copy the trailing component block verbatim from the English source and append it, preserving the blank-line separation. Verify the referenced `quizKey` has full string coverage in every locale *first* — if the strings are missing, the widget renders broken.

### 50. The angle-bracket autolink corruption of #3 also appears as a MOVED `>`, not only a dropped one (CRITICAL)

Pattern 3's last row covers a *dropped* `>` in `[t](<url_(qual)>)`. PR #19015 produced the sibling form: the `>` was **moved to before the file extension**, giving `[src](<https://…PayPal-(1)>).pdf>)` — a broken href plus a literal `).pdf>)` rendered as visible junk. **All 24 locales, both table rows of `energy-consumption/index.md`, 48 dead links**, and PR-introduced (zero occurrences pre-PR).

**The regex matters.** A naive `\]\(<[^)]*?>\)` finds nothing, because the URL itself contains `)`. Grep for the tell instead: `>\)\.[a-z]+>\)` (or simply `>)\.pdf`). Fix is `s/>\)\.pdf>\)/.pdf>)/`. Add this to the standard deterministic sweep — 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 (CRITICAL)

#32/#35 frame incremental-merge damage as deleted headings and spliced links. PR #19015 shows a quieter variant: of the 6 changes in English commit `0e42e1a2ee`, **4 landed in all 24 locales and 2 did not** — and the 2 that failed were both single-clause prose edits inside otherwise-updated paragraphs:

| English change | Propagated? |
|---|---|
| section retitle, note rewrite, whole EIP-8080→8061 section body, resources link | 24/24 ✅ |
| `H2 2026` → `Q4 2026` in the alert | 0/24 ❌ |
| `democratize liquidity` → `speed up how quickly stakers can move their stake` | 0/24 ❌ |

The same run also deleted a whole FAQ section (#32) in 24/24. So a run can be simultaneously right about the hard parts and wrong about the easy ones — **"the big restructure came through" is not evidence the small edits did.**

**Detect deterministically:** enumerate the English commit's changed lines (`git show <sha> -- <path> | grep -E '^[+-][^+-]'`) and assert each one's counterpart changed in every locale. Anchor on a distinctive token from the new English (a date, an EIP number, a renamed noun) — set-based anchor/link diffs pass cleanly here because neither stale clause carried a link or an anchor.

**Repair choice hinges on the line count, not the pattern.** Two stale prose lines × 24 is cheaper and lower-risk to hand-patch from per-locale agent output than a `mode=full` re-run, which would also discard hand-repairs already made to the same file (#34) and invite collateral drift (#33). Reserve `mode=full` for when whole sections are missing or the count runs past a handful of lines per locale.

### 52. Balanced `<strong>` count mismatches in SOV/RTL locales are CORRECT — do not flag (REVIEW HYGIENE)

English bolds a contiguous verb+object (`<strong>Distribute public funds</strong> and benefits…`). In SOV and verb-final languages the verb moves to the end, so the bolded phrase legitimately splits into two discontiguous runs and the locale ships **two** balanced `<strong>` pairs where English has one. PR #19015: 26 such mismatches across bn/hi/ja/ko/ta/tr/ur/zh/zh-tw in `page-what-is-ethereum.json`, every one correct.

**The discriminator is direction, not count:** `translated > english` and balanced = legitimate redistribution; `translated < english` = a genuinely dropped emphasis (one real case in #19015: bn lost the `<strong>` around `DeFi`). Confirm the key renders through `t.rich` — next-intl accepts repeated tags, so the split is safe. Same family as the ar/ko redistributions noted under PR #18739.

### All 24 languages -- glamsterdam + core docs + what-is-ethereum, Reviewed PR #19015 (intl/pending-dev)
- 24 langs x 11-12 files (8-9 markdown + `common.json` / `learn-quizzes.json` / `page-what-is-ethereum.json`) = 200 markdown + 72 JSON. Pages: `bridges`, `developers/docs/{blocks,evm,transactions}`, `energy-consumption`, `payments`, `roadmap/glamsterdam`, `what-are-apps`, plus `zero-knowledge-proofs` in 8 locales. Fleet avg (pre-fix) **8.4**.
- Scores: ru 9.6, zh 9.4, bn 9.1, fr/zh-tw 9.0, hi 8.9, pl/pt-br 8.8, id/it/ko 8.7, tr 8.6, mr 8.5, ja/te/uk/vi 8.4, de 8.3, es 7.7, ur 7.5, cs/ta 7.4, ar 7.2, sw 6.2.
- **The Netlify build was RED on arrival.** Cause: `<p>` collapsed to `<p></p>` in `zero-knowledge-proofs/index.md` in 8 locales (bn hi ko mr ta te tr ur), orphaning the following `</p>` -> `Unexpected closing tag </p>, expected closing tag for <AlertDescription>`. Fixed; 200/200 compile clean and a scoped `NEXT_PUBLIC_BUILD_LOCALES` build passes.
- **Deterministic sweeps found every structural defect; no agent surfaced any of them first** (#25 again). Five fleet-wide finds: the build-breaker (8 locales), #50 `.pdf` autolink corruption (24 locales, 48 links), #32 deleted FAQ section `{#will-my-smart-contracts-change}` (24 locales), #49 missing `<QuizWidget>` (192 files), and 13 ghost duplicate blocks (7 locales). Agents then supplied the judgment layer *and* the per-locale replacement prose the sweeps could not write.
- **Resuming a finished per-language agent to request one exact line is the cheapest way to hand-patch a fleet-wide prose defect.** 18 agents were resumed from transcript for the #51 lines; each returned a full grammatical line in seconds with its locale context still loaded, avoiding both a `mode=full` re-run and reviewer-authored prose in 24 languages (#36).
- **Confirmed clean fleet-wide:** JSON validity 72/72, full key parity, ICU placeholders, rich-text tag sets (modulo #52), zero `HTML-PLACEHOLDER` leaks, no untranslated English prose chunks (vi's historical failure mode absent), no ticker/domain typos, no transliterated domains. One real cross-script contamination: a Bengali word `বিপুল` inside Tamil prose in `ta/zero-knowledge-proofs`.
- **Recurring per-locale glossary regressions, all fixed against ETHGlossary + the locale's own corpus:** cs `gas`->`plyn` (42 sites across 5 files, while cs `common.json` had it right); sw `client`->`mteja` (customer) instead of `kiteja` (31 sites, worst score of the fleet); the `actor`->film-performer polyseme (#37b) recurring in bn/hi/mr/ur; fr `créneau`->`slot` reversion and bare `L1`/`L2` nav strings; pl `receipt`->`paragon` (till receipt); es untranslated `banks` and `Merge`; it/es `gatekeeper` collapsing onto `intermediario` (#47 recurred); mr `miners`->`खनिज` (mineral); te/ar/mr `zero-knowledge proof` nav labels disagreeing with their own page titles.
- **The stray `# <Title> {#anchor}` h1 in translated `roadmap/glamsterdam` (24/24) is PRE-EXISTING**, inherited from the h1 -> `frontmatter.title` migration (`d9f62fb787`); English has no h1 and the locales still carry one. It is corpus-wide, not this PR's regression — left alone, still owed a dedicated sweep.
6 changes: 6 additions & 0 deletions .claude/translation-review/per-language/ar.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,3 +120,9 @@ Scope: accounts `CREATE2` + `page-app-descriptions`/`page-apps`/`page-developers

- `salt` is LTR-wrapped consistently with the 11 existing `<span dir="ltr">` spans in the same file.
- `بسك` for game-sense mint is the established ar crypto verb (5 prior uses), not the coin-minting failure mode.

## PR #19015 (intl/pending-dev) -- 2026-08-10 -- Score 7.2/10 (pre-fix)

- Scope: 11-12 files (8-9 markdown + common / learn-quizzes / page-what-is-ethereum JSON). Fleet avg 8.4.
- `common.json` zero-knowledge-proofs root `براهين` -> `إثباتات` (ETHGlossary uses إثبات; learn-quizzes already had it right 9x). Brand transliterations still owed in `learn-quizzes.json`/`page-what-is-ethereum.json` (Optimism/Arbitrum/Aave/MakerDAO/ZK-STARK, `فاليديم`->`فاليديوم`) -- left for a native pass.
- Fleet-wide items fixed in this branch for every locale: the `<p></p>` MDX build-breaker (8 locales), the `.pdf` autolink corruption (#50), the deleted `{#will-my-smart-contracts-change}` FAQ section (#32), the missing `<QuizWidget>` component (#49), and the two stale glamsterdam prose clauses (#51 -- `Q4 2026` and the stakers/liquidity sentence).
6 changes: 6 additions & 0 deletions .claude/translation-review/per-language/bn.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,9 @@ Scope: accounts `CREATE2` + `page-app-descriptions`/`page-apps`/`page-developers
- **Protect from naive auto-fix:** `app-zkpdf-description` renders "legal contracts" as `আইনি চুক্তি`, not the glossary's `কন্ট্রাক্ট`. That is correct — the glossary note reserves `চুক্তি` for traditional legal documents.
- The `page-values` reword is a net fidelity gain: moving `গোপনীয়তা ছাড়া` ahead of the bolded head noun fixes an English-word-order calque.
- **Sweep gotcha:** a `[ऀ-ॿ]` Devanagari-leak check fires on every bn string, because Bengali shares the danda `।` U+0964 with the Devanagari block.

## PR #19015 (intl/pending-dev) -- 2026-08-10 -- Score 9.1/10 (pre-fix)

- Scope: 11-12 files (8-9 markdown + common / learn-quizzes / page-what-is-ethereum JSON). Fleet avg 8.4.
- Two corrupted words that destroyed a negation, both fixed: `প্রয়োজন হবে ঘন` -> `হবে না` (transactions -- view/pure calls need NO gas) and `থাকেবিধা নেই` -> `থাকে না` (payments). `actor` -> `পক্ষ` (was অভিনেতা, film performer). Dropped `<strong>` around DeFi restored.
- Fleet-wide items fixed in this branch for every locale: the `<p></p>` MDX build-breaker (8 locales), the `.pdf` autolink corruption (#50), the deleted `{#will-my-smart-contracts-change}` FAQ section (#32), the missing `<QuizWidget>` component (#49), and the two stale glamsterdam prose clauses (#51 -- `Q4 2026` and the stakers/liquidity sentence).
6 changes: 6 additions & 0 deletions .claude/translation-review/per-language/cs.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,9 @@ Scope: accounts `CREATE2` + `page-app-descriptions`/`page-apps`/`page-developers

- The new `důkazech s nulovou znalostí` is the **glossary-correct** form. Three pre-existing out-of-scope strings in the same file still use `s nulovým vědomím` for the proof sense — the old ones are the drift. Do not "fix" the new string.
- `smlouva` in `app-zkpdf-description` is correct (legal paper document per the glossary note), not a `kontrakt` deviation. `razíte` for game-mint matches 5 existing uses.

## PR #19015 (intl/pending-dev) -- 2026-08-10 -- Score 7.4/10 (pre-fix)

- Scope: 11-12 files (8-9 markdown + common / learn-quizzes / page-what-is-ethereum JSON). Fleet avg 8.4.
- **`gas` rendered as the literal `plyn` in 42 sites across 5 files**, while cs `common.json` had `gas` right -- ETHGlossary's own cs note mandates the loanword. All fixed; unrelated Czech words (`plynulejší`, `plynout`) and the literal natural-gas flaring line in energy-consumption correctly untouched. Dropped `[aktualizace London](/ethereum-forks/#london)` restored; `cílovové` typo fixed.
- Fleet-wide items fixed in this branch for every locale: the `<p></p>` MDX build-breaker (8 locales), the `.pdf` autolink corruption (#50), the deleted `{#will-my-smart-contracts-change}` FAQ section (#32), the missing `<QuizWidget>` component (#49), and the two stale glamsterdam prose clauses (#51 -- `Q4 2026` and the stakers/liquidity sentence).
6 changes: 6 additions & 0 deletions .claude/translation-review/per-language/de.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,9 @@ Scope: accounts `CREATE2` + `page-app-descriptions`/`page-apps`/`page-developers

- The two reworded `page-values` strings improve the file's Sie register (`die man nicht überprüfen kann` -> `die Sie nicht überprüfen können`).
- The `du` forms in the new game/consumer blurbs match the file's established split (games/consumer = du, DeFi/enterprise = Sie) — not an intra-file inconsistency.

## PR #19015 (intl/pending-dev) -- 2026-08-10 -- Score 8.3/10 (pre-fix)

- Scope: 11-12 files (8-9 markdown + common / learn-quizzes / page-what-is-ethereum JSON). Fleet avg 8.4.
- `Yellowpaper` -> `Yellow Paper` (2 quiz keys; the markdown had it right). Lone informal `Du` in an all-`Sie` `payments/index.md` normalised. Open: du/Sie split across `learn-quizzes.json` categories (5 of ~20 use Sie) -- a deliberate convention call, not a mechanical fix.
- Fleet-wide items fixed in this branch for every locale: the `<p></p>` MDX build-breaker (8 locales), the `.pdf` autolink corruption (#50), the deleted `{#will-my-smart-contracts-change}` FAQ section (#32), the missing `<QuizWidget>` component (#49), and the two stale glamsterdam prose clauses (#51 -- `Q4 2026` and the stakers/liquidity sentence).
6 changes: 6 additions & 0 deletions .claude/translation-review/per-language/es.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,9 @@ Scope: accounts `CREATE2` + `page-app-descriptions`/`page-apps`/`page-developers

- `acuñar` for game-sense mint matches the file's NFT-mint convention (`app-basepaint-description`).
- `la "sal"` for the CREATE2 salt is valid Spanish cryptography usage; the es EVM opcodes doc keeps the parameter as `salt`, so a `(salt)` gloss would help discoverability but the term is not wrong.

## PR #19015 (intl/pending-dev) -- 2026-08-10 -- Score 7.7/10 (pre-fix)

- Scope: 11-12 files (8-9 markdown + common / learn-quizzes / page-what-is-ethereum JSON). Fleet avg 8.4.
- Untranslated English `banks` -> `bancos`, and `Merge` -> `Fusión` (ETHGlossary: The Merge => La Fusión) in `common.json`. `gatekeeper` -> `guardián`, un-collapsing it from `intermediario` (middleman) per #47. Open: tú/usted split across the file set; decimal period-vs-comma mixing on the same statistic in 3 files.
- Fleet-wide items fixed in this branch for every locale: the `<p></p>` MDX build-breaker (8 locales), the `.pdf` autolink corruption (#50), the deleted `{#will-my-smart-contracts-change}` FAQ section (#32), the missing `<QuizWidget>` component (#49), and the two stale glamsterdam prose clauses (#51 -- `Q4 2026` and the stakers/liquidity sentence).
6 changes: 6 additions & 0 deletions .claude/translation-review/per-language/fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,9 @@ Scope: accounts `CREATE2` + `page-app-descriptions`/`page-apps`/`page-developers
**Notes:**

- **Do not "fix" « sel » for salt.** It is the established French cryptography term (fr.wikipedia *Sel (cryptographie)*, "salage"), and the scare quotes mirror English, marking it as a term of art.

## PR #19015 (intl/pending-dev) -- 2026-08-10 -- Score 9.0/10 (pre-fix)

- Scope: 11-12 files (8-9 markdown + common / learn-quizzes / page-what-is-ethereum JSON). Fleet avg 8.4.
- `slot` -> `créneau` restored to the glossary form in both `single-slot-finality` keys. Bare `L1`/`L2` -> `couche 1 (l1)`/`couche 2 (l2)` in 2 nav strings. `formelnellement` typo fixed.
- Fleet-wide items fixed in this branch for every locale: the `<p></p>` MDX build-breaker (8 locales), the `.pdf` autolink corruption (#50), the deleted `{#will-my-smart-contracts-change}` FAQ section (#32), the missing `<QuizWidget>` component (#49), and the two stale glamsterdam prose clauses (#51 -- `Q4 2026` and the stakers/liquidity sentence).
6 changes: 6 additions & 0 deletions .claude/translation-review/per-language/hi.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,9 @@ Scope: accounts `CREATE2` + `page-app-descriptions`/`page-apps`/`page-developers

- Both headline polysemy traps resolved correctly: "salt" -> `सॉल्ट` (not `नमक`), "mint" -> `मिंट करना` in the creature sense (not coinage, not the herb). Zero glossary deviations.
- `ciphernodes` -> `साइफरनोड्स` was judged acceptable: English lowercases it and it matches hi's existing `साइफरपंक`.

## PR #19015 (intl/pending-dev) -- 2026-08-10 -- Score 8.9/10 (pre-fix)

- Scope: 11-12 files (8-9 markdown + common / learn-quizzes / page-what-is-ethereum JSON). Fleet avg 8.4.
- `actor` -> `पक्ष` (was अभिनेता, film performer) -- hi `learn-quizzes.json` already rendered the same English phrase correctly, which is what confirmed it. Open: `non-trusted setup` twice rendered with the *untrustworthy* reading, which ETHGlossary's `trustless` note explicitly warns against -- native call.
- Fleet-wide items fixed in this branch for every locale: the `<p></p>` MDX build-breaker (8 locales), the `.pdf` autolink corruption (#50), the deleted `{#will-my-smart-contracts-change}` FAQ section (#32), the missing `<QuizWidget>` component (#49), and the two stale glamsterdam prose clauses (#51 -- `Q4 2026` and the stakers/liquidity sentence).
6 changes: 6 additions & 0 deletions .claude/translation-review/per-language/id.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,9 @@ Scope: accounts `CREATE2` + `page-app-descriptions`/`page-apps`/`page-developers

- `bertujuan`-style tense-neutrality (#33) did not recur: `sebelum kontrak ada` and `belum diterapkan` both carry their temporal force.
- The adjectival/nominal zero-knowledge split (`bukti tanpa pengetahuan` nominal, `zero-knowledge` as modifier) is coherent and matches 6 pre-existing uses in the same file.

## PR #19015 (intl/pending-dev) -- 2026-08-10 -- Score 8.7/10 (pre-fix)

- Scope: 11-12 files (8-9 markdown + common / learn-quizzes / page-what-is-ethereum JSON). Fleet avg 8.4.
- No per-locale fixes needed beyond the fleet-wide items. Open: `common.json` `zero-knowledge-proofs` uses the hybrid `Bukti zero-knowledge` where the glossary compound is `Bukti tanpa pengetahuan`, which `learn-quizzes.json` already uses 8+ times.
- Fleet-wide items fixed in this branch for every locale: the `<p></p>` MDX build-breaker (8 locales), the `.pdf` autolink corruption (#50), the deleted `{#will-my-smart-contracts-change}` FAQ section (#32), the missing `<QuizWidget>` component (#49), and the two stale glamsterdam prose clauses (#51 -- `Q4 2026` and the stakers/liquidity sentence).
Loading
Loading