URL strategy
The default language is Japanese, served with no prefix (/), while English lives under /en/. Setting prefixDefaultLocale: false in Astro’s native i18n routing produces exactly this shape.
Linking translations
Each language version of a post is bound together by matching the translationKey in its frontmatter. The language switcher pulls the other version’s URL from that cluster. For a post that has no translation, the switch falls back to the home page of that language.
hreflang breaks easily
Research had already warned that hreflang behaves like a directed graph: drop a single link and the whole group can be invalidated. So I generate hreflang symmetrically from the translationKey cluster, which makes dangling links impossible by construction. A small build-time check then warns about any cluster that is missing a translation.
Ready for a third language
The list of languages lives in a single config. Adding a third is just one more entry in that array plus the translation files — the change ripples out from one place. Building on a multilingual foundation from the start keeps later steps light.