diff --git a/packages/gitbook/src/components/SitePage/SitePage.tsx b/packages/gitbook/src/components/SitePage/SitePage.tsx index 29bb504a41..85a89235dd 100644 --- a/packages/gitbook/src/components/SitePage/SitePage.tsx +++ b/packages/gitbook/src/components/SitePage/SitePage.tsx @@ -3,6 +3,7 @@ import { getPageDocument } from '@/lib/data'; import { CustomizationHeaderPreset, CustomizationThemeMode, + type RevisionPageDocument, SiteInsightsDisplayContext, } from '@gitbook/api'; import type { Metadata, Viewport } from 'next'; @@ -14,7 +15,9 @@ import { getPagePath } from '@/lib/pages'; import { isPageIndexable, isSiteIndexable } from '@/lib/seo'; import { getResizedImageURL } from '@/lib/images'; +import { removeTrailingSlash } from '@/lib/paths'; import { tcls } from '@/lib/tailwind'; +import { assert } from 'ts-essentials'; import { PageContextProvider } from '../PageContext'; import { PageClientLayout } from './PageClientLayout'; import { type PagePathParams, fetchPageData, getPathnameParam } from './fetch'; @@ -106,16 +109,15 @@ export async function generateSitePageMetadata(props: SitePageProps): Promise['languages'] = {}; + siteSpaces + .filter( + (sp) => sp.section === siteSpace.section && typeof sp.space.language !== 'undefined' + ) + .forEach((langSiteSpace) => { + const publishedURL = langSiteSpace.urls.published; + const language = langSiteSpace.space.language; + assert(publishedURL, `Published URL must be defined for space in ${langSiteSpace.id}`); + assert(language, `Language must be defined for space in ${langSiteSpace.id}`); + + const langSiteSpaceURL = linker.toAbsoluteURL( + linker.toLinkForContent(new URL(publishedURL).toString()) + ); + + // @ts-expect-error - Metadata.languages does not have all the language types that GitBook supports + languages[language] = new URL( + getPagePath(revision.pages, page), + langSiteSpaceURL.endsWith('/') ? langSiteSpaceURL : `${langSiteSpaceURL}/` + ) + .toString() + .replace(/\/+$/, ''); + }); + + return { canonical, languages }; +} + /** * Fetches all the data required to render the site page. */