52 lines
2.0 KiB
JavaScript
52 lines
2.0 KiB
JavaScript
import { buildLocalizedPath, getDefaultLocale, getLocaleCodes } from '../i18n/index.js';
|
|
/**
|
|
* 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',
|
|
* // 'x-default': 'https://example.com/pl/o-nas',
|
|
* // }
|
|
*/ export function buildHreflangAlternates({ baseUrl, config, homeSlug = 'home', prefix, slugs }) {
|
|
const origin = baseUrl?.replace(/\/$/, '') ?? '';
|
|
const alternates = {};
|
|
for (const locale of getLocaleCodes(config)){
|
|
const path = buildLocalizedPath({
|
|
config,
|
|
homeSlug,
|
|
locale,
|
|
prefix,
|
|
slugs
|
|
});
|
|
if (path) {
|
|
alternates[locale] = `${origin}${path}`;
|
|
}
|
|
}
|
|
// 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;
|
|
}
|
|
|
|
//# sourceMappingURL=hreflang.js.map
|