Skip to content

Commit b20e050

Browse files
Mlaz-codeclaude
andcommitted
seo(i18n): add hreflang link tags to per-page HTML head
generateMetadata in the catch-all MDX route now emits alternates.languages for all 4 locales plus x-default. Next.js renders these as <link rel="alternate" hreflang="..." href="..." /> in each page's <head>, giving Google a per-page hreflang signal in addition to the sitemap-level alternates. Belt-and-suspenders for SEO: search engines read both signals, but the HTML head is the more robust source. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent c2eb09b commit b20e050

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

app/[lang]/[[...mdxPath]]/page.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,25 @@ import { ApiReferenceJsonLd, PageBreadcrumb } from '../../../components/Structur
44

55
export const generateStaticParams = generateStaticParamsFor('mdxPath')
66

7+
const LOCALES = ['en', 'es', 'pt-BR', 'de']
8+
const DEFAULT_LOCALE = 'en'
9+
710
export async function generateMetadata(props) {
811
const params = await props.params
912
const { metadata } = await importPage(params.mdxPath, params.lang)
1013
const path = params.mdxPath ? `/${params.lang}/${params.mdxPath.join('/')}` : `/${params.lang}`
14+
const subPath = params.mdxPath ? `/${params.mdxPath.join('/')}` : ''
15+
const languages: Record<string, string> = {}
16+
for (const l of LOCALES) {
17+
languages[l] = `https://docs.sharpapi.io/${l}${subPath}`
18+
}
19+
languages['x-default'] = `https://docs.sharpapi.io/${DEFAULT_LOCALE}${subPath}`
1120
const ogTitle = metadata.title ? `${metadata.title} - SharpAPI Docs` : 'SharpAPI Docs'
1221
return {
1322
...metadata,
1423
alternates: {
1524
canonical: `https://docs.sharpapi.io${path}`,
25+
languages,
1626
},
1727
openGraph: {
1828
title: ogTitle,

0 commit comments

Comments
 (0)