De uitdaging
De meeste meertalige sites maken een van drie fouten: duplicate content-meldingen door ontbrekende hreflang-tags, verweesd pagina's door onvolledige reciproque links, of schema dat taal volledig negeert. Wishfy had een viertalige site nodig (Engels, Nederlands, Duits, Frans) die alle drie vanaf dag één goed deed — niet als retrofit, maar als kernarchitectuurbeslissing.
De beperking: één domein (`wishfy.ai`), geen subdomeinen, geen landcode-TLD's. Alles leeft onder subdirectories: `/en/`, `/nl/`, `/de/`, `/fr/`.
Subdirectory-strategie
Subdirectories verslaan subdomeinen voor meertalige SEO wanneer je domeinautoriteit vanaf nul opbouwt. Alle linkwaarde stroomt naar één domein. Al het crawlbudget blijft in één property. Google Search Console toont één geïntegreerd overzicht.
De routeringslaag gebruikt Astro's `[lang]` dynamische parameter. Elke pagina-route begint met `[lang]/` — services, work, blog, legal. De root `/` redirectt naar de standaard locale (`/en/`). Geen content leeft buiten een taal-subdirectory.
hreflang-implementatie
Elke pagina zendt een complete set hreflang `<link>` tags uit in de `<head>` — één voor elke taal waarin de pagina bestaat, plus een `x-default` die naar de Engelse versie wijst. De implementatie gebruikt de `translationKey` van elke content-entry om tegenhangers in andere locales te vinden.
Reciprociteit wordt afgedwongen tijdens de build: als `/en/services/seo` een Nederlands alternatief declareert, moet `/nl/services/seo` het Engelse alternatief terug declareren. Gebroken reciprociteit is de nummer-één hreflang-foutmodus, en we vangen het voor deployment.
De hreflang-tags gebruiken volledige URL's met het canonieke domein — `https://wishfy.ai/nl/services/seo`, geen relatieve paden. Google's documentatie is expliciet: hreflang-waarden moeten volledig gekwalificeerd zijn.
Per-taal sitemaps
De site genereert vijf sitemaps: één per taal (`sitemap-en.xml`, `sitemap-nl.xml`, `sitemap-de.xml`, `sitemap-fr.xml`) plus een sitemap-index (`sitemap-index.xml`) die alle vier referenceert. Elke taalsitemap bevat alleen URL's voor die locale, met `<xhtml:link>` alternates die naar de andere taalversies wijzen.
Deze structuur geeft zoekmachines een helder signaal: hier zijn alle Engelse pagina's, hier zijn alle Nederlandse pagina's, en zo verhouden ze zich. Geen ambiguïteit, geen mixed-language sitemap-ruis.
Content collection-architectuur
Content leeft in locale-prefixed directories binnen Astro's content collections: `services/en/seo.mdx`, `services/nl/seo.mdx`. Elke entry heeft een `locale` veld en een `translationKey` die vertalingen koppelt. Het schema dwingt dit af op typeniveau — je kunt geen content-entry aanmaken zonder de taal te declareren.
Deze architectuur betekent dat content-queries altijd locale-aware zijn. De services-index voor Nederlands toont alleen Nederlandse entries. De blog voor Duits toont alleen Duitse posts. Er is geen runtime filtering-giswerk — het datamodel maakt het onmogelijk om per ongeluk talen te mixen.
Schema inLanguage-dekking
Elk JSON-LD schema-blok op de site bevat een `inLanguage` property afgestemd op de pagina-locale. Het Organization-schema op `/de/` declareert `"inLanguage": "de"`. Het Service-schema op `/fr/services/geo` declareert `"inLanguage": "fr"`. Dit vertelt zowel zoekmachines als LLM's precies tot welke taalcontext elk gestructureerd datablok behoort.
Het resultaat
Vier talen. Eén domein. Nul duplicate content-meldingen in Google Search Console. 100% hreflang-reciprociteit geverifieerd tijdens de build. Per-taal sitemaps met correcte alternate-annotaties. Schema dat weet welke taal het spreekt. Dit is hoe meertalige SEO-architectuur eruitziet wanneer het in de fundering is gebouwd in plaats van achteraf vastgeschroefd.