Docs: all five locales are stranded on the pre-restructure tree, so 76-96% of translated navigation serves English

Author: do-operatorCreated Sep 10, 2026Updated Sep 10, 2026
Labelsdocumentation

Summary

The English docs were restructured from a Diátaxis tree (tutorials/ how-to/ reference/ explanation/) into a task-based one (start/ plan/ build/ customize/ existing-codebases/ reference/). None of the five translated locales moved with it.

The sidebar is one shared slug list with per-locale label translations, so it points every locale at the English paths. Where a locale has no file at that path, Starlight falls back to the English page — and serves it under the locale's own lang attribute.

The result is the opposite of what you would expect: most of the translated content is finished and sitting on disk, while readers in those locales are served English.

What a French reader gets today

/fr/start/install-bmad/ is what the French sidebar links to. There is no docs/fr/start/install-bmad.md, so it renders:

<html lang="fr-FR">
<title>How to Install BMad | BMad Method</title>

English prose, declared as French. Meanwhile the real translation exists at /fr/how-to/install-bmad/ — complete, titled Comment installer BMad — and is not in the sidebar.

Scale

Of the 26 slugs in the sidebar, how many resolve to a real translated file:

Locale Translated Falls back to English
fr 2 24 (92%)
cs 1 25 (96%)
ko-kr 6 20 (76%)
vi-vn 2 24 (92%)
zh-cn 2 24 (92%)

And the translated pages that are not in the sidebar at all — reachable only by following in-body links from other pages in the same island:

Locale Pages Not in the sidebar
fr 29 28
cs 23 23
ko-kr 37 32
vi-vn 28 27
zh-cn 32 31

ko-kr is the only locale partway across: it has both start/ and build/ alongside the old tree.

Why this matters beyond tidiness

  • lang lies. Every fallback page declares a locale it is not written in. That misleads screen readers, browser translation, and search engines.
  • Finished work is invisible. These are complete translations that contributors wrote. Nobody can find them.
  • It silently gets worse. Nothing fails when a locale lacks a page — the fallback absorbs it — so the gap never shows up in CI or review.

Not a pure rename

Matching by filename, 19–27 pages per locale have no English page of that name any more. Some are genuine deletions; others were merged or renamed in the restructure (getting-startedstart/build-your-first-change, quick-fixes folded into build/build-a-change). Each needs a decision, so this cannot be done with git mv alone.

Suggested sequence

  1. Write down the mapping. One table, old path → new path or dropped, agreed once and applied to all five locales.
  2. Move what maps cleanly, keeping the translated prose as-is. This alone reconnects most of the sidebar.
  3. Decide the unmapped pages — retranslate against the new English page, or delete.
  4. Add a guard so it cannot drift silently again: fail the build, or at minimum warn, when a sidebar slug has no file in a locale. Right now that case is indistinguishable from success.

Step 4 is worth doing first even if the migration waits — it turns an invisible problem into a visible one.

Reproducing the numbers

grep -o "slug: '[^']*'" docs-site/astro.config.mjs | sed "s/slug: '//;s/'//" | sort -u > /tmp/slugs.txt
for l in fr cs ko-kr vi-vn zh-cn; do
  have=$(while read s; do [ -f "docs/$l/$s.md" ] && echo x; done < /tmp/slugs.txt | wc -l)
  echo "$l: $have of $(wc -l < /tmp/slugs.txt) sidebar slugs translated"
done

Noticed while adding a diagram to the docs index: the delivery-loop diagram appeared on exactly one page of the whole site, ko-kr/how-to/choose-a-development-path, a page whose English original no longer exists.

Source: bmad-code-org/BMAD-METHOD