1.1.0: R2 storage, media preconnect/normalization, favicon + SEO structured data, x-default hreflang

This commit is contained in:
2026-08-28 15:50:25 +02:00
parent 41630bb8c5
commit c41b75e364
25 changed files with 674 additions and 12 deletions
+21 -3
View File
@@ -1,6 +1,6 @@
import type { I18nConfig, LocalizedSlugs } from '../i18n/index.js'
import { buildLocalizedPath, getLocaleCodes } from '../i18n/index.js'
import { buildLocalizedPath, getDefaultLocale, getLocaleCodes } from '../i18n/index.js'
type BuildHreflangArgs = {
/** Absolute site origin, e.g. 'https://example.com'. Omit for relative paths. */
@@ -19,20 +19,28 @@ type BuildHreflangArgs = {
}
/**
* Builds a map of locale → URL for hreflang alternate links, suitable for
* Next.js Metadata `alternates.languages`.
*
* Bridges SEO and i18n: for each configured locale that the document has a
* slug in, it produces the locale-aware path (via buildLocalizedPath),
* optionally prefixed with an absolute origin.
*
* Also emits `x-default` pointing at the default locale — the version Google
* serves when the user's language/region matches no hreflang, and the fallback
* when the root ('/') redirect is ambiguous (Googlebot with no/foreign
* Accept-Language).
*
* @example
* buildHreflangAlternates({
* slugs: { pl: 'o-nas', en: 'about' },
* config,
* baseUrl: 'https://example.com',
* })
* // → { pl: 'https://example.com/pl/o-nas', en: 'https://example.com/en/about' }
* // → {
* // pl: 'https://example.com/pl/o-nas',
* // en: 'https://example.com/en/about',
* // 'x-default': 'https://example.com/pl/o-nas',
* // }
*/
export function buildHreflangAlternates({
baseUrl,
@@ -51,5 +59,15 @@ export function buildHreflangAlternates({
}
}
// x-default: the version Google serves when the user's language/region doesn't
// match any hreflang — and, crucially here, the fallback when the root ('/')
// redirect is ambiguous (Googlebot with no/foreign Accept-Language). Point it
// at the default locale (the primary market) so search shows that version by
// default instead of guessing. Only set when the default locale has a URL.
const defaultLocalePath = alternates[getDefaultLocale(config)]
if (defaultLocalePath) {
alternates['x-default'] = defaultLocalePath
}
return alternates
}