En praktisk gennemgang: byg et internationaliseret lufthavnsregister pĂ„ Profound CMS â Ă©n parametrisk rute, der gengiver en side for hver lufthavn pĂ„ 35 sprog.
Byg et ĂŠgte, internationaliseret lufthavnsregister pĂ„ Profound CMS: Ă©t URL-mĂžnster, der gengiver en side for hver lufthavn pĂ„ 35 sprog. Du skriver Next.js-koden og bygger CMS-strukturen manuelt; Claude Code (via Profound MCP) hĂ„ndterer tre opgaver â generering af lufthavnsdata, tilslutning af et designsystem og generering af de fire React-komponenter. Tre dele: OpsĂŠtning, Byg, Produktion.
/{language}/{airport_code}.cms-renderer.curl -fsSL https://bun.sh/install | bashgh) med login samt en Vercel-konto forbundet til GitHub.language) fÞlger med som standard.cms-renderer-SDK'et med en API-nÞgle i lÊseniveau.Sluttilstand: ~50 lufthavne i CMS'et, appen koblet pÄ til at lÊse dem, og designsystemet pÄ plads.
Tilmeld dig hos Profound (WorkOS-login) og opret et website med navnet airports. KopiĂ©r to ting: website-ID'et (UUID'en i admin-URL'en) og en API-nĂžgle i lĂŠseniveau fra Deployments â Create API key. Appen lĂŠser kun, sĂ„ en lĂŠsenĂžgle er nok.
bunx create-profound-next airports
cd airports
TilfĂžj dine legitimationsoplysninger til .env.local:
PROFOUND_API_KEY=<din lĂŠsenĂžgle>
NEXT_PUBLIC_PROFOUND_WEBSITE_ID=<dit 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 og Äbn localhost:3000 for at bekrÊfte forbindelsen.
airport-komponentenGĂ„ i admin til Components â Create new component og navngiv den airport. TilfĂžj seks felter: code, name, city, country (Text) og latitude, longitude (Number). MarkĂ©r code som Route Slug-felt og sĂŠt status til Active. Lad alle felter vĂŠre valgfrie; tilfĂžj intet UI Element-tag.
airport-komponenten â seks felter, med code sat som Route Slug.
bun run generate-schemas
Dette skriver airportSchema (Zod) og Airport (type) til generated/cms-schemas.ts og bekrĂŠfter, at dine legitimationsoplysninger virker.
Tilslut MCP'en og autentificér:
claude mcp add --transport http Profound http://107.21.107.99:8081/mcp
Serveren autentificerer via OAuth (WorkOS). I Claude Code kĂžrer du /mcp, vĂŠlger Profound og fuldfĂžrer login i din browser â Claude Code beder dig ogsĂ„ automatisk, fĂžrste gang et Profound-vĂŠrktĂžj kaldes. NĂ„r /mcp viser Profound som connected, prompt Claude:
GenerĂ©r halvtreds rigtige lufthavne â korrekte IATA-koder, navne, byer, lande og koordinater. Gem dem som JSON i en
data-mappe, valider mod vores airport-komponent, og opret derefter hver som et publiceret dokument via Profound MCP, parallelt.
Ă bn airport â Variants for at bekrĂŠfte ~50 publicerede lufthavne. Appen lĂŠser med API-nĂžglen; MCP'en skriver med sin egen WorkOS-session.
Omkring 50 lufthavne seedet som publicerede varianter.
Scaffoldet leveres uden styling. PlacĂ©r en DESIGN.md (en Tailwind v4-@theme-blok plus tokens) i projektroden â din egen, eller download Ă©n fra refero.design. Prompt derefter Claude:
LĂŠs DESIGN.md. OpsĂŠt Tailwind v4 og tilslut temaet og skrifterne. Brug
next/fonttil skrifter, ikke et runtime-import fra Google. Kun styling â ingen sider eller komponenter endnu.
BekrĂŠft, at src/app/globals.css indeholder @import "tailwindcss"; plus @theme-blokken, og at localhost:3000 viser tokensene.
Byg rendringslaget: UI-elementerne, React-komponenterne, ruten, CEL-bindingerne og oversĂŠttelsen.
I admin: Create new component fire gange (ingen Route Slug). TilfĂžj felterne som Text, medmindre andet er angivet, sĂŠt status til Active, og tilfĂžj UI Element-tagget under Settings â Tags:
nav â brandheadline â title, subtitlebody â code, city, country, latitude (Number), longitude (Number)footer â textbody.latitude og body.longitude skal vĂŠre Number for at matche airport-komponenten.
Hvert UI-element er sin egen komponent â her body, sat til Active med UI Element-tagget.
Alle fire UI-elementer ved siden af airport-komponenten.
bun run generate-schemas
Prompt Claude:
Byg fire React-komponenter â nav, headline, body, footer â i
components/. Hver tager en enkeltcontent-prop typet somBlockComponentProps<T>fracms-renderer/lib/types, hvorTer elementets genererede type, og lĂŠser felterne fracontent. RegistrĂ©r alle fire i den catch-all-rutes registry efter komponentnavn. Style dem med vores designsystem, men som vores egne komponenter â kopier ikke kildewebsitets layout. Nav: brand til venstre. Headline: lufthavnens navn med encode · city, country-undertekst. Body: detaljepanel med kode, by, land og koordinater. Footer: Ă©n statisk linje. Kun layout og styling.
Claude opretter de fire komponenter og udfylder registry i src/app/[...slug]/page.tsx:
const registry = { nav: Nav, headline: Headline, body: Body, footer: Footer };
To regler: hver komponent lĂŠser sine felter fra content (ikke som separate props), og registry-nĂžgler skal matche CMS-komponentnavnene prĂŠcist â uoverensstemmelser gengiver intet.
I admin: gĂ„ til Pages â Create page og angiv mĂžnsteret /{airport_code}. Under Dynamic Segment Mappings, map airport_code â airport-komponenten, slug-felt code. Gem â du lander i Page Builder. VerificĂ©r, at /JFK virker.
TilfĂžjelse af et UI-element til siden fra fanen Custom.
De fire UI-elementer tilfĂžjet til JFK-bindingen i Page Builder.
VĂŠlg JFK-bindingen â Add UI Element â fanen Custom â tilfĂžj nav, headline, body, footer i nĂŠvnte rĂŠkkefĂžlge. Profound udbreder sĂŠttet til hver lufthavnsbinding.
Udfyld hvert felt. Statisk indhold (nav-brand, footer-tekst): skriv dem direkte. Dynamiske vĂŠrdier: skift til dynamisk og skriv CEL. Den fĂŠlles opslagning er documents.get("airport", meta.params.airport_code).
| Felt | CEL-vĂŠrdi |
|---|---|
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 (og .longitude) |
nav.brand, footer.text | statiske strenge |
Publicér siden (Þverst til hÞjre).
Ă
bn localhost:3000/JFK, derefter /SFO, /LAX â samme skabelon, forskellige lufthavne.
Den fÊrdige side gengiver JFK's data pÄ engelsk.
OversĂŠt komponenterne fĂžrst. I admin: Ă„bn hver komponent (enhver komponent â det behĂžver ikke vĂŠre et UI-element) og klik Translate â Submit. Profound oversĂŠtter indholdet til alle 35 sprog pĂ„ Ă©n gang, inklusive statiske feltvĂŠrdier. GĂžr dette fĂžr du redigerer ruten eller rĂžrer ved CEL.
Translate â Submit sender en komponent til alle 35 sprog pĂ„ Ă©n gang.
TilfĂžj sprogdimensionen. Under Pages ĂŠndres mĂžnsteret til /{language}/{airport_code}. TilfĂžj en Dynamic Segment Mapping for language â den indbyggede language-systemkomponent, slug-felt code. Gem og verificĂ©r, at /en/JFK virker.
TilfĂžjelse af {language}-segmentet til ruten.
Peg hvert oversĂŠttelige felt mod den oversatte fetch. Internationalisering betyder, at alle sprogspecifikke felter â ikke kun overskriften â skifter fra documents.get(...) til documents.translated("airport", meta.params.airport_code, meta.params.language):
| Felt | Oversat 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 (og .country) |
Lad IATA-code og koordinaterne blive pĂ„ documents.get â de er identiske pĂ„ alle sprog. nav.brand og footer.text er allerede dĂŠkket af komponentoversĂŠttelsen i trin 1.
NÄr alle tre trin er fÊrdige, fungerer /fr/SFO, /de/SFO osv. fuldt oversat.
Push til GitHub:
git init
git add -A
git commit -m "Lufthavnsregister"
gh repo create airports --public --source=. --push
ImportĂ©r til Vercel: Add New â Project â importĂ©r airports-repoet. TilfĂžj miljĂžvariablerne â PROFOUND_API_KEY, NEXT_PUBLIC_PROFOUND_WEBSITE_ID, NEXT_PUBLIC_CMS_API_URL og valgfrit NEXT_PUBLIC_BUNNY_CDN_URL â og Deploy. BesĂžg /en/JFK og /fr/SFO. Hver fremtidig git push udruller pĂ„ ny.
Begge fĂžlger med scaffoldet.
<Refresher> i layout.tsx opdaterer siden, du previewer, nĂ„r du redigerer og gemmer i admin â ingen ny deploy nĂždvendig.?edit_mode=true til enhver URL (fx âŠ/en/JFK?edit_mode=true) for redigeringsoverlays. Offentlige besĂžgende ser fortsat den rene side.?edit_mode=true lĂŠgger editoren oven pĂ„ den live side.
Halvtreds lufthavne, 35 sprog, live â beskrevet Ă©n gang og fyldt ud af data: Ă©n rute, fire React-komponenter og en hĂ„ndfuld CEL-bindinger. CMS'et holder indholdet, din kode gengiver det, og CEL forbinder dem.