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
+58 -1
View File
@@ -784,4 +784,61 @@ const jsonLd = buildFaqJsonLd(
WAŻNE: Q&A musi odpowiadać widocznej treści strony (Google flaguje rozbieżność).
Nie wymyślaj pytań, których nie ma na stronie.
Wszystkie: dane z panelu (company, bloki), jako `<script type="application/ld+json">`.
Wszystkie: dane z panelu (company, bloki), jako `<script type="application/ld+json">`.
## Wielojęzyczna strona główna — homeSlug per język (naprawione 1.2)
Gdy strona główna ma RÓŻNE slugi per język (pl: `strona-glowna`, de: `startseite`),
plugin obsługuje mapę homeSlug — każdy język zwija się do swojego roota (`/pl`,
`/de`), a hreflang wskazuje poprawnie (nie `/de/startseite`).
- **readSiteMetaConfig** czyta slug homepage per język (`locale: 'all'`) → mapa.
- **buildLocalizedPath** przyjmuje `homeSlug: string | Record<string, string>`.
- **hreflang** dostaje mapę → poprawne return tags (koniec błędu GSC „Missing
return tags”).
Działa automatycznie przez createPageMetadata. Warunek: strona główna musi mieć
slug wypełniony w KAŻDYM języku (panel, per locale).
## Sitemap wielojęzyczny — <url> per język (naprawione 1.2)
Sitemap emituje osobny `<url>` dla KAŻDEGO języka (nie tylko domyślnego). Zgodnie
z wymogiem Google: każda wersja językowa = osobny `<loc>` + alternates. GSC liczy
teraz wszystkie wersje (8×3 = 24, nie 8). Działa automatycznie w buildSitemapEntries.
## Aliasy strony głównej — 301 zamiast 200 (do wpięcia w projekcie)
PROBLEM: `/pl/strona-glowna` (pełny slug home) zwraca 200, tak jak `/pl` (root).
Google widzi duplikat („Duplikat bez URL kanonicznego”).
ROZWIĄZANIE (projekt): w page.tsx, jeśli slug odpowiada slugowi strony głównej
w danym języku, zrób redirect 301 na root:
```ts
// page.tsx — po resolveRoute
const homeSlugForLocale = /* slug home w tym języku, z settings */
if (slug?.length === 1 && slug[0] === homeSlugForLocale) {
redirect(`/${locale}`) // 301 do roota, nie serwuj duplikatu
}
```
Plugin nie robi tego automatycznie (redirect to decyzja projektu — Next redirect
w page.tsx). Ale warto wpiąć, żeby nie mieć duplikatów w GSC. Alternatywnie:
canonical strony `/pl/strona-glowna` wskazujący na `/pl` (mniej czyste niż 301).
## Article/BlogPosting JSON-LD (blog)
Dla wpisów blogowych — buildArticleJsonLd generuje Article/BlogPosting rich
results (headline, data, autor, obraz):
```ts
import { buildArticleJsonLd } from '@intecion/ipal-kit'
const jsonLd = buildArticleJsonLd({
headline: post.title, url: postUrl, description: post.excerpt,
image: post.coverImage, datePublished: post.publishedAt,
author: post.author, publisherName: settings.siteName,
publisherLogo: settings.logo, type: 'BlogPosting',
})
```
Dane z dokumentu/panelu. Google wymaga headline + dat dla rich result.