Panduan praktis: bangun direktori bandara terinternasionalisasi di Profound CMS โ satu rute parametrik yang merender halaman untuk setiap bandara, dalam 35 bahasa.
Bangun direktori bandara nyata yang terinternasionalisasi di Profound CMS: satu pola URL yang merender halaman untuk setiap bandara, dalam 35 bahasa. Anda menulis kode Next.js dan menyusun struktur CMS secara manual; Claude Code (melalui Profound MCP) menangani tiga tugas โ menghasilkan data bandara, memasang sistem desain, dan menghasilkan empat komponen React. Terdiri dari tiga bagian: Penyiapan, Pembangunan, Produksi.
/{language}/{airport_code}.cms-renderer.curl -fsSL https://bun.sh/install | bashgh) yang sudah masuk, dan akun Vercel yang ditautkan ke GitHub.language) tersedia bawaan.cms-renderer dengan kunci API tier baca.Hasil akhir: ~50 bandara di CMS, aplikasi terhubung untuk membacanya, dan sistem desain terpasang.
Daftar di Profound (autentikasi WorkOS) dan buat situs web bernama airports. Salin dua hal: ID situs web (UUID di URL admin) dan kunci API tier baca dari Deployments โ Create API key. Aplikasi hanya membaca, jadi kunci baca sudah cukup.
bunx create-profound-next airports
cd airports
Tambahkan kredensial Anda ke .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
Jalankan bun dev dan buka localhost:3000 untuk memastikan koneksi berhasil.
airportDi admin, buka Components โ Create new component dan beri nama airport. Tambahkan enam bidang: code, name, city, country (Text) dan latitude, longitude (Number). Tandai code sebagai bidang Route Slug dan setel status ke Active. Biarkan setiap bidang opsional; jangan tambahkan tag UI Element.
Komponen airport โ enam bidang, dengan code ditetapkan sebagai Route Slug.
bun run generate-schemas
Perintah ini menulis airportSchema (Zod) dan Airport (tipe) ke generated/cms-schemas.ts, dan memastikan kredensial Anda berfungsi.
Hubungkan MCP dan lakukan autentikasi:
claude mcp add --transport http Profound http://107.21.107.99:8081/mcp
Server melakukan autentikasi melalui OAuth (WorkOS). Di Claude Code, jalankan /mcp, pilih Profound, dan selesaikan proses masuk di browser Anda โ Claude Code juga akan meminta otomatis saat pertama kali alat Profound dipanggil. Setelah /mcp menampilkan Profound sebagai connected, minta Claude:
Hasilkan lima puluh bandara asli โ kode IATA, nama, kota, negara, dan koordinat yang benar. Simpan sebagai JSON di folder
data, validasi terhadap komponen airport kami, lalu buat masing-masing sebagai dokumen terbit melalui Profound MCP secara paralel.
Buka airport โ Variants untuk memastikan ada ~50 bandara berstatus published. Aplikasi membaca dengan kunci API; MCP menulis dengan sesi WorkOS-nya sendiri.
Sekitar 50 bandara, diisi sebagai varian berstatus published.
Kerangka awal dikirim tanpa gaya. Letakkan DESIGN.md (blok Tailwind v4 @theme plus token) di root proyek โ bisa buatan Anda sendiri, atau unduh dari refero.design. Lalu minta Claude:
Baca DESIGN.md. Siapkan Tailwind v4 dan hubungkan tema serta fontnya. Gunakan
next/fontuntuk font, bukan impor Google saat runtime. Hanya styling โ belum ada halaman atau komponen.
Pastikan src/app/globals.css memiliki @import "tailwindcss"; plus blok @theme, dan localhost:3000 menampilkan tokennya.
Bangun lapisan rendering: elemen UI, komponen React, rute, binding CEL, dan terjemahan.
Di admin, Create new component empat kali (tanpa Route Slug). Untuk masing-masing, tambahkan bidang dengan tipe Text kecuali yang disebutkan, setel status ke Active, dan tambahkan tag UI Element di Settings โ Tags:
nav โ brandheadline โ title, subtitlebody โ code, city, country, latitude (Number), longitude (Number)footer โ textbody.latitude dan body.longitude harus berupa Number agar sesuai dengan komponen bandara.
Setiap elemen UI adalah komponen tersendiri โ ini body, berstatus Active dengan tag UI Element.
Keempat elemen UI berdampingan dengan komponen airport.
bun run generate-schemas
Minta Claude:
Bangun empat komponen React โ nav, headline, body, footer โ di
components/. Masing-masing menerima satu propcontentyang diketik sebagaiBlockComponentProps<T>daricms-renderer/lib/types, di manaTadalah tipe elemen yang dihasilkan, dan membaca bidangnya daricontent. Daftarkan semuanya di registry rute catch-all sesuai nama komponen. Gaya menggunakan sistem desain kita, namun sebagai komponen kita sendiri โ jangan menyalin tata letak situs sumber. Nav: brand di kiri. Headline: nama bandara dengan subtitlecode ยท city, country. Body: panel detail berisi code, city, country, dan koordinat. Footer: satu baris statis. Hanya tata letak dan styling.
Claude membuat keempat komponen dan mengisi registry di src/app/[...slug]/page.tsx:
const registry = { nav: Nav, headline: Headline, body: Body, footer: Footer };
Dua aturan: tiap komponen membaca bidang dari content (bukan sebagai prop terpisah), dan kunci registry harus persis sama dengan nama komponen di CMS โ jika tidak cocok, akan kosong.
Di admin, buka Pages โ Create page dan atur pola /{airport_code}. Di Dynamic Segment Mappings, petakan airport_code โ komponen airport, bidang slug code. Simpan โ Anda akan masuk ke Page Builder. Pastikan /JFK dapat diakses.
Menambahkan elemen UI ke halaman dari tab Custom.
Keempat elemen UI ditambahkan ke binding JFK di Page Builder.
Pilih binding JFK โ Add UI Element โ tab Custom โ tambahkan nav, headline, body, footer secara berurutan. Profound menyebarkan set tersebut ke setiap binding bandara.
Isi setiap bidang. Nilai statis (nav brand, footer text): ketik langsung. Nilai dinamis: ubah ke mode dinamis dan tulis CEL. Referensi bersama adalah documents.get("airport", meta.params.airport_code).
| Bidang | Nilai CEL |
|---|---|
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 (dan .longitude) |
nav.brand, footer.text | string statis |
Publish halaman tersebut (pojok kanan atas).
Buka localhost:3000/JFK, lalu /SFO, /LAX โ template sama, konten bandara berbeda.
Halaman selesai menampilkan data JFK dalam bahasa Inggris.
Terjemahkan komponennya terlebih dahulu. Di admin, buka setiap komponen (komponen apa pun โ tidak harus elemen UI) dan klik Translate โ Submit. Profound menerjemahkan kontennya ke 35 bahasa sekaligus, termasuk nilai bidang statis. Lakukan ini sebelum Anda mengedit rute atau menyentuh CEL.
Translate โ Submit mengirim komponen ke 35 bahasa sekaligus.
Tambahkan dimensi bahasa. Di Pages, ubah pola menjadi /{language}/{airport_code}. Tambahkan Dynamic Segment Mapping untuk language โ komponen Sistem language, bidang slug code. Simpan dan pastikan /en/JFK dapat diakses.
Menambahkan segmen {language} ke rute.
Arahkan setiap bidang yang bisa diterjemahkan ke fetch terjemahan. Menginternasionalisasi halaman berarti mengganti setiap bidang yang bergantung bahasa โ bukan hanya headline โ dari documents.get(...) ke documents.translated("airport", meta.params.airport_code, meta.params.language):
| Bidang | CEL Terjemahan |
|---|---|
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 (dan .country) |
Biarkan IATA code dan koordinat tetap menggunakan documents.get โ nilainya sama di setiap bahasa. nav.brand dan footer.text sudah tercakup oleh fitur Translate di langkah 1.
Setelah semuanya selesai, /fr/SFO, /de/SFO, dll. tampil sepenuhnya dalam bahasa masing-masing.
Push ke GitHub:
git init
git add -A
git commit -m "Airport directory"
gh repo create airports --public --source=. --push
Impor ke Vercel: Add New โ Project โ impor repositori airports. Tambahkan variabel environment โ PROFOUND_API_KEY, NEXT_PUBLIC_PROFOUND_WEBSITE_ID, NEXT_PUBLIC_CMS_API_URL, dan opsional NEXT_PUBLIC_BUNNY_CDN_URL โ lalu Deploy. Kunjungi /en/JFK dan /fr/SFO. Setiap git push berikutnya akan redeploy.
Keduanya sudah tersedia dalam kerangka.
<Refresher> di layout.tsx memperbarui halaman yang sedang Anda pratinjau ketika Anda mengedit dan menyimpan di admin โ tanpa redeploy.?edit_mode=true ke URL apa pun (mis. โฆ/en/JFK?edit_mode=true) untuk menampilkan overlay penyuntingan. Pengunjung publik tetap melihat halaman bersih.?edit_mode=true menampilkan overlay editor di halaman live.
Lima puluh bandara, 35 bahasa, live โ dijelaskan sekali dan diisi oleh data: satu rute, empat komponen React, dan beberapa binding CEL. CMS menampung kontennya, kode Anda merendernya, dan CEL menghubungkannya.