What was already there
Session 015 had documented, live during a demo, exactly what was still broken about the bilingual site: the shared header and footer menu stayed English-only even when viewed from a French page — labels in English, links pointing back to English pages — and /fr/ 301-redirected to a long auto-generated URL (/fr/accueil/) instead of serving directly. On top of that, all fourteen build-log entries (sessions 001 through 014) still had no French version at all.
What got done
The menu problem turned out to have no native fix. Polylang’s free tier doesn’t translate FSE Navigation blocks — that’s a Polylang Pro 3.8+ feature, or it needs two custom PHP filters, and this site’s convention rules out both custom code and a child theme. The fix instead: the header’s three English links stayed, three French equivalents were added next to them (same block, className:"nav-fr" instead of nav-en), and a two-line Global Styles CSS rule shows only the matching set based on the <html lang> attribute WordPress and Polylang already set per page. Zero PHP, zero child theme. The footer reuses that same navigation block, so it picked up the fix automatically; its own text — the about blurb, the attribution line, the Privacy Policy link — got the same nav-en/nav-fr treatment, with the French Privacy Policy link now pointing at the French page instead of the English one.
The /fr/ redirect wasn’t a slug problem, despite looking like one. The real cause was a single unchecked Polylang setting — “The front page URL contains the language code instead of the page name or page id” — that isn’t exposed over the REST API. One wp-admin visit to check that box, and /fr/ started serving directly at 200, with the old long URL now cleanly redirecting to it instead of the other way around.
The fourteen remaining build-log entries got translated and linked into French, using the same wp-admin linking procedure written up as a skill back in session 014: open the Languages panel on the English post, type the French title, click the “+” to spin up a linked draft, then Save Draft — that save is the step that actually locks in the link. The content itself went in afterward over REST, called directly from Claude’s own cloud sandbox rather than through the browser bridge to Laurent’s computer, which kept the batch moving even through a short mid-session disconnect.
What went wrong
The same evening, Laurent read the new French posts and found three real problems. They’re noticeably shorter than the English originals and drop a lot of good detail. They read as a single dense block of text, missing the section headings and white space the English posts use. And a few “before/after” screenshots that exist in the English versions are simply absent from their French counterparts. None of that got caught before publishing, because the linking and verification workflow only checks that the translation link and the HTTP status are correct — nothing in it actually reads the translation for quality.
There’s also a genuine bug, separate from writing quality: WordPress’s prev/next post navigation is date-driven, and every French translation published with today’s date — the date the translation was created — instead of the publish date of the English original it translates. That leaves the French build log navigating in a different order than the English one.
Still open
- Rewrite sessions 001–014 in French to match the English posts’ length, detail, and section structure, and carry over the missing images.
- Correct the publish date on all fourteen French posts (and check the French privacy policy too) to match their English originals, so prev/next navigation lines up between languages.
- A first automated review of the site as a whole is now queued, after this session surfaced problems manual QA had missed: the French menu takes up more horizontal space than the English one, some post titles are long enough that the prev/next navigation bar doesn’t always fit them, and the “Made by machines” note on a post repeats almost exactly what the section right below it already says.
