En praktisk genomgĂ„ng: bygg en internationaliserad flygplatskatalog i Profound CMS â en parametrisk rutt som renderar en sida för varje flygplats, pĂ„ 35 sprĂ„k.
Bygg en verklig, internationaliserad flygplatskatalog i Profound CMS: en URL-struktur som renderar en sida för varje flygplats, pĂ„ 35 sprĂ„k. Du skriver Next.js-koden och bygger CMS-strukturen för hand; Claude Code (via Profound MCP) hanterar tre uppgifter â att generera flygplatsdatan, koppla in ett designsystem och generera de fyra React-komponenterna. Tre delar: Installation, Bygg, Produktion.
Titta pÄ den fullstÀndiga videoguiden.
/{language}/{airport_code}.cms-renderer.curl -fsSL https://bun.sh/install | bashgh) inloggad och ett Vercel-konto lÀnkat till GitHub.language) skickas med frÄn början.cms-renderer med en API-nyckel i lÀsnivÄn.SlutmÄl: ~50 flygplatser i CMS:et, appen kopplad för att lÀsa dem och designsystemet pÄ plats.
Registrera dig pĂ„ Profound (WorkOS-autentisering) och skapa en webbplats som heter airports. Kopiera tvĂ„ saker: webbplats-ID:t (UUID:t i admin-URL:en) och en API-nyckel i lĂ€snivĂ„ frĂ„n Deployments â Create API key. Appen lĂ€ser bara, sĂ„ en lĂ€snyckel rĂ€cker.
bunx create-profound-next airports
cd airports
LĂ€gg till dina autentiseringsuppgifter i .env.local:
PROFOUND_API_KEY=<your read key>
NEXT_PUBLIC_PROFOUND_WEBSITE_ID=<your website id>
NEXT_PUBLIC_CMS_API_URL=https://cms.dev.tryprofound.com
NEXT_PUBLIC_BUNNY_CDN_URL=https://cms-profound.b-cdn.net
Kör bun dev och öppna localhost:3000 för att bekrÀfta att den kopplar upp.
airportGĂ„ i admin till Components â Create new component och namnge den airport. LĂ€gg till sex fĂ€lt: code, name, city, country (Text) samt latitude, longitude (Number). Markera code som fĂ€ltet Route Slug och sĂ€tt status till Active. LĂ€mna alla fĂ€lt valfria; lĂ€gg inte till nĂ„gon UI Element-tagg.
Komponenten airport â sex fĂ€lt dĂ€r code Ă€r satt som Route Slug.
bun run generate-schemas
Detta skriver airportSchema (Zod) och Airport (typ) till generated/cms-schemas.ts och bekrÀftar att dina autentiseringsuppgifter fungerar.
Anslut MCP:t och autentisera:
claude mcp add --transport http Profound http://107.21.107.99:8081/mcp
Servern autentiserar via OAuth (WorkOS). I Claude Code kör du /mcp, vĂ€lj Profound och slutför inloggningen i webblĂ€saren â Claude Code uppmanar dig Ă€ven automatiskt första gĂ„ngen ett Profound-verktyg anropas. NĂ€r /mcp visar Profound som connected, uppmana Claude:
Generera femtio verkliga flygplatser â korrekta IATA-koder, namn, stĂ€der, lĂ€nder och koordinater. Spara dem som JSON i en
data-mapp, validera mot vÄr airport-komponent och skapa sedan varje som ett publicerat dokument via Profound MCP, parallellt.
Ăppna airport â Variants för att bekrĂ€fta att cirka 50 publicerade flygplatser finns. Appen lĂ€ser med API-nyckeln; MCP:t skriver med sin egen WorkOS-session.
Runt 50 flygplatser, insÄdda som publicerade varianter.
Grundstrukturen levereras ostylad. LĂ€gg ett DESIGN.md (ett Tailwind v4-@theme-block plus tokens) i projektroten â ditt eget eller ladda ner ett frĂ„n refero.design. Uppmana sedan Claude:
LÀs DESIGN.md. Konfigurera Tailwind v4 och koppla in temat och typsnitten. AnvÀnd
next/fontför typsnitten, inte en Google-import i runtime. Endast styling â inga sidor eller komponenter Ă€nnu.
BekrÀfta att src/app/globals.css har @import "tailwindcss"; plus @theme-blocket och att localhost:3000 visar tokenserna.
Bygg renderingslagret: UI-elementen, React-komponenterna, rutten, CEL-bindningarna och översÀttningen.
I admin, Create new component fyra gĂ„nger (ingen Route Slug). För varje, lĂ€gg till fĂ€lten som Text om inget annat anges, sĂ€tt status till Active och lĂ€gg till taggen UI Element i Settings â Tags:
nav â brandheadline â title, subtitlebody â code, city, country, latitude (Number), longitude (Number)footer â textbody.latitude och body.longitude mĂ„ste vara Number för att matcha komponenten airport.
Varje UI-element Ă€r en egen komponent â hĂ€r body, satt till Active med taggen UI Element.
Alla fyra UI-elementen tillsammans med komponenten airport.
bun run generate-schemas
Uppmana Claude:
Bygg fyra React-komponenter â nav, headline, body, footer â i
components/. Varje komponent tar en endacontent-prop typad somBlockComponentProps<T>frĂ„ncms-renderer/lib/types, dĂ€rTĂ€r elementets genererade typ, och lĂ€ser sina fĂ€lt frĂ„ncontent. Registrera alla fyra i fĂ„ng-allt-ruttens register med komponentnamnet. Styla dem med vĂ„rt designsystem, men som vĂ„ra egna komponenter â kopiera inte kĂ€llsidans layout. Nav: varumĂ€rke till vĂ€nster. Headline: flygplatsnamn med en undertitelcode · city, country. Body: informationspanel med code, city, country och koordinater. Footer: en statisk rad. Endast layout och styling.
Claude skapar de fyra komponenterna och fyller registret i src/app/[...slug]/page.tsx:
const registry = { nav: Nav, headline: Headline, body: Body, footer: Footer };
TvĂ„ regler: varje komponent lĂ€ser sina fĂ€lt frĂ„n content (inte som separata props), och registry-nycklarna mĂ„ste matcha CMS-komponenternas namn exakt â annars renderas inget.
GĂ„ i admin till Pages â Create page och sĂ€tt mönstret /{airport_code}. Under Dynamic Segment Mappings, mappa airport_code â komponenten airport, slug-fĂ€lt code. Spara â du hamnar i Page Builder. Kontrollera att /JFK fungerar.
LÀgga till ett UI-element pÄ sidan frÄn fliken Custom.
De fyra UI-elementen tillagda i bindningen för JFK i Page Builder.
VĂ€lj bindningen JFK â Add UI Element â fliken Custom â lĂ€gg till nav, headline, body, footer i ordning. Profound sprider uppsĂ€ttningen till varje flygplatsbindning.
Fyll varje fÀlt. Statisk text (nav-brand, footer-text): skriv dem direkt. Dynamiska vÀrden: vÀxla till dynamiskt lÀge och skriv CEL. Den delade uppslagsnyckeln Àr documents.get("airport", meta.params.airport_code).
| FÀlt | CEL-vÀrde |
|---|---|
headline.title | documents.get("airport", meta.params.airport_code).name |
headline.subtitle | documents.get("airport", meta.params.airport_code).code + " · " + documents.get("airport", meta.params.airport_code).city + ", " + documents.get("airport", meta.params.airport_code).country |
body.code / body.city / body.country | documents.get("airport", meta.params.airport_code).<field> |
body.latitude / body.longitude | documents.get("airport", meta.params.airport_code).latitude (och .longitude) |
nav.brand, footer.text | statiska strÀngar |
Publicera sidan (uppe till höger).
Ăppna localhost:3000/JFK, sedan /SFO, /LAX â samma mall, olika flygplats.
Den fÀrdiga sidan som renderar JFK:s data, pÄ engelska.
ĂversĂ€tt komponenterna först. I admin, öppna varje komponent (vilken som helst â det behöver inte vara ett UI-element) och klicka Translate â Submit. Profound översĂ€tter dess innehĂ„ll till alla 35 sprĂ„k pĂ„ en gĂ„ng, inklusive statiska fĂ€ltvĂ€rden. Gör detta innan du redigerar rutten eller rör nĂ„gon CEL.
Translate â Submit skickar en komponent till alla 35 sprĂ„k samtidigt.
LĂ€gg till sprĂ„kdimensionen. Under Pages Ă€ndrar du mönstret till /{language}/{airport_code}. LĂ€gg till en Dynamic Segment Mapping för language â den inbyggda systemkomponenten language, slug-fĂ€lt code. Spara och kontrollera att /en/JFK fungerar.
LĂ€gga till segmentet {language} i rutten.
Peka varje översĂ€ttningsbart fĂ€lt mot den översatta hĂ€mtningen. Internationalisering av sidan innebĂ€r att alla sprĂ„kbundna fĂ€lt â inte bara rubriken â byts frĂ„n documents.get(...) till documents.translated("airport", meta.params.airport_code, meta.params.language):
| FĂ€lt | Ăversatt CEL |
|---|---|
headline.title | documents.translated("airport", meta.params.airport_code, meta.params.language).name |
headline.subtitle | documents.get("airport", meta.params.airport_code).code + " · " + documents.translated("airport", meta.params.airport_code, meta.params.language).city + ", " + documents.translated("airport", meta.params.airport_code, meta.params.language).country |
body.city / body.country | documents.translated("airport", meta.params.airport_code, meta.params.language).city (och .country) |
LĂ€mna IATA-code och koordinaterna pĂ„ documents.get â de Ă€r identiska pĂ„ varje sprĂ„k. nav.brand och footer.text tĂ€cks redan av komponentöversĂ€ttningen i steg 1.
NÀr alla tre stegen Àr klara fungerar /fr/SFO, /de/SFO osv. fullt översatta.
Push till GitHub:
git init
git add -A
git commit -m "Airport directory"
gh repo create airports --public --source=. --push
Importera till Vercel: Add New â Project â importera airports-repot. LĂ€gg till miljövariablerna â PROFOUND_API_KEY, NEXT_PUBLIC_PROFOUND_WEBSITE_ID, NEXT_PUBLIC_CMS_API_URL och valfritt NEXT_PUBLIC_BUNNY_CDN_URL â och Deploy. Besök /en/JFK och /fr/SFO. Varje framtida git push gör en ny distribution.
BÄda följer med grundstrukturen.
<Refresher> i layout.tsx uppdaterar sidan du förhandsgranskar nĂ€r du redigerar och sparar i admin â ingen ny distribution behövs.?edit_mode=true pĂ„ valfri URL (t.ex. âŠ/en/JFK?edit_mode=true) för redigeringsöverlĂ€gg. Publika besökare ser fortfarande den rena sidan.?edit_mode=true lĂ€gger över redigeraren pĂ„ livesidan.
Femtio flygplatser, 35 sprĂ„k, live â beskrivet en gĂ„ng och fyllt av data: en rutt, fyra React-komponenter och ett fĂ„tal CEL-bindningar. CMS:et hĂ„ller innehĂ„llet, din kod renderar det och CEL kopplar ihop dem.