میرا پہلا بلاگ

مسئلہ کا بیان:
پلیٹ فارم میں اس وقت کوئی کنٹینٹ مارکیٹنگ چینل موجود نہیں۔ بلاگ کی موجودگی سے ہر ٹیننٹ کو یہ سہولت ملے گی کہ وہ Strapi CMS میں لکھے گئے، SEO کے لحاظ سے بہتر بنائے گئے، کثیر لسانی مضامین شائع کر سکے جو SvelteKit ایپ میں رینڈر ہوں — اس طرح قدرتی (آرگینک) ٹریفک بڑھے گی، اتھارٹی قائم ہوگی، اور موجودہ 13 زبانوں پر مشتمل i18n پائپ لائن کو تقویت ملے گی۔
کامیابی کے معیارات
- Strapi میں لکھی گئی بلاگ پوسٹس فرنٹ اینڈ پر ٹیننٹ کی برانڈنگ کے ساتھ رینڈر ہوں
- پوسٹس موجودہ ویب ہُک پائپ لائن کے ذریعے بغیر کسی ترجمہ انفرا میں تبدیلی کے خودکار طور پر تمام 13 مقامی زبانوں میں ترجمہ ہو جائیں
- بلاگ صفحات سرچ انجنز میں رینک کریں (structured data، sitemap، hreflang، og:article)
- جن ٹیننٹس کے پاس
blogفیچر فلیگ نہیں ہے، وہ کسی بھی بلاگ روٹ پر 404 دیکھیں
User Stories
- بطور content author، میں Strapi میں رچ مارک ڈاؤن، تصاویر اور ویڈیو ایمبیڈز کے ساتھ بلاگ پوسٹس لکھ سکوں تاکہ کوڈ کو چھوئے بغیر مواد شائع کر سکوں۔
- بطور site visitor، میں بلاگ پوسٹس کو کیٹیگری کے لحاظ سے فلٹر کر کے براؤز کرنا چاہتا ہوں تاکہ مجھے اپنا متعلقہ مواد آسانی سے مل سکے۔
- بطور site visitor، میں چاہتا ہوں کہ لمبی پوسٹس پر ایک جدولِ مضامین (table of contents) ہو تاکہ میں تیزی سے نیویگیٹ کر سکوں۔
- بطور site visitor، میں چاہتا ہوں کہ میں پوسٹس اپنی زبان میں پڑھ سکوں، اور انگریزی سے خودکار ترجمہ موجود ہو۔
- بطور site visitor، میں پوسٹس کو سوشل میڈیا پر شیئر کرنا چاہتا ہوں۔
- بطور site visitor، میں متعلقہ پوسٹس دریافت کرنا اور مصنف کے بارے میں جاننا چاہتا ہوں۔
- بطور SEO manager، میں چاہتا ہوں کہ ہر پوسٹ کے ساتھ درست میٹا ٹیگز، structured data، اور sitemap اندراجات موجود ہوں۔
فَنکشنل ضروریات
لازمی فیچرز (MVP)
- Strapi content types:
blog-posts،blog-authors،blog-categories— سب میں tenant، locale، inherit فیلڈز ہوں - Blog listing page (
/blog) — پوسٹس کی paginated grid، category فلٹر query param کے ذریعے - Post detail page (
/blog/[slug]) — مکمل markdown rendering کے ساتھ ToC، author card، related posts، social share - Category page (
/blog/category/[slug]) — فلٹرڈ لسٹنگ جو وہی listing components دوبارہ استعمال کرے - Author page (
/blog/author/[slug]) — author bio + اس کی پوسٹس - Table of Contents (ToC) — h2/h3 headings سے خودکار جنریشن، ڈیسک ٹاپ پر sticky sidebar، موبائل پر collapsible، Intersection Observer کے ذریعے active heading highlight
- YouTube/Vimeo embeds — markdown میں bare URLs خودکار طور پر responsive iframes میں convert ہوں (privacy کے لیے youtube-nocookie.com)
- Read time — word count سے server-side calculation (Math.ceil(words / 200))
- Social share buttons — X، Facebook، LinkedIn، email، copy‑link (جہاں ممکن ہو Web Share API استعمال ہو)
- Related posts — اسی category سے، موجودہ پوسٹ exclude، حد 3، publishedAt desc کے مطابق sort
- RSS feed (
/blog/rss.xml) — RSS 2.0، locale query param کے ذریعے - SEO — ہر پوسٹ کے لیے SeoComponent، og:article tags، BlogPosting JSON‑LD schema، canonical URLs
- Sitemap — موجودہ sitemap میں dynamic blog post/category/author URLs کا اضافہ، hreflang کے ساتھ
- Feature flag — TenantConfig.features میں
blog: boolean، layout guard بند ہونے کی صورت میں 404 return کرے - i18n — تمام UI strings (nav، labels، pagination) کے لیے Paraglide message keys، Strapi content موجودہ webhook کے ذریعے auto‑translate ہو
- Pagination — Strapi کی native pagination کے ساتھ page‑based (فی صفحہ 9 پوسٹس)
- Featured post — blog-posts پر boolean
featuredflag؛ featured post کو/bloglisting page کے اوپر hero card کے طور پر دکھایا جائے (بڑا card، full‑width، grid کے اوپر)
اچھا ہو اگر ہو (Post-MVP)
- Blog posts پر full‑text search
- Post series / multi‑part articles
- Reading progress bar
- Comments (امکاناً third‑party embed کے ذریعے)
- Posts کے اندر newsletter signup CTA
- View count / analytics integration
تکنیکی تقاضے
ڈیٹا ماڈل (Strapi کنٹنٹ ٹائپس)
blog-posts (api::blog-post.blog-post):
| فیلڈ | قسم | لوکلائزڈ | نوٹس |
|---|---|---|---|
| title | ٹیکسٹ (ضروری) | ہاں | ترجمہ کنفیگریشن کے مطابق میچ ہوتا ہے |
| slug | UID (from title) | نہیں | ترجمہ سے خارج |
| excerpt | ٹیکسٹ | ہاں | کارڈز اور meta description کے لیے |
| body | رِچ ٹیکسٹ (Markdown) | ہاں | marked کے ذریعے رینڈر ہوتا ہے |
| featuredImage | میڈیا (سنگل) | نہیں | URL + alternativeText |
| category | ریلیشن (manyToOne -> blog-category) | نہیں | |
| author | ریلیشن (manyToOne -> blog-author) | نہیں | |
| featured | Boolean (ڈیفالٹ false) | نہیں | فیچرڈ پوسٹ لسٹنگ پر ہیرو کارڈ کی صورت میں دکھائی جاتی ہے |
| seo | کمپوننٹ (shared.seo) | ہاں | موجودہ SeoComponent دوبارہ استعمال کریں |
| tenant | ٹیکسٹ | نہیں | معیاری tenant فلٹر |
| inherit | Boolean (ڈیفالٹ true) | نہیں | آٹو ترجمہ فلیگ |
blog-authors (api::blog-author.blog-author):
| فیلڈ | قسم | لوکلائزڈ | نوٹس |
|---|---|---|---|
| name | ٹیکسٹ (ضروری) | ہاں | |
| slug | UID (from name) | نہیں | |
| bio | رِچ ٹیکسٹ (Markdown) | ہاں | |
| avatar | میڈیا (سنگل) | نہیں | |
| socialLinks | JSON | نہیں | { twitter?, linkedin?, website? } |
| tenant | ٹیکسٹ | نہیں | |
| inherit | Boolean (ڈیفالٹ true) | نہیں |
blog-categories (api::blog-category.blog-category):
| فیلڈ | قسم | لوکلائزڈ | نوٹس |
|---|---|---|---|
| name | ٹیکسٹ (ضروری) | ہاں | |
| slug | UID (from name) | نہیں | |
| description | ٹیکسٹ | ہاں | |
| color | ٹیکسٹ | نہیں | UI بیجز کے لیے Hex کلر |
| tenant | ٹیکسٹ | نہیں | |
| inherit | Boolean (ڈیفالٹ true) | نہیں |
TypeScript انٹرفیسز
BlogPost، BlogAuthor، BlogCategory کے لیے src/lib/services/strapi-types.ts دیکھیں۔
روٹس
سب src/routes/(marketing)/blog/ کے تحت:
| روٹ | سرور لوڈ | مقصد |
|---|---|---|
blog/+layout.server.ts |
فیچر گارڈ + کیٹیگریز لوڈ کرنا | گیٹ + نیوِگیشن ڈیٹا |
blog/+page.server.ts |
پیجینیٹڈ پوسٹس، اختیاری ?category= فلٹر |
لسٹنگ |
blog/[slug]/+page.server.ts |
پوسٹ بائی slug + متعلقہ پوسٹس + read time کیلکولیشن | ڈیٹیل |
blog/category/[slug]/+page.server.ts |
کیٹیگری کے حساب سے فلٹر کی گئی پوسٹس | کیٹیگری لسٹنگ |
blog/author/[slug]/+page.server.ts |
مصنف + اس کی پوسٹس | مصنف صفحہ |
blog/rss.xml/+server.ts |
RSS 2.0 XML، ?locale= پیرامیٹر |
فیڈ |
UI کمپوننٹس
سب src/lib/components/blog/ میں:
| کمپوننٹ | Props | نوٹس |
|---|---|---|
BlogPostCard.svelte |
post: BlogPost |
کارڈ جس میں امیج، کیٹیگری بیج، ٹائٹل، excerpt، مصنف، تاریخ، read time |
BlogPostContent.svelte |
body: string |
Markdown سے HTML میں marked کے ذریعے، ویڈیو ایمبیڈ ایکسٹینشن + ہیڈنگ IDs کے ساتھ |
TableOfContents.svelte |
entries: TocEntry[] |
اسٹکی سائیڈ بار، active state کے لیے Intersection Observer، موبائل پر collapsible |
AuthorCard.svelte |
author: BlogAuthor |
اوتار، نام، bio، سوشل لنکس |
SocialShare.svelte |
url: string, title: string |
شیئر بٹنز، Web Share API fallback کے ساتھ |
RelatedPosts.svelte |
posts: BlogPost[] |
BlogPostCard کی گرِڈ |
BlogPagination.svelte |
pagination: StrapiPagination, basePath: string |
پچھلا/اگلا + پیج نمبرز |
سیکیورٹی اور اوتھ
- بلاگ پبلک ہے (کسی اوتھ کی ضرورت نہیں) — مارکیٹنگ کونٹینٹ
- Strapi API ریڈ ایکسس موجودہ
STRAPI_JWTٹوکن کے ذریعے - ویڈیو ایمبیڈز جی ڈی پی آر کمپلائنس کے لیے
youtube-nocookie.comاستعمال کرتے ہیں
کنارے کے کیسز اور ایرر ہینڈلنگ
- Post not found: 404 بذریعہ SvelteKit
error() - No posts in category: خالی اسٹیٹ،
blog_no_postsپیغام کے ساتھ - Missing featured image: کارڈ تصویر کے بغیر بھی رینڈر ہوتا ہے
- Translation not available:
loadContentWithFallback()انگریزی پر واپس چلا جاتا ہے - RTL languages: لے آؤٹ
dir="rtl"(ar, he, ur) کا احترام کرتا ہے
E2E ٹیسٹ پلان
ٹیسٹ فائلیں tests/blog/ میں موجود ہیں۔ موجودہ پیٹرنز فالو کریں: ویوپورٹس کے لحاظ سے پیرا میٹرائزڈ، a11y کے لیے Axe، networkidle اس وقت تک ویٹ کرتا ہے جب تک Strapi کنٹینٹ لوڈ نہ ہو جائے۔
Critical Path Tests
- Blog listing لوڈ ہو —
/blogایک گرڈ رینڈر کرے جس میں پوسٹ کارڈز ہوں، ہر ایک پر عنوان، اقتباس (excerpt)، category بیج، مصنف، تاریخ، اور read time ہو۔ - Pagination کام کرے —
/blog?page=2رزلٹس کے دوسرے صفحے کو دکھائے؛ prev/next بٹن درست طور پر نیویگیٹ کریں؛ صفحہ 1 پر "Previous" بٹن نہ ہو۔ - Category فلٹر — کسی category chip پر کلک کرنے سے پوسٹس فلٹر ہوں؛ URL
?category=<slug>پر اپڈیٹ ہو؛ "All" chip فلٹر کو کلئیر کر دے۔ - Post detail رینڈر ہو —
/blog/[slug]پر عنوان، featured image، فارمیٹ شدہ باڈی، author card، read time، اور published date نظر آئیں۔ - Table of Contents — post detail پیج h2/h3 ہیڈنگز سے ToC جنریٹ کرے؛ ToC انٹری پر کلک کرنے سے متعلقہ ہیڈنگ تک اسکرول ہو۔
- Related posts — post detail پیج پر اسی category سے زیادہ سے زیادہ 3 related posts دکھائی جائیں (موجودہ پوسٹ کے بغیر)۔
- Category پیج —
/blog/category/[slug]category کا نام، اس کی description، اور صرف اسی category کی پوسٹس دکھائے۔ - Author پیج —
/blog/author/[slug]پر author bio، اوتار، سوشل لنکس، اور اس کی پوسٹس نظر آئیں۔ - Social share بٹن — post detail پر share بٹن نظر آئیں؛ "Copy link" URL کو کاپی کرے اور کنفرمیشن ٹیکسٹ دکھائے۔
- RSS feed —
GET /blog/rss.xmlدرست XML ریٹرن کرے جس میںContent-Type: application/rss+xmlہو اور پوسٹ انٹریز شامل ہوں۔ - Navigation — سائٹ مینو میں blog لنک
/blogپر نیویگیٹ کرے؛ breadcrumbs درست hierarchy دکھائیں۔ - Featured post —
/blogfeatured post کو نارمل گرڈ کے اوپر بڑے hero card کے طور پر دکھائے۔
Edge Case & Error Tests
- Post not found —
/blog/nonexistent-slugایک 404 پیج ریٹرن کرے۔ - خالی category — جس category میں کوئی پوسٹس نہیں، وہاں
blog_no_postsوالا empty state پیغام دکھے۔ - Missing featured image — پوسٹ کارڈ امیج کے بغیر بھی خوبصورتی سے رینڈر ہو (کوئی ٹوٹی ہوئی
<img>نہ ہو)۔ - Missing author/category — جس پوسٹ میں author یا category نہ ہو وہ ان elements کے بغیر بھی رینڈر ہو (کوئی کریش نہ ہو)۔
- Feature flag disable ہونے پر — جب
blog: falseہو، تو/blog404 ریٹرن کرے۔
Cross-Cutting Tests
- i18n: locale سوئچ —
/fr/blogپر نیویگیٹ کر کے چیک کریں کہ UI strings (page title، "Read more"، pagination labels) فرانسیسی میں ہوں؛ اگر پوسٹ کنٹینٹ کا ترجمہ نہ ہو تو وہ انگلش میں fallback کرے۔ - i18n: RTL layout —
/ar/blogاور/ar/blog/[slug]پر نیویگیٹ کریں، تصدیق کریں کہdir="rtl"سیٹ ہو اور layout درست رینڈر ہو (ToC صحیح سائیڈ پر ہو)۔ - SEO: meta tags — post detail پیج پر
og:type=article،og:title،og:description،article:published_time، اور canonical لنک موجود ہوں۔ - SEO: JSON-LD — post detail پیج پر
<script type="application/ld+json">موجود ہو جس میں@type: BlogPosting، headline، author، اور datePublished ہو۔ - SEO: sitemap —
/sitemap.xmlمیں blog post URLs شامل ہوں، ساتھ میں hreflang alternates بھی ہوں۔ - Accessibility —
/blog،/blog/[slug]،/blog/author/[slug]پر Axe audits چلائیں، موبائل اور ڈیسک ٹاپ دونوں ویوپورٹس پر (موجودہ a11y ٹیسٹ پیٹرن کے مطابق)۔ - Keyboard navigation — ToC انٹریز اور pagination بٹن keyboard سے focusable اور activatable ہوں؛ focus indicators واضح طور پر نظر آئیں۔
دائرۂ کار سے باہر
- بلاگ پوسٹ کے تبصرے
- مکمل متن کی تلاش (Full-text search)
- پوسٹس کے اندر نیوز لیٹر انضمام
- اینالیٹکس / ویو کاؤنٹس
- ہر ٹیننٹ کے لیے کسٹم پوسٹ ٹیمپلیٹس
Ludo ایک معلم اور ٹیکنالوجی کے شعبے میں انٹرپرینیور ہیں، جنہیں ایک سادہ یقین آگے بڑھاتا ہے: معیاری تعلیم ہر کسی کے لیے دستیاب ہونی چاہیے۔