\n\n \n \n \n ```\n\n التكوين العالمي عبر إضافة `intlayerMarkdown` (يدعم مكونات MDX المخصصة):\n\n ```ts fileName=\"main.ts\"\n import { intlayerMarkdown } from \"vue-intlayer/markdown\";\n\n app.use(intlayerMarkdown, {\n components: {\n h1: (props) => h('h1', { style: { color: 'green' } }, props.children),\n MyButton: (props) => h('button', props), // مكون MDX\n },\n });\n ```\n\n > إذا لم يتم تثبيت إضافة `intlayerMarkdown` ، فسيقوم Intlayer بالعرض باستخدام المترجم الافتراضي.\n\n يمكنك أيضًا توفير تجاوزات محلية لعقد معينة باستخدام طريقة `.use()`:\n\n ```vue\n h('h1', { style: { color: 'red' } }, props.children),\n })\" />\n ```\n\n يمكنك استرداد Markdown كسلسلة نصية:\n\n ```vue\n {{ myMarkdownContent.value }}\n {{ String(myMarkdownContent) }}\n {{ myMarkdownContent.toString() }}\n ```\n\n ويمكنك الوصول إلى بيانات markdown الوصفية الخاصة بك على النحو التالي:\n\n ```vue\n \n \n ```\n\n \n \n يعرض Svelte Markdown كسلسلة HTML افتراضيًا. استخدم `{@html}` لعرضه.\n\n ```svelte fileName=\"App.svelte\"\n \n\n \n {@html $content.myMarkdownContent}\n \n ```\n\n > إذا لم يكن `MarkdownProvider` موجودًا ، فسيقوم Intlayer بعرض markdown باستخدام المترجم الافتراضي.\n\n يمكنك أيضًا توفير تجاوزات محلية لعقد معينة باستخدام طريقة `.use()`:\n\n ```svelte\n {@html $content.myMarkdownContent.use({ ... })}\n ```\n\n يمكنك استرداد Markdown كسلسلة نصية:\n\n ```svelte\n {$content.myMarkdownContent.value}\n {String($content.myMarkdownContent)}\n {$content.myMarkdownContent.toString()}\n ```\n\n ويمكنك الوصول إلى بيانات markdown الوصفية الخاصة بك على النحو التالي:\n\n ```svelte\n {$content.myMarkdownContent.metadata}\n {$content.myMarkdownContent.metadata.title}\n ```\n\n \n \n يدعم Preact عقد Markdown مباشرة في JSX.\n\n ```tsx fileName=\"App.tsx\"\n import { useIntlayer } from \"preact-intlayer\";\n import { MarkdownProvider } from \"preact-intlayer/markdown\";\n\n const AppContent = () => {\n const { myMarkdownContent } = useIntlayer(\"app\");\n return
{myMarkdownContent}
;\n };\n\n const App = () => (\n
{children}
,\n MyButton: (props) => , // مكون MDX\n }}\n >\n \n \n );\n ```\n\n > إذا لم يكن `MarkdownProvider` موجودًا ، فسيقوم Intlayer بعرض markdown باستخدام المحلل اللغوي الافتراضي من Markdown إلى JSX.\n\n يمكنك أيضًا توفير تجاوزات محلية لعقد معينة باستخدام طريقة `.use()`:\n\n ```tsx\n {myMarkdownContent.use({\n h1: ({ children }) =>
{children}
,\n })}\n ```\n\n يمكنك استرداد Markdown كسلسلة نصية:\n\n ```tsx\n {myMarkdownContent.value}\n {String(myMarkdownContent)}\n {myMarkdownContent.toString()}\n ```\n\n ويمكنك الوصول إلى بيانات markdown الوصفية الخاصة بك على النحو التالي:\n\n ```tsx\n {myMarkdownContent.metadata}\n {myMarkdownContent.metadata.title}\n ```\n\n \n \n يدعم Solid عقد Markdown مباشرة في JSX.\n\n ```tsx fileName=\"App.tsx\"\n import { useIntlayer } from \"solid-intlayer\";\n import { MarkdownProvider } from \"solid-intlayer/markdown\";\n\n const AppContent = () => {\n const { myMarkdownContent } = useIntlayer(\"app\");\n return
{myMarkdownContent}
;\n };\n\n const App = () => (\n
{props.children}
,\n MyButton: (props) => , // مكون MDX\n }}\n >\n \n \n );\n ```\n\n > إذا لم يكن `MarkdownProvider` موجودًا ، فسيقوم Intlayer بعرض markdown باستخدام المحلل اللغوي الافتراضي من Markdown إلى JSX.\n\n يمكنك أيضًا توفير تجاوزات محلية لعقد معينة باستخدام طريقة `.use()`:\n\n ```tsx\n {myMarkdownContent.use({\n h1: (props) =>
{props.children}
,\n })}\n ```\n\n يمكنك استرداد Markdown كسلسلة نصية:\n\n ```tsx\n {myMarkdownContent.value}\n {String(myMarkdownContent)}\n {myMarkdownContent.toString()}\n ```\n\n ويمكنك الوصول إلى بيانات markdown الوصفية الخاصة بك على النحو التالي:\n\n ```tsx\n {myMarkdownContent.metadata}\n {myMarkdownContent.metadata.title}\n ```\n\n \n \n يستخدم Angular التوجيه `[innerHTML]` لعرض محتوى Markdown.\n\n ```typescript fileName=\"app.component.ts\"\n import { Component } from \"@angular/core\";\n import { useIntlayer } from \"angular-intlayer\";\n\n @Component({\n selector: \"app-root\",\n template: ``,\n })\n export class AppComponent {\n content = useIntlayer(\"app\");\n }\n ```\n\n > إذا لم يتم تكوين مزود IntlayerMarkdown ، فسيقوم Intlayer بالعرض باستخدام المترجم الافتراضي.\n\n يمكنك أيضًا توفير تجاوزات محلية لعقد معينة باستخدام طريقة `.use()`:\n\n ```typescript\n content().myMarkdownContent.use({\n h1: { class: \"text-3xl font-bold\" },\n })\n ```\n\n يمكنك استرداد Markdown كسلسلة نصية:\n\n ```typescript\n content().myMarkdownContent.value\n String(content().myMarkdownContent)\n content().myMarkdownContent.toString()\n ```\n\n ويمكنك الوصول إلى بيانات markdown الوصفية الخاصة بك على النحو التالي:\n\n ```typescript\n content().myMarkdownContent.metadata\n content().myMarkdownContent.metadata.title\n ```\n\n \n\n\n### 2. الأدوات المساعدة (سلاسل Markdown فقط)\n\nهذه الأدوات تعرض **فقط سلاسل Markdown الخام** وهي مستقلة عن `useIntlayer`. استخدمها عندما تحتاج إلى عرض Markdown من مصادر أخرى غير قواميسك.\n\n\n \n \n #### مكون ``\n\n يعرض سلسلة Markdown مع خيارات محددة.\n\n ```tsx\n import { MarkdownRenderer } from \"react-intlayer/markdown\";\n\n \n {\"# عنواني\"}\n \n ```\n\n #### خطاف `useMarkdownRenderer()`\n\n احصل على وظيفة عارض مكونة مسبقًا.\n\n ```tsx\n import { useMarkdownRenderer } from \"react-intlayer/markdown\";\n\n const renderMarkdown = useMarkdownRenderer({\n forceBlock: true,\n components: { h1: (props) => }\n });\n\n return renderMarkdown(\"# عنواني\");\n ```\n\n #### أداة `renderMarkdown()`\n أداة مستقلة للعرض خارج المكونات.\n\n ```tsx\n import { renderMarkdown } from \"react-intlayer/markdown\";\n\n const jsx = renderMarkdown(\"# عنواني\", { forceBlock: true });\n ```\n\n \n \n \n #### مكون ``\n\n يعرض سلسلة Markdown مع خيارات محددة.\n\n ```tsx\n import { MarkdownRenderer } from \"next-intlayer/markdown\";\n\n \n {\"# عنواني\"}\n \n ```\n\n #### خطاف `useMarkdownRenderer()`\n\n احصل على وظيفة عارض مكونة مسبقًا.\n\n ```tsx\n import { useMarkdownRenderer } from \"next-intlayer/markdown\";\n\n const renderMarkdown = useMarkdownRenderer({\n forceBlock: true,\n components: { h1: (props) => }\n });\n\n return renderMarkdown(\"# عنواني\");\n ```\n\n #### أداة `renderMarkdown()`\n أداة مستقلة للعرض خارج المكونات.\n\n ```tsx\n import { renderMarkdown } from \"next-intlayer/markdown\";\n\n const jsx = renderMarkdown(\"# عنواني\", { forceBlock: true });\n ```\n\n \n \n\n #### مكون ``\n\n ```vue\n \n\n \n \n \n ```\n\n \n \n\n #### مكون ``\n\n ```svelte\n \n\n \n ```\n\n #### خطاف `useMarkdownRenderer()`\n\n ```svelte\n \n\n {@html render(\"# عنواني\")}\n ```\n\n #### أداة `renderMarkdown()`\n\n ```svelte\n \n\n {@html renderMarkdown(\"# عنواني\")}\n ```\n\n \n \n #### مكون ``\n\n ```tsx\n import { MarkdownRenderer } from \"preact-intlayer/markdown\";\n\n \n {\"# عنواني\"}\n \n ```\n\n #### خطاف `useMarkdownRenderer()`\n\n ```tsx\n import { useMarkdownRenderer } from \"preact-intlayer/markdown\";\n\n const render = useMarkdownRenderer();\n\n return
;\n ```\n\n \n \n #### خدمة `IntlayerMarkdownService`\n تعرض سلسلة Markdown باستخدام الخدمة.\n\n ```typescript\n import { IntlayerMarkdownService } from \"angular-intlayer/markdown\";\n\n export class MyComponent {\n constructor(private markdownService: IntlayerMarkdownService) {}\n\n renderMarkdown(markdown: string) {\n return this.markdownService.renderMarkdown(markdown);\n }\n }\n ```\n\n \n\n\n## التكوين العالمي باستخدام `MarkdownProvider`\n\nيقوم `MarkdownProvider` (أو ما يعادله في إطار العمل) بتكوين خط أنابيب عرض Markdown لتطبيقك بالكامل. ينطبق هذا على كل من العرض التلقائي `useIntlayer` والأدوات المساعدة. الخيارات المعينة هنا هي الإعدادات الافتراضية — يتجاوزها `.use()` على مستوى العقدة.\n\n\n \n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"react-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n ,\n a: ({ href, ...props }) => ,\n MyCustomJSXComponent: (props) => ,\n }}\n >\n {children}\n \n );\n ```\n\n\n > MDX مدعوم — يتم حل أي اسم مكون يستخدم داخل Markdown الخاص بك (على سبيل المثال ``) مقابل خريطة `components`.\n\n يمكنك أيضًا استخدام عارض markdown الخاص بك:\n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"react-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n {\n // Use dynamic import to reduce the bundle size of your application\n const { renderMarkdown } = await import('react-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n {children}\n \n );\n ```\n\n > الاستيراد الديناميكي لعارض Markdown الخاص بك هو طريقة رائعة لتقليل حجم حزمة تطبيقك.\n\n \n \n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"next-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n ,\n a: ({ href, ...props }) => ,\n MyCustomJSXComponent: (props) => ,\n }}\n >\n {children}\n \n );\n ```\n\n\n > MDX مدعوم — يتم حل أي اسم مكون يستخدم داخل Markdown الخاص بك (على سبيل المثال ``) مقابل خريطة `components`.\n\n يمكنك أيضًا استخدام عارض markdown الخاص بك:\n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"next-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n {\n // Use dynamic import to reduce the bundle size of your application\n const { renderMarkdown } = await import('next-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n {children}\n \n );\n ```\n\n > الاستيراد الديناميكي لعارض Markdown الخاص بك هو طريقة رائعة لتقليل حجم حزمة تطبيقك.\n\n \n \n\n ```typescript fileName=\"main.ts\"\n import { createApp } from \"vue\";\n import { intlayer } from \"vue-intlayer\";\n import { intlayerMarkdown } from \"vue-intlayer/markdown\";\n import App from \"./App.vue\";\n\n const app = createApp(App);\n\n app.use(intlayer);\n app.use(intlayerMarkdown, {\n components: {\n h1: (props) =>\n h('h1', { style: { color: 'orange' }, ...props }, props.children),\n ComponentDemo: () => h('div', { style: { background: 'grey' } }, 'DEMO'),\n bold: (props) => h('strong', props),\n code: (props) => h('code', props),\n },\n });\n\n app.mount(\"#app\");\n ```\n\n\n > MDX مدعوم — يتم حل أي اسم مكون يستخدم داخل Markdown الخاص بك (على سبيل المثال ``) مقابل خريطة `components`.\n\n يمكنك أيضًا استخدام عارض markdown الخاص بك:\n\n ```typescript fileName=\"main.ts\"\n import { createApp } from \"vue\";\n import { intlayer } from \"vue-intlayer\";\n import { intlayerMarkdown } from \"vue-intlayer/markdown\";\n import App from \"./App.vue\";\n\n const app = createApp(App);\n\n app.use(intlayer);\n app.use(intlayerMarkdown, {\n renderMarkdown: async (md) => {\n const { renderMarkdown } = await import('vue-intlayer/markdown');\n return renderMarkdown(md);\n },\n });\n\n app.mount(\"#app\");\n ```\n\n > الاستيراد الديناميكي لعارض Markdown الخاص بك هو طريقة رائعة لتقليل حجم حزمة تطبيقك.\n\n \n \n\n ```svelte fileName=\"App.svelte\"\n \n\n \n \n \n ```\n\n\n > MDX مدعوم — يتم حل أي اسم مكون يستخدم داخل Markdown الخاص بك (على سبيل المثال ``) مقابل خريطة `components`.\n\n يمكنك أيضًا استخدام عارض markdown الخاص بك:\n\n ```svelte fileName=\"App.svelte\"\n \n\n {\n const { renderMarkdown } = await import('svelte-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n \n \n ```\n\n > الاستيراد الديناميكي لعارض Markdown الخاص بك هو طريقة رائعة لتقليل حجم حزمة تطبيقك.\n\n \n \n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"preact-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n
{children}
,\n }}\n >\n {children}\n \n );\n ```\n\n\n > MDX مدعوم — يتم حل أي اسم مكون يستخدم داخل Markdown الخاص بك (على سبيل المثال ``) مقابل خريطة `components`.\n\n يمكنك أيضًا استخدام عارض markdown الخاص بك:\n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"preact-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n {\n const { renderMarkdown } = await import('preact-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n {children}\n \n );\n ```\n\n > الاستيراد الديناميكي لعارض Markdown الخاص بك هو طريقة رائعة لتقليل حجم حزمة تطبيقك.\n\n \n \n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"solid-intlayer/markdown\";\n\n export const AppProvider = (props) => (\n
{props.children}
,\n }}\n >\n {props.children}\n \n );\n ```\n\n\n > MDX مدعوم — يتم حل أي اسم مكون يستخدم داخل Markdown الخاص بك (على سبيل المثال ``) مقابل خريطة `components`.\n\n يمكنك أيضًا استخدام عارض markdown الخاص بك:\n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"solid-intlayer/markdown\";\n\n export const AppProvider = (props) => (\n {\n const { renderMarkdown } = await import('solid-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n {props.children}\n \n );\n ```\n\n > الاستيراد الديناميكي لعارض Markdown الخاص بك هو طريقة رائعة لتقليل حجم حزمة تطبيقك.\n\n \n \n\n ```typescript fileName=\"app.module.ts\"\n import { NgModule } from '@angular/core';\n import { IntlayerMarkdownModule } from 'angular-intlayer/markdown';\n\n @NgModule({\n imports: [\n IntlayerMarkdownModule.forRoot({\n renderMarkdown: async (md) => {\n const { renderMarkdown } = await import('angular-intlayer/markdown');\n return renderMarkdown(md);\n }\n })\n ]\n })\n export class AppModule {}\n ```\n\n > الاستيراد الديناميكي لعارض Markdown الخاص بك هو طريقة رائعة لتقليل حجم حزمة تطبيقك.\n\n \n\n\n## التعليق (Suspense)\n\nيتم تحميل محرك Markdown في Intlayer ديناميكيًا. على الرغم من تحسينه، يبلغ حجم الجزء الأساسي للمحلل حوالي 55 كيلوبايت. يؤدي تحميل هذا بشكل متزامن إلى تأخير عرض الصفحة الأولي ويقلل من سرعة عرض المحتوى الأول (FCP).\n\nلمنع حظر واجهة المستخدم، يتكامل Intlayer مع واجهة برمجة تطبيقات React Suspense. حيث يقوم بجلب المحلل في الخلفية ويرمي Promise أثناء التنزيل.\n\nقم بتغليف أي مكون يعرض Intlayer Markdown في حدود ``. يعرض هذا حالة احتياطية محلية أثناء تنزيل الجزء، مما يسمح لبقية DOM الخاص بك بالعرض على الفور.\n\nتحذير: إذا لم تقم بتوفير حدود ``، سيقوم React بالتعليق على مستوى الجذر أو حظر شجرة المكونات بأكملها من العرض حتى يتم تحميل جزء الـ 55 كيلوبايت بالكامل.\n\n\n \n\nفي Next.js App Router، يمكنك استخدام إما React `Suspense` لمكونات العميل أو ملف `loading.tsx` لمكونات الخادم.\n\n**مكون العميل:**\n\n```tsx fileName=\"components/MyComponent.tsx\"\n\"use client\";\nimport { useIntlayer } from \"next-intlayer\";\nimport { Suspense } from \"react\";\n\nconst MyComponent = () => {\n const markdownContent = useIntlayer(\"my-markdown\");\n\n return (\n Loading...}>{markdownContent}\n );\n};\n```\n\n**مكون الخادم مع `loading.tsx`:**\n\n```tsx fileName=\"app/loading.tsx\"\nexport default function Loading() {\n return
;\n};\n\nexport default MyPage;\n```\n\n \n\n \n\n```tsx\nimport { useIntlayer } from \"react-intlayer\";\nimport { Suspense } from \"react\";\n\nconst MyComponent = () => {\n const markdownContent = useIntlayer(\"my-markdown\");\n\n return (\n Loading...}>{markdownContent}\n );\n};\n```\n\n \n \n \n\nيحتوي Vue على مكون `` مضمن. قم بتغليف المكون الذي يعرض محتوى Markdown في حدود ``.\n\n```vue fileName=\"MyComponent.vue\"\n\n\n\n \n \n \n
Loading...
\n \n \n\n```\n\n \n \n\nلا يحتوي Svelte على واجهة برمجة تطبيقات Suspense مماثلة. استخدم كتلة `{#await}` للتعامل مع العرض غير المتزامن لمحتوى Markdown.\n\n```svelte fileName=\"MyComponent.svelte\"\n\n\n{#await $content.markdownContent}\n
Loading...
\n{:then rendered}\n {@html rendered}\n{/await}\n```\n\n \n \n\nيدعم Preact واجهة برمجة تطبيقات Suspense الخاصة بـ React عبر `preact/compat`.\n\n```tsx fileName=\"MyComponent.tsx\"\nimport { useIntlayer } from \"preact-intlayer\";\nimport { Suspense } from \"preact/compat\";\n\nconst MyComponent = () => {\n const markdownContent = useIntlayer(\"my-markdown\");\n\n return (\n Loading...}>{markdownContent}\n );\n};\n```\n\n \n \n\nيحتوي Solid على مكون `` الخاص به من `solid-js`.\n\n```tsx fileName=\"MyComponent.tsx\"\nimport { useIntlayer } from \"solid-intlayer\";\nimport { Suspense } from \"solid-js\";\n\nconst MyComponent = () => {\n const { markdownContent } = useIntlayer(\"my-markdown\");\n\n return (\n Loading...}>{markdownContent}\n );\n};\n```\n\n \n \n\nلا يحتوي Angular على واجهة برمجة تطبيقات Suspense. استخدم طرق العرض المؤجلة (`@defer`) للتعامل مع محتوى Markdown المحمل ببطء (يتطلب Angular 17+).\n\n```typescript fileName=\"my.component.ts\"\nimport { Component } from \"@angular/core\";\nimport { useIntlayer } from \"angular-intlayer\";\n\n@Component({\n selector: \"app-my\",\n template: `\n @defer {\n \n } @loading {\n
Loading...
\n }\n `,\n})\nexport class MyComponent {\n content = useIntlayer(\"my-markdown\");\n}\n```\n\n \n\n\n---\n\n## العرض من جانب الخادم (SSR) والترطيب (Hydration)\n\nبالمقارنة مع محللات Markdown الأخرى مثل remark / rehype، فإن Intlayer Markdown خالي من الاعتماديات ويعمل على جانب العميل وجانب الخادم على حد سواء.\n\nولكن قامت Intlayer بتحسين التحليل لإطارات عمل العرض من جانب الخادم (SSR) (مثل Next.js App Router و React Router و Nuxt و SvelteKit وما إلى ذلك).\n\nبدلاً من إرسال سلاسل Markdown الخام إلى العميل وتحليلها في المتصفح (مما يؤدي إلى تراجع الأداء)، تتيح لك Intlayer تحليل Markdown مسبقًا إلى شجرة لغة مجردة (AST) على الخادم.\n\nيمكنك استخدام دالة `parseMarkdown` من حزمة Intlayer الخاصة بإطار العمل لديك على جانب الخادم لإنشاء AST قابل للتسلسل (كائن `ParsedMarkdown`)، وتمريره مباشرة إلى الواجهة الأمامية. تقبل جميع أدوات عرض Intlayer (مثل `` و `useMarkdownRenderer` وما إلى ذلك) كائن AST هذا تلقائيًا وتعرضه بسلاسة.\n\n### مثال في بنية خادم/عميل\n\n\n \n\n ```tsx fileName=\"server.ts\"\n import { parseMarkdown } from \"react-intlayer/markdown\";\n\n // 1. على الخادم: تحليل markdown إلى AST قابل للتسلسل\n export const loader = async () => {\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n const ast = parseMarkdown(markdownString);\n\n // إرجاع AST كـ JSON إلى العميل\n return Response.json({ content: ast });\n };\n ```\n\n ```tsx fileName=\"client.tsx\"\n import { useLoaderData } from \"react-router\";\n import { MarkdownRenderer } from \"react-intlayer/markdown\";\n\n // 2. على العميل: عرض AST مباشرة دون إعادة تحليل\n export default function Page() {\n const { content } = useLoaderData();\n\n // يقبل العارض إما سلسلة خام أو AST الذي تم تحليله\n return ;\n }\n ```\n\n \n \n\n ```tsx fileName=\"app/page.tsx\"\n import { parseMarkdown } from \"next-intlayer/markdown\";\n import { MarkdownRenderer } from \"next-intlayer/markdown\";\n\n export default async function Page() {\n // 1. تحليل markdown إلى AST قابل للتسلسل على الخادم\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n const ast = parseMarkdown(markdownString);\n\n // 2. عرض AST مباشرة\n // في مكون الخادم (Server Component)، يعمل هذا بسلاسة ويمرر AST\n // مباشرة إلى مكونات العميل الأساسية إذا لزم الأمر.\n return ;\n }\n ```\n\n \n \n\n ```vue fileName=\"pages/index.vue\"\n \n\n \n \n \n \n ```\n\n \n \n\n ```typescript fileName=\"+page.server.ts\"\n import { parseMarkdown } from \"svelte-intlayer/markdown\";\n\n // 1. على الخادم: تحليل markdown إلى AST قابل للتسلسل\n export const load = async () => {\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n const ast = parseMarkdown(markdownString);\n\n // إرجاع AST إلى العميل\n return { content: ast };\n };\n ```\n\n ```svelte fileName=\"+page.svelte\"\n \n\n \n \n ```\n\n \n \n\n يعمل Angular SSR عادةً على حل البيانات على الخادم أثناء التحميل الأولي وترطيبها على العميل. يمكنك استخدام أدوات الحل (resolvers) لتمرير AST.\n\n ```typescript fileName=\"app.resolver.ts\"\n import { Injectable } from \"@angular/core\";\n import { Resolve } from \"@angular/router\";\n import { parseMarkdown, type ParsedMarkdown } from \"angular-intlayer/markdown\";\n\n @Injectable({ providedIn: \"root\" })\n export class MarkdownResolver implements Resolve {\n resolve(): ParsedMarkdown {\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n // 1. على الخادم: تحليل markdown إلى AST قابل للتسلسل\n return parseMarkdown(markdownString);\n }\n }\n ```\n\n ```typescript fileName=\"app.component.ts\"\n import { Component } from \"@angular/core\";\n import { ActivatedRoute } from \"@angular/router\";\n import { IntlayerMarkdownService, type ParsedMarkdown } from \"angular-intlayer/markdown\";\n\n @Component({\n selector: \"app-root\",\n template: ``,\n })\n export class AppComponent {\n renderedMarkdown: string = \"\";\n\n constructor(\n private route: ActivatedRoute,\n private markdownService: IntlayerMarkdownService\n ) {\n // 2. على العميل: عرض AST مباشرة دون إعادة تحليل\n this.route.data.subscribe((data) => {\n this.renderedMarkdown = this.markdownService.renderMarkdown(\n data.markdownAst\n ) as string;\n });\n }\n }\n ```\n\n \n\n\nيضمن هذا النمط تنفيذ منطق تحليل Markdown بالكامل على الخادم، مما يقلل بشكل كبير من وقت التنفيذ من جانب العميل ويحسن سرعة الترطيب الأولية.\n\n## مرجع الخيارات\n\nيمكن تمرير هذه الخيارات إلى `MarkdownProvider` و `MarkdownRenderer` و `useMarkdownRenderer` و `renderMarkdown`.\n\n| Option | Type | Default | الوصف |\n| :-------------------- | :---------- | :------ | :------------------------------------------------------------------------------------ |\n| `forceBlock` | `boolean` | `false` | يجبر الإخراج على الالتفاف في عنصر على مستوى الكتلة (مثل `
`). |\n| `forceInline` | `boolean` | `false` | يجبر الإخراج على الالتفاف في عنصر مضمن (مثل ``). |\n| `tagfilter` | `boolean` | `true` | يمكّن عامل تصفية علامات GitHub لتحسين الأمان عن طريق إزالة علامات HTML الخطيرة. |\n| `preserveFrontmatter` | `boolean` | `false` | إذا كان `true`، فلن يتم إزالة البيانات الأولية (frontmatter) في بداية سلسلة Markdown. |\n| `components` | `Overrides` | `{}` | خريطة لعلامات HTML إلى مكونات مخصصة (مثل `{ h1: MyHeading }`). |\n| `wrapper` | `Component` | `null` | مكون مخصص لتغليف Markdown المعروض. |\n| `renderMarkdown` | `Function` | `null` | وظيفة عرض مخصصة لاستبدال مترجم Markdown الافتراضي بالكامل. |\n","description":"تعرف على كيفية الإعلان عن واستخدام محتوى Markdown في موقعك متعدد اللغات باستخدام Intlayer. اتبع الخطوات في هذه الوثائق عبر الإنترنت لدمج Markdown بسلاسة في مشروعك.","url":"https://intlayer.org/ar/doc/concept/content/markdown","datePublished":"2025-02-07","dateModified":"2026-05-19","version":"8.11.0","keywords":"Markdown, تدويل, وثائق, Intlayer, Next.js, JavaScript, React","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"المطورون ومديرو المحتوى"}}
يدعم Intlayer المحتوى النصي الغني المعرف باستخدام بناء جملة Markdown. يتيح لك هذا كتابة المحتوى ذي التنسيق الغني والحفاظ عليه بسهولة مثل المدونات والمقالات والمزيد.
الإعلان عن محتوى Markdown
يمكنك الإعلان عن محتوى Markdown باستخدام وظيفة md أو ببساطة كسلسلة نصية (إذا كانت تحتوي على بناء جملة Markdown).
بدءًا من الإصدار 8.10.0 ، يمكنك الإعلان عن محتوى Markdown مباشرةً في ملفات .content.md. سيكتشف Intlayer محتوى Markdown ويحلله تلقائيًا.
markdown-file.en.content.md
نسخ الكود
نسخ الكود إلى الحافظة
---key: my-markdown-contentdescription: محتوايlocale: en---# محتوايفيما يلي مثال على محتوى markdown
حقل front-matter locale هو الحقل الذي يحدد لغة المحتوى. إنه اختياري. في حالة عدم توفيره ، سيستخدم Intlayer اللغة الافتراضية ، والتي تُستخدم أيضًا كلغة احتياطية إذا لم تتوفر ترجمة للغة معينة.
يمكنك إضافة أي خصائص معرفة في تعريف القاموس في front-matter
استخدم الوظيفة md للإعلان بشكل صريح عن محتوى Markdown. يكون هذا مفيدًا إذا كنت تريد التأكد من التعامل مع سلسلة نصية على أنها Markdown حتى لو كانت لا تحتوي على بناء جملة واضح.
عبر useIntlayer
— يحول Intlayer تلقائيًا عقدة md إلى الإخراج الأصلي لإطار العمل (JSX ، VNode ، سلسلة HTML).
يتم تحليل Frontmatter وكشفه كـ .metadata. يمكنك تجاوز التقديم على مستويين — عالميًا باستخدام MarkdownProvider (أو ما يعادله في إطار العمل) ومحليًا لكل عقدة باستخدام .use(). يمكن دمج كليهما ؛ .use() له الأسبقية على MarkdownProvider ، والذي له الأسبقية على الافتراضي.
الأدوات المساعدة — <MarkdownRenderer /> ، useMarkdownRenderer() ، و renderMarkdown() هي أدوات مستقلة لا تقبل سوى سلاسل Markdown الخام. إنها مستقلة عن useIntlayer ولا تعمل مع العقد المزخرفة التي تعيدها.
يدعم عرض Markdown MDX — استخدم أي مكون JSX/framework بالاسم مباشرة داخل Markdown الخاص بك.
import { renderMarkdown } from "solid-intlayer/markdown";return <div>{renderMarkdown("# عنواني")}</div>;
خدمة IntlayerMarkdownService
تعرض سلسلة Markdown باستخدام الخدمة.
typescript
نسخ الكود
نسخ الكود إلى الحافظة
import { IntlayerMarkdownService } from "angular-intlayer/markdown";export class MyComponent { constructor(private markdownService: IntlayerMarkdownService) {} renderMarkdown(markdown: string) { return this.markdownService.renderMarkdown(markdown); }}
التكوين العالمي باستخدام MarkdownProvider
يقوم MarkdownProvider (أو ما يعادله في إطار العمل) بتكوين خط أنابيب عرض Markdown لتطبيقك بالكامل. ينطبق هذا على كل من العرض التلقائي useIntlayer والأدوات المساعدة. الخيارات المعينة هنا هي الإعدادات الافتراضية — يتجاوزها .use() على مستوى العقدة.
الاستيراد الديناميكي لعارض Markdown الخاص بك هو طريقة رائعة لتقليل حجم حزمة تطبيقك.
التعليق (Suspense)
يتم تحميل محرك Markdown في Intlayer ديناميكيًا. على الرغم من تحسينه، يبلغ حجم الجزء الأساسي للمحلل حوالي 55 كيلوبايت. يؤدي تحميل هذا بشكل متزامن إلى تأخير عرض الصفحة الأولي ويقلل من سرعة عرض المحتوى الأول (FCP).
لمنع حظر واجهة المستخدم، يتكامل Intlayer مع واجهة برمجة تطبيقات React Suspense. حيث يقوم بجلب المحلل في الخلفية ويرمي Promise أثناء التنزيل.
قم بتغليف أي مكون يعرض Intlayer Markdown في حدود <Suspense>. يعرض هذا حالة احتياطية محلية أثناء تنزيل الجزء، مما يسمح لبقية DOM الخاص بك بالعرض على الفور.
تحذير: إذا لم تقم بتوفير حدود <Suspense>، سيقوم React بالتعليق على مستوى الجذر أو حظر شجرة المكونات بأكملها من العرض حتى يتم تحميل جزء الـ 55 كيلوبايت بالكامل.
في Next.js App Router، يمكنك استخدام إما React Suspense لمكونات العميل أو ملف loading.tsx لمكونات الخادم.
لا يحتوي Angular على واجهة برمجة تطبيقات Suspense. استخدم طرق العرض المؤجلة (@defer) للتعامل مع محتوى Markdown المحمل ببطء (يتطلب Angular 17+).
my.component.ts
نسخ الكود
نسخ الكود إلى الحافظة
import { Component } from "@angular/core";import { useIntlayer } from "angular-intlayer";@Component({selector: "app-my",template: ` @defer { <div [innerHTML]="content().markdownContent"></div> } @loading { <div>Loading...</div> }`,})export class MyComponent {content = useIntlayer("my-markdown");}
العرض من جانب الخادم (SSR) والترطيب (Hydration)
بالمقارنة مع محللات Markdown الأخرى مثل remark / rehype، فإن Intlayer Markdown خالي من الاعتماديات ويعمل على جانب العميل وجانب الخادم على حد سواء.
ولكن قامت Intlayer بتحسين التحليل لإطارات عمل العرض من جانب الخادم (SSR) (مثل Next.js App Router و React Router و Nuxt و SvelteKit وما إلى ذلك).
بدلاً من إرسال سلاسل Markdown الخام إلى العميل وتحليلها في المتصفح (مما يؤدي إلى تراجع الأداء)، تتيح لك Intlayer تحليل Markdown مسبقًا إلى شجرة لغة مجردة (AST) على الخادم.
يمكنك استخدام دالة parseMarkdown من حزمة Intlayer الخاصة بإطار العمل لديك على جانب الخادم لإنشاء AST قابل للتسلسل (كائن ParsedMarkdown)، وتمريره مباشرة إلى الواجهة الأمامية. تقبل جميع أدوات عرض Intlayer (مثل <MarkdownRenderer> و useMarkdownRenderer وما إلى ذلك) كائن AST هذا تلقائيًا وتعرضه بسلاسة.
مثال في بنية خادم/عميل
server.ts
نسخ الكود
نسخ الكود إلى الحافظة
import { parseMarkdown } from "react-intlayer/markdown";// 1. على الخادم: تحليل markdown إلى AST قابل للتسلسلexport const loader = async () => { const markdownString = "## My title \n\nLorem Ipsum"; const ast = parseMarkdown(markdownString); // إرجاع AST كـ JSON إلى العميل return Response.json({ content: ast });};
client.tsx
نسخ الكود
نسخ الكود إلى الحافظة
import { useLoaderData } from "react-router";import { MarkdownRenderer } from "react-intlayer/markdown";// 2. على العميل: عرض AST مباشرة دون إعادة تحليلexport default function Page() { const { content } = useLoaderData(); // يقبل العارض إما سلسلة خام أو AST الذي تم تحليله return <MarkdownRenderer content={content} />;}
app/page.tsx
نسخ الكود
نسخ الكود إلى الحافظة
import { parseMarkdown } from "next-intlayer/markdown";import { MarkdownRenderer } from "next-intlayer/markdown";export default async function Page() { // 1. تحليل markdown إلى AST قابل للتسلسل على الخادم const markdownString = "## My title \n\nLorem Ipsum"; const ast = parseMarkdown(markdownString); // 2. عرض AST مباشرة // في مكون الخادم (Server Component)، يعمل هذا بسلاسة ويمرر AST// مباشرة إلى مكونات العميل الأساسية إذا لزم الأمر. return <MarkdownRenderer content={ast} />;}
pages/index.vue
نسخ الكود
نسخ الكود إلى الحافظة
<script setup lang="ts">import { parseMarkdown } from "vue-intlayer/markdown";import { MarkdownRenderer } from "vue-intlayer/markdown";// 1. جلب وتحليل markdown إلى AST على الخادمconst { data: ast } = await useAsyncData('markdown', () => { const markdownString = "## My title \n\nLorem Ipsum"; return parseMarkdown(markdownString);});</script><template> <!-- 2. على العميل: عرض AST مباشرة دون إعادة تحليل --> <MarkdownRenderer :content="ast" /></template>
+page.server.ts
نسخ الكود
نسخ الكود إلى الحافظة
import { parseMarkdown } from "svelte-intlayer/markdown";// 1. على الخادم: تحليل markdown إلى AST قابل للتسلسلexport const load = async () => { const markdownString = "## My title \n\nLorem Ipsum"; const ast = parseMarkdown(markdownString); // إرجاع AST إلى العميل return { content: ast };};
+page.svelte
نسخ الكود
نسخ الكود إلى الحافظة
<script lang="ts"> import { MarkdownRenderer } from "svelte-intlayer/markdown"; export let data;</script><!-- 2. على العميل: عرض AST مباشرة دون إعادة تحليل --><MarkdownRenderer value={data.content} />
يعمل Angular SSR عادةً على حل البيانات على الخادم أثناء التحميل الأولي وترطيبها على العميل. يمكنك استخدام أدوات الحل (resolvers) لتمرير AST.
app.resolver.ts
نسخ الكود
نسخ الكود إلى الحافظة
import { Injectable } from "@angular/core";import { Resolve } from "@angular/router";import { parseMarkdown, type ParsedMarkdown } from "angular-intlayer/markdown";@Injectable({ providedIn: "root" })export class MarkdownResolver implements Resolve<ParsedMarkdown> { resolve(): ParsedMarkdown { const markdownString = "## My title \n\nLorem Ipsum"; // 1. على الخادم: تحليل markdown إلى AST قابل للتسلسل return parseMarkdown(markdownString); }}
app.component.ts
نسخ الكود
نسخ الكود إلى الحافظة
import { Component } from "@angular/core";import { ActivatedRoute } from "@angular/router";import { IntlayerMarkdownService, type ParsedMarkdown } from "angular-intlayer/markdown";@Component({ selector: "app-root", template: `<div [innerHTML]="renderedMarkdown"></div>`,})export class AppComponent { renderedMarkdown: string = ""; constructor( private route: ActivatedRoute, private markdownService: IntlayerMarkdownService ) { // 2. على العميل: عرض AST مباشرة دون إعادة تحليل this.route.data.subscribe((data) => { this.renderedMarkdown = this.markdownService.renderMarkdown( data.markdownAst ) as string; }); }}
يضمن هذا النمط تنفيذ منطق تحليل Markdown بالكامل على الخادم، مما يقلل بشكل كبير من وقت التنفيذ من جانب العميل ويحسن سرعة الترطيب الأولية.
مرجع الخيارات
يمكن تمرير هذه الخيارات إلى MarkdownProvider و MarkdownRenderer و useMarkdownRenderer و renderMarkdown.
اظهار جميع محتويات الجدول
افتح الجدول في نافذة منبثقة لعرض جميع محتويات البيانات بوضوح
Option
Type
Default
الوصف
forceBlock
boolean
false
يجبر الإخراج على الالتفاف في عنصر على مستوى الكتلة (مثل <div>).
forceInline
boolean
false
يجبر الإخراج على الالتفاف في عنصر مضمن (مثل <span>).
tagfilter
boolean
true
يمكّن عامل تصفية علامات GitHub لتحسين الأمان عن طريق إزالة علامات HTML الخطيرة.
preserveFrontmatter
boolean
false
إذا كان true، فلن يتم إزالة البيانات الأولية (frontmatter) في بداية سلسلة Markdown.
components
Overrides
{}
خريطة لعلامات HTML إلى مكونات مخصصة (مثل { h1: MyHeading }).
wrapper
Component
null
مكون مخصص لتغليف Markdown المعروض.
renderMarkdown
Function
null
وظيفة عرض مخصصة لاستبدال مترجم Markdown الافتراضي بالكامل.