Fixed support for multi-langual slugs

This commit is contained in:
2026-09-09 09:56:47 +02:00
parent db2ac80a1e
commit 2ecfc2e12d
41 changed files with 646 additions and 212 deletions
+44 -5
View File
@@ -5,21 +5,60 @@
* whatever an editor set in the panel. Metadata generation shouldn't also know
* that the separator arrives unpadded, or that the home slug hides inside a
* relationship — it should receive a resolved config.
*/ export async function readSiteMetaConfig({ locale, payload, settingsSlug = 'site-settings', siteNameField = 'siteName' }) {
*/ export async function readSiteMetaConfig({ payload, locale, settingsSlug = 'site-settings', siteNameField = 'siteName' }) {
// depth 1 populates the homepage relationship, so its slug is available
// without a second query.
const settings = await payload.findGlobal({
slug: settingsSlug,
depth: 1,
locale: locale
locale: locale,
depth: 1
});
const homepage = settings.homepage && typeof settings.homepage === 'object' ? settings.homepage : null;
// Build the per-locale home slug map. The homepage's slug is localized, so a
// single-locale read only gives THIS language's slug. Re-read the homepage
// with locale:'all' to get every language's slug — needed so hreflang can
// collapse each language's home to its root.
let homeSlug;
if (homepage?.id) {
try {
const homeDoc = await payload.findByID({
collection: 'pages',
id: homepage.id,
locale: 'all',
depth: 0
});
const slugField = homeDoc.slug;
if (slugField && typeof slugField === 'object') {
const map = {};
for (const [loc, value] of Object.entries(slugField)){
if (typeof value === 'string') map[loc] = value;
}
if (Object.keys(map).length > 0) homeSlug = map;
} else if (typeof slugField === 'string') {
// Non-localized slug (same in every language) — key it by current locale;
// buildLocalizedPath tolerates a partial map. Non-localized homepage
// slugs are rare, so this branch is a safety net, not the norm.
homeSlug = {
[locale]: slugField
};
}
} catch {
// Fall back to the single-locale slug below.
}
}
// Fallback: if the 'all' read didn't yield a map, use the current locale's slug
// for at least this locale (better than nothing).
if (!homeSlug && typeof homepage?.slug === 'string') {
homeSlug = {
[locale]: homepage.slug
};
}
return {
siteName: settings[siteNameField] ?? null,
// The panel stores '|'; titles need it padded.
homeSlug: typeof homepage?.slug === 'string' ? homepage.slug : undefined,
separator: settings.titleSeparator ? ` ${settings.titleSeparator} ` : undefined,
order: settings.titleOrder ?? undefined,
separator: settings.titleSeparator ? ` ${settings.titleSeparator} ` : undefined
homeSlug
};
}