دليل عملي: ابنِ دليل مطارات معولمًا على Profound CMS — مسار براميتري واحد يعرض صفحة لكل مطار، بـ 35 لغة.
أنشئ دليل مطارات حقيقيًا ومعولمًا على Profound CMS: نمط عنوان URL واحد يعرض صفحة لكل مطار، بـ 35 لغة. أنت تكتب شيفرة Next.js وتبني بنية نظام إدارة المحتوى يدويًا؛ يتولى Claude Code (عبر Profound MCP) ثلاث مهام — توليد بيانات المطارات، ربط نظام التصميم، وتوليد مكونات React الأربعة. ثلاثة أجزاء: الإعداد، البناء، الإنتاج.
/{language}/{airport_code}.cms-renderer.curl -fsSL https://bun.sh/install | bashgh) بتسجيل دخول، وحساب Vercel مرتبط بـ GitHub.language) تأتي مدمجة مسبقًا.cms-renderer باستخدام مفتاح واجهة برمجة التطبيقات للقراءة.الحالة النهائية: حوالي 50 مطارًا في CMS، التطبيق موصول لقراءتها، ونظام التصميم في مكانه.
سجل في Profound (مصادقة WorkOS) وأنشئ موقعًا باسم airports. انسخ شيئين: معرّف الموقع (UUID في عنوان URL للإدارة) ومفتاح API لطبقة القراءة من Deployments → Create API key. التطبيق يقرأ فقط، لذا مفتاح القراءة يكفي.
bunx create-profound-next airports
cd airports
أضف بيانات الاعتماد إلى .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
شغّل bun dev وافتح localhost:3000 للتأكد من الاتصال.
airportفي لوحة الإدارة، انتقل إلى Components → Create new component وسمّه airport. أضف ستة حقول: code، name، city، country (نص) وlatitude، longitude (رقم). وسم الحقل code كحقل Route Slug واضبط الحالة على Active. اترك كل الحقول اختيارية؛ لا تضف وسم عنصر واجهة.
مكون airport — ستة حقول، مع تعيين code كحقل Route Slug.
bun run generate-schemas
يكتب هذا airportSchema (Zod) وAirport (نوع) في generated/cms-schemas.ts، ويؤكد صلاحية بيانات اعتمادك.
وصّل MCP وصدّق:
claude mcp add --transport http Profound http://107.21.107.99:8081/mcp
يُجري الخادم المصادقة عبر OAuth (WorkOS). في Claude Code، شغّل /mcp، اختر Profound، وأكمل تسجيل الدخول في المتصفح — سيطالبك Claude Code تلقائيًا أول مرة يُستدعى فيها أداة Profound. بمجرد أن يُظهر /mcp أن Profound متصل، وجّه طلبًا إلى Claude:
أنشئ خمسين مطارًا حقيقيًا — رموز IATA الصحيحة، الأسماء، المدن، البلدان، والإحداثيات. احفظها كـ JSON في مجلد
data، تحقق منها مقابل مكون airport، ثم أنشئ كل واحدة كوثيقة منشورة عبر Profound MCP، بالتوازي.
افتح airport → Variants للتأكد من وجود حوالي 50 مطارًا منشورًا. التطبيق يقرأ عبر مفتاح API؛ MCP يكتب عبر جلسة WorkOS الخاصة به.
حوالي 50 مطارًا، تمت زراعتها كمتغيرات منشورة.
يأتي الهيكل الأساسي بدون تنسيق. ضع ملف DESIGN.md (كتلة @theme لـ Tailwind v4 بالإضافة إلى التوكنات) في جذر المشروع — يمكنك إنشاء واحد بنفسك، أو تنزيله من refero.design. ثم وجّه طلبًا إلى Claude:
اقرأ DESIGN.md. اضبط Tailwind v4 ووصل السمة والخطوط. استخدم
next/fontللخطوط، وليس استيراد Google وقت التشغيل. تنسيق فقط — لا صفحات ولا مكونات بعد.
تأكد من أن src/app/globals.css يحتوي على @import "tailwindcss"; بالإضافة إلى كتلة @theme، وأن localhost:3000 يُظهر التوكنات.
ابنِ طبقة العرض: عناصر الواجهة، مكونات React، المسار، ربط CEL، والترجمة.
في لوحة الإدارة، أنشئ مكونًا جديدًا أربع مرات (بدون Route Slug). لكل واحد، أضف الحقول كـ نص ما لم يُذكر خلاف ذلك، واضبط الحالة على Active، وأضف وسم UI Element في Settings → Tags:
nav → brandheadline → title, subtitlebody → code, city, country, latitude (رقم), longitude (رقم)footer → textيجب أن يكون body.latitude وbody.longitude من نوع رقم ليتطابقا مع مكون المطار.
كل عنصر واجهة مستخدم هو مكون منفصل — هنا body، مضبوط على Active مع وسم UI Element.
جميع عناصر الواجهة الأربعة إلى جانب مكون airport.
bun run generate-schemas
وجّه طلبًا إلى Claude:
أنشئ أربعة مكونات React — nav، headline، body، footer — داخل
components/. كل منها يستقبل خاصيةcontentواحدة من نوعBlockComponentProps<T>منcms-renderer/lib/types، حيثTهو النوع المُولد للعنصر، ويقرأ حقوله منcontent. سجّل المكونات الأربعة في سجل المسار الجامع باسم المكون. نسّقها باستخدام نظام التصميم لدينا، ولكن كمكوناتنا الخاصة — لا تنسخ تخطيط الموقع المصدر. شريط التصفح: العلامة التجارية على اليسار. العنوان الرئيسي: اسم المطار مع سطر فرعيcode · city, country. المتن: لوحة تفاصيل تحتوي على الرمز، المدينة، البلد، والإحداثيات. التذييل: سطر ثابت واحد. تخطيط وتنسيق فقط.
يُنشئ Claude المكونات الأربعة ويملأ السجل في src/app/[...slug]/page.tsx:
const registry = { nav: Nav, headline: Headline, body: Body, footer: Footer };
قاعدتان: يقرأ كل مكون حقوله من content (ليس كخصائص منفصلة)، ويجب أن تتطابق مفاتيح السجل مع أسماء مكونات CMS تمامًا — أي عدم تطابق سيجعل العرض فارغًا.
في لوحة الإدارة، اذهب إلى Pages → Create page واضبط النمط على /{airport_code}. ضمن Dynamic Segment Mappings، اربط airport_code → مكون airport, وحقل slug هو code. احفظ — ستنتقل إلى Page Builder. تأكد من أن /JFK يعمل.
إضافة عنصر واجهة إلى الصفحة من علامة التبويب Custom.
عناصر الواجهة الأربعة مضافة إلى ربط JFK في Page Builder.
اختر ربط JFK → Add UI Element → علامة التبويب Custom → أضف nav، headline، body، footer بالترتيب. يقوم Profound بنسخ المجموعة إلى كل ربط مطار.
املأ كل حقل. القيم الثابتة (علامة شريط التصفح، نص التذييل): اكتبها مباشرة. القيم الديناميكية: انتقل إلى الوضع الديناميكي واكتب CEL. الاستعلام المشترك هو documents.get("airport", meta.params.airport_code).
| الحقل | قيمة 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 (و.longitude) |
nav.brand, footer.text | سلاسل ثابتة |
انشر الصفحة (أعلى اليمين).
افتح localhost:3000/JFK، ثم /SFO، /LAX — نفس القالب، ولكن مطار مختلف.
الصفحة النهائية تعرض بيانات JFK، بالإنجليزية.
ترجم المكونات أولًا. في لوحة الإدارة، افتح كل مكون (أي مكون — لا يلزم أن يكون عنصر واجهة) وانقر Translate → Submit. يترجم Profound المحتوى إلى جميع اللغات الـ35 دفعة واحدة، بما في ذلك القيم الثابتة. افعل ذلك قبل تعديل المسار أو لمس أي CEL.
Translate → Submit يرسل المكون إلى جميع اللغات الـ35 دفعة واحدة.
أضف بُعد اللغة. في Pages، غيّر النمط إلى /{language}/{airport_code}. أضف Dynamic Segment Mapping لـ language → مكون النظام المدمج language، حقل slug هو code. احفظ وتأكد من أن /en/JFK يعمل.
إضافة المقطع {language} إلى المسار.
وجّه كل حقل قابل للترجمة إلى الجلب المترجم. تدويل الصفحة يعني تبديل كل حقل يعتمد على اللغة — ليس العنوان فقط — من documents.get(...) إلى documents.translated("airport", meta.params.airport_code, meta.params.language):
| الحقل | 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 (و.country) |
اترك رمز IATA والإحداثيات على documents.get — فهما متماثلان في كل اللغات. يتم تغطية nav.brand وfooter.text بالفعل عبر ترجمة المكون في الخطوة 1.
عند اكتمال الخطوات الثلاث، ستُعرض /fr/SFO، /de/SFO، وغيرها مترجمة بالكامل.
ادفع إلى GitHub:
git init
git add -A
git commit -m "Airport directory"
gh repo create airports --public --source=. --push
استورد إلى Vercel: Add New → Project → استورد مستودع airports. أضف متغيرات البيئة — PROFOUND_API_KEY، NEXT_PUBLIC_PROFOUND_WEBSITE_ID، NEXT_PUBLIC_CMS_API_URL، وبشكل اختياري NEXT_PUBLIC_BUNNY_CDN_URL — ثم Deploy. زر /en/JFK و/fr/SFO. كل git push لاحق يعيد النشر.
كلاهما يأتي مع الهيكل الأساسي.
<Refresher> في layout.tsx بتحديث الصفحة التي تعاينها عند التحرير والحفظ في لوحة الإدارة — بلا إعادة نشر.?edit_mode=true إلى أي عنوان URL (مثل …/en/JFK?edit_mode=true) للحصول على تراكبات التحرير. الزوار العموميون يرون الصفحة النظيفة.?edit_mode=true يُظهر تراكب المحرر على الصفحة الحية.
خمسون مطارًا، 35 لغة، في وضع عمل — موصوفة مرة واحدة ومملوءة بالبيانات: مسار واحد، أربعة مكونات React، وعدد قليل من روابط CEL. نظام إدارة المحتوى يحتفظ بالمحتوى، شيفرتك تعرضه، وCEL يربط بينهما.