- Shipped
- September 11, 2026 at 7:18 PM UTC
- Author
- Kamo
- Commit
- 69ae23b
/sitemap.xml listed each page once, as its English URL. The 17,843 changelog entries had no language alternates at all, and every page's own hreflang named all 21 locales whether or not the page existed in them. - Every language version is now a <url> of its own, carrying the page's full, reciprocal hreflang cluster and x-default: Google's recommended form, and the one that gets a localized page found without waiting for a crawler to follow an alternate link to it. - A version is listed only where it is its own canonical: SITE_LOCALES for hand-written pages, blog posts and changelog list pages; COLLECTION_CONTENT_LOCALES for comparisons, solutions, integrations and the glossary; and for KB articles and changelog entries, the locales KBService and SecurityService report a real translation for. An echo of the English does not count. Listing a version that canonicals to English submits a URL that cannot be indexed. - Each page's <head> names exactly the same set. localeAlternates() takes the locales a page exists in, and a locale outside them canonicals to English with no noindex. Collection pages in locales without collection copy used to be noindex while every other page still named them as alternates. - The index is split by section (pages, collections, each KB section, changelog list pages, changelog entries), each file with its newest lastmod and well inside the 50,000-URL / 50 MB limits. Changelog files run oldest first, so a full file never changes again. - Changelog list pages 2..N are listed; each is its own canonical. - /sitemap.json is one streamed document holding every page and every language URL. /api/sitemap serves the same document. - A source that cannot be read answers 503 rather than a partial sitemap.