Skip to content

Figure captions ship untranslated: 74 of 237 on lecture-python.zh-cn across 18 lectures (re-measured 2026-08-20; was 85 of 222) #255

Description

@mmcky

85 of 222 mystnb figure captions (38%) on QuantEcon/lecture-python.zh-cn are byte-identical to the English source — untranslated, and reader-visible on pages whose prose is fully Chinese. Example live text: "Relaxation algorithm paths, undamped and damped".

Found by sweeping the site after the _toc.yml caption repair in QuantEcon/lecture-python.zh-cn#245. The ToC captions turned out to be the visible half of a larger localisation hole.

What is affected

Verified by comparing every caption: value against the same file's caption in QuantEcon/lecture-python.myst — byte-identical means untranslated, which avoids the false positives a script-detection test produces.

Lecture Untranslated captions
phillips_drifts_volatilities 26
merging_of_opinions 8
phillips_two_stories 7
olg_adaptive_money, pricing_information 5 each
exchange_rate_learning, genetic_classifier, lq_robust_smoothing, theil_2, var_subsets 4 each
bounded_rationality, market_diffusion 3 each
prospects_bounded_rationality 2
lq_robust_bewley, misspecified_recovery, phillips_escaping_nash, phillips_learning, phillips_self_confirming, sargent_surico 1 each

Which path introduced them

Tracing the commit that first introduced each English caption:

Introduced by Lectures Captions
sync (organic [translation-sync] PRs) 15 68
bulk seed (init, the 2026-07-22 37-lecture seed) 4 17

So it is predominantly the sync path — consistent with #178's thesis — but not exclusively. init left 17 as well, in merging_of_opinions, lq_robust_smoothing, theil_2 and misspecified_recovery. Any fix scoped to sync alone would leave those.

The current release is affected. Delivery tool-versions across the 19 lectures are 0.20.0, 0.24.0 and 0.25.0pricing_information and market_diffusion were both delivered by v0.25.0 on 2026-08-07 and both carry English captions.

This is a gap, not an absence

The engine clearly can translate captions: 137 captions on the same edition are correctly in Chinese, arriving via init, resync and hand translation. And QuantEcon/lecture-intro.zh-cn is completely clean — 115 captions, zero byte-identical to its source. So the capability exists and something about the sync path (and part of init) skips it.

Blast radius is one edition, for a structural reason

Swept all six editions:

Edition Captions Untranslated
lecture-python.zh-cn 222 85
lecture-intro.zh-cn 115 0
lecture-python-programming.zh-cn / .fa / .fr / .ml 0

The whole lecture-python-programming series has no mystnb captions in the English source at all, so those four editions are unaffected by construction rather than by correctness. If captions are ever added upstream there, they inherit this bug.

One false-positive class worth recording for anyone writing a checker: lecture-intro.zh-cn's inequality.md and long_run_growth.md carry 19 captions written as "洛伦..." — double-quoted \u escapes that YAML decodes correctly and that render as Chinese on the published page. A naive "does this line contain CJK codepoints" test flags them; comparing against the source does not.

Suggested fix

Same family as #178 (sync applies no localisation rules) but a different surface — YAML caption: metadata inside {figure} / code-cell directives, not plot labels or font config inside code. #178's evidence and likely fix do not reach this.

Worth deciding alongside #254, which proposes a deterministic target-script assertion for _toc.yml captions: one check could cover both surfaces, since the predicate is the same — a target-language file should not contain a caption byte-identical to its source. Deciding that before #254 is built narrowly would avoid writing the same check twice.

Repair of the existing 85 is a separate, hand-fixable pass on the edition; it is prose-only, so it publishes without a cache run.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions