refactor(i18n): serve locales from a [...lang] route so scopes can drop them master
Locale pages existed as real files (src/pages/about.astro plus src/pages/nl/about.astro), which made i18n.locales decorative: Astro cannot skip a route that exists on disk, so a .eu build declaring English-only still emitted all 10 Dutch pages. Only a dynamic route can opt out. Ten pages collapse into src/pages/[...lang]/, each calling localePaths() from src/i18n/paths.ts, which asks the scope which locales to build. The rest parameter keeps the default locale at the root: lang undefined -> /about, lang 'nl' -> /nl/about, matching prefixDefaultLocale: false. community-size was the only page carrying per-locale copy inline; its titles and descriptions move into a table beside the route rather than into a global catalogue, so the copy stays where whoever edits the page will look. 404 and offline stay unlocalised -- they had no Dutch counterpart. Result: .eu builds 15 pages with no Dutch, .nl and .be build 25 with it. The .nl output is unchanged -- same titles, same lang attributes, same canonicals. Drops 'fr' from the .be scope. The UI string catalogue has no French entries, so building it crashed on t('nav.about'); adding an English fallback instead would have shipped French URLs full of English, which is worse than not offering French yet. Add 'fr' back in the same change that adds the strings. Removes the two build guards from the previous commit. They existed only to stop this exact mismatch shipping silently, and checked for the src/pages/<locale>/ directories this commit deletes.