diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs
index ebb59d36115..52218a32089 100644
--- a/docs/astro.config.mjs
+++ b/docs/astro.config.mjs
@@ -58,6 +58,11 @@ export default defineConfig({
label: 'English',
lang: 'en',
},
+ ar: {
+ label: 'العربية',
+ lang: 'ar',
+ dir: 'rtl',
+ },
},
social: socialConfig,
tableOfContents: {
diff --git a/docs/src/content/docs/ar/assets/controlnets-parallax/city-canny.png b/docs/src/content/docs/ar/assets/controlnets-parallax/city-canny.png
new file mode 100644
index 00000000000..f46ad56e1b5
Binary files /dev/null and b/docs/src/content/docs/ar/assets/controlnets-parallax/city-canny.png differ
diff --git a/docs/src/content/docs/ar/assets/controlnets-parallax/city-depth.png b/docs/src/content/docs/ar/assets/controlnets-parallax/city-depth.png
new file mode 100644
index 00000000000..5ed305e8cd9
Binary files /dev/null and b/docs/src/content/docs/ar/assets/controlnets-parallax/city-depth.png differ
diff --git a/docs/src/content/docs/ar/assets/controlnets-parallax/city-og.png b/docs/src/content/docs/ar/assets/controlnets-parallax/city-og.png
new file mode 100644
index 00000000000..25fd75cdf6e
Binary files /dev/null and b/docs/src/content/docs/ar/assets/controlnets-parallax/city-og.png differ
diff --git a/docs/src/content/docs/ar/assets/controlnets-parallax/city-ui-layers.png b/docs/src/content/docs/ar/assets/controlnets-parallax/city-ui-layers.png
new file mode 100644
index 00000000000..6ddc0f74058
Binary files /dev/null and b/docs/src/content/docs/ar/assets/controlnets-parallax/city-ui-layers.png differ
diff --git a/docs/src/content/docs/ar/assets/invoke-web-server-1.png b/docs/src/content/docs/ar/assets/invoke-web-server-1.png
new file mode 100644
index 00000000000..e1cf27a2176
Binary files /dev/null and b/docs/src/content/docs/ar/assets/invoke-web-server-1.png differ
diff --git a/docs/src/content/docs/ar/assets/invoke-webui-canvas.png b/docs/src/content/docs/ar/assets/invoke-webui-canvas.png
new file mode 100644
index 00000000000..29dda3baf42
Binary files /dev/null and b/docs/src/content/docs/ar/assets/invoke-webui-canvas.png differ
diff --git a/docs/src/content/docs/ar/assets/splash-banner.png b/docs/src/content/docs/ar/assets/splash-banner.png
new file mode 100644
index 00000000000..74d23f514d9
Binary files /dev/null and b/docs/src/content/docs/ar/assets/splash-banner.png differ
diff --git a/docs/src/content/docs/ar/concepts/diffusion.mdx b/docs/src/content/docs/ar/concepts/diffusion.mdx
new file mode 100644
index 00000000000..bbffe1c9562
--- /dev/null
+++ b/docs/src/content/docs/ar/concepts/diffusion.mdx
@@ -0,0 +1,77 @@
+---
+title: الانتشار
+lastUpdated: 2026-02-20
+sidebar:
+ order: 5
+---
+
+import { Card, CardGrid, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
+
+سيساعدك أخذ الوقت لفهم عملية الانتشار على فهم كيفية استخدام InvokeAI بشكل أكثر فعالية.
+
+## فضاء الصورة مقابل فضاء الكامن
+
+هناك طريقتان رئيسيتان يعمل بهما Stable Diffusion — مع الصور، والكامنات.
+
+
+
+ يمثل الصور بشكل بكسل تنظر إليها. هذا هو المخرَج البصري النهائي الذي تراه.
+
+
+ يمثل المدخلات المضغوطة. في الفضاء الكامن يعالج Stable Diffusion الصور.
+
+
+
+:::note[ما هو VAE؟]
+ **VAE (جهاز التشفير التلقائي المتغير)** مسؤول عن ضغط وتشفير المدخلات إلى *الفضاء الكامن*، وكذلك فك تشفير المخرجات إلى *فضاء الصورة*.
+:::
+
+## المكونات الأساسية
+
+لفهم عملية الانتشار بشكل كامل، نحتاج إلى فهم بضعة مصطلحات إضافية: **U-Net** و **CLIP** و **التهيئة**.
+
+
+
+ نموذج تم تدريبه على عدد كبير من الصور الكامنة مع كميات معروفة من الضوضاء العشوائية المضافة. يمكن إعطاء U-Net صورة مشوشة قليلاً وسيتنبأ بنمط الضوضاء اللازمة لطرحها من الصورة لاستعادة الأصل.
+
+
+ **CLIP** هو نموذج يقوم بتقطيع النص وتشفيره إلى **تهيئة**. هذه التهيئة توجه النموذج أثناء خطوات إزالة الضوضاء لإنتاج صورة جديدة.
+
+
+
+يعمل U-Net و CLIP معاً أثناء عملية توليد الصور في كل خطوة من خطوات إزالة الضوضاء. يزيل U-Net الضوضاء بحيث تكون النتيجة مشابهة للصور في مجموعة تدريبه، بينما يوجه CLIP الـ U-Net نحو إنشاء صور أكثر تشابهاً مع أمرك.
+
+## عملية التوليد
+
+
+
+ عندما تقوم بتوليد صورة باستخدام نص إلى صورة، تحدث خطوات متعددة في الفضاء الكامن:
+
+
+ 1. **توليد الضوضاء:** يتم توليد ضوضاء عشوائية بالارتفاع والعرض المختارين. يتم تحديد خصائص الضوضاء بواسطة البذرة. يتم تمرير موتر الضوضاء هذا إلى الفضاء الكامن. سنسمي هذا *الضوضاء أ*.
+ 2. **توقع الضوضاء:** باستخدام U-Net للنموذج، يفحص متوقع الضوضاء *الضوضاء أ* والكلمات المرمزة بواسطة CLIP من أمرك (التهيئة). يولد موتر الضوضاء الخاص به لتوقع كيف قد تبدو الصورة النهائية في الفضاء الكامن. سنسمي هذا *الضوضاء ب*.
+ 3. **الطرح:** يتم طرح *الضوضاء ب* من *الضوضاء أ* في محاولة لإنشاء صورة كامنة متسقة مع الأمر. تتكرر هذه الخطوة لعدد خطوات العيّنة المختارة.
+ 4. **فك التشفير:** يقوم VAE بفك تشفير الصورة الكامنة النهائية من الفضاء الكامن إلى فضاء الصورة.
+
+
+
+ صورة إلى صورة هي عملية مشابهة، مع اختلاف الخطوة الأولى فقط:
+
+
+ 1. **التشفير وإضافة الضوضاء:** يتم تشفير صورة الإدخال من فضاء الصورة إلى الفضاء الكامن بواسطة VAE. ثم تتم إضافة ضوضاء إلى الصورة الكامنة المدخلة.
+ * **قوة إزالة الضوضاء** تحدد عدد خطوات الضوضاء المضافة، وكمية الضوضاء المضافة في كل خطوة.
+ * قوة `0` تعني 0 خطوات ولا ضوضاء مضافة، مما يؤدي إلى صورة غير متغيرة.
+ * قوة `1` تؤدي إلى استبدال الصورة بالكامل بالضوضاء وتنفيذ مجموعة كاملة من خطوات إزالة الضوضاء.
+ 2. **توقع الضوضاء:** باستخدام U-Net للنموذج، يفحص متوقع الضوضاء الصورة الكامنة المشوشة والتهيئة من أمرك. يولد موتر الضوضاء الخاص به لتوقع الصورة النهائية.
+ 3. **الطرح:** يتم طرح الضوضاء المتوقعة من الضوضاء الحالية في محاولة لإنشاء صورة كامنة متسقة مع الأمر. تتكرر هذه الخطوة لخطوات العيّنة المتبقية.
+ 4. **فك التشفير:** يقوم VAE بفك تشفير الصورة الكامنة النهائية من الفضاء الكامن إلى فضاء الصورة.
+
+
+
+
+## ملخص
+
+
+- **النموذج** يوفر مرمز أوامر CLIP، وVAE، و U-Net (حيث يتم توقع الضوضاء بالنظر إلى الأمر وموتر الضوضاء الأولي).
+- **مجدول الضوضاء** (مثل `DPM++ 2M Karras`) يحدد جدول طرح الضوضاء من الصورة الكامنة عبر خطوات العيّنة المختارة. عادةً ما يتم طرح ضوضاء أقل في خطوات العيّنة الأعلى.
+
diff --git a/docs/src/content/docs/ar/concepts/dynamic-prompting.mdx b/docs/src/content/docs/ar/concepts/dynamic-prompting.mdx
new file mode 100644
index 00000000000..87dd43d0b26
--- /dev/null
+++ b/docs/src/content/docs/ar/concepts/dynamic-prompting.mdx
@@ -0,0 +1,133 @@
+---
+title: الأوامر الديناميكية
+lastUpdated: 2026-03-30
+sidebar:
+ order: 4
+---
+
+import { Card, CardGrid, Steps, LinkCard } from '@astrojs/starlight/components';
+
+توسع الأوامر الديناميكية أمراً واحداً إلى العديد من تنويعات الأوامر. إنها مفيدة للعصف الذهني، واستكشاف الأوامر، والاختبار الجماعي دون إعادة كتابة نفس الأمر يدوياً.
+
+## الصياغة الأساسية
+
+ضع البدائل داخل أقواس معقوفة وافصل بينها بـ `|`.
+
+```text
+a {red|green|blue} balloon
+```
+
+يمكن أن يتوسع هذا إلى:
+
+```text
+a red balloon
+a green balloon
+a blue balloon
+```
+
+يمكنك استخدام أكثر من مجموعة ديناميكية في نفس الأمر:
+
+```text
+a {red|green} {balloon|kite}
+```
+
+ينشئ ذلك مجموعة من تركيبات الأوامر مثل `a red balloon` و `a red kite` و `a green balloon` و `a green kite`.
+
+## اختر أكثر من خيار بـ `$$`
+
+أسبق مجموعة برقم و `$$` لاختيار عدة خيارات متميزة من نفس المجموعة.
+
+```text
+portrait, {2$$rim light|fog|rain|neon reflections}
+```
+
+النتائج المحتملة تشمل:
+
+```text
+portrait, rim light, fog
+portrait, fog, rain
+portrait, rim light, neon reflections
+```
+
+هذا مفيد عندما تريد تنوعاً مضبوطاً دون كتابة كل تركيبة يدوياً.
+
+## التوسع العشوائي مقابل التوافقي
+
+
+
+ يتنقل بين تركيبات الأوامر الممكنة بشكل منهجي حتى الوصول إلى `Max Prompts`.
+
+
+ يختبر تنويعات الأوامر بدلاً من تعداد كل تركيبة. يمكن للبذرة أن تجعل التوسع العشوائي قابلاً للتكرار.
+
+
+
+يدعم InvokeAI كلا الوضعين، لكن مكان اختيارهما يعتمد على سير العمل.
+
+- في واجهة المستخدم الخطية الحالية، تكون معاينة الأمر الديناميكي مدفوعة من الأمر الإيجابي وتتبع حالياً مسار التوسع التوافقي القياسي.
+- في سياقات العقد والخلفية، يتم عرض التوليد العشوائي والتوافقي بشكل أكثر وضوحاً.
+
+## الحد الأقصى للأوامر
+
+`Max Prompts` يحدد عدد الأوامر الموسعة التي سينشئها InvokeAI.
+
+هذا مهم لأن التركيبات تنمو بسرعة. على سبيل المثال:
+
+```text
+a {red|green|blue} balloon in {morning mist|golden hour|rain}
+```
+
+حتى هذا الأمر الصغير لديه بالفعل تسع تركيبات محتملة.
+
+:::tip[ابدأ صغيراً]
+ قم بمعاينة حفنة من تنويعات الأوامر أولاً. بمجرد أن تبدو التركيبات مفيدة، قم بزيادة `Max Prompts` لمجموعة أكبر.
+:::
+
+## سلوك البذرة
+
+في واجهة المستخدم الحالية، يتحكم إعداد `Seed Behaviour` في كيفية إعادة استخدام البذور عبر الأوامر الموسعة.
+
+
+
+ يستخدم بذرة واحدة لكل تكرار، لذلك تشارك تنويعات الأمر في نفس التكرار بذرة واحدة. هذا مفيد عندما تريد مقارنة صياغة الأمر بشكل أكثر مباشرة.
+
+
+ يستخدم بذرة مختلفة لكل صورة يتم توليدها. هذا مفيد عندما تريد أوسع تنوع ممكن.
+
+
+
+## استخدام الأوامر الديناميكية في واجهة المستخدم الخطية
+
+
+ 1. **ضع صياغة الأمر الديناميكي في الأمر الإيجابي**
+
+ في واجهة المستخدم الخطية الحالية، يتم تشغيل توسيع الأمر الديناميكي من الأمر الإيجابي.
+
+ 2. **افتح المعاينة**
+
+ استخدم `Show Dynamic Prompts` أو معاينة الأوامر لفحص القائمة الموسعة قبل التوليد.
+
+ 3. **اضبط `Max Prompts`**
+
+ حافظ على التوسع تحت السيطرة قبل إطلاق مجموعة كبيرة.
+
+ 4. **اختر سلوك البذرة المناسب**
+
+ استخدم `Seed per Iteration` لمقارنة أسهل، أو `Seed per Image` لمزيد من التنوع.
+
+ 5. **قم بتوليد مجموعة صغيرة أولاً**
+
+ تحقق من صحة التركيبات قبل التوسع.
+
+
+:::note[سلوك واجهة المستخدم الخطية الحالية]
+ تعرض واجهة المستخدم الخطية حالياً `Max Prompts` والمعاينة وسلوك البذرة. لا تعرض مفتاح تبديل منفصل لوضع عشوائي مقابل توافقي في تدفق الأمر الإيجابي الرئيسي.
+:::
+
+## نصائح
+
+- حافظ على كل مجموعة خيارات متوافقة داخلياً.
+- كن حذراً مع المجموعات المتعددة، لأن عدد التركيبات ينمو بسرعة.
+- راجع قائمة الأوامر الموسعة قبل إطلاق مجموعة كبيرة.
+- استخدم الأوامر الديناميكية للتنوع، وليس لتجنب التفكير في الأمر الأساسي.
+- عندما يحتاج مصطلح معين إلى مزيد من التركيز، استخدم [صياغة الأوامر](../prompt-syntax) بدلاً من إضافة المزيد من المجموعات الديناميكية.
diff --git a/docs/src/content/docs/ar/concepts/image-generation.mdx b/docs/src/content/docs/ar/concepts/image-generation.mdx
new file mode 100644
index 00000000000..2274614c580
--- /dev/null
+++ b/docs/src/content/docs/ar/concepts/image-generation.mdx
@@ -0,0 +1,153 @@
+---
+title: توليد الصور
+lastUpdated: 2026-03-30
+sidebar:
+ order: 1
+---
+
+import { Card, CardGrid, Steps, LinkCard } from '@astrojs/starlight/components';
+
+:::tip[جديد في توليد الصور بالذكاء الاصطناعي؟]
+ أنت في المكان الصحيح! هذه نظرة عامة عالية المستوى لبعض المفاهيم والمصطلحات التي ستراها عند بدء استخدام Invoke. يرجى ملاحظة أن هذا ليس دليلاً شاملاً وقد يكون قديماً بسبب الطبيعة سريعة التغير لهذا المجال.
+:::
+
+## استخدام InvokeAI
+
+### صياغة الأوامر
+
+الأوامر هي أساس استخدام InvokeAI، حيث توفر للنماذج توجيهات حول ما يجب توليده. كقاعدة عامة، كلما كان أمرك أكثر تفصيلاً، كانت نتيجتك أفضل.
+
+
+ للبدء، إليك قالب سهل لاستخدامه في هيكلة أوامرك:
+ **الموضوع، النمط، الجودة، الجماليات**
+
+ - **الموضوع:** ما ستكون صورتك عنه. مثلاً "مدينة مستقبلية بقطارات"، "بطاريق تطفو على جبال جليدية"، "أصدقاء يتشاركون البيرة".
+ - **النمط:** النمط أو الوسيط الذي ستكون به صورتك. مثلاً "تصوير فوتوغرافي"، "رسم بقلم رصاص"، "دهانات زيتية"، أو "فن بوب"، "تكسيرية"، "تجريدي".
+ - **الجودة:** جانب أو سمة معينة ترغب في رؤيتها مؤكدة في صورتك. مثلاً "حائز على جائزة"، "مميز في مجموعة أعمال عالية الجودة"، "مشهود له مهنياً". كثير من الناس يستخدمون "تحفة فنية".
+ - **الجماليات:** التأثير البصري وتصميم العمل الفني. يمكن أن يكون الألوان، المزاج، الإضاءة، الإعداد، إلخ.
+
+
+يوجد مربعا أوامر: **الأمر الإيجابي** و **الأمر السلبي**.
+
+- **الأمر الإيجابي** يحتوي على كلمات تريد من النموذج الرجوع إليها عند إنشاء صورة.
+- **الأمر السلبي** هو لأي شيء تريد من النموذج استبعاده عند إنشاء صورة. لا يفسر الأشياء دائماً تماماً بالطريقة التي تفعلها، لكنه يساعد في التحكم في عملية التوليد. حاول دائماً تضمين بضعة مصطلحات - يمكنك عادة استخدام مصطلحات الصور منخفضة الجودة مثل "ضبابي" أو "مشوه" بنجاح جيد.
+
+**بعض الأمثلة على الأوامر التي يمكنك تجربتها بنفسك:**
+
+- *لوحة زيتية مفصلة لغابة هادئة عند غروب الشمس بألوان نابضة بالحياة وضوء ذهبي ناعم يتسرب عبر الأشجار*
+- *أصدقاء يتشاركون البيرة في مدينة مزدحمة، رسم واقعي بقلم رصاص ملون، شفق، تحفة فنية، مشرق، حيوي*
+
+### الصياغة المتقدمة
+
+
+
+
+
+
+
+### سير عمل التوليد
+
+يقدم Invoke عدداً من سير العمل المختلفة للتفاعل مع النماذج لإنتاج الصور. كل منها قوي جداً بمفرده، لكنها معاً توفر لك طريقة لا مثيل لها لإنتاج مخرجات إبداعية عالية الجودة تتوافق مع رؤيتك.
+
+
+
+ يركز على سير العمل الرئيسي لاستخدام أمر لتوليد صورة جديدة. يتضمن ميزات أخرى تساعد في التحكم في عملية التوليد أيضاً.
+
+
+ قدم صورة كمرجع (تسمى "الصورة الأولية")، والتي توفر توجيهاً أكثر حول اللون والبنية للذكاء الاصطناعي أثناء توليد صورة جديدة.
+
+
+ أداة تحرير صور متقدمة قائمة على الذكاء الاصطناعي. اسحب صورة على اللوحة لإعادة توليد العناصر، أو تحرير المحتوى أو الألوان (**inpainting**)، أو تمديد الصورة مع الاتساق والوضوح (**outpainting**).
+
+
+
+### تحسين جودة الصورة
+
+
+ 1. **ضبط الأمر الخاص بك:**
+
+ كلما كنت أكثر تحديداً، كلما كانت الصورة أقرب إلى ما في رأسك. إضافة المزيد من التفاصيل في الأمر الإيجابي أو السلبي يمكن أن يساعد في إضافة أو إزالة أجزاء من الصورة. يمكنك أيضاً استخدام تقنيات متقدمة مثل الترجيح لأعلى ولأسفل للتحكم في تأثير كلمات محددة. تعلم المزيد في [دليل الصياغة](../prompting-guide) و [صياغة الأوامر](../prompt-syntax).
+
+ :::tip
+ إذا كنت ترى نتائج سيئة، حاول إضافة الأشياء التي لا تعجبك في الصورة إلى أمرك السلبي. مثلاً *مشوه، جودة منخفضة، غير واقعي، إلخ.*
+ :::
+
+ 2. **استكشاف نماذج مختلفة:**
+
+ يمكن للنماذج الأخرى إنتاج نتائج مختلفة بسبب البيانات التي تم تدريبها عليها. كل نموذج لديه لغة وإعدادات محددة يعمل بها بشكل أفضل؛ وثائق النموذج هي صديقك هنا. جرب بعضها وانظر ما يناسبك!
+
+ 3. **زيادة الخطوات:**
+
+ عدد الخطوات المستخدمة يتحكم في مقدار الوقت الممنوح للنموذج لإنتاج صورة، ويعتمد على "المجدول" المستخدم. الخطوات الأكثر تعني نتائج أفضل عادة، لكنها ستستغرق وقتاً أطول. نوصي بما لا يقل عن 30 خطوة لمعظم الحالات.
+
+ 4. **التعديل والتكرار:**
+
+ تذكر، من الأفضل تغيير شيء واحد في كل مرة حتى تعرف ما يعمل وما لا يعمل. أحياناً تحتاج فقط إلى تجربة صورة جديدة، وأحياناً أخرى قد يكون استخدام أمر جديد هو الحل.
+ *للاختبار، فكر في إيقاف تشغيل البذرة العشوائية. استخدام نفس البذرة مع نفس الإعدادات سينتج نفس الصورة، مما يجعله الطريقة المثالية لمعرفة بالضبط ما تفعله تغييراتك.*
+
+ 5. **استكشاف الإعدادات المتقدمة:**
+
+ يحتوي InvokeAI على مجموعة كاملة من الأدوات المتاحة للسماح لك بالتحكم الكامل في عملية إنشاء الصور. تحقق من [وثائق الميزات](../../features/gallery) إذا كنت تريد معرفة المزيد.
+
+
+## المصطلحات والمفاهيم
+
+:::note
+ إذا كنت مهتماً بمعرفة المزيد، تحقق من [هذا العرض التقديمي](https://docs.google.com/presentation/d/1IO78i8oEXFTZ5peuHHYkVF-Y3e2M6iM5tCnc-YBfcCM/edit?usp=sharing) من أحد المشرفين لدينا (@lstein).
+:::
+
+### Stable Diffusion
+
+Stable Diffusion هو نموذج تعلم عميق من نص إلى صورة وهو الأساس للقدرات الموجودة في InvokeAI. منذ إصدار Stable Diffusion، تم إنشاء العديد من النماذج اللاحقة بناءً على Stable Diffusion والمصممة لتوليد أنواع محددة من الصور.
+
+### الأوامر
+
+توفر الأوامر توجيهات للنماذج حول ما يجب توليده. كقاعدة عامة، كلما كان أمرك أكثر تفصيلاً، كانت نتيجتك أفضل.
+
+### النماذج
+
+النماذج هي السحر الذي يشغّل InvokeAI. هذه الملفات تمثل مخرجات تدريب آلة على فهم كميات هائلة من الصور - مما يوفر لها القدرة على توليد صور جديدة باستخدام مجرد وصف نصي لما تود رؤيته.
+
+يقدم Invoke طريقة بسيطة لتنزيل عدة نماذج مختلفة عند التثبيت، ولكن يمكن اكتشاف المزيد الكثير عبر الإنترنت، بما في ذلك على [civitai.com](https://civitai.com). كل نموذج يمكنه إنتاج نمط فريد من المخرجات، بناءً على الصور التي تم تدريبه عليها.
+
+:::note
+ النماذج التي تحتوي على "inpainting" في الاسم مصممة للاستخدام مع ميزة inpainting في اللوحة الموحدة.
+:::
+
+### المجدولات والخطوات
+
+**المجدولات** توجه عملية إزالة الضوضاء من البيانات. تحدد:
+1. عدد الخطوات المطلوبة لإزالة الضوضاء.
+2. ما إذا كانت الخطوات عشوائية (احتمالية) أم قابلة للتنبؤ (حتمية).
+3. الطريقة المحددة (الخوارزمية) المستخدمة لإزالة الضوضاء.
+
+**الخطوات** تمثل عدد تكرارات إزالة الضوضاء التي تمر بها كل عملية توليد. يمكن أن تكون المجدولات معقدة وغالباً ما يكون هناك توازن يجب تحقيقه بين سرعة إزالة الضوضاء وجودة الأداء. يُنصح عادة بتجربة مجدولات مختلفة لمعرفة أيها يعطي أفضل النتائج.
+
+### مفاهيم إضافية
+
+
+
+ LoRAs تشبه نسخة أصغر وأكثر تركيزاً من النماذج، تهدف إلى التركيز على تدريب فهم أفضل لكيفية ظهور شخصية أو نمط أو مفهوم معين.
+
+
+ مثل LoRAs، تساعد التضمينات في تسهيل الصياغة لشخصيات أو أنماط أو مفاهيم معينة. يتم تدريبها على تحديث العلاقة بين كلمة محددة (تُعرف باسم "المشغل") والمخرجات المقصودة.
+
+
+ شبكات ControlNet هي نماذج شبكات عصبية قادرة على استخراج الميزات الرئيسية من صورة موجودة واستخدام هذه الميزات لتوجيه مخرجات نموذج توليد الصور.
+
+
+ جهاز التشفير التلقائي المتغير (VAE) هو نموذج تشفير/فك تشفير يترجم صورة "الكامنة" المنتجة أثناء عملية توليد الصور إلى صور البكسل الكبيرة التي نراها.
+
+
diff --git a/docs/src/content/docs/ar/concepts/models.mdx b/docs/src/content/docs/ar/concepts/models.mdx
new file mode 100644
index 00000000000..37939415cfe
--- /dev/null
+++ b/docs/src/content/docs/ar/concepts/models.mdx
@@ -0,0 +1,133 @@
+---
+title: النماذج
+sidebar:
+ order: 8
+---
+
+## نماذج Checkpoint و Diffusers
+
+ملفات نقاط التحكم للنموذج (`*.ckpt`) هي "الصلصة السرية" لـ Stable Diffusion. إنها نتاج تدريب الذكاء الاصطناعي على ملايين الصور الموصوفة التي تم جمعها من مصادر متعددة.
+
+في البداية كان هناك ملف أوزان واحد فقط لـ Stable Diffusion، أطلق عليه العديد من الأشخاص اسم `model.ckpt`.
+
+اليوم، هناك آلاف النماذج، مضبوطة بدقة لتتفوق في أنماط أو أنواع أو موضوعات محددة.
+
+:::tip[تنسيقات النماذج]
+ لدينا أيضاً تنسيقان آخران شائعان للنماذج، تم إنشاؤهما بواسطة [HuggingFace](https://huggingface.co/):
+
+ - `safetensors`: ملف واحد، مثل ملفات `.ckpt`. يمنع البرامج الضارة من الاختباء في النموذج.
+ - `diffusers`: يقسم مكونات النموذج إلى ملفات منفصلة، مما يسمح بتحميل سريع جداً.
+
+ يدعم InvokeAI التنسيقات الثلاثة.
+:::
+
+## النماذج الابتدائية
+
+عند بدء تشغيل InvokeAI لأول مرة، ستظهر لك نافذة منبثقة تطالبك بتثبيت بعض النماذج الابتدائية من مدير النماذج. انقر فوق علامة التبويب `Starter Models` لرؤية القائمة.
+
+ستجد مجموعة من النماذج الشهيرة عالية الجودة المتاحة للتحميل بسهولة.
+
+بعض النماذج تحمل شروط ترخيص تحد من استخدامها في التطبيقات التجارية أو على الخوادم العامة. من مسؤوليتك الالتزام بشروط الترخيص.
+
+## نماذج أخرى
+
+هناك عدة طرق لتثبيت نماذج أخرى:
+
+- **URL أو مسار محلي**: قدم المسار إلى نموذج على جهاز الكمبيوتر الخاص بك، أو رابط مباشر للنموذج. بعض المواقع تتطلب منك استخدام رمز API لتنزيل النماذج، والذي يمكنك [إعداده في ملف الإعدادات]. يمكنك أيضاً لصق معرف مستودع HuggingFace هنا مباشرة — يتم اكتشافه وتوجيهه إلى مثبت HuggingFace تلقائياً.
+- **HuggingFace**: الصق معرف مستودع HF لتثبيته. إذا كان هناك نماذج متعددة في المستودع، ستحصل على قائمة للاختيار منها. تبدو معرفات المستودع هكذا: `XpucT/Deliberate`. يوجد زر نسخ في كل مستودع لنسخ المعرف.
+- **مسح مجلد**: امسح مجلداً محلياً بحثاً عن النماذج. يمكنك تثبيت جميع النماذج المكتشفة بنقرة واحدة.
+
+### نماذج Diffusers في مجلدات فرعية لمستودع HF
+
+يمكن تنظيم مستودعات HuggingFace بأي شكل. بعض مؤلفي النماذج يضمون نماذج متعددة داخل نفس المجلد.
+
+في هذه الحالة، قد تحتاج إلى تقديم بعض المعلومات الإضافية لتحديد النموذج الذي تريده، عن طريق إضافة `:subfolder_name` إلى معرف المستودع.
+
+:::note[مثال]
+ لنقل أن لديك معرف مستودع `monster-labs/control_v1p_sd15_qrcode_monster`، والنموذج الذي تريده موجود داخل المجلد الفرعي `v2`.
+
+ أضف `:v2` إلى معرف المستودع واستخدم ذلك عند تثبيت النموذج: `monster-labs/control_v1p_sd15_qrcode_monster:v2`
+:::
+
+[إعداده في ملف الإعدادات]: ../../configuration/invokeai-yaml
+
+## تحرير بيانات النموذج الوصفية
+
+كل نموذج لديه حقل **Source URL** قابل للتحرير بجانب اسمه ووصفه. استخدمه لتسجيل من أين أتى النموذج — على سبيل المثال صفحة Civitai أو HuggingFace — بغض النظر عن كيفية تثبيته أصلاً. الرابط قابل للتحرير من عرض **Edit** للنموذج ويظهر كرابط قابل للنقر في رأس النموذج بمجرد تعيينه. النماذج بدون رابط تخفي الحقل ببساطة.
+
+هذه مجرد بيانات وصفية: الرابط ليس له تأثير على التحميل ولا يستخدم لتحديث أو إعادة تثبيت النموذج. هو مفيد بشكل أساسي للعودة إلى وثائق النموذج أو ترخيصه أو أمثلة أوامره لاحقاً.
+
+## الإجراءات الجماعية في مدير النماذج
+
+يدعم مدير النماذج التحديد المتعدد للعمليات المجمعة.
+
+- **حدد نماذج متعددة** بالنقر مع الضغط على **Ctrl** (ويندوز / لينكس) أو **Cmd** (ماك)، أو باستخدام مربعات الاختيار في كل صف. يظهر رأس ثابت في الأعلى عدد التحديد الحالي ويكون مرئياً دائماً أثناء التمرير.
+- افتح القائمة المنسدلة **Actions** للتحديد. الإجراءات المتاحة هي:
+ - **Delete Models** — يزيل كل نموذج محدد في خطوة تأكيد واحدة. يتم الإبلاغ عن حالات الفشل الجزئي (مثل مشكلات الأذونات) لكل نموذج في إشعار النتيجة.
+ - **Reidentify Models** — يعيد فحص كل نموذج محدد، محدّثاً الحقول التي تعتمد على محتويات الملف (النوع، القاعدة، التنسيق، المتغير، إلخ). هذه هي النسخة المجمعة من إجراء إعادة التعرف لكل نموذج.
+
+:::caution[إعادة التعرف يعيد ضبط الإعدادات المخصصة]
+إعادة التعرف على نموذج يعيد اشتقاق إعداده من الملف على القرص. أي إعدادات مخصصة قمت بتعديلها على تلك النماذج — الإعدادات الافتراضية، الأوصاف، عبارات التشغيل — قد يتم استبدالها. النافذة التأكيدية تحذرك من هذا قبل التشغيل.
+:::
+
+كلا الإجراءين يتعاملان مع حالات الفشل الجزئي: إذا نجحت بعض النماذج وفشل بعضها الآخر، يعرض الإشعار أعداد الناجحين والفاشلين ويتم تحديث عرض القائمة فوراً للنماذج التي نجحت.
+
+## العثور على النماذج اليتيمة
+
+إذا تم حذف ملف نموذج أو نقله خارج مدير النماذج، يبقى إدخال قاعدة البيانات موجوداً. للعثور على هذه الإدخالات اليتيمة:
+
+1. افتح مدير النماذج.
+2. افتح القائمة المنسدلة **type filter** واختر **Missing Files**.
+3. تعرض القائمة الآن فقط النماذج التي لم تعد ملفاتها موجودة على القرص. كل منها يعرض أيضاً شارة **Missing Files** في صفه.
+
+يتم استبعاد النماذج اليتيمة تلقائياً من القوائم المنسدلة للاختيار (النموذج الرئيسي، LoRA، VAE، إلخ)، لذلك لا يمكنك اختيار واحدة عن طريق الخطأ للتوليد. استخدم [إجراء الحذف الجماعي](#bulk-actions-in-the-model-manager) لتنظيفها في خطوة واحدة.
+
+## مزامنة أدلة النماذج اليتيمة
+
+يقوم مرشح **Missing Files** بإيجاد سجلات قاعدة البيانات التي اختفت ملفاتها. لدى InvokeAI أيضاً سير عمل مزامنة منفصل للحالة المعاكسة: أدلة النماذج التي لا تزال موجودة على القرص ولكنها غير مرجعية في قاعدة البيانات.
+
+يمكن أن يحدث هذا بعد استيراد فاشل، أو تعديل يدوي لقاعدة البيانات، أو حذف سجل نموذج مع ترك الملفات وراءه. يقوم سير عمل المزامنة بفحص دليل النماذج بحثاً عن المجلدات ذات المستوى الأعلى التي تحتوي على ملفات نماذج ذات امتدادات نماذج شائعة، بما في ذلك `.safetensors` و `.ckpt` و `.pt` و `.pth` و `.bin` و `.onnx` و `.gguf`.
+
+لمراجعة هذه الأدلة:
+
+1. في وضع متعدد المستخدمين، سجل الدخول كمسؤول. في وضع المستخدم الفردي، تكون عناصر تحكم مدير النماذج متاحة افتراضياً.
+2. افتح مدير النماذج.
+3. انقر فوق **Sync Models** لفحص أدلة النماذج اليتيمة.
+4. راجع كل مسار دليل نسبي تم الإبلاغ عنه، وملفات النموذج الموجودة، والحجم الإجمالي قبل حذف أي شيء.
+
+:::caution[الحذف يزيل الأدلة]
+حذف دليل نموذج يتيم يزيل الدليل بأكمله من القرص. الخادم يحذفه مباشرة مع حذف دليل متكرر، لذا تأكد من أن الدليل يحتوي فقط على الملفات التي تنوي إزالتها.
+:::
+
+يمكن للمسؤولين فقط استخدام سير العمل هذا في وضع متعدد المستخدمين. واجهة API الأساسية هي `/api/v2/models/sync/orphaned`؛ نتائج API تتضمن أيضاً المسار المطلق لكل دليل تم الإبلاغ عنه.
+
+## تصدير واستيراد إعدادات النموذج
+
+كل نموذج مثبت لديه إجراء **Export Settings** و **Import Settings** في مدير النماذج. استخدمها لنسخ إعدادات النموذج احتياطياً، أو نقلها إلى تثبيت آخر، أو مشاركة إعداد منسق مع شخص آخر.
+
+### ما يتم تصديره
+
+ملف `.json` المصدر يلتقط الإعدادات التي قمت بتعيينها على النموذج، وليس أوزان النموذج نفسها:
+
+- `default_settings` — الخطوات، CFG / التوجيه، المجدول، الأبعاد، تبديل تخزين FP8، دقة VAE، إلخ.
+- `trigger_phrases` — لـ LoRAs وما شابه.
+- `cpu_only` — لنماذج نوع المشفر.
+- `name`، `description`، `source_url` — بيانات النموذج التعريفية.
+- `cover_image` — الصورة المصغرة للنموذج، مضمنة كرابط بيانات base64.
+
+يتم حذف الحقول التي لم تقم بتعيينها من الملف. التنسيق متوافق للأمام وللخلف: العملاء الأقدم يتجاهلون الحقول الأحدث، والملف المنتج بواسطة إصدار أحدث لا يزال يستورد بشكل نظيف إلى إصدار أقدم (يتخطى فقط الحقول التي لا يفهمها).
+
+### الاستيراد
+
+الاستيراد يطبق JSON على النموذج المحدد حالياً:
+
+- `default_settings`، `trigger_phrases`، `cpu_only`، `name`، `description`، و `source_url` يتم تطبيقها عبر مسار تحديث النموذج العادي. أي حقل لا يدعمه نوع النموذج الهدف (مثل `cpu_only` على نموذج ليس لديه مثل هذا الإعداد) يتم إدراجه في إشعار "تم التخطي" — كل شيء آخر يتم تطبيقه.
+- `cover_image` يتم رفعه وتعيينه كصورة مصغرة للنموذج.
+
+يتم التحقق من صحة الاستيرادات قبل تشغيلها. يتم رفض الملف إذا كان `source_url` ليس رابط `http(s)://` أو إذا كانت `cover_image` ليست رابط صورة بيانات صالحاً — لذلك لا يمكن لملف تالف أو معدل يدوياً أن يسمم إعدادات النموذج بهدوء.
+
+### سير العمل النموذجي
+
+- **انسخ احتياطياً نموذجاً قضيت وقتاً في ضبطه** حتى تتمكن من استعادة إعداداته بعد إعادة التثبيت، أو التراجع بعد التجربة.
+- **انسخ الإعدادات بين تثبيتين لنفس النموذج** — مثلاً بين كمبيوتر مكتبي ومحطة عمل.
+- **شارك إعداداً منسقاً** (الاسم، الوصف، الصورة المصغرة، الخطوات الافتراضية / CFG / المجدول، عبارات التشغيل) لنموذج قمت بتكوينه جيداً.
diff --git a/docs/src/content/docs/ar/concepts/nodes-workflows.mdx b/docs/src/content/docs/ar/concepts/nodes-workflows.mdx
new file mode 100644
index 00000000000..9bfbe145793
--- /dev/null
+++ b/docs/src/content/docs/ar/concepts/nodes-workflows.mdx
@@ -0,0 +1,29 @@
+---
+title: العقود وسير العمل
+sidebar:
+ order: 7
+---
+
+import { Card, CardGrid } from '@astrojs/starlight/components';
+
+## ما هي العقود؟
+
+**العقدة** هي ببساطة عملية واحدة تأخذ مدخلات وتعيد مخرجات. يمكن ربط عدة عقد معاً لإنشاء وظائف أكثر تعقيداً. جميع ميزات InvokeAI تضاف من خلال العقد.
+
+باستخدام العقد، يمكنك بسهولة توسيع قدرات توليد الصور في InvokeAI وبناء سير عمل يناسب احتياجاتك الخاصة.
+
+### تشريح العقدة
+
+تتكون العقد الفردية مما يلي:
+
+
+
+ نقاط اتصال على **الجانب الأيسر** من نافذة العقدة حيث توصل المخرجات من العقد الأخرى.
+
+
+ نقاط اتصال على **الجانب الأيمن** من نافذة العقدة حيث توصل بمدخلات العقد الأخرى.
+
+
+ خيارات متنوعة يتم تكوينها يدوياً، أو تجاوزها بتوصيل مخرج من عقدة أخرى بالمدخل.
+
+
diff --git a/docs/src/content/docs/ar/concepts/parameters.mdx b/docs/src/content/docs/ar/concepts/parameters.mdx
new file mode 100644
index 00000000000..91b99fb221e
--- /dev/null
+++ b/docs/src/content/docs/ar/concepts/parameters.mdx
@@ -0,0 +1,143 @@
+---
+title: معلمات التوليد
+lastUpdated: 2026-02-20
+sidebar:
+ order: 6
+---
+
+import { Card, CardGrid, Steps } from '@astrojs/starlight/components';
+
+# تقارب العيّنات
+
+مع استمرار زيادة الميزات، قد يصبح اتخاذ الخيارات الصحيحة لاحتياجاتك أكثر صعوبة. أي عيّنة تستخدم؟ ولأي عدد من الخطوات؟ هل تغير قيمة CFG؟ هل تستخدم ترجيح الأوامر؟ هل تسمح بالتنويعات؟
+
+حتى بعد الحصول على نتيجة، هل تمزجها مع صور أخرى؟ تمررها عبر `img2img`؟ وبأي قوة؟ هل تستخدم inpainting لتصحيح التفاصيل الصغيرة؟ Outpainting لتمديد الأقسام المقتطعة؟
+
+الغرض من هذه السلسلة من المستندات هو مساعدتك على فهم هذه الأدوات بشكل أفضل، حتى تتمكن من الاستفادة القصوى منها. لا تتردد في المساهمة باكتشافاتك الخاصة!
+
+في هذا المستند، سنتحدث عن **تقارب العيّنات**.
+
+
+ هل تبحث عن نسخة مختصرة؟ إليك الملخص:
+
+ - تتقارب النتائج مع زيادة الخطوات (`-s`) (باستثناء `K_DPM_2_A` و `K_EULER_A`). غالباً عند ≥ `-s100`، لكن قد تتطلب ≥ `-s700`.
+ - إنتاج مجموعة من الصور المرشحة بأعداد خطوات منخفضة (`-s8` إلى `-s30`) يمكن أن يوفر لك ساعات من الحساب.
+ - `K_HEUN` و `K_DPM_2` يتقاربان في خطوات أقل (لكنهما أبطأ لكل خطوة).
+ - `K_DPM_2_A` و `K_EULER_A` يدمجان الكثير من الإبداع والتنوع.
+
+
+## نظرة عامة على أداء العيّنات
+
+
+
+ *(تم الاختبار على M1 Max 64GB، 512x512، متوسط 3 عينات)*
+
+ | العيّنة | it/s |
+ | :--- | :--- |
+ | `DDIM` | 1.89 |
+ | `PLMS` | 1.86 |
+ | `K_EULER` | 1.86 |
+ | `K_LMS` | **1.91** (الأسرع) |
+ | `K_EULER_A` | 1.86 |
+ | `K_HEUN` | 0.95 *(أبطأ)* |
+ | `K_DPM_2` | 0.95 *(أبطأ)* |
+ | `K_DPM_2_A` | 0.95 *(أبطأ)* |
+
+
+
+ لمعظم حالات الاستخدام، `K_LMS` و `K_HEUN` و `K_DPM_2` هي أفضل الخيارات.
+
+ بينما تعمل `K_HEUN` و `K_DPM_2` بنصف السرعة، فإنها تميل إلى التقارب بضعف سرعة `K_LMS`.
+
+ في الخطوات المنخفضة جداً (≤ `-s8`)، لا يُنصح باستخدام `K_HEUN` و `K_DPM_2`. استخدم `K_LMS` بدلاً من ذلك.
+
+ للتنوع العالي بين الخطوات، استخدم `K_EULER_A` (الذي يعمل بضعف سرعة `K_DPM_2_A`).
+
+
+
+---
+
+## نتائج العيّنات حسب الموضوع
+
+لنبدأ باختيار أمر واستخدامه مع كل من العيّنات الثماني، وتشغيله لـ 10، 20، 30، 40، 50 و 100 خطوة.
+
+### أنمي
+> `"an anime girl" -W512 -H512 -C7.5 -S3031912972`
+
+
+
+على الفور، يمكنك ملاحظة أن النتائج تميل إلى التقارب — أي أنه مع زيادة قيم `-s` (الخطوات)، تصبح الصور أكثر تشابهاً حتى تصل إلى نقطة où لا تتغير الصورة بعدها.
+
+يمكنك أيضاً ملاحظة كيف أن `DDIM` و `PLMS` تميلان في النهاية إلى التقارب مع نتائج عيّنات K مع زيادة الخطوات. بين عيّنات K، يبدو أن `K_HEUN` و `K_DPM_2` تتطلبان أقل عدد من الخطوات للتقارب، وحتى في أعداد الخطوات المنخفضة تكون مؤشرات جيدة للنتيجة النهائية. أخيراً، يبدو أن `K_DPM_2_A` و `K_EULER_A` تفعلان شيئاً خاصاً بهما ولا تحتفظان بكثير من التشابه مع بقية العيّنات.
+
+### طبيعة
+الآن، تبدو هذه النتائج مثيرة للاهتمام، لكن هل تنطبق على موضوعات أخرى؟ لنجرب!
+
+> `"valley landscape wallpaper, d&d art, fantasy, painted, 4k, high detail, sharp focus, washed colors, elaborate excellent painted illustration" -W512 -H512 -C7.5 -S1458228930`
+
+
+
+مع الطبيعة، يمكنك رؤية كيف أن النتائج الأولية هي مؤشر أكبر للنتيجة النهائية — أكثر من الشخصيات/الأشخاص. `K_HEUN` و `K_DPM_2` هما مرة أخرى أسرع المؤشرات، تقريباً من البداية. النتائج تتقارب أيضاً بشكل أسرع (مثلاً، `K_HEUN` تقاربت عند `-s21`).
+
+### طعام
+> `"a hamburger with a bowl of french fries" -W512 -H512 -C7.5 -S4053222918`
+
+
+
+مرة أخرى، `K_HEUN` و `K_DPM_2` تأخذان أقل عدد من الخطوات لتكونا مؤشرات جيدة للنتيجة النهائية. `K_DPM_2_A` و `K_EULER_A` يبدو أنهما يدمجان الكثير من الإبداع/التنوع، قادرتان على إنتاج هامبرغر فاسد، ولكن أيضاً إضافة الخس إلى المزيج. وهما العيّنتان الوحيدتان اللتان أنتجتا 'وعاء بطاطس مقلية' فعلياً!
+
+### حيوانات
+> `"grown tiger, full body" -W512 -H512 -C7.5 -S3721629802`
+
+
+
+`K_HEUN` و `K_DPM_2` تتطلبان مرة أخرى أقل عدد من الخطوات لتكونا مؤشرتين للنتيجة النهائية (حوالي `-s30`)، بينما العيّنات الأخرى لا تزال تعاني من عدة ذيول أو أرجل خلفية مشوهة.
+
+كما يستغرق التقارب وقتاً أطول (للمقارنة، تطلبت `K_HEUN` حوالي 150 خطوة للتقارب). هذا طبيعي، لأن إنتاج وجوه/أجسام البشر/الحيوانات هو أحد الأشياء التي يعاني منها النموذج أكثر من غيره. بالنسبة لهذه المواضيع، فإن التشغيل لخطوات أكثر سيزيد غالباً من التماسك داخل التكوين.
+
+### أشخاص
+> `"Ultra realistic photo, (Miranda Bloom-Kerr), young, stunning model, blue eyes, blond hair, beautiful face, intricate, highly detailed, smooth, art by artgerm and greg rutkowski and alphonse mucha, stained glass" -W512 -H512 -C7.5 -S2131956332`. *(هذه المرة، سنصل إلى 300 خطوة).*
+
+
+
+بمراقبة النتائج، يستغرق الأمر مرة أخرى وقتاً أطول لجميع العيّنات للتقارب (`K_HEUN` استغرقت حوالي 150 خطوة)، لكن يمكننا ملاحظة نتائج مؤشرة جيدة في وقت أبكر بكثير (انظر: `K_HEUN`). على العكس، `DDIM` و `PLMS` لا تزالان تخضعان لتغييرات معتدلة (انظر: الدانتيل حول رقبتها)، حتى عند `-s300`.
+
+في الواقع، كما نرى في هذه التجربة الأخرى، يمكن لبعض العيّنات أن تستغرق 700+ خطوة للتقارب عند توليد الأشخاص.
+
+
+
+لاحظ أيضاً أن نقطة التقارب قد لا تكون الحالة الأكثر Desirability (مثلاً، قد تفضل نسخة أقدم من الوجه تكون أكثر استدارة)، لكنها ستكون على الأرجح الأكثر تماسكاً فيما يتعلق بخصائص الذراعين/اليدين/الوجه. يمكنك دائماً دمج الصور المختلفة باستخدام أداة تحرير الصور وتمريرها عبر `img2img` لتنعيم التكوين.
+
+---
+
+## تسريع التوليد الجماعي
+
+هذا الإدراك حول التقارب مفيد جداً لأنه يعني أنك لست بحاجة إلى إنشاء مجموعة من 100 صورة (`-n100`) عند `-s100` فقط لاختيار صورتين أو 3 صور مفضلة لديك.
+
+يمكنك إنتاج نفس 100 صورة عند `-s10` إلى `-s30` باستخدام عيّنة K (لأنها تتقارب بشكل أسرع)، والحصول على فكرة تقريبية عن النتيجة النهائية، واختيار صورتين أو 3 صور مفضلة لديك، ثم تشغيل `-s100` على تلك الصور المحددة لصقل التفاصيل. هذه التقنية **أسرع بـ 3-8 مرات**.
+
+:::tip[مثال على توفير الوقت]
+ بافتراض 60 ثانية لكل 100 خطوة:
+
+ - **الطريقة أ:** 60ث * 100 صورة = **6000ث** (100 صورة عند `-s100`، اختيار 3 مفضلات يدوياً). الوقت الإجمالي: **ساعة و 40 دقيقة.**
+ - **الطريقة ب:** 6ث * 100 صورة + 60ث * 3 صور = **780ث** (100 صورة عند `-s10`، اختيار 3 مفضلات يدوياً، وتشغيل تلك الـ 3 عند `-s100` لصقل التفاصيل). الوقت الإجمالي: **13 دقيقة.**
+:::
+
+## ثلاث نقاط رئيسية
+
+أخيراً، من المهم ذكر أنه، بشكل عام، هناك 3 لحظات مهمة في عملية تكوين الصورة مع زيادة الخطوات:
+
+
+1. **مرحلة المؤشر:**
+ أقرب نقطة تصبح فيها الصورة مؤشراً جيداً للنتيجة النهائية. هذا مفيد للتوليد الجماعي بقيم خطوات منخفضة لمعاينة المخرجات قبل الالتزام بخطوات أعلى.
+2. **مرحلة التماسك:**
+ النقطة التي تصبح فيها الصورة متماسكة، حتى لو كانت مختلفة عن النتيجة النهائية المتقاربة. هذا مفيد للتوليد الجماعي منخفض الخطوات حيث يتم تحسين الجودة عبر تقنيات أخرى (مثل inpainting) بدلاً من عدد الخطوات الخام.
+3. **مرحلة التقارب:**
+ النقطة التي تتقارب فيها الصورة تماماً وتتوقف عن التغير.
+
+
+:::note[سير العمل يحدد الاستراتيجية]
+ تذكر أن سير العمل/الاستراتيجية الخاصة بك يجب أن تحدد العدد الأمثل من الخطوات، حتى لنفس الأمر والبذرة. على سبيل المثال، إذا كنت تسعى للتقارب الكامل، قد تشغّل `K_LMS` لـ `-s200`. ومع ذلك، تشغيل `K_LMS` لـ `-s20` (باعتبار الوقت عشر الوقت) قد يؤدي بشكل جيد بنفس القدر إذا كان سير عملك يتضمن إضافة تفاصيل صغيرة مفقودة عبر `img2img`.
+:::
+
+
diff --git a/docs/src/content/docs/ar/concepts/prompt-syntax.mdx b/docs/src/content/docs/ar/concepts/prompt-syntax.mdx
new file mode 100644
index 00000000000..66da3344317
--- /dev/null
+++ b/docs/src/content/docs/ar/concepts/prompt-syntax.mdx
@@ -0,0 +1,138 @@
+---
+title: صياغة الأوامر
+lastUpdated: 2026-03-30
+sidebar:
+ order: 3
+---
+
+import { Card, LinkCard, CardGrid } from '@astrojs/starlight/components';
+
+
+
+
+
+
+
+يدعم InvokeAI ترجيح الأوامر على نمط Compel ودوال الأوامر لسير عمل تهيئة النص لـ `SD 1.5` و `SDXL`. عائلات النماذج الأحدث، بما في ذلك `FLUX` و `Z-Image` و `CogView4` و `Qwen Image`، تتجاوز Compel ولا تستخدم الصياغة الموثقة في هذه الصفحة. توثق هذه الصفحة الصياغة لسير عمل Compel فقط. إذا كنت تريد نصائح عامة حول كتابة أوامر أفضل، ابدأ بـ [دليل الصياغة](../prompting-guide).
+
+:::note[ملاحظة التوافق]
+ إذا بدا أن أمراً مرجحاً يتم تجاهله، تحقق مما إذا كنت تستخدم سير عمل `SD 1.5` أو `SDXL`. صياغة Compel في هذه الصفحة لا تنطبق على عائلات النماذج الأحدث مثل `FLUX` و `Z-Image` و `CogView4` و `Qwen Image`.
+:::
+
+## مرجع سريع
+
+
+ - زيادة كلمة واحدة: `trees+`
+ - تقليل كلمة واحدة: `fog-`
+ - ترجيح عبارة: `(golden hour light)+`
+ - استخدام وزن عددي دقيق: `(cinematic lighting)1.25`
+ - ترجيح متداخل: `(portrait with (blue eyes)1.3)1.1`
+ - مزج الأوامر: `("portrait photo", "oil painting").blend(0.7, 0.3)`
+ - ربط الجمل: `("red silk dress", "studio portrait", "soft rim light").and()`
+ - تخطي الأقواس الحرفية: `colored pencil \(medium\)`
+
+
+## ترجيح الانتباه بـ `+` و `-`
+
+ألحق `+` لزيادة التأثير، أو `-` لتقليله.
+
+```text
+freckles+
+background crowd-
+(soft rim light)++
+```
+
+قواعد عامة:
+
+- يمكن ترجيح الكلمات المفردة مباشرة.
+- يجب وضع العبارات متعددة الكلمات بين قوسين.
+- كل `+` إضافية تزيد الترجيح للأعلى.
+- كل `-` إضافية تقلل الترجيح للأسفل بخطوات تقريبية 10%.
+
+:::tip[ابدأ صغيراً]
+ خطوة أو خطوتان عادة ما تكون كافية. الترجيح المفرط يمكن أن يطغى على باقي الأمر.
+:::
+
+## الأوزان العددية
+
+استخدم الأوزان العددية عندما تريد تحكماً دقيقاً بدلاً من علامات الزائد أو الناقص المتكررة.
+
+```text
+(cinematic lighting)1.25
+(background crowd)0.8
+(sharp focus)1.1
+```
+
+إرشادات:
+
+- `1` محايد.
+- القيم الأكبر من `1` تزيد التركيز.
+- القيم بين `0` و `1` تقلل التركيز.
+- ضع العبارة المرجحة بين قوسين.
+
+## التجميع والتداخل
+
+يمكنك تجميع العبارات وتطبيق وزن على المجموعة بأكملها، ثم تداخل عبارة مرجحة أخرى داخلها.
+
+```text
+(portrait with (blue eyes)1.3)1.1
+```
+
+في هذا المثال، المجموعة الخارجية تقوي العبارة بأكملها، والمجموعة الداخلية تعطي `blue eyes` تركيزاً أكبر.
+
+## مزج الأوامر بـ `.blend()`
+
+استخدم `.blend()` لمزج معنى أمرين أو أكثر.
+
+```text
+("portrait photo, 85mm lens", "oil painting, visible brushstrokes").blend(0.7, 0.3)
+```
+
+هذا مفيد جداً لدمج المفاهيم أو الأنماط التي تريد موازنتها عن قصد.
+
+نصائح:
+
+- قدم وزناً واحداً لكل وسيط أمر.
+- إبقاء الأوزان قريبة من مجموع `1` يجعل النتيجة أسهل للتحليل.
+- الوسائط المقتبسة هي الخيار الأكثر أماناً، خاصة عندما تحتوي الأوامر على فواصل.
+
+## دمج الجمل بـ `.and()`
+
+استخدم `.and()` عندما تريد جمل أوامر منفصلة مشفرة بشكل فردي بدلاً من جملة واحدة طويلة مفصولة بفواصل.
+
+```text
+("red silk dress", "studio portrait", "soft rim light").and()
+```
+
+يمكن أن يتصرف هذا بشكل مختلف عن:
+
+```text
+red silk dress, studio portrait, soft rim light
+```
+
+إذا كان الأمر العادي يدمج الأفكار معاً باستمرار، فإن `.and()` تستحق الاختبار.
+
+## تخطي الأقواس الحرفية
+
+يتم التعامل مع الأقواس غير المخطوطة كصياغة أمر. إذا كنت تريد أقواساً فعلية في النص، قم بتخطيها بخطوط مائلة عكسية.
+
+```text
+colored pencil \(medium\)
+portrait \(realistic\) (high quality)1.2
+A bear \(with razor-sharp teeth\) in a forest
+```
+
+استخدم الأقواس غير المخطوطة فقط عندما تقصد التجميع أو الترجيح.
+
+## الصفحات ذات الصلة
+
+- للحصول على نصائح عملية لكتابة الأوامر، اقرأ [دليل الصياغة](../prompting-guide).
+- لتوسيع الأوامر والتباديل، اقرأ [الأوامر الديناميكية](../dynamic-prompting).
diff --git a/docs/src/content/docs/ar/concepts/prompting-guide.mdx b/docs/src/content/docs/ar/concepts/prompting-guide.mdx
new file mode 100644
index 00000000000..df300aaefc7
--- /dev/null
+++ b/docs/src/content/docs/ar/concepts/prompting-guide.mdx
@@ -0,0 +1,180 @@
+---
+title: دليل الصياغة
+lastUpdated: 2026-03-30
+sidebar:
+ order: 2
+---
+
+import { Card, CardGrid, Steps, LinkCard } from '@astrojs/starlight/components';
+
+
+
+
+
+
+
+تعمل الصياغة في InvokeAI بشكل أفضل عندما تصف الصورة بوضوح، ثم تقوم بتحسين الأجزاء المهمة فقط. تركز هذه الصفحة على العادات العملية لكتابة الأوامر.
+
+
+
+ ابدأ بالشيء الرئيسي الذي تريد رؤيته: شخصية، كائن، مشهد، أو حركة.
+
+
+ أضف اللغة البصرية: تصوير فوتوغرافي، ألوان مائية، لوحة زيتية، عرض ثلاثي الأبعاد، رسم أنمي، وهكذا.
+
+
+ صف زاوية الكاميرا، التأطير، الإضاءة، البيئة، لوحة الألوان، أو المزاج الذي سيشكل الصورة.
+
+
+ أضف بعض مؤشرات الجودة عالية القيمة مثل نسيج القماش، عمق المجال الضحل، نسيج البشرة الطبيعي، أو فرشاة الرسم الفنية.
+
+
+
+نمط بسيط يعمل بشكل جيد هو:
+
+`الموضوع، النمط أو الوسيط، الإضاءة أو التكوين، بعض التفاصيل المهمة`
+
+ليس كل أمر يحتاج كل فئة. ابدأ ببساطة، ثم أضف التفاصيل فقط عندما يحتاج النموذج إلى مزيد من التوجيه.
+
+## الأوامر الإيجابية والسلبية
+
+
+
+ استخدم الأمر الإيجابي لوصف ما تريد أن ينشئه النموذج. ضع الفكرة الأكثر أهمية في البداية واجعل الصياغة ملموسة.
+
+
+ استخدم الأمر السلبي لإزالة المشكلات المتكررة أو السمات غير المرغوب فيها. اجعله قصيراً ومركزاً بدلاً من لصق قائمة ضخمة في كل عملية توليد.
+
+
+
+عادةً ما تذكر الأوامر السلبية الجيدة أنماط الفشل المحددة: `ضبابي`، `أيدي مشوهة`، `تفاصيل منخفضة`، `أطراف زائدة`.
+
+:::tip[الأوامر السلبية قوية]
+ يمكن للمصطلح السلبي أن يثبط المفاهيم المجاورة أيضاً. إذا نفيت شيئاً واسعاً مثل `أخضر` أو `طحلب`، فقد تضعف أيضاً العشب، أوراق الشجر، أو أفكار أخرى ذات صلة.
+:::
+
+## سير عمل عملي للصياغة
+
+
+ 1. ابدأ بالصورة الأساسية
+
+ اكتب أوضح نسخة من الصورة التي تريدها قبل إضافة الإضافات الأسلوبية.
+
+ 2. أضف النمط والتكوين
+
+ بمجرد أن يصبح الموضوع صحيحاً، أضف الوسيط، العدسة، الإضاءة، المزاج، الخلفية، أو تفاصيل التأطير.
+
+ 3. اختبر ببذرة ثابتة
+
+ عندما تتعلم تأثير تغيير الأمر، حافظ على ثبات البذرة لتتمكن من مقارنة النتائج مباشرة.
+
+ 4. غيّر شيئاً واحداً في كل مرة
+
+ إذا أضفت خمسة مصطلحات جديدة دفعة واحدة، لن تعرف أي منها ساعد.
+
+ 5. تصعّد فقط عند الحاجة
+
+ إذا كانت النتيجة قريبة لكن عنصراً واحداً ضعيف جداً أو قوي جداً، انتقل إلى [صياغة الأوامر](../prompt-syntax) للترجيح. إذا كنت تريد الكثير من التنويعات، استخدم [الأوامر الديناميكية](../dynamic-prompting).
+
+
+إليك نفس الفكرة مكررة على مراحل:
+
+```text
+صورة شخصية لامرأة
+
+صورة شخصية لامرأة، تصوير استوديو، إضاءة رئيسية ناعمة
+
+صورة شخصية لامرأة، تصوير استوديو، إضاءة رئيسية ناعمة، عدسة 85mm، عمق مجال ضحل، نسيج بشرة طبيعي
+```
+
+## اكتب للنموذج الذي تستخدمه
+
+يمكن أن يتصرف نفس الأمر بشكل مختلف جداً عبر النماذج المختلفة.
+
+- النماذج الموجهة للصور تستجيب جيداً للغة الكاميرا، العدسة، الإضاءة، والنسيج.
+- نماذج الرسوم التوضيحية غالباً ما تستجيب بشكل أفضل للوسيط، التوجيه الفني، ولغة الشكل.
+- النماذج التخصصية قد تتوقع كلمات تشغيل محددة، موضوعات، أو أنماط من بطاقة النموذج الخاصة بها.
+- إذا كان الأمر يعمل بشكل جميل على نموذج وضعيف على آخر، فهذا لا يعني دائماً أن الأمر سيء. قد يتحدث النموذج لغة بصرية مختلفة.
+
+## متى تساعد الصياغة المتقدمة
+
+استخدم الصياغة المتقدمة عندما يكون الأمر العادي المفصول بفواصل صحيحاً تقريباً، لكنك تحتاج تحكماً أكبر.
+
+- استخدم [صياغة الأوامر](../prompt-syntax) عندما يحتاج مصطلح ما إلى تأثير أكثر أو أقل.
+- استخدم `.blend()` عندما تريد مزج المفاهيم أو الأنماط عن قصد.
+- استخدم `.and()` عندما تريد جمل أوامر منفصلة مشفرة بشكل فردي.
+- استخدم [الأوامر الديناميكية](../dynamic-prompting) عندما تريد العديد من تنويعات الأوامر من قالب واحد.
+
+## الأخطاء الشائعة
+
+- حشر العديد من الأفكار غير المرتبطة في أمر واحد.
+- استخدام قوائم كلمات جودة عامة طويلة قبل معرفة أن الأمر الأساسي يعمل.
+- التعامل مع الأمر السلبي كسلة مهملات لكل نتيجة سيئة.
+- توقع سلوك متطابق عبر النماذج، المجدولات، وسير العمل.
+- تغيير الأمر، النموذج، البذرة، والإعدادات كلها مرة واحدة أثناء استكشاف الأخطاء.
+
+## أمثلة على الأوامر
+
+### صورة شخصية فوتوغرافية
+
+**الأمر الإيجابي**
+
+```text
+صورة شخصية تحريرية لامرأة في معطف فحمي، تصوير استوديو، إضاءة رئيسية ناعمة، إضاءة حافة خفيفة، عدسة 85mm، عمق مجال ضحل، نسيج بشرة طبيعي
+```
+
+**الأمر السلبي**
+
+```text
+ضبابي، تفاصيل منخفضة، بشرة شمعية، أصابع زائدة
+```
+
+### فن مفهوم البيئة
+
+**الأمر الإيجابي**
+
+```text
+معبد حجري قديم مبني في جانب جرف، فن مفهوم خيالي، شروق شمس ضبابي، مقياس شامخ، درج مغطى بالطحلب، جو سينمائي
+```
+
+**الأمر السلبي**
+
+```text
+إضاءة مسطحة، تباين منخفض، تفاصيل موحلة
+```
+
+### عرض على نمط المنتج
+
+**الأمر الإيجابي**
+
+```text
+إبريق شاي سيراميك أنيق على سطح حجري غير لامع، تصوير منتجات، إضاءة استوديو نظيفة، ظل ناعم، تفاصيل عالية، خلفية بسيطة
+```
+
+**الأمر السلبي**
+
+```text
+خلفية مزدحمة، تشوه، كائنات مكررة
+```
+
+### رسم توضيحي منمق
+
+**الأمر الإيجابي**
+
+```text
+ثعلب ساعي يعبر شارع مدينة ممطر، رسم توضيحي لكتاب قصص، أشكال جريئة، لافتات متاجر متوهجة، رصيف عاكس، تباين ألوان دافئة وباردة
+```
+
+**الأمر السلبي**
+
+```text
+واقعي فوتوغرافياً، ألوان باهتة، تفاصيل منخفضة
+```
diff --git a/docs/src/content/docs/ar/configuration/docker.mdx b/docs/src/content/docs/ar/configuration/docker.mdx
new file mode 100644
index 00000000000..fc6653b3831
--- /dev/null
+++ b/docs/src/content/docs/ar/configuration/docker.mdx
@@ -0,0 +1,95 @@
+---
+title: دوكر (Docker)
+---
+
+import { Aside, Tabs, TabItem } from '@astrojs/starlight/components'
+
+import SystemRequirementsLink from '@components/SystemRequirmentsLink.astro'
+
+
+
+:::note[أنظمة التشغيل ودعم GPU]
+
+
+ يتضمن Docker Desktop على ويندوز [دعم GPU](https://www.docker.com/blog/wsl-2-gpu-support-for-docker-desktop-on-nvidia-gpus/).
+
+
+ لا يمكن لـ Docker الوصول إلى GPU على macOS، لذا ستكون سرعات التوليد لديك بطيئة. استخدم [المشغل](../../start-here/installation) بدلاً من ذلك.
+
+
+ قم بتهيئة Docker للوصول إلى GPU الخاص بجهازك.
+ اتبع وثائق [NVIDIA](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) أو [AMD](https://rocm.docs.amd.com/projects/install-on-linux/en/latest/how-to/docker.html).
+
+
+:::
+
+## خلاصة
+
+تأكد من أن إعداد Docker الخاص بك قادر على استخدام GPU الخاص بك. ثم:
+
+```bash
+docker run --runtime=nvidia --gpus=all --publish 9090:9090 ghcr.io/invoke-ai/invokeai
+```
+
+بمجرد بدء تشغيل الحاوية، افتح [http://localhost:9090](http://localhost:9090) في متصفحك، وقم بتثبيت بعض النماذج، وابدأ التوليد.
+
+## البناء بنفسك
+
+جميع مواد Docker موجودة داخل دليل [docker](https://github.com/invoke-ai/InvokeAI/tree/main/docker) في مستودع Git.
+
+```bash
+cd docker
+cp .env.sample .env
+docker compose up
+```
+
+نقوم أيضاً بتوفير البرنامج النصي المساعد `run.sh`. راجع ملف `docker/README.md` للحصول على تعليمات مفصلة حول كيفية تخصيص إعداد Docker لاحتياجاتك.
+
+### المتطلبات الأساسية
+
+#### تثبيت [Docker](https://github.com/santisbon/guides#docker)
+
+على تطبيق [Docker Desktop](https://docs.docker.com/get-docker/)، اذهب إلى `Preferences` -> `Resources` -> `Advanced`. قم بزيادة CPUs والذاكرة لتجنب هذه [المشكلة](https://github.com/invoke-ai/InvokeAI/issues/342). قد تحتاج أيضاً إلى زيادة Swap وحجم صورة القرص.
+
+### الإعداد
+
+قم بإعداد متغيرات البيئة الخاصة بك. في دليل `docker`، انسخ `.env.sample` وسمِّه `.env`. قم بإجراء التغييرات حسب الحاجة.
+
+يمكن تعيين أي متغيرات بيئة يدعمها InvokeAI هنا — يرجى مراجعة [وثائق التكوين](/configuration/invokeai-yaml/) لمزيد من التفاصيل.
+
+على الأقل، قد ترغب في تعيين متغير البيئة `INVOKEAI_ROOT`
+للإشارة إلى الموقع الذي ترغب في تخزين نماذج InvokeAI والتكوين والمخرجات فيه.
+
+| متغير البيئة | القيمة الافتراضية | الوصف |
+| --- | --- | --- |
+| `INVOKEAI_ROOT` | `~/invokeai` | **مطلوب** - موقع دليل InvokeAI الجذر الخاص بك. سيتم إنشاؤه إذا لم يكن موجوداً. |
+| `HUGGING_FACE_HUB_TOKEN` | | سيعمل InvokeAI بدونه، لكن بعض التكاملات مع HuggingFace (مثل التنزيل من المستودعات الخاصة) قد لا تعمل |
+| `GPU_DRIVER` | `cuda` | يمكنك تغييره اختيارياً إلى `rocm` لبناء الصورة لوحدات AMD GPU. ملاحظة: استخدم البرنامج النصي `build.sh` لبناء الصورة حتى يسري هذا التغيير. |
+
+#### بناء الصورة
+
+استخدم الأمر القياسي `docker compose build` من داخل دليل `docker`.
+
+إذا كنت تستخدم AMD GPU:
+أ: قم بتعيين متغير البيئة `GPU_DRIVER=rocm` في ملف `docker-compose.yml` واستمر في استخدام `docker compose build` كالمعتاد، أو
+ب: قم بتعيين `GPU_DRIVER=rocm` في ملف `.env` واستخدم البرنامج النصي `build.sh`، المقدم للراحة
+
+#### تشغيل الحاوية
+
+استخدم الأمر القياسي `docker compose up`، وبشكل عام [CLI](https://docs.docker.com/compose/reference/) الخاص بـ `docker compose` كالمعتاد.
+
+بمجرد بدء تشغيل الحاوية (وتكوين دليل InvokeAI الجذر إذا كان هذا تثبيتاً جديداً)، يمكنك الوصول إلى InvokeAI على [http://localhost:9090](http://localhost:9090)
+
+## استكشاف الأخطاء وإصلاحها / الأسئلة الشائعة
+
+
+ "أنا أشغل Windows تحت WSL2، وأرى خطأ 'no such file or directory'."
+
+ قد يحتوي ملف `docker-entrypoint.sh` الخاص بك على نهايات أسطر Windows (CRLF)، اعتماداً على كيفية استنساخك للمستودع.
+ لحل هذا، قم بتغيير نهايات الأسطر في ملف `docker-entrypoint.sh` إلى `LF`. يمكنك فعل ذلك في VSCode
+ (`Ctrl+P` وابحث عن "line endings")، أو باستخدام أداة `dos2unix` في WSL.
+ أخيراً، يمكنك حذف `docker-entrypoint.sh` متبوعاً بـ `git pull; git checkout docker/docker-entrypoint.sh`
+ لإعادة ضبط الملف إلى أحدث إصدار له.
+ لمزيد من المعلومات حول هذه المشكلة، راجع [وثائق Docker Desktop](https://docs.docker.com/desktop/troubleshoot/topics/#avoid-unexpected-syntax-errors-use-unix-style-line-endings-for-files-in-containers)
+
+
diff --git a/docs/src/content/docs/ar/configuration/fp8-storage.mdx b/docs/src/content/docs/ar/configuration/fp8-storage.mdx
new file mode 100644
index 00000000000..e46ae452e5b
--- /dev/null
+++ b/docs/src/content/docs/ar/configuration/fp8-storage.mdx
@@ -0,0 +1,128 @@
+---
+title: تخزين FP8
+sidebar:
+ order: 3
+---
+
+import { Steps } from '@astrojs/starlight/components';
+
+يقلل تخزين FP8 من بصمة VRAM للنموذج بمقدار النصف تقريباً عن طريق الاحتفاظ بالأوزان على GPU بتنسيق النقطة العائمة 8 بت (`float8_e4m3fn`). أثناء الاستدلال، يتم تحويل أوزان كل طبقة أثناء التشغيل مرة أخرى إلى دقة الحساب (FP16/BF16)، ثم يتم تحويلها مرة أخرى إلى FP8 بعد التمرير الأمامي — وبالتالي يتم الحفاظ على الجودة إلى حد كبير.
+
+يتناسب بشكل جيد مع [وضع الذاكرة المنخفضة](/configuration/low-vram-mode/): وضع الذاكرة المنخفضة يدفق الطبقات بين RAM و VRAM، بينما تخزين FP8 يقلص الطبقات نفسها.
+
+:::caution[لنماذج الدقة الكاملة فقط]
+ينطبق تخزين FP8 فقط على نماذج **الدقة الكاملة** (FP16 / BF16 / FP32). إنه **بدون تأثير صامت** للتنسيقات المضغوطة بالفعل — نماذج **GGUF** و **NF4** و **int8** تحمل دقة التخزين الخاصة بها ويعيد المُحمّل نوع وحدة مختلف لا تلمسه طبقة تحويل FP8. إذا كان نموذجك مضغوطاً بالفعل، فإن المبدّل ليس له أي تأثير؛ استخدم متغير الدقة الكاملة للنموذج إذا كنت ترغب في تفعيل تخزين FP8.
+:::
+
+## المتطلبات
+
+- **GPU من Nvidia على ويندوز أو لينكس.** يستخدم تخزين FP8 أنواع موترات CUDA ويتم تعطيله صامتاً على CPU و MPS.
+- **CUDA 12.x و PyTorch حديث.** تمت إضافة نوع البيانات `float8_e4m3fn` في PyTorch 2.1 — الإصدارات المرفقة مع InvokeAI تحقق هذا الشرط.
+
+لا يوجد متطلب أجهزة لـ *حساب* FP8 — يقوم InvokeAI بتحويل النتيجة مرة أخرى إلى FP16/BF16 للعمليات الحسابية. هذا يعني أن تخزين FP8 يعمل على وحدات GPU التي لا تدعم أصلاً ضرب المصفوفات FP8 (مثل سلسلة RTX 30)، بتكلفة إنتاجية بسيطة لكل خطوة.
+
+## مستويات دعم الأجهزة
+
+يقوم مسار FP8 في InvokeAI بتخزين الأوزان بتنسيق FP8 وتحويلها مرة أخرى إلى BF16/FP16 في كل تمرير أمامي عبر أغلفة `register_forward_pre_hook` / `register_forward_hook` الخاصة به (نفس قائمة التخطي مثل `apply_layerwise_casting` في diffusers، ولكن مطبقة على كل `nn.Module` — بما في ذلك فئات `ModelMixin` الفرعية في diffusers — بحيث تتركب بشكل صحيح مع `CustomLinear` والتحميل الجزئي في InvokeAI). الفائدة العملية لتفعيل تخزين FP8 تعتمد على ما يمكن لـ GPU الخاص بك فعله أصلاً. هناك ثلاث مستويات:
+
+### سلسلة RTX 30 وبطاقات عمل Ampere الأقدم — كسب VRAM فقط
+
+يعمل المبدّل كما هو معلن: ينخفض UNet / المحول بحوالي 50% على GPU. زمن الانتظار لكل خطوة هو نفسه أو أبطأ قليلاً لأن كل تمرير أمامي يضيف تحويل FP8 → BF16 عند الدخول وتحويل BF16 → FP8 عند الخروج. هذه **أكبر مجموعة مستهدفة**: مالكو 3090 الذين يضغطون FLUX في 24 GB يستفيدون أكثر.
+
+### سلسلة RTX 40 وسلسلة RTX 50 و Hopper — كسب VRAM اليوم، كسب حسابي محتمل لاحقاً
+
+تمتلك وحدات GPU هذه أنوية FP8 tensor أصلية. المبدّل لا يزال يوفر لك نفس تقليل VRAM بنسبة ~50% اليوم، لأن التمرير الأمامي لا يزال يعمل بـ BF16 — الخطاف يحول الأوزان مرة أخرى إلى دقة الحساب قبل كل طبقة. إذا قام InvokeAI لاحقاً بتوصيل مسار ضرب مصفوفات FP8 حقيقي (مثلاً عبر `torchao`)، فإن نفس المبدّل سيفتح أيضاً تسريعات حسابية على هذه الأجهزة. حتى ذلك الحين، تعامل مع الفائدة كـ "VRAM فقط، نفس Ampere".
+
+### بطاقات CUDA الأقدم — لا يزال كسب VRAM
+
+`float8_e4m3fn` هو نوع تخزين خالص في PyTorch ويعمل على أي جهاز CUDA، لذا فإن البطاقات ما قبل Ampere (سلسلة GTX 16، سلسلة RTX 20، إلخ) تحصل على نفس تقليل VRAM بنسبة ~50% مثل Ampere. لا توجد أنوية FP8 tensor أصلية على وحدات GPU هذه، لذا فإن المفاضلة في الإنتاجية هي نفسها كما في سلسلة 30: تحويل للداخل، حساب بـ BF16/FP16، تحويل للخارج.
+
+### MPS و CPU — بدون تأثير
+
+يتم تعطيل تخزين FP8 صامتاً على أي شيء ليس CUDA. على CPU، يدعم PyTorch *تقنياً* أنواع FP8، لكن عمليات التحويل محاكاة برمجياً وتكلف أكثر مما توفره من توفير في الذاكرة، لذا يقوم InvokeAI بحظر المسار بالكامل على `device.type == "cuda"`. إذا قمت بتفعيله على CPU أو MPS، يتخطى المُحمّل التحويل ويعيد النموذج دون تغيير دون أي سطر في السجل.
+
+## تفعيل تخزين FP8
+
+تخزين FP8 هو **إعداد لكل نموذج**، يتم تكوينه من مدير النموذج:
+
+
+1. افتح **مدير النموذج**.
+2. اختر نموذجاً (رئيسي، ControlNet، أو T2I-Adapter).
+3. ضمن **الإعدادات الافتراضية**، فعّل **تخزين FP8 (توفير VRAM)**.
+4. انقر **حفظ**.
+
+
+يسري الإعداد عند التحميل التالي. إذا كان النموذج موجوداً بالفعل في ذاكرة التخزين المؤقت، يقوم InvokeAI بطرد النسخة المخزنة تلقائياً بحيث يسري الإعداد الجديد — حتى إذا كان التوليد يستخدم النموذج حالياً (يتم تأجيل الطرد حتى انتهاء التوليد).
+
+:::tip[متى يتم التفعيل]
+ فعّل تخزين FP8 على النماذج الكبيرة التي لا تناسب VRAM بشكل مريح — FLUX dev/Klein، نماذج SDXL الكبيرة، محولات ControlNet-XL. بالنسبة لنماذج SD1 / SD2 الأصغر، التوفير لا يُذكر ولا يستحق المفاضلة الصغيرة في الدقة.
+:::
+
+## ما ينطبق عليه تخزين FP8
+
+يتم تطبيق تخزين FP8 **فقط** على الطبقات حيث المفاضلة في الدقة مقبولة:
+
+| نوع النموذج | هل يتم تطبيق FP8؟ |
+| ----------------------------- | -------------------------------------- |
+| النماذج الرئيسية (SD1, SD2, SDXL) | نعم |
+| FLUX.1 / FLUX.2 Klein | نعم |
+| ControlNet, T2I-Adapter | نعم |
+| VAE | لا — تراجع ملحوظ في جودة فك التشفير |
+| مشفرات النص، محللات الرموز | لا — نماذج صغيرة، لا فائدة |
+| Z-Image (أي متغير) | لا — عدم تطابق dtype مع الطبقات المتخطاة |
+| LoRA, ControlLoRA | لا — يتم تصحيحها في القاعدة، لا تعمل بمفردها |
+
+داخل نموذج مدعوم، **يتم تخطي طبقات المعايير (norm)، وتضمينات الموضع/الرقعة، و `proj_in`/`proj_out`** حتى لا يتم سحق القيم العددية الصغيرة الحساسة للدقة (مثل FLUX `RMSNorm.scale`) إلى FP8. هذا يعكس قائمة التخطي الافتراضية لـ diffusers.
+
+## مفاضلات الجودة
+
+تخزين FP8 هو **قريب من اللافقدان** لمعظم أعباء العمل لأن:
+
+- المعايير والتضمينات (الطبقات الحساسة للدقة) يتم تخطيها.
+- ضرب المصفوفات الفعلي لا يزال يحدث بـ FP16/BF16 — FP8 هو فقط تنسيق التخزين على GPU.
+
+ومع ذلك، تم الإبلاغ عن بعض التشوهات على:
+
+- **VAEs** — لا يتم تحويلها أبداً (المبدّل ليس له تأثير على النماذج الفرعية VAE).
+- **أكوام LoRA الثقيلة** — التصحيح غير متأثر، لكن LoRAs الحساسة جداً للدقة قد تظهر انحرافاً طفيفاً. قارن جنباً إلى جنب إذا كان سير عملك يعتمد على سلوك LoRA الدقيق.
+
+إذا رأيت تراجعاً غير متوقع في الجودة، فعطّل تخزين FP8 على النموذج المتأثر وأعد التشغيل.
+
+## الدمج مع وضع الذاكرة المنخفضة
+
+**FP8 + التحميل الجزئي**: مدعوم بالكامل. تخزين FP8 يقلص الطبقات؛ التحميل الجزئي يدفقها بين RAM و VRAM حسب الحاجة. استخدم كليهما في ميزانيات VRAM المحدودة.
+
+(لمعرفة سبب عدم تراكم تخزين FP8 فوق نماذج GGUF / NF4 / int8، راجع التنبيه في أعلى هذه الصفحة.)
+
+## استكشاف الأخطاء وإصلاحها
+
+### "قمت بتفعيل تخزين FP8 لكن استخدام VRAM لم يتغير"
+
+طرد ذاكرة التخزين المؤقت فوري للنماذج الخاملة، لكن **مؤجل حتى فتح القفل التالي** إذا كان النموذج في منتصف التوليد. انتظر حتى ينتهي التوليد الحالي، ثم ابدأ توليداً جديداً — التحميل التالي سيستخدم الإعداد الجديد.
+
+إذا لم ينخفض VRAM بعد:
+
+- تحقق من سجل InvokeAI بحثاً عن `FP8 layerwise casting enabled for `. إذا لم يكن السطر موجوداً، فإن النموذج في قائمة الاستثناء (VAE، مشفر النص، Z-Image، LoRA — راجع الجدول أعلاه).
+- تأكد من أنك على CUDA. تخزين FP8 معطل صامتاً على CPU و MPS.
+
+### تراجع في الجودة على نموذج معين
+
+عطّل تخزين FP8 لذلك النموذج في مدير النموذج وأعد التحميل. إذا عادت الجودة، فإن النموذج يحتوي على طبقات حساسة لـ FP8 تقع خارج قائمة التخطي الافتراضية. يرجى فتح مشكلة مع اسم النموذج ومقارنة جنباً إلى جنب.
+
+### "RuntimeError: ... float8_e4m3fn ..."
+
+أنت تستخدم إصدار PyTorch يسبق دعم FP8. أعد تثبيت InvokeAI باستخدام المشغل الرسمي — إصدار torch المرفق يدعم FP8.
+
+### الإبلاغ عن مشكلة FP8
+
+إذا أساء تخزين FP8 التصرف — تعطل، تراجع في الجودة، OOM لا ينبغي أن يحدث — يرجى [فتح مشكلة على GitHub](https://github.com/invoke-ai/InvokeAI/issues/new/choose) وتضمين:
+
+- **ما فعلته**: سير العمل / خطوة التوليد التي تسببت في المشكلة، وما إذا كانت تتكرر في كل مرة.
+- **النموذج**: الاسم والمتغير بالضبط (مثل "FLUX.2 Klein 9B Diffusers"، "SDXL Base 1.0 single-file")، وما إذا كان الملف نقطة تفتيش كاملة الدقة أو مضغوطاً بالفعل (GGUF / NF4 / int8).
+- **LoRAs**: ما إذا كانت أي LoRAs (أو ControlLoRAs) مكدسة على النموذج، وكم عددها.
+- **المبدّلات الأخرى**: وضع الذاكرة المنخفضة تشغيل/إيقاف، أي إعداد `cpu_only` لمشفر النص، حد VRAM المهيأ.
+- **GPU**: الطراز وحجم VRAM (مثل "RTX 3090 24 GB"، "RTX 4070 Ti 12 GB").
+- **نظام التشغيل**: ويندوز أو لينكس، بالإضافة إلى إصدار برنامج التشغيل / CUDA إذا كان متوفراً لديك.
+- **السجلات**: سجل InvokeAI حول وقت الفشل — خصوصاً سطر `FP8 layerwise casting enabled for ` (أو غيابه) وأي تتبع (traceback).
+
+مقارنة صور جنباً إلى جنب (FP8 مفعل مقابل FP8 معطل، نفس البذرة) مفيدة جداً لتراجع الجودة.
diff --git a/docs/src/content/docs/ar/configuration/invokeai-yaml.mdx b/docs/src/content/docs/ar/configuration/invokeai-yaml.mdx
new file mode 100644
index 00000000000..c39595d14ed
--- /dev/null
+++ b/docs/src/content/docs/ar/configuration/invokeai-yaml.mdx
@@ -0,0 +1,211 @@
+---
+title: تكوين YAML
+sidebar:
+ order: 1
+---
+
+import { FileTree } from '@astrojs/starlight/components'
+import SettingsDocs from '@lib/components/SettingsDocs.astro'
+
+إعدادات وقت التشغيل، بما في ذلك موقع الملفات والأدلة، واستخدام الذاكرة، والأداء، تُدار عبر ملف التكوين `invokeai.yaml` أو متغيرات البيئة. يمكن تعيين مجموعة فرعية من الإعدادات عبر وسائط سطر الأوامر.
+
+يتم استخدام مصادر الإعدادات بهذا الترتيب:
+
+- وسائط CLI
+- متغيرات البيئة
+- إعدادات `invokeai.yaml`
+- احتياطي: القيم الافتراضية
+
+### الدليل الجذر لـ InvokeAI
+
+عند بدء التشغيل، يبحث InvokeAI عن دليله "الجذر". هذا هو الدليل الذي يحتوي على النماذج والصور وقاعدة البيانات وما إلى ذلك. يحتوي أيضاً على ملف تكوين يسمى `invokeai.yaml`.
+
+
+ - models/
+ - outputs/
+ - databases/
+ - workflow_thumbnails/
+ - style_presets/
+ - nodes/
+ - configs/
+ - invokeai.example.yaml
+ - **invokeai.yaml**
+
+
+يبحث InvokeAI عن الدليل الجذر بهذا الترتيب:
+
+1. وسيط CLI `--root `.
+2. متغير البيئة INVOKEAI_ROOT.
+3. الدليل الذي يحتوي على البيئة الافتراضية النشطة حالياً.
+4. احتياطي: دليل في المجلد الرئيسي للمستخدم الحالي باسم `invokeai`.
+
+### ملف تكوين InvokeAI
+
+داخل الدليل الجذر، نقرأ الإعدادات من ملف `invokeai.yaml`.
+
+له قسمان - واحد للاستخدام الداخلي وآخر لإعدادات المستخدم:
+
+```yaml
+# بيانات وصفية داخلية - لا تقم بتحريرها:
+schema_version: 4.0.2
+
+# ضع إعدادات المستخدم هنا - راجع https://invoke.ai/configuration/invokeai-yaml/:
+host: 0.0.0.0 # تشغيل التطبيق على شبكتك المحلية
+models_dir: D:\invokeai\models # تخزين النماذج على محرك أقراص خارجي
+precision: float16 # استخدام دقة fp16 دائماً
+```
+
+الإعدادات في هذا الملف ستتجاوز القيم الافتراضية. تحتاج فقط إلى
+تغيير هذا الملف إذا كان الإعداد الافتراضي لخيار معين لا
+يعمل لديك.
+
+ستجد ملف مثال بجوار `invokeai.yaml` يوضح القيم الافتراضية.
+
+بعض الإعدادات، مثل [مفاتيح API سوق النماذج], تتطلب تنسيق YAML
+صحيحاً. إليك [دليل أساسي لملفات YAML].
+
+#### موقع ملف التكوين المخصص
+
+يمكنك استخدام أي ملف تكوين باستخدام وسيط CLI `--config`. مرر المسار إلى ملف `invokeai.yaml` الذي تريد استخدامه.
+
+لاحظ أن متغيرات البيئة ستتجاوز أي إعدادات في ملف التكوين.
+
+#### مفاتيح API سوق النماذج
+
+تتطلب بعض أسواق النماذج مفتاح API لتنزيل النماذج. يمكنك توفير نمط URL والرمز المميز المناسب في ملف `invokeai.yaml` الخاص بك لتوفير مفتاح API هذا.
+
+يمكن أن يكون النمط أي تعبير regex صالح (قد تحتاج إلى وضع النمط بين علامتي اقتباس):
+
+```yaml
+remote_api_tokens:
+ # أي URL يحتوي على `models.com` سيستخدم تلقائياً `your_models_com_token`
+ - url_regex: models.com
+ token: your_models_com_token
+ # أي URL يطابق هذا التعبير النمطي المصطنع سيستخدم `some_other_token`
+ - url_regex: '^[a-z]{3}whatever.*\.com$'
+ token: some_other_token
+```
+
+سيتم إضافة الرمز المميز المقدم كرمز `Bearer` لطلبات الشبكة لتنزيل ملفات النموذج. على حد علمنا، يعمل هذا مع جميع أسواق النماذج التي تتطلب تفويضاً.
+
+:::tip[نماذج Hugging Face]
+إذا حصلت على خطأ عند تثبيت نموذج HF باستخدام URL بدلاً من معرف المستودع، قد تحتاج إلى [إعداد رمز HF API](https://huggingface.co/settings/tokens) وإضافة إدخال له ضمن `remote_api_tokens`. استخدم `huggingface.co` لـ `url_regex`.
+:::
+
+#### التجزئة (Hashing) للنماذج
+
+يتم تجزئة النماذج أثناء التثبيت، مما يوفر معرفاً ثابتاً للنماذج عبر جميع المنصات. التجزئة هي عملية لمرة واحدة.
+
+```yaml
+hashing_algorithm: blake3_single # القيمة الافتراضية
+```
+
+قد ترغب في تغيير هذا الإعداد، اعتماداً على نظامك:
+
+- `blake3_single` (افتراضي): أحادي الخيط - الأفضل للأقراص الصلبة الدوارة (HDD)، مقبول للأقراص الصلبة SSD
+- `blake3_multi`: متوازي، تطبيق يعتمد على الذاكرة المعينة - الأفضل لـ SSD، سيء جداً للأقراص الدوارة
+- `random`: تخطي التجزئة بالكامل - الأسرع ولكنه بالطبع بدون تجزئة
+
+خلال بدء التشغيل الأول بعد الترقية إلى v4، سيتم تجزئة جميع نماذجك. قد يستغرق هذا بضع دقائق.
+
+معظم الخوارزميات الشائعة مدعومة، مثل `md5` و `sha256` و `sha512`. هذه عادة أبطأ بكثير من أي من متغيري BLAKE3.
+
+#### إعدادات المسار
+
+تحدد هذه الخيارات مسارات الأدلة والملفات المختلفة التي يستخدمها InvokeAI. يجب أن تكون أي مسارات معرفة من قبل المستخدم مسارات مطلقة.
+
+#### استراتيجية المجلدات الفرعية للصور
+
+افتراضياً، يتم تخزين الصور المولدة في دليل واحد مسطح تحت `outputs/images/`. يتيح لك إعداد `image_subfolder_strategy` تنظيم الصور المنشأة حديثاً في مجلدات فرعية تلقائياً. يمكنك تعديل هذا الإعداد في `invokeai.yaml` أو، كمستخدم مسؤول، في لوحة الإعدادات.
+
+```yaml
+image_subfolder_strategy: flat # القيمة الافتراضية
+```
+
+الاستراتيجيات المتاحة:
+
+| الاستراتيجية | مثال المسار | الوصف |
+| -------- | -------------------------------------- | ------------------------------------------------------------------------------------------------- |
+| `flat` | `outputs/images/abc123.png` | تخزين الصور مباشرة في دليل الصور. |
+| `date` | `outputs/images/2026/03/17/abc123.png` | تنظيم الصور حسب تاريخ الإنشاء. |
+| `type` | `outputs/images/general/abc123.png` | تنظيم الصور حسب فئة الصورة. |
+| `hash` | `outputs/images/ab/abc123.png` | استخدام أول حرفين من UUID الصورة لأداء نظام الملفات مع المجموعات الكبيرة. |
+
+تغيير هذا الإعداد يؤثر فقط على الصور المنشأة حديثاً. تبقى الصور الموجودة في مواقعها الحالية.
+
+#### التسجيل (Logging)
+
+تتوفر عدة وجهات لمعالج السجلات، ويتم دعم وجهات متعددة عن طريق توفير قائمة:
+
+```yaml
+log_handlers:
+ - console
+ - syslog=localhost
+ - file=/var/log/invokeai.log
+```
+
+- `console` هو الإعداد الافتراضي. يطبع رسائل السجل إلى نافذة سطر الأوامر التي تم إطلاق InvokeAI منها.
+
+- `syslog` متاح فقط على أنظمة لينكس وماكنتوش. يستخدم
+ مرفق "syslog" لنظام التشغيل لكتابة إدخالات ملف السجل
+ محلياً أو على جهاز تسجيل عن بعد. يوفر `syslog` مجموعة متنوعة
+ من خيارات التهيئة:
+
+```yaml
+syslog=/dev/log` - التسجيل إلى جهاز /dev/log
+syslog=localhost` - التسجيل إلى مسجل الشبكة على الجهاز المحلي
+syslog=localhost:512` - نفس ما سبق، لكن باستخدام منفذ غير قياسي
+syslog=fredserver,facility=LOG_USER,socktype=SOCK_DRAM`
+- التسجيل إلى خادم "fredserver" المتصل بالشبكة المحلية باستخدام المرفق LOG_USER وحزم البيانات (datagrams).
+```
+
+- `http` يمكن استخدامه للتسجيل إلى خادم ويب عن بعد. يجب أن يكون الخادم
+ مهيأ بشكل صحيح لاستقبال رسائل السجل والتصرف بناءً عليها. الخيار
+ يقبل URL لخادم الويب، ووسيطة `method`
+ تشير إلى ما إذا كان يجب إرسال الرسالة باستخدام طريقة GET أو
+ POST.
+
+```yaml
+http=http://my.server/path/to/logger,method=POST
+```
+
+يوفر خيار `log_format` عدة تنسيقات بديلة:
+
+- `color` - التنسيق الافتراضي الذي يوفر الوقت والتاريخ والرسالة، باستخدام ألوان النص لتمييز مستويات الخطورة المختلفة
+- `plain` - نفس ما سبق، لكن نص أحادي اللون فقط
+- `syslog` - مستوى السجل ورسالة الخطأ فقط، مما يسمح لنظام syslog بإرفاق الوقت والتاريخ
+- `legacy` - تنسيق مشابه لذلك المستخدم في الإصدارات القديمة 2.3 من InvokeAI.
+
+### متغيرات البيئة
+
+جميع الإعدادات يمكن تعيينها عبر متغيرات البيئة بإضافة البادئة `INVOKEAI_`
+إلى اسم المتغير. على سبيل المثال، `INVOKEAI_HOST` سيحدد إعداد `host`.
+
+للقيم غير البدائية، مرر سلسلة JSON مشفرة:
+
+```sh
+export INVOKEAI_REMOTE_API_TOKENS='[{"url_regex":"modelmarketplace", "token": "12345"}]'
+```
+
+نقترح استخدام `invokeai.yaml`، لأنه أكثر سهولة للمستخدم.
+
+### وسائط CLI
+
+يمكن تحديد مجموعة فرعية من الإعدادات باستخدام وسائط CLI:
+
+- `--root`: تحديد الدليل الجذر
+- `--config`: تجاوز موقع ملف `invokeai.yaml` الافتراضي
+
+### وضع الذاكرة المنخفضة (Low-VRAM)
+
+راجع [وثائق وضع الذاكرة المنخفضة][low-vram] للحصول على تفاصيل حول تفعيل هذه الميزة.
+
+### جميع الإعدادات
+
+المرجع الكامل للإعدادات موجود أدناه. تظهر شروحات إضافية لإعدادات محددة سابقاً في هذه الصفحة.
+
+
+
+[basic guide to yaml files]: https://circleci.com/blog/what-is-yaml-a-beginner-s-guide/
+[مفاتيح API سوق النماذج]: #مفاتيح-api-سوق-النماذج
+[low-vram]: /configuration/low-vram-mode
diff --git a/docs/src/content/docs/ar/configuration/low-vram-mode.mdx b/docs/src/content/docs/ar/configuration/low-vram-mode.mdx
new file mode 100644
index 00000000000..9b380508b62
--- /dev/null
+++ b/docs/src/content/docs/ar/configuration/low-vram-mode.mdx
@@ -0,0 +1,180 @@
+---
+title: وضع الذاكرة المنخفضة (Low-VRAM)
+sidebar:
+ order: 2
+---
+
+اعتباراً من الإصدار v5.6.0، يحتوي Invoke على وضع الذاكرة المنخفضة (Low-VRAM). يعمل على الأنظمة المزودة بوحدات معالجة رسوميات مخصصة (وحدات Nvidia على ويندوز/لينكس ووحدات AMD على لينكس).
+
+يتيح لك هذا التوليد حتى إذا كانت بطاقة الرسوميات لديك لا تحتوي على ذاكرة VRAM كافية لاستيعاب النماذج بالكامل. يجب أن يكون большинство المستخدمين قادرين على تشغيل حتى أقوى النماذج - مثل نموذج FLUX dev غير المضغوط بحجم ~24GB.
+
+## تفعيل وضع الذاكرة المنخفضة
+
+وضع الذاكرة المنخفضة **مُفعّل افتراضياً** عبر الإعداد `enable_partial_loading: true` في ملف `invokeai.yaml`. لا حاجة لاتخاذ أي إجراء لتفعيله.
+
+**يجب على مستخدمي ويندوز أيضاً [تعطيل احتياطي ذاكرة النظام Nvidia](#تعطيل-احتياطي-ذاكرة-النظام-nvidia-لنظام-ويندوز-فقط)**.
+
+من الممكن ضبط الإعدادات بدقة للحصول على أفضل أداء أو إذا كنت لا تزال تواجه أخطاء نفاد الذاكرة (OOMs).
+
+إذا كنت تريد تعطيل التحميل الجزئي (مثلاً على الأنظمة التي لديها وفرة في VRAM حيث يكون التحميل الكامل أسرع)، أضف هذا السطر إلى ملف `invokeai.yaml` وأعد تشغيل Invoke:
+
+```yaml
+enable_partial_loading: false
+```
+
+:::tip[كيفية العثور على `invokeai.yaml`]
+ ملف التكوين `invokeai.yaml` موجود في دليل التثبيت الخاص بك. للوصول إليه، شغّل مشغل **Invoke Community Edition** وانقر على موقع التثبيت. سيفتح ذلك دليل التثبيت في نافذة مستكشف الملفات.
+
+ سترى `invokeai.yaml` هناك ويمكنك تعديله باستخدام أي محرر نصوص. بعد إجراء التغييرات، أعد تشغيل Invoke.
+
+ إذا لم ترَ `invokeai.yaml`، شغّل Invoke مرة واحدة. سيقوم بإنشاء الملف عند بدء التشغيل الأول.
+:::
+
+## التفاصيل والضبط الدقيق
+
+يتضمن وضع الذاكرة المنخفضة 4 ميزات، يمكن تهيئة كل منها أو ضبطها بدقة:
+
+- تحميل النموذج الجزئي (`enable_partial_loading`)
+- إعداد موزع CUDA لـ PyTorch (`pytorch_cuda_alloc_conf`)
+- أحجام ذاكرة التخزين المؤقت الديناميكية للذاكرة RAM و VRAM (`max_cache_ram_gb`, `max_cache_vram_gb`)
+- ذاكرة العمل (`device_working_mem_gb`)
+- الاحتفاظ بنسخة من الأوزان في RAM (`keep_ram_copy_of_weights`)
+
+تابع القراءة لمعرفة المزيد عن هذه الميزات وكيفية ضبطها لنظامك وحالات الاستخدام الخاصة بك.
+
+### تحميل النموذج الجزئي
+
+يعمل التحميل الجزئي للنموذج في Invoke عن طريق دفق "طبقات" النموذج بين RAM و VRAM حسب الحاجة.
+
+عندما تحتاج عملية ما إلى طبقات غير موجودة في VRAM، ولكن لا توجد مساحة كافية لتحميلها، يتم تفريغ الطبقات غير النشطة إلى RAM لإفساح المجال.
+
+#### تفعيل تحميل النموذج الجزئي
+
+التحميل الجزئي للنموذج مُفعّل افتراضياً. الإعداد المقابل في `invokeai.yaml` هو:
+
+```yaml
+enable_partial_loading: true
+```
+
+اضبطه على `false` لتعطيل التحميل الجزئي.
+
+### إعداد موزع CUDA لـ PyTorch
+
+يمكن تهيئة سلوك موزع CUDA الخاص بـ PyTorch باستخدام إعداد `pytorch_cuda_alloc_conf`. يمكن أن يساعد ضبط تكوين الموزع في تقليل ذروة VRAM المحجوزة. يعتمد التكوين الأمثل على عوامل كثيرة (مثل نوع الجهاز، VRAM، إصدار برنامج تشغيل CUDA، إلخ)، لكن التبديل من الموزع الأصلي لـ PyTorch إلى استخدام الموزع المدمج في CUDA يعمل بشكل جيد على العديد من الأنظمة. لتجربة هذا، أضف السطر التالي إلى ملف `invokeai.yaml`:
+
+```yaml
+pytorch_cuda_alloc_conf: "backend:cudaMallocAsync"
+```
+
+شرح أكثر اكتمالاً لخيارات التكوين المتاحة موجود [هنا](https://pytorch.org/docs/stable/notes/cuda.html#optimizing-memory-usage-with-pytorch-cuda-alloc-conf).
+
+### أحجام ذاكرة التخزين المؤقت الديناميكية RAM و VRAM
+
+تحميل النماذج من القرص بطيء ويمكن أن يكون عنق زجاجة رئيسي للأداء. يستخدم Invoke ذاكري تخزين مؤقت للنماذج - RAM و VRAM - لتقليل التحميل من القرص إلى الحد الأدنى.
+
+افتراضياً، يدير Invoke أحجام ذاكرة التخزين المؤقت هذه ديناميكياً للحصول على أفضل أداء.
+
+#### ضبط أحجام ذاكرة التخزين المؤقت بدقة
+
+قبل الإصدار v5.6.0، كانت أحجام ذاكرة التخزين المؤقت ثابتة، وللحصول على أفضل أداء، احتاج العديد من المستخدمين إلى ضبط إعدادات `ram` و `vram` يدوياً في `invokeai.yaml`.
+
+اعتباراً من v5.6.0، أصبحت أحجام ذاكرة التخزين المؤقت ديناميكية. لم يعد إعدادا `ram` و `vram` مستخدمين، وتمت إضافة إعدادات جديدة لتهيئة ذاكرة التخزين المؤقت.
+
+**معظم المستخدمين لن يحتاجوا إلى ضبط أحجام ذاكرة التخزين المؤقت بدقة.**
+
+لكن، إذا كانت بطاقة الرسوميات لديك تحتوي على VRAM كافية لاستيعاب النماذج بالكامل، قد تحصل على تحسن في الأداء عن طريق تعيين أحجام ذاكرة التخزين المؤقت يدوياً في `invokeai.yaml`:
+
+```yaml
+# الحجم الافتراضي الأقصى لذاكرة تخزين RAM يتم تسجيله عند بدء تشغيل InvokeAI. يتم تحديده بناءً على ذاكرة RAM / VRAM لنظامك.
+# يمكنك تجاوز القيمة الافتراضية عن طريق تعيين `max_cache_ram_gb`.
+# زيادة `max_cache_ram_gb` ستزيد من كمية RAM المستخدمة لتخزين النماذج غير النشطة مؤقتاً، مما يؤدي إلى إعادة تحميل أسرع للنماذج المخزنة.
+# كمثال، إذا كان نظامك يحتوي على 32GB من RAM ولا توجد عمليات ثقيلة أخرى، قد يكون تعيين `max_cache_ram_gb` إلى 28GB قيمة جيدة لتحقيق تخزين مؤقت قوي للنماذج.
+max_cache_ram_gb: 28
+
+# الحجم الافتراضي الأقصى لذاكرة تخزين VRAM يتم ضبطه ديناميكياً بناءً على كمية VRAM المتاحة (مع مراعاة
+# VRAM المستخدمة من قبل العمليات الأخرى).
+# يمكنك تجاوز القيمة الافتراضية عن طريق تعيين `max_cache_vram_gb`.
+# تنبيه: معظم المستخدمين لا يجب عليهم تعيين هذه القيمة يدوياً. انظر التحذير أدناه.
+max_cache_vram_gb: 16
+```
+
+:::caution[القيمة القصوى الآمنة لـ `max_cache_vram_gb`]
+ معظم المستخدمين لا يجب عليهم تهيئة `max_cache_vram_gb` يدوياً. قيمة التهيئة هذه لها أولوية على `device_working_mem_gb` وأي عمليات تحجز ذاكرة عمل إضافية صراحة (مثل فك تشفير VAE). وبالتالي، فإن تهيئتها يدوياً تزيد من احتمالية مواجهة أخطاء نفاد الذاكرة.
+
+ بالنسبة للمستخدمين الذين يرغبون في تهيئة `max_cache_vram_gb`، يمكن تحديد القيمة القصوى الآمنة بطرح `device_working_mem_gb` من VRAM لبطاقة الرسوميات الخاصة بك. كما هو موضح أدناه، القيمة الافتراضية لـ `device_working_mem_gb` هي 3GB.
+
+ على سبيل المثال، إذا كان لديك بطاقة رسوميات بسعة 12GB، فإن القيمة القصوى الآمنة لـ `max_cache_vram_gb` هي `12GB - 3GB = 9GB`.
+
+ إذا قمت بزيادة `device_working_mem_gb` إلى 4GB، فإن القيمة القصوى الآمنة لـ `max_cache_vram_gb` تصبح `12GB - 4GB = 8GB`.
+
+ معظم المستخدمين الذين يتجاوزون `max_cache_vram_gb` يفعلون ذلك لأنهم يرغبون في استخدام VRAM أقل بكثير، ويجب عليهم تعيين `max_cache_vram_gb` إلى قيمة أقل بكثير من "القيمة القصوى الآمنة".
+:::
+
+### ذاكرة العمل
+
+لا يمكن لـ Invoke استخدام _كل_ VRAM المتاحة لديك لتخزين النماذج وتحميلها مؤقتاً. يتطلب بعضاً من VRAM لاستخدامها كذاكرة عمل للعمليات المختلفة.
+
+يحتفظ Invoke بـ 3GB من VRAM كذاكرة عمل افتراضياً، وهو ما يكفي لمعظم حالات الاستخدام. ومع ذلك، من الممكن ضبط هذا الإعداد بدقة إذا كنت لا تزال تواجه أخطاء OOM.
+
+#### ضبط ذاكرة العمل بدقة
+
+يمكنك زيادة حجم ذاكرة العمل في `invokeai.yaml` لمنع أخطاء OOM:
+
+```yaml
+# القيمة الافتراضية هي 3GB - ارفعها إلى 4GB لمنع أخطاء OOM.
+device_working_mem_gb: 4
+```
+
+:::tip[العمليات قد تطلب ذاكرة عمل إضافية]
+ بالنسبة لبعض العمليات، يمكننا تحديد متطلبات VRAM مسبقاً وتخصيص ذاكرة عمل إضافية لمنع أخطاء OOM.
+
+ فك تشفير VAE هو إحدى هذه العمليات. تقوم هذه العملية بتحويل مخرج عملية التوليد إلى صورة. لمخرجات الصور الكبيرة، قد يستخدم هذا أكثر من حجم ذاكرة العمل الافتراضي البالغ 3GB.
+
+ أثناء خطوة فك التشفير هذه، يحسب Invoke مقدار VRAM المطلوب لفك التشفير ويطلب ذلك المقدار من مدير النموذج. إذا تجاوز المقدار حجم ذاكرة العمل، يقوم مدير النموذج بتفريغ طبقات النموذج المخزنة من VRAM حتى تتوفر مساحة كافية من VRAM لفك التشفير.
+
+ بمجرد اكتمال فك التشفير، "يستعيد" مدير النموذج VRAM الإضافية التي تم تخصيصها كذاكرة عمل لعمليات تحميل النموذج المستقبلية.
+:::
+
+### الاحتفاظ بنسخة من الأوزان في RAM
+
+لدى Invoke خيار الاحتفاظ بنسخة في RAM من جميع أوزان النموذج، حتى عندما تكون محملة على GPU. هذا التحسين _مُفعّل_ افتراضياً، ويتيح التبديل الأسرع بين النماذج وتصحيح LoRA. تعطيل هذه الميزة سيقلل من متوسط حمل RAM أثناء تشغيل Invoke (من غير المرجح أن تتغير ذروة RAM)، على حساب تباطؤ التبديل بين النماذج وتصحيح LoRA. إذا كانت ذاكرة RAM لديك محدودة، يمكنك تعطيل هذا التحسين:
+
+```yaml
+# اضبط على false لتقليل متوسط استخدام RAM على حساب تباطؤ التبديل بين النماذج وتصحيح LoRA.
+keep_ram_copy_of_weights: false
+```
+
+### تعطيل احتياطي ذاكرة النظام Nvidia (لنظام ويندوز فقط)
+
+على ويندوز، يمكن لوحدات معالجة الرسوميات Nvidia استخدام ذاكرة النظام عندما تمتلئ VRAM الخاصة بها عبر **احتياطي ذاكرة النظام (sysmem fallback)**. بينما يبدو هذا فكرة جيدة على السطح، إلا أنه في الممارسة العملية يسبب بطئاً هائلاً أثناء التوليد.
+
+يُنصح بشدة بتعطيل هذه الميزة:
+
+- افتح تطبيق **لوحة تحكم NVIDIA**.
+- وسّع **إعدادات ثلاثية الأبعاد** في اللوحة اليسرى.
+- انقر **إدارة الإعدادات ثلاثية الأبعاد** في اللوحة اليسرى.
+- ابحث عن **CUDA - سياسة احتياطي ذاكرة النظام** في اللوحة اليمنى واضبطها على **تفضيل عدم استخدام احتياطي ذاكرة النظام**.
+
+
+
+:::tip[Invoke يفعل نفس الشيء، ولكن بشكل أفضل]
+ إذا كانت ميزة احتياطي ذاكرة النظام تبدو مألوفة، فذلك لأن استراتيجية تحميل النموذج الجزئي في Invoke مشابهة من الناحية المفاهيمية - استخدام VRAM عندما تتسع، وإلا الرجوع إلى RAM.
+
+ لسوء الحظ، تطبيق Nvidia ليس محسَّناً لتطبيقات مثل Invoke ويسبب ضرراً أكثر من نفعه.
+:::
+
+## استكشاف الأخطاء وإصلاحها
+
+### ملف ترحيل الصفحات في ويندوز
+
+لدى Invoke متطلبات عالية للذاكرة الافتراضية (المعروفة أيضاً باسم 'الذاكرة الملتزمة'). يمكن أن يسبب هذا مشاكل على ويندوز إذا تم الوصول إلى حدود حجم ملف ترحيل الصفحات. (راجع هذه المشكلة للحصول على التفاصيل التقنية حول سبب حدوث ذلك: https://github.com/invoke-ai/InvokeAI/issues/7563).
+
+إذا نفدت مساحة ملف ترحيل الصفحات، فقد يتعطل InvokeAI. غالباً، ستحدث هذه الأعطال مع أحد الأخطاء التالية:
+
+- يخرج InvokeAI برمز خطأ ويندوز `3221225477`
+- يتعطل InvokeAI بدون خطأ، لكن `eventvwr.msc` يكشف عن خطأ برمز `0xc0000005` (المكافئ السداسي العشري لـ `3221225477`)
+
+إذا كنت تنفد من مساحة ملف ترحيل الصفحات، جرب الحلول التالية:
+
+- تأكد من أن لديك مساحة كافية على القرص لنمو ملف ترحيل الصفحات. راقب استخدام القرص أثناء تشغيل Invoke. إذا اقترب من 100% قبل التعطل، فمن المرجح جداً أن هذا هو مصدر المشكلة. أخل بعض مساحة القرص لحل المشكلة.
+- تأكد من أن ملف ترحيل الصفحات مضبوط على "حجم مُدار من قبل النظام" (هذا هو الإعداد الافتراضي) بدلاً من حجم مخصص. ضمن سياسة "حجم مُدار من قبل النظام"، سينمو ملف ترحيل الصفحات ديناميكياً حسب الحاجة.
diff --git a/docs/src/content/docs/ar/configuration/patchmatch.mdx b/docs/src/content/docs/ar/configuration/patchmatch.mdx
new file mode 100644
index 00000000000..9508530bdcc
--- /dev/null
+++ b/docs/src/content/docs/ar/configuration/patchmatch.mdx
@@ -0,0 +1,126 @@
+---
+title: باتش ماتش
+---
+
+import { Tabs, TabItem, Steps } from '@astrojs/starlight/components'
+
+باتش ماتش (PatchMatch) هي خوارزمية تُستخدم لملء الصور. يمكنها تحسين نتائج التوسيع الخارجي (outpainting) بشكل كبير. PyPatchMatch هو غلاف بايثون حول تطبيق بلغة C++ للخوارزمية.
+
+تستخدم بيانات الصورة المحيطة بالمنطقة المستهدفة كمرجع لتوليد بيانات صورة جديدة ذات طابع وجودة مماثلين.
+
+## لماذا استخدام باتش ماتش
+
+في سياق توليد الصور، يشير مصطلح "التوسيع الخارجي" (outpainting) إلى ملء منطقة شفافة باستخدام بيانات صورة مولّدة بالذكاء الاصطناعي. لكن الذكاء الاصطناعي لا يمكنه التوليد دون بعض البيانات الأولية. نحتاج أولاً إلى ملء المنطقة الشفافة بـ _شيء_ ما.
+
+الخطوة الأولى في "التوسيع الخارجي" إذن، هي ملء المنطقة الشفافة بشيء ما. بشكل عام، تحصل على نتائج أفضل عندما يكون هذا الملء الأولي مشابهاً لبقية الصورة.
+
+نظراً لأن باتش ماتش يولّد بيانات صورة شديدة التشابه ببقية الصورة، فهو يعمل بشكل جيد جداً كخطوة أولى في التوسيع الخارجي، وعادةً ما ينتج نتائج أفضل من طرق الملء الأخرى التي تدعمها Invoke (مثل LaMA، وcv2 infill، والبلاط العشوائي).
+
+### ملاحظة حول الأداء
+
+باتش ماتش يعتمد على وحدة المعالجة المركزية (CPU)، ويزداد الوقت المستغرق بشكل تناسبي مع زيادة مساحة الملء. بينما تختلف الأرقام بالتأكيد حسب مواصفات النظام، يمكنك توقع تباطؤ ملحوظ عند البدء في ملء مساحات بحجم 512×512 بكسل. قد تستغرق المساحات بحجم 1024×1024 بكسل عدة ثوانٍ للملء.
+
+## التثبيت
+
+لسوء الحظ، قد يكون التثبيت صعباً بعض الشيء، حيث يتطلب بعض الأشياء التي لا يستطيع `pip` تثبيتها لك.
+
+
+ 1. تأكد من تثبيت التبعيات اللازمة لنظامك (انظر أدناه).
+
+
+
+ أنت محظوظ! على منصات ويندوز، سيتم تثبيت PyPatchMatch تلقائياً على أنظمة ويندوز دون أي تدخل إضافي.
+
+
+ يجب تثبيت opencv ليتمكن pypatchmatch من البناء:
+
+ ```bash
+ brew install opencv
+ ```
+
+ في المرة التالية التي تشغل فيها `invoke`، بعد تثبيت opencv بنجاح، سيتم بناء pypatchmatch.
+
+
+ قبل تثبيت PyPatchMatch، عليك اتخاذ الخطوات التالية:
+
+
+
+
+ 1. تثبيت أدوات `build-essential`:
+
+ ```sh
+ sudo apt update # تحديث قوائم الحزم
+ sudo apt install build-essential
+ ```
+
+ 2. تثبيت `opencv`:
+
+ ```sh
+ sudo apt install python3-opencv libopencv-dev
+ ```
+
+ 3. تفعيل البيئة التي تستخدمها لـ invokeai، إما باستخدام `conda` أو بيئة افتراضية.
+
+
+
+
+ 1. تثبيت حزمة `base-devel`:
+
+ ```sh
+ sudo pacman -Syu
+ sudo pacman -S --needed base-devel
+ ```
+
+ 2. تثبيت `opencv` و `blas` والتبعيات المطلوبة:
+
+ ```sh
+ sudo pacman -S opencv blas fmt glew vtk hdf5
+ ```
+
+ أو لدعم CUDA
+
+ ```sh
+ sudo pacman -S opencv-cuda blas fmt glew vtk hdf5
+ ```
+
+ 3. إصلاح تسمية ملف تكوين حزمة `opencv`:
+
+ ```sh
+ cd /usr/lib/pkgconfig/
+ ln -sf opencv4.pc opencv.pc
+ ```
+
+
+
+
+
+
+ 2. تثبيت pypatchmatch:
+
+ ```sh
+ pip install pypatchmatch
+ ```
+
+ 3. تأكد من تثبيت pypatchmatch. في موجه الأوامر اكتب `python`، ثم عند السطر `>>>` اكتب `from patchmatch import patch_match`: يجب أن يبدو كالتالي:
+
+ ```py
+ Python 3.12.3 (main, Aug 14 2025, 17:47:21) [GCC 13.3.0] on linux
+ Type "help", "copyright", "credits" or "license" for more information.
+ >>> from patchmatch import patch_match
+ Compiling and loading c extensions from "/home/lstein/Projects/InvokeAI/.invokeai-env/src/pypatchmatch/patchmatch".
+ rm -rf build/obj libpatchmatch.so
+ mkdir: created directory 'build/obj'
+ mkdir: created directory 'build/obj/csrc/'
+ [dep] csrc/masked_image.cpp ...
+ [dep] csrc/nnf.cpp ...
+ [dep] csrc/inpaint.cpp ...
+ [dep] csrc/pyinterface.cpp ...
+ [CC] csrc/pyinterface.cpp ...
+ [CC] csrc/inpaint.cpp ...
+ [CC] csrc/nnf.cpp ...
+ [CC] csrc/masked_image.cpp ...
+ [link] libpatchmatch.so ...
+ ```
+
+ إذا لم ترَ أي أخطاء، فأنت جاهز للانطلاق!
+
diff --git a/docs/src/content/docs/ar/contributing/new-contributor-guide.mdx b/docs/src/content/docs/ar/contributing/new-contributor-guide.mdx
new file mode 100644
index 00000000000..d9f23a6a0f3
--- /dev/null
+++ b/docs/src/content/docs/ar/contributing/new-contributor-guide.mdx
@@ -0,0 +1,107 @@
+---
+title: دليل المساهم الجديد
+lastUpdated: 2026-02-19
+---
+
+import { Steps, LinkCard } from '@astrojs/starlight/components';
+
+إذا كنت مساهمًا جديدًا في InvokeAI أو مشاريع مفتوحة المصدر، فهذا هو الدليل المناسب لك.
+
+## قائمة التحقق للمساهم الجديد
+
+
+ 1. قم بإعداد بيئة التطوير المحلية الخاصة بك ونسخة fork من InvokeAI باتباع [الخطوات الموضحة هنا](../../development/setup/dev-environment/#initial-setup)
+
+ 2. قم بإعداد أدواتك المحلية باستخدام [هذا الدليل](/development/). لا تتردد في تخطي هذه الخطوة إذا كان لديك بالفعل أدوات تشعر بالراحة معها.
+
+ 3. تعرف على [Git](https://www.atlassian.com/git) وهيكل مشروعنا من خلال قراءة [وثائق التطوير](/development/)
+
+ 4. انضم إلى قناة [#dev-chat](https://discord.com/channels/1020123559063990373/1049495067846524939) على Discord
+
+ 5. اختر مشكلة للعمل عليها! يمكن تحقيق ذلك عن طريق السؤال في قناة #dev-chat، أو معالجة [أول قضية جيدة](https://github.com/invoke-ai/InvokeAI/contribute) أو العثور على عنصر على [خارطة الطريق](https://github.com/orgs/invoke-ai/projects/7). إذا لم يلفت انتباهك أي شيء في أي من تلك الأماكن، فلا تتردد في العمل على شيء يثير اهتمامك!
+
+ 6. قم بعمل طلب السحب الأول الخاص بك باستخدام الدليل أدناه
+
+ 7. تطوير سعيد! لا تخف من طلب المساعدة - نحن سعداء بمساعدتك في المساهمة!
+
+
+## كيف يمكنني تقديم مساهمة؟
+
+لم تقم بتقديم مساهمة مفتوحة المصدر من قبل؟ تتساءل كيف تعمل المساهمات في مشروعنا؟ إليك ملخص سريع!
+
+قبل بدء هذه الخطوات، تأكد من أن بيئتك المحلية [مهيأة للتطوير](/development/setup/dev-environment/).
+
+
+ 1. ابحث عن [أول قضية جيدة](https://github.com/invoke-ai/InvokeAI/contribute) التي تهتم بمعالجتها أو ميزة ترغب في إضافتها. ثم، تواصل مع فريقنا في قناة [#dev-chat](https://discord.com/channels/1020123559063990373/1049495067846524939) على Discord لضمان تهيئتك للنجاح.
+
+ 2. قم بعمل fork لمستودع [InvokeAI](https://github.com/invoke-ai/InvokeAI) إلى ملفك الشخصي على GitHub. هذا يعني أنه سيكون لديك نسخة من المستودع تحت **your-GitHub-username/InvokeAI**.
+
+ 3. استنسخ المستودع إلى جهازك المحلي باستخدام:
+
+ ```bash
+ git clone https://github.com/your-GitHub-username/InvokeAI.git
+ ```
+
+ إذا لم تكن معتادًا على استخدام Git عبر سطر الأوامر، فإن [GitHub Desktop](https://desktop.github.com) هو بديل سهل الاستخدام بواجهة رسومية. يمكنك القيام بجميع الخطوات نفسها المذكورة هنا، ولكن من خلال الواجهة.
+
+ 4. أنشئ فرعًا جديدًا للإصلاح الخاص بك باستخدام:
+
+ ```bash
+ git checkout -b branch-name-here
+ ```
+
+ 5. قم بإجراء التغييرات المناسبة للمشكلة التي تحاول معالجتها أو الميزة التي تريد إضافتها.
+
+ 6. أضف محتويات الملفات التي تم تغييرها إلى "اللقطة" التي يستخدمها git لإدارة حالة المشروع، والمعروفة أيضًا باسم الفهرس:
+
+ ```bash
+ git add -A
+ ```
+
+ 7. قم بتخزين محتويات الفهرس برسالة وصفية.
+
+ ```bash
+ git commit -m "أدخل رسالة قصيرة عن التغييرات التي تم إجراؤها هنا"
+ ```
+
+ 8. ادفع التغييرات إلى المستودع البعيد باستخدام:
+
+ ```bash
+ git push origin branch-name-here
+ ```
+
+ 9. قدم طلب سحب إلى فرع **main** لمستودع InvokeAI. إذا لم تكن متأكدًا من كيفية القيام بذلك، [اتبع هذا الدليل](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)
+
+ 10. قم بتسمية طلب السحب بوصف قصير للتغييرات التي تم إجراؤها ورقم المشكلة أو الخطأ المرتبط بالتغيير. على سبيل المثال، يمكنك تسمية مشكلة مثل "إضافة المزيد من إخراج السجل لحل #1234".
+
+ 11. في وصف طلب السحب، اشرح التغييرات التي أجريتها، وأي مشكلات تعتقد أنها موجودة في طلب السحب الذي قدمته، وأي أسئلة لديك للمشرف. لا بأس إذا لم يكن طلب السحب الخاص بك مثاليًا (لا يوجد طلب سحب مثالي)، سيكون المراجع قادرًا على مساعدتك في إصلاح أي مشاكل وتحسينه!
+
+ 12. انتظر حتى يتم مراجعة طلب السحب من قبل المساهمين الآخرين.
+
+ 13. قم بإجراء تغييرات على طلب السحب إذا أوصى بها المراجع (المراجعون).
+
+ 14. احتفل بنجاحك بعد دمج طلب السحب الخاص بك!
+
+
+
+
+:::tip[أفضل الممارسات]
+
+- حافظ على صغر طلبات السحب الخاصة بك. طلبات السحب الأصغر أكثر عرضة للقبول والدمج.
+- التعليقات! يساعد التعليق على الكود المراجعين على فهم مساهمتك بسهولة.
+- استخدم أنظمة كتابة الأنواع في Python و Typescript، وفكر في استخدام محرر مع دعم [LSP](https://microsoft.github.io/language-server-protocol/) لتبسيط التطوير.
+- اجعل جميع الاتصالات عامة. هذا يضمن مشاركة المعرفة مع المجتمع بأكمله.
+
+:::
+
+## **أين يمكنني الحصول على المساعدة؟**
+
+إذا كنت بحاجة إلى مساعدة، يمكنك طرح الأسئلة في قناة [#dev-chat](https://discord.com/channels/1020123559063990373/1049495067846524939) على Discord.
+
+للعمل المتعلق بالواجهة الأمامية، **@pyschedelicious** هو أفضل شخص للتواصل معه.
+
+للعمل المتعلق بالواجهة الخلفية، يرجى التواصل مع **@blessedcoolant** أو **@lstein** أو **@StAlKeR7779** أو **@pyschedelicious**.
diff --git a/docs/src/content/docs/ar/development/Architecture/invocations.mdx b/docs/src/content/docs/ar/development/Architecture/invocations.mdx
new file mode 100644
index 00000000000..02068d03b17
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Architecture/invocations.mdx
@@ -0,0 +1,356 @@
+---
+title: الاستدعاءات
+lastUpdated: 2026-02-18
+---
+
+import { FileTree, Code, Steps } from '@astrojs/starlight/components'
+
+# العقد
+
+تُضاف الميزات في InvokeAI في شكل أنظمة عقد معيارية تسمى **الاستدعاءات**.
+
+الاستدعاء هو ببساطة عملية واحدة تأخذ بعض المدخلات وتعطي بعض المخرجات. يمكننا بعد ذلك ربط استدعاءات متعددة معًا لإنشاء وظائف أكثر تعقيدًا.
+
+## دليل الاستدعاءات
+
+يمكن العثور على عقد InvokeAI في دليل `invokeai/app/invocations`. يمكن استخدام هذه كأمثلة لإنشاء العقد الخاصة بك.
+
+يجب إضافة العقد الجديدة إلى مجلد فرعي في دليل `nodes` الموجود على المستوى الجذري لموقع تثبيت InvokeAI. العقد المضافة إلى هذا المجلد ستكون قابلة للاستخدام عند بدء تشغيل التطبيق.
+
+مثال على هيكل المجلد الفرعي `nodes`:
+
+
+ - nodes
+ - `__init__.py` محمل العقد المخصص المُدار من Invoke
+ - cool_node
+ - `__init__.py` انظر المثال أدناه
+ - cool_node.py
+ - my_node_pack
+ - `__init__.py` انظر المثال أدناه
+ - tasty_node.py
+ - bodacious_node.py
+ - utils.py
+ - extra_nodes
+ - fancy_node.py
+
+
+يجب أن يحتوي كل مجلد عقدة على ملف `__init__.py` يقوم باستيراد عقدها. فقط العقد المستوردة في ملف `__init__.py` يتم تحميلها. راجع README في مجلد العقد لمزيد من الأمثلة:
+
+```py title="__init__.py"
+from .cool_node import ResizeInvocation
+```
+
+## إنشاء استدعاء جديد
+
+لفهم عملية إنشاء استدعاء جديد، دعنا في الواقع نقوم بإنشاء واحد.
+
+في مثالنا، دعنا ننشئ استدعاءًا يأخذ صورة، ويغير حجمها ويخرج الصورة بعد تغيير الحجم.
+
+المجموعة الأولى من الأشياء التي نحتاج إلى القيام بها عند إنشاء استدعاء جديد هي:
+
+
+ 1. إنشاء فئة جديدة مشتقة من فئة أب محددة مسبقًا تسمى `BaseInvocation`.
+ 2. يجب أن يحتوي كل استدعاء على `docstring` يصف ما يفعله هذا الاستدعاء.
+ 3. على الرغم من أنه ليس مطلوبًا بشكل صارم، نقترح أن ينتهي اسم كل فئة استدعاء بكلمة "Invocation"، مثل "CropImageInvocation".
+ 4. يجب أن يستخدم كل استدعاء ديكور `@invocation` لتوفير نوع الاستدعاء الفريد الخاص به. يمكنك توفير عنوانه ووسومه وفئته باستخدام الديكور.
+ 5. الاستدعاءات مقيدة بنظام الأنواع بشكل صارم. نستخدم مكتبة [typing](https://docs.python.org/3/library/typing.html) الأصلية ومكتبة [pydantic](https://pydantic-docs.helpmanual.io/) المثبتة للتحقق من الصحة.
+
+
+لنقم بذلك.
+
+```py title="resize.py"
+from invokeai.invocation_api import (
+ BaseInvocation,
+ invocation,
+)
+
+@invocation('resize')
+class ResizeInvocation(BaseInvocation):
+ '''يغير حجم صورة'''
+```
+
+هذا رائع.
+
+الآن قمنا بإعداد أساس استدعائنا الجديد. دعنا نفكر في المدخلات التي يأخذها استدعائنا.
+
+- نحتاج إلى `صورة` سنقوم بتغيير حجمها.
+- سنحتاج إلى قيم `عرض` و `ارتفاع` جديدة لتغيير حجم الصورة إليها.
+
+### المدخلات
+
+يجب تعريف كل مدخل استدعاء باستخدام دالة `InputField`. هذه غلاف حول دالة `Field` من pydantic، والتي تتعامل مع بضعة أشياء إضافية وتوفر تلميحات الأنواع. مثل أي شيء آخر، يجب أن يكون هذا مقيدًا بنظام الأنواع بشكل صارم ومُعرفًا.
+
+لنقم بإنشاء هذه المدخلات لاستدعائنا. أولاً، مدخل `image` الذي نحتاجه. بشكل عام، يمكننا استخدام أنواع المتغيرات القياسية في Python ولكن InvokeAI لديها بالفعل نوع `ImageField` مخصص يتعامل مع كل ما هو مطلوب لمدخلات الصور.
+
+ولكن ما هو `ImageField`؟ إنه نوع فئة خاص مكتوب خصيصًا للتعامل مع كيفية معالجة الصور في InvokeAI. سنغطي كيفية إنشاء أنواع الحقول المخصصة الخاصة بك لاحقًا في هذا الدليل. الآن، دعنا نمضي قدمًا ونستخدمه.
+
+```py title="resize.py"
+from invokeai.invocation_api import (
+ BaseInvocation,
+ ImageField,
+ InputField,
+ invocation,
+)
+
+@invocation('resize')
+class ResizeInvocation(BaseInvocation):
+
+ # المدخلات
+ image: ImageField = InputField(description="صورة الإدخال")
+```
+
+دعنا نحلل كود الإدخال الخاص بنا.
+
+```python
+image: ImageField = InputField(description="صورة الإدخال")
+```
+
+| الجزء | القيمة | الوصف |
+| ---- | ----- | ----------- |
+| الاسم | `image` | المتغير الذي سيحتوي على صورتنا. |
+| تلميح النوع | `ImageField` | النوع لحقلنا. يشير إلى أن `image` يجب أن يكون `ImageField`. |
+| الحقل | `InputField(description="صورة الإدخال")` | يعلن عن `image` كحقل إدخال ويوفر وصفه. |
+
+رائع. الآن دعنا ننشئ مدخلاتنا الأخرى لـ `width` و `height`
+
+```py title="resize.py"
+from invokeai.invocation_api import (
+ BaseInvocation,
+ ImageField,
+ InputField,
+ invocation,
+)
+
+@invocation('resize')
+class ResizeInvocation(BaseInvocation):
+
+ # المدخلات
+ image: ImageField = InputField(description="صورة الإدخال")
+ width: int = InputField(default=512, ge=64, le=2048, description="عرض الصورة الجديدة")
+ height: int = InputField(default=512, ge=64, le=2048, description="ارتفاع الصورة الجديدة")
+```
+
+كما قد تكون لاحظت، أضفنا وسيطين جديدين لتعريف `InputField` لـ `width` و `height`، يُسميان `gt` و `le`. يرمزان إلى _أكبر من أو يساوي_ و _أقل من أو يساوي_.
+
+تفرض هذه قيودًا على تلك الحقول، وستثير استثناءً إذا كانت القيم لا تفي بالقيود. يتم توفير قيود الحقل بواسطة **pydantic**، لذا أي شيء تراه في **وثائق pydantic** سيعمل.
+
+**ملاحظة:** _كلما كان من الممكن تعريف قيود لحقلنا، يجب أن نفعل ذلك حتى تتوفر للواجهة الأمامية مزيد من المعلومات حول كيفية تحليل هذا الحقل._
+
+ممتاز. لدينا الآن مدخلاتنا. دعنا نفعل شيئًا بها.
+
+### دالة الاستدعاء
+
+دالة `invoke` هي حيث يحدث كل السحر. توفر هذه الدالة معامل `context` من النوع `InvocationContext` والذي سيمنحك الوصول إلى السياق الحالي للتوليد وجميع الخدمات الأخرى التي يوفرها InvokeAI.
+
+لنقم بإنشاء هذه الدالة أولاً.
+
+```py title="resize.py"
+from invokeai.invocation_api import (
+ BaseInvocation,
+ ImageField,
+ InputField,
+ InvocationContext,
+ invocation,
+)
+
+@invocation('resize')
+class ResizeInvocation(BaseInvocation):
+ '''يغير حجم صورة'''
+
+ image: ImageField = InputField(description="صورة الإدخال")
+ width: int = InputField(default=512, ge=64, le=2048, description="عرض الصورة الجديدة")
+ height: int = InputField(default=512, ge=64, le=2048, description="ارتفاع الصورة الجديدة")
+
+ def invoke(self, context: InvocationContext):
+ pass
+```
+
+### المخرجات
+
+مخرجات استدعائنا ستكون أي شيء يتم إرجاعه بواسطة دالة `invoke` هذه. كما هو الحال مع مدخلاتنا، نحتاج إلى تحديد أنواع مخرجاتنا بقوة وتعريفها أيضًا.
+
+ما هو مخرجاتنا؟ صورة أخرى. عادةً ستحتاج إلى إنشاء نوع لهذا ولكن InvokeAI تقدم لك بالفعل نوع `ImageOutput` الذي يتعامل مع جميع المعلومات الضرورية المتعلقة بمخرجات الصور. لذا دعنا نستخدم ذلك.
+
+سنغطي كيفية إنشاء أنواع المخرجات الخاصة بك لاحقًا في هذا الدليل.
+
+```py title="resize.py"
+from invokeai.invocation_api import (
+ BaseInvocation,
+ ImageField,
+ InputField,
+ InvocationContext,
+ invocation,
+)
+
+from invokeai.app.invocations.image import ImageOutput
+
+@invocation('resize')
+class ResizeInvocation(BaseInvocation):
+ '''يغير حجم صورة'''
+
+ image: ImageField = InputField(description="صورة الإدخال")
+ width: int = InputField(default=512, ge=64, le=2048, description="عرض الصورة الجديدة")
+ height: int = InputField(default=512, ge=64, le=2048, description="ارتفاع الصورة الجديدة")
+
+ def invoke(self, context: InvocationContext) -> ImageOutput:
+ pass
+```
+
+ممتاز. الآن بعد أن قمنا بإعداد استدعائنا، دعنا نفعل ما نريد فعله.
+
+- سنقوم أولاً بتحميل الصورة باستخدام إحدى الخدمات التي يوفرها InvokeAI لتحميل الصورة.
+- سنقوم بتغيير حجم الصورة باستخدام `PIL` إلى بيانات الإدخال الخاصة بنا.
+- سنقوم بإخراج هذه الصورة بالتنسيق الذي حددناه أعلاه.
+
+لنقم بذلك.
+
+```py title="resize.py"
+from invokeai.invocation_api import (
+ BaseInvocation,
+ ImageField,
+ InputField,
+ InvocationContext,
+ invocation,
+)
+
+from invokeai.app.invocations.image import ImageOutput
+
+@invocation("resize")
+class ResizeInvocation(BaseInvocation):
+ """يغير حجم صورة"""
+
+ image: ImageField = InputField(description="صورة الإدخال")
+ width: int = InputField(default=512, ge=64, le=2048, description="عرض الصورة الجديدة")
+ height: int = InputField(default=512, ge=64, le=2048, description="ارتفاع الصورة الجديدة")
+
+ def invoke(self, context: InvocationContext) -> ImageOutput:
+ # تحميل صورة الإدخال كصورة PIL
+ image = context.images.get_pil(self.image.image_name)
+
+ # تغيير حجم الصورة
+ resized_image = image.resize((self.width, self.height))
+
+ # حفظ الصورة
+ image_dto = context.images.save(image=resized_image)
+
+ # إرجاع ImageOutput
+ return ImageOutput.build(image_dto)
+```
+
+**ملاحظة:** لا تشعر بالإرهاق من عملية `ImageOutput`. لدى InvokeAI طريقة معينة يجب أن تُرسل بها الصور لتخزينها وقراءتها بشكل صحيح. في 99٪ من الحالات عند التعامل مع مخرجات الصور، يمكنك ببساطة نسخ ولصق القالب أعلاه.
+
+### التخصيص
+
+يمكننا استخدام ديكور `@invocation` لتوفير بعض المعلومات الإضافية لواجهة المستخدم، مثل عنوان مخصص ووسوم وفئة.
+
+نشجع أيضًا على توفير إصدار. يجب أن يكون هذا سلسلة إصدار [semver](https://semver.org/) ("`$MAJOR`.`$MINOR`.`$PATCH`"). ستعلم واجهة المستخدم المستخدمين إذا كان سير عملهم يستخدم إصدارًا غير متطابق من العقدة.
+
+```py title="resize.py"
+@invocation("resize", title="أداة تغيير الحجم الخاصة بي", tags=["resize", "image"], category="استدعاءاتي", version="1.0.0")
+class ResizeInvocation(BaseInvocation):
+ """يغير حجم صورة"""
+
+ image: ImageField = InputField(description="صورة الإدخال")
+
+ # باقي الكود
+```
+
+هذا كل شيء. لقد صنعت **استدعاء تغيير الحجم** الخاص بك.
+
+## النتيجة
+
+بمجرد إنشاء استدعائك بشكل صحيح، فإن باقي العملية مؤتمتة بالكامل لك.
+
+عند تشغيل InvokeAI، يمكنك الذهاب إلى `http://localhost:9090/docs` ورؤية استدعائك الجديد يظهر هناك مع جميع المعلومات ذات الصلة.
+
+
+
+عند تشغيل واجهة المستخدم الأمامية، يمكنك الذهاب إلى علامة تبويب محرر العقد والعثور على استدعائك الجديد جاهزًا للاستخدام.
+
+
+
+## المساهمة بالعقد
+
+بمجرد إنشاء عقدة، الخطوة التالية هي مشاركتها مع المجتمع! أفضل طريقة للقيام بذلك هي تقديم طلب سحب لإضافة العقدة إلى قائمة [العقد المجتمعية](/features/workflows/community-nodes). إذا لم تكن متأكدًا من كيفية القيام بذلك، ألق نظرة على [نظرة عامة حول المساهمة بالعقد](/development/guides/creating-nodes/).
+
+## متقدم
+
+### أنواع المخرجات المخصصة
+
+كما هو الحال مع المدخلات المخصصة، قد تجد أحيانًا أنك بحاجة إلى مخرجات مخصصة لا يوفرها InvokeAI. يمكننا إعداد واحدة بسهولة.
+
+الآن بعد أن أصبحت على دراية بالاستدعاءات والمدخلات، دعنا نستخدم تلك المعرفة لإنشاء مخرجات تحتوي على حقل `image` وحقل `color` وحقل `string`.
+
+- مخرجات الاستدعاء هي فئة مشتقة من الفئة الأب `BaseInvocationOutput`.
+- يجب أن تستخدم جميع مخرجات الاستدعاء ديكور `@invocation_output` لتوفير نوع المخرجات الفريد الخاص بها.
+- يجب أن تستخدم حقول المخرجات دالة `OutputField` الموفرة. هذا مشابه جدًا لدالة `InputField` الموصوفة سابقًا - إنها غلاف حول `Field()` من `pydantic`.
+- ليس إلزاميًا ولكننا نوصي باستخدام أسماء تنتهي بـ `Output` لأنواع المخرجات.
+- ليس إلزاميًا ولكننا نوصي بشدة بإضافة `docstring` لوصف ما هو نوع المخرجات الخاص بك من أجله.
+
+الآن بعد أن عرفنا القواعد الأساسية لإنشاء نوع مخرجات جديد، دعنا نمضي قدمًا وننشئه.
+
+```py title="custom_output.py"
+from .baseinvocation import BaseInvocationOutput, OutputField, invocation_output
+from .primitives import ImageField, ColorField
+
+@invocation_output('image_color_string_output')
+class ImageColorStringOutput(BaseInvocationOutput):
+ '''الفئة الأساسية للعقد التي تخرج صورة واحدة'''
+
+ image: ImageField = OutputField(description="الصورة")
+ color: ColorField = OutputField(description="اللون")
+ text: str = OutputField(description="النص")
+```
+
+هذا كل ما في الأمر.
+
+### حقول الإدخال المخصصة
+
+الآن بعد أن عرفت كيفية إنشاء استدعاءاتك الخاصة، دعنا نتعمق في مواضيع أكثر تقدمًا قليلاً.
+
+أثناء إنشاء استدعاءاتك الخاصة، قد تصادف سيناريو حيث لا تلبي الحقول الموجودة في InvokeAI متطلباتك. في مثل هذه الحالات، يمكنك إنشاء حقولك الخاصة.
+
+دعنا ننشئ واحدًا كمثال. لنقل أننا نريد إنشاء حقل إدخال لون يمثل رمز لون. ولكن قبل أن نبدأ، إليك بعض الممارسات الجيدة العامة التي يجب مراعاتها.
+
+### أفضل الممارسات
+
+- لا توجد اتفاقية تسمية لحقول الإدخال، لكننا نوصي بشدة بتسميتها بشيء مناسب مثل `ColorField`.
+- ليس إلزاميًا ولكن من المستحسن بشدة إضافة `docstring` مناسب لوصف حقل.
+- حافظ على حقل في نفس ملف الاستدعاء الذي صُنع من أجله، أو في ملف آخر حيث يكون مناسبًا.
+
+جميع أنواع الإدخال هي فئة مشتقة من نوع `BaseModel` من `pydantic`. لذا دعنا ننشئ واحدًا.
+
+```py title="color_field.py"
+ from pydantic import BaseModel
+
+ class ColorField(BaseModel):
+ '''حقل يحمل قيم rgba للون'''
+ pass
+```
+
+ممتاز. الآن دعنا ننشئ خصائص حقلنا. هذا مشابه لكيفية إنشاء حقول الإدخال لاستدعائك. تنطبق نفس القواعد. دعنا ننشئ أربعة حقول تمثل قنوات _الأحمر (r)_ و _الأزرق (b)_ و _الأخضر (g)_ و _الشفافية (a)_ للون.
+
+:::note
+من الناحية الفنية، تُسمى الخصائص أيضًا _حقول_ - ولكن في هذه الحالة، يشير ذلك إلى حقل `pydantic`.
+:::
+
+```py title="color_field.py"
+class ColorField(BaseModel):
+ '''حقل يحمل قيم rgba للون'''
+ r: int = Field(ge=0, le=255, description="القناة الحمراء")
+ g: int = Field(ge=0, le=255, description="القناة الخضراء")
+ b: int = Field(ge=0, le=255, description="القناة الزرقاء")
+ a: int = Field(ge=0, le=255, description="قناة الشفافية")
+```
+
+هذا كل شيء. لدينا الآن نوع حقل إدخال جديد يمكننا استخدامه في استدعاءاتنا بهذه الطريقة.
+
+```python
+color: ColorField = InputField(default=ColorField(r=0, g=0, b=0, a=0), description='لون خلفية الصورة')
+```
+
+### استخدام الحقل المخصص
+
+عند تشغيل واجهة المستخدم، سيتم التعرف على حقل المخصص تلقائيًا.
+
+الحقول المخصصة تدعم فقط مدخلات الاتصال في محرر سير العمل.
diff --git a/docs/src/content/docs/ar/development/Architecture/model-manager.mdx b/docs/src/content/docs/ar/development/Architecture/model-manager.mdx
new file mode 100644
index 00000000000..b0f3d90b3e7
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Architecture/model-manager.mdx
@@ -0,0 +1,1181 @@
+---
+title: مقدمة إلى مدير النماذج
+sidebar:
+ label: مدير النماذج
+lastUpdated: 2026-02-18
+---
+
+import { FileTree, Code, Steps } from '@astrojs/starlight/components';
+
+مدير النماذج مسؤول عن تنظيم نماذج التعلم الآلي المختلفة المستخدمة من قبل InvokeAI. يتكون من سلسلة من الخدمات المترابطة التي تتعامل معًا مع دورة الحياة الكاملة للنموذج. هذه هي:
+
+- **ModelRecordServiceBase:** مسؤول عن إدارة بيانات النموذج الوصفية ومعلومات التكوين. من بين أمور أخرى، تتعقب خدمة السجلات نوع النموذج ومصدره ومكان العثور عليه على القرص.
+- **ModelInstallServiceBase:** خدمة لتثبيت النماذج على القرص. تستخدم `DownloadQueueServiceBase` لتنزيل النماذج وبياناتها الوصفية، و `ModelRecordServiceBase` لتخزين تلك المعلومات. وهي مسؤولة أيضًا عن إدارة دليل `models` في InvokeAI ومحتوياته.
+- **DownloadQueueServiceBase:** أداة تنزيل متعددة الخيوط مسؤولة عن تنزيل النماذج من مصدر بعيد إلى القرص. تحتوي قائمة انتظار التنزيل على طرق خاصة لتنزيل مجلدات repo_id من Hugging Face، بالإضافة إلى التمييز بين إصدارات النماذج في Civitai، ولكن يمكن استخدامها لمحتوى عشوائي.
+- **ModelLoadServiceBase:** مسؤول عن تحميل نموذج من القرص إلى RAM و VRAM وتجهيزه للاستدلال.
+
+## موقع الكود
+
+يمكن العثور على الخدمات الأربع الرئيسية في `invokeai/app/services` في الدلائل التالية:
+
+
+- invokeai
+ - app
+ - services خدمات مدير النماذج
+ - model_records/
+ - model_install/
+ - downloads/
+ - model_load/
+ - api
+ - routers
+ - model_manager_v2.py واجهة برمجة تطبيقات ويب FastAPI لإدارة النماذج
+
+
+---
+
+## ما هو في النموذج؟ ModelRecordService
+
+يدير `ModelRecordService` البيانات الوصفية للنموذج. يدعم تسلسل هرمي من كائنات تكوين البيانات الوصفية من Pydantic، والتي تصبح متخصصة بشكل متزايد لدعم أنواع نماذج معينة.
+
+### ModelConfigBase
+
+جميع فئات البيانات الوصفية للنموذج ترث من فئة Pydantic هذه. توفر الحقول التالية:
+
+| **اسم الحقل** | **النوع** | **الوصف** |
+|----------------|-----------------|------------------|
+| `key` | str | معرف فريد للنموذج |
+| `name` | str | اسم النموذج (ليس فريدًا) |
+| `model_type` | ModelType | نوع النموذج |
+| `model_format` | ModelFormat | تنسيق النموذج (مثل "diffusers")؛ يُستخدم أيضًا كمميّز للاتحاد |
+| `base_model` | BaseModelType | النموذج الأساسي الذي يتوافق معه النموذج |
+| `path` | str | موقع النموذج على القرص |
+| `hash` | str | تجزئة (hash) للنموذج |
+| `description` | str | وصف قابل للقراءة البشرية للنموذج (اختياري) |
+| `source` | str | عنوان URL المصدر للنموذج أو معرف المستودع (اختياري) |
+
+`key` هو معرف عشوائي فريد مكون من 32 حرفًا تم إنشاؤه في وقت التثبيت. حقل `hash` يخزن تجزئة لمحتويات النموذج في وقت التثبيت تم الحصول عليها عن طريق أخذ عينات من عدة أجزاء من ملفات النموذج باستخدام مكتبة `imohash`. على مدار عمر النموذج، قد يتم تحويله بطرق مختلفة، مثل تغيير دقته أو تحويله من نموذج .safetensors إلى نموذج diffusers.
+
+حقل `path` يمكن أن يكون مطلقًا أو نسبيًا. إذا كان نسبيًا، يُعتبر نسبيًا إلى إعداد `models_dir` في ملف `invokeai.yaml` الخاص بالمستخدم.
+
+`ModelType` و `ModelFormat` و `BaseModelType` هي تعدادات نصية محددة في `invokeai.backend.model_manager.config`. كما يتم استيرادها من، ويمكن إعادة تصديرها من، `invokeai.app.services.model_manager.model_records`:
+
+```py title="invokeai.backend.model_manager.config"
+from invokeai.app.services.model_records import ModelType, ModelFormat, BaseModelType
+```
+
+### CheckpointConfig
+
+يضيف هذا دعمًا لتكوينات نقاط التفتيش، ويضيف الحقل التالي:
+
+| **اسم الحقل** | **النوع** | **الوصف** |
+|----------------|-----------------|------------------|
+| `config` | str | المسار إلى ملف تكوين نقطة التفتيش |
+
+`config` هو المسار إلى ملف تكوين نقطة التفتيش. إذا كان نسبيًا، يُعتبر نسبيًا إلى دليل جذر InvokeAI (مثل `configs/stable-diffusion/v1-inference.yaml`)
+
+### MainConfig
+
+يضيف هذا دعمًا لنماذج Stable Diffusion "الرئيسية"، ويضيف هذه الحقول:
+
+| **اسم الحقل** | **النوع** | **الوصف** |
+|----------------|-----------------|------------------|
+| `vae` | str | المسار إلى VAE لاستخدامه بدلاً من المضمن |
+| `variant` | ModelVariantType | نوع متغير النموذج، مثل "inpainting" |
+
+يمكن أن يكون `vae` مسارًا مطلقًا أو نسبيًا. إذا كان نسبيًا، فإن أساسه يعتبر دليل `models_dir`.
+
+`variant` هو فئة سلسلة نصية معدودة بقيم `normal` و `inpaint` و `depth`. إذا لزم الأمر، يمكن استيراده من `invokeai.app.services.model_records` أو `invokeai.backend.model_manager.config`.
+
+### ONNXSD2Config
+
+| **اسم الحقل** | **النوع** | **الوصف** |
+|----------------|-----------------|------------------|
+| `prediction_type` | SchedulerPredictionType | نوع توقع الجدولة المراد استخدامه، مثل "epsilon" |
+| `upcast_attention` | bool | يتطلب النموذج ترقية وحدة الانتباه الخاصة به |
+
+يمكن استيراد تعداد `SchedulerPredictionType` من `invokeai.app.services.model_records` أو `invokeai.backend.model_manager.config`.
+
+### فئات التكوين الأخرى
+
+هناك سلسلة من هذه الفئات كل منها مميّز بـ `ModelFormat` الخاص به، بما في ذلك `LoRAConfig` و `IPAdapterConfig` وما إلى ذلك. نادرًا ما تكون هذه مطلوبة خارج الكود الداخلي لمدير النماذج، ولكنها متاحة في `invokeai.backend.model_manager.config` إذا لزم الأمر. هناك أيضًا اتحاد لجميع فئات ModelConfig، يسمى `AnyModelConfig` يمكن استيراده من نفس الملف.
+
+### قيود نموذج البيانات
+
+التسلسل الهرمي للتكوين له قيد رئيسي في معالجته لنوع النموذج الأساسي. يمكن لكل نموذج أن يكون متوافقًا مع نموذج أساسي واحد فقط، وهو ما ينهار في حالة النماذج المتوافقة مع نموذجين أساسيين أو أكثر. على سبيل المثال، تعمل vaes SD-1 أيضًا مع نماذج SD-2. الحل البديل الجزئي هو استخدام `BaseModelType.Any`، الذي يشير إلى أن النموذج متوافق مع أي من النماذج الأساسية. يعمل هذا بشكل جيد لبعض النماذج، مثل مشفرات صور IP Adapter، لكنه مقترح الكل أو لا شيء.
+
+## قراءة وكتابة سجلات تكوين النموذج
+
+يوفر `ModelRecordService` القدرة على استرداد سجلات تكوين النموذج من قواعد بيانات SQL أو YAML، وتحديثها، وكتابتها مرة أخرى.
+
+يتم إنشاء `ModelRecordService` على مستوى التطبيق أثناء تهيئة API ويمكن استرداده داخل استدعاء من كائن `InvocationContext`:
+
+```py
+store = context.services.model_manager.store
+```
+
+أو من أي مكان آخر في الكود عن طريق الوصول إلى `ApiDependencies.invoker.services.model_manager.store`.
+
+### إنشاء `ModelRecordService`
+
+لإنشاء قاعدة بيانات `ModelRecordService` جديدة أو فتح قاعدة بيانات موجودة، يمكنك إنشاء كائن `ModelRecordServiceSQL` أو `ModelRecordServiceFile` مباشرة:
+
+```py
+from invokeai.app.services.model_records import ModelRecordServiceSQL, ModelRecordServiceFile
+
+store = ModelRecordServiceSQL.from_connection(connection, lock)
+store = ModelRecordServiceSQL.from_db_file('/path/to/sqlite_database.db')
+store = ModelRecordServiceFile.from_db_file('/path/to/database.yaml')
+```
+
+نموذج `from_connection()` متاح فقط من فئة `ModelRecordServiceSQL`، ويستخدم لإدارة السجلات في قاعدة بيانات SQLITE3 تم فتحها مسبقًا باستخدام كائن `sqlite3.connection` وكائن `threading.lock`. مخصص لحالة الاستخدام المحددة لتخزين معلومات السجل في قاعدة بيانات InvokeAI الرئيسية، عادةً `databases/invokeai.db`.
+
+يمكن استخدام طرق `from_db_file()` لفتح اتصالات جديدة بملفات قاعدة البيانات المسماة. إذا كان الملف غير موجود، سيتم إنشاؤه وتهيئته.
+
+كخدمة إضافية، تقدم `ModelRecordServiceBase` طريقتين، `from_db_file` و `open`، واللتان ستعيدان إما تطبيق SQL أو تطبيق ملف اعتمادًا على السياق. الطريقة الأولى تنظر إلى امتداد الملف لتحديد ما إذا كان سيتم فتح الملف كقاعدة بيانات SQL (".db") أو كقاعدة بيانات ملف (".yaml"). إذا كان الملف موجودًا، ولكنه إما من النوع الخطأ أو لا يحتوي على معلومات المخطط الوصفية المتوقعة، فسيتم رفع `AssertionError` المناسب:
+
+```py
+store = ModelRecordServiceBase.from_db_file('/path/to/a/file.{yaml,db}')
+```
+
+طريقة `ModelRecordServiceBase.open()` مصممة خصيصًا للاستخدام في خادم ويب InvokeAI. توقيعها هو:
+
+```py
+def open(
+ cls,
+ config: InvokeAIAppConfig,
+ conn: Optional[sqlite3.Connection] = None,
+ lock: Optional[threading.Lock] = None
+ ) -> Union[ModelRecordServiceSQL, ModelRecordServiceFile]:
+```
+
+طريقة عملها كالتالي:
+
+1. استرجع قيمة خيار `model_config_db` من ملف تكوين `invokeai.yaml` الخاص بالمستخدم.
+2. إذا كانت `model_config_db` هي `auto` (الافتراضي)، فـ:
+ - استخدم قيم `conn` و `lock` لإرجاع كائن `ModelRecordServiceSQL` مفتوح على الاتصال والقفل المُمررين.
+ - افتح اتصالاً جديدًا إلى `databases/invokeai.db` إذا كانت `conn` و/أو `lock` مفقودة (انظر الملاحظة أدناه).
+3. إذا كانت `model_config_db` هي مسار، فاستخدم `from_db_file` لإرجاع النوع المناسب من ModelRecordService.
+4. إذا كانت `model_config_db` هي None، فاسترجع خيار `conf_path` القديم من `invokeai.yaml` واستخدم المسار المشار إليه هناك. سيكون الافتراضي هو `configs/models.yaml`.
+
+لذا فإن نمط بدء التشغيل النموذجي سيكون:
+
+```py
+import sqlite3
+from invokeai.app.services.thread import lock
+from invokeai.app.services.model_records import ModelRecordServiceBase
+from invokeai.app.services.config import InvokeAIAppConfig
+
+config = InvokeAIAppConfig.get_config()
+db_conn = sqlite3.connect(config.db_path.as_posix(), check_same_thread=False)
+store = ModelRecordServiceBase.open(config, db_conn, lock)
+```
+
+### جلب تكوين نموذج من `ModelRecordServiceBase`
+
+يمكن استرداد التكوينات بعدة طرق.
+
+#### get_model(key) -> AnyModelConfig
+
+الوظيفة الأساسية هي استدعاء طريقة `get_model()` لكائن مخزن السجلات مع المفتاح الفريد للنموذج المطلوب. تقوم بإرجاع الفئة الفرعية المناسبة من ModelConfigBase:
+
+```py
+model_conf = store.get_model('f13dd932c0c35c22dcb8d6cda4203764')
+print(model_conf.path)
+
+>> '/tmp/models/ckpts/v1-5-pruned-emaonly.safetensors'
+
+```
+
+إذا كان المفتاح غير معروف، يثير هذا الاستدعاء استثناء `UnknownModelException`.
+
+#### exists(key) -> AnyModelConfig
+
+يعيد True إذا كان النموذج ذو المفتاح المحدد موجودًا في قاعدة البيانات.
+
+#### search_by_path(path) -> AnyModelConfig
+
+يعيد تكوين النموذج الذي مساره هو `path`. يتم مطابقة المسار باستخدام مقارنة سلسلة بسيطة ولن يطابق النماذج المشار إليها بمسارات مختلفة بشكل صحيح (مثل استخدام الروابط الرمزية).
+
+#### search_by_name(name, base, type) -> List[AnyModelConfig]
+
+تبحث هذه الطريقة عن النماذج التي تطابق مجموعة من `name` و `BaseType` و `ModelType`. الاستدعاء دون أي وسائط سيعيد جميع النماذج في قاعدة البيانات.
+
+#### all_models() -> List[AnyModelConfig]
+
+يعيد جميع تكوينات النماذج في قاعدة البيانات. مكافئ تمامًا لاستدعاء `search_by_name()` بدون وسائط.
+
+#### search_by_tag(tags) -> List[AnyModelConfig]
+
+`tags` هي قائمة من السلاسل النصية. تعيد هذه الطريقة قائمة بتكوينات النماذج التي تحتوي على جميع الوسوم المعطاة. أمثلة:
+
+```py
+# العثور على جميع النماذج الموسومة بأنها SFW والتي تولد
+# مشاهد خلفية
+configs = store.search_by_tag(['sfw', 'scenery'])
+```
+
+لاحظ أنه يمكن البحث عن الوسوم فقط بهذه الطريقة. يمكن البحث في الحقول الأخرى باستخدام مرشح:
+
+```py
+commercializable_models = [x for x in store.all_models() \
+ if x.license.contains('allowCommercialUse=Sell')]
+```
+
+#### version() -> str
+
+يعيد إصدار قاعدة البيانات، حاليًا عند `3.2`
+
+#### model_info_by_name(name, base_model, model_type) -> ModelConfigBase
+
+توجد هذه الطريقة لتسهيل الانتقال من الإصدار السابق لمدير النماذج، حيث كانت `get_model()` تأخذ الوسائط الثلاثة الموضحة أعلاه. تبحث هذه عن نموذج فريد محدد بالاسم والنموذج الأساسي ونوع النموذج وتعيده.
+
+ستولد الطريقة استثناء `DuplicateModelException` إذا كان هناك أكثر من نموذج يشتركون في نفس النوع والأساس والاسم. بينما هو غير مرجح، من الممكن بالتأكيد وجود موقف أضاف فيه المستخدم نموذجين بنفس الاسم والأساس والنوع، أحدهما موجود في المسار `/foo/my_model` والآخر في `/bar/my_model`. يوصى بشدة بالبحث عن النماذج باستخدام `search_by_name()`، التي يمكنها إرجاع نتائج متعددة، ثم تحديد النموذج المطلوب وتمرير مفتاحه إلى `get_model()`.
+
+### كتابة تكوينات النموذج إلى قاعدة البيانات
+
+تسمح لك عدة طرق بإنشاء وتحديث سجلات تكوين النموذج المخزنة.
+
+#### add_model(key, config) -> AnyModelConfig
+
+بالنظر إلى مفتاح وتكوين، سيضيف هذا سجل تكوين النموذج إلى قاعدة البيانات. يمكن أن يكون `config` إما فئة فرعية من `ModelConfigBase` (أي أي فئة مدرجة في `AnyModelConfig`)، أو `dict` من أزواج المفتاح/القيمة. في الحالة الأخيرة، سيتم اختيار فئة التكوين الصحيحة بواسطة آلية الاتحاد المُميَّز لـ Pydantic.
+
+إذا نجحت، ستعيد الطريقة الفئة الفرعية المناسبة من `ModelConfigBase`. ستثير استثناء `DuplicateModelException` إذا كان النموذج بنفس المفتاح موجودًا بالفعل في قاعدة البيانات، أو `InvalidModelConfigException` إذا تم تمرير قاموس وعانى Pydantic من خطأ في التحليل أو التحقق.
+
+#### update_model(key, config) -> AnyModelConfig
+
+بالنظر إلى مفتاح وتكوين، سيقوم هذا بتحديث سجل تكوين النموذج في قاعدة البيانات. يمكن أن يكون `config` إما مثيلاً من `ModelConfigBase`، أو `dict` متفرقًا يحتوي على الحقول المطلوب تحديثها. سيعيد `AnyModelConfig` عند النجاح، أو يثير استثناءات `InvalidModelConfigException` أو `UnknownModelException` عند الفشل.
+
+---
+
+## تثبيت النموذج
+
+تنفذ فئة `ModelInstallService` الفئة الأساسية المجردة `ModelInstallServiceBase`، وتوفر متجرًا شاملاً لجميع احتياجات تثبيت النماذج. توفر الوظائف التالية:
+
+- تسجيل سجل تكوين نموذج لنموذج موجود بالفعل على نظام الملفات المحلي، دون نقله أو تغيير مساره.
+
+- تثبيت نموذج موجود بالفعل على نظام الملفات المحلي، عن طريق نقله إلى دليل جذر InvokeAI تحت مجلد `models` (أو أينما يحدد معامل التكوين `models_dir`).
+
+- فحص النماذج لتحديد نوعها ونوعها الأساسي ومعلومات رئيسية أخرى.
+
+- الواجهة مع ناقل أحداث InvokeAI لتوفير تحديثات الحالة حول عملية التنزيل والتثبيت والتسجيل.
+
+- تنزيل نموذج من أي عنوان URL وتثبيته في `models_dir`.
+
+- معالجة خاصة لمعرفات مستودعات HuggingFace لتنزيل محتويات المستودع بشكل متكرر، مع الانتباه إلى المتغيرات البديلة مثل fp16.
+
+- حفظ الوسوم والبيانات الوصفية الأخرى حول النموذج في قاعدة بيانات invokeai عند الجلب من مستودع يوفر هذا النوع من المعلومات (حاليًا HuggingFace فقط).
+
+### تهيئة المثبت
+
+يتم إنشاء مثبت افتراضي عند بدء تشغيل API لـ InvokeAI ويتم تخزينه في `ApiDependencies.invoker.services.model_install` ويمكن استرداده أيضًا من وسيطة `context` للاستدعاء باستخدام `context.services.model_install`.
+
+في حال رغبتك في إنشاء مثبت جديد، يمكنك استخدام نمط التهيئة التالي:
+
+```py
+from invokeai.app.services.config import get_config
+from invokeai.app.services.model_records import ModelRecordServiceSQL
+from invokeai.app.services.model_install import ModelInstallService
+from invokeai.app.services.download import DownloadQueueService
+from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase
+from invokeai.backend.util.logging import InvokeAILogger
+
+config = get_config()
+
+logger = InvokeAILogger.get_logger(config=config)
+db = SqliteDatabase(config.db_path, logger)
+record_store = ModelRecordServiceSQL(db, logger)
+queue = DownloadQueueService()
+queue.start()
+
+installer = ModelInstallService(app_config=config,
+ record_store=record_store,
+ download_queue=queue
+ )
+installer.start()
+```
+
+النموذج الكامل لـ `ModelInstallService()` يأخذ المعاملات المطلوبة التالية:
+
+| **الوسيط** | **النوع** | **الوصف** |
+|------------------|------------------------------|------------------------------|
+| `app_config` | InvokeAIAppConfig | كائن تكوين تطبيق InvokeAI |
+| `record_store` | ModelRecordServiceBase | قاعدة بيانات تخزين سجلات التكوين |
+| `download_queue` | DownloadQueueServiceBase | كائن قائمة انتظار التنزيل |
+| `session` | Optional[requests.Session] | تبديل كائن Session مختلف (عادةً للتصحيح) |
+
+بمجرد التهيئة، سيوفر المثبت الطرق التالية:
+
+#### install_job = installer.heuristic_import(source, [config], [access_token])
+
+هذه واجهة مبسطة للمثبت تأخذ سلسلة مصدر، وقاموس تكوين نموذج اختياري ورمز وصول اختياري.
+
+`source` هي سلسلة نصية يمكن أن تكون أيًا من هذه الأشكال:
+
+1. مسار على نظام الملفات المحلي (`C:\\users\\fred\\model.safetensors`)
+2. عنوان URL يشير إلى ملف نموذج واحد قابل للتنزيل (`https://civitai.com/models/58390/detail-tweaker-lora-lora`)
+3. معرف مستودع HuggingFace بأي من التنسيقات التالية:
+ * `model/name` — النموذج بأكمله
+ * `model/name:fp32` — النموذج بأكمله، باستخدام متغير fp32
+ * `model/name:fp16:vae` — النموذج الفرعي vae، باستخدام متغير fp16
+ * `model/name::vae` — النموذج الفرعي vae، باستخدام الدقة الافتراضية
+ * `model/name:fp16:path/to/model.safetensors` — ملف نموذج فردي، متغير fp16
+ * `model/name::path/to/model.safetensors` — ملف نموذج فردي، المتغير الافتراضي
+
+لاحظ أنه من خلال تحديد مسار نسبي إلى أعلى مستودع HuggingFace، يمكنك تنزيل وتثبيت ملفات نماذج عشوائية.
+
+سيتم ملء المتغير تلقائيًا بـ `fp32` إذا طلب المستخدم الدقة الكاملة، و `fp16` خلاف ذلك. إذا تم طلب متغير غير موجود، فستقوم الطريقة بتثبيت ما يعيده HuggingFace كمراجعته الافتراضية.
+
+`config` هو قاموس اختياري من القيم التي ستتجاوز القيم التي تم فحصها تلقائيًا لنوع النموذج والأساس ونوع توقع الجدولة وما إلى ذلك. راجع [تكوين النموذج وفحصه](#تكوين-النموذج-وفحصه) للتفاصيل.
+
+`access_token` هو رمز وصول اختياري للوصول إلى الموارد التي تحتاج إلى مصادقة.
+
+ستعيد الطريقة `ModelInstallJob`. تتم مناقشة هذا الكائن مطولاً في القسم التالي.
+
+#### install_job = installer.import_model()
+
+طريقة `import_model()` هي جوهر المثبت. ما يلي يوضح الاستخدام الأساسي:
+
+```py
+from invokeai.app.services.model_install import (
+ LocalModelSource,
+ HFModelSource,
+ URLModelSource,
+)
+
+source1 = LocalModelSource(path='/opt/models/sushi.safetensors') # ملف safetensors محلي
+source2 = LocalModelSource(path='/opt/models/sushi_diffusers') # مجلد diffusers محلي
+
+source3 = HFModelSource(repo_id='runwayml/stable-diffusion-v1-5') # معرف مستودع
+source4 = HFModelSource(repo_id='runwayml/stable-diffusion-v1-5', subfolder='vae') # مجلد فرعي داخل معرف مستودع
+source5 = HFModelSource(repo_id='runwayml/stable-diffusion-v1-5', variant='fp16') # متغير مسمى لنموذج HF
+source6 = HFModelSource(repo_id='runwayml/stable-diffusion-v1-5', subfolder='OrangeMix/OrangeMix1.ckpt') # مسار إلى ملف نموذج فردي
+
+source7 = URLModelSource(url='https://civitai.com/api/download/models/63006') # نموذج موجود في عنوان URL
+source8 = URLModelSource(url='https://civitai.com/api/download/models/63006', access_token='letmein') # مع رمز وصول
+
+for source in [source1, source2, source3, source4, source5, source6, source7]:
+ install_job = installer.install_model(source)
+
+source2job = installer.wait_for_installs(timeout=120)
+for source in sources:
+ job = source2job[source]
+ if job.complete:
+ model_config = job.config_out
+ model_key = model_config.key
+ print(f"{source} مثبت كـ {model_key}")
+ elif job.errored:
+ print(f"{source}: {job.error_type}.\nتتبع المكدس:\n{job.error}")
+
+```
+
+كما هو موضح هنا، تقبل طريقة `import_model()` مجموعة متنوعة من المصادر، بما في ذلك ملفات safetensors المحلية ومجلدات diffusers المحلية ومعرفات مستودعات HuggingFace مع وبدون تسمية مجلد فرعي وعناوين URL لنماذج Civitai وعناوين URL عشوائية تشير إلى ملفات نقاط التفتيش (ولكن ليس المجلدات).
+
+كل استدعاء لـ `import_model()` يعيد وظيفة `ModelInstallJob`، كائن يتتبع تقدم التثبيت.
+
+إذا تم طلب نموذج بعيد، يتم تنزيل ملفات النموذج بالتوازي عبر مجموعة من الخيوط باستخدام قائمة انتظار التنزيل. أثناء عملية التنزيل، يتم تحديث `ModelInstallJob` لتوفير معلومات الحالة والتقدم. بعد تنزيل الملفات (إن وجدت)، يتم تشغيل باقي التثبيت في خلفية مسلسلة واحدة. هذه هي خطوات فحص النموذج ونسخ الملف وتحديث قاعدة بيانات سجل التكوين.
+
+يمكن وضع وظائف تثبيت متعددة في قائمة الانتظار. يمكنك الحظر حتى تكتمل جميع وظائف التثبيت (أو يحدث خطأ) عن طريق استدعاء طريقة `wait_for_installs()` كما هو موضح في مثال الكود. ستعيد `wait_for_installs()` قاموسًا `dict` يربط المصدر المطلوب بوظيفته. يمكن استجواب هذا الكائن لتحديد حالته. إذا فشلت الوظيفة، يمكن استرداد نوع الخطأ والتفاصيل من `job.error_type` و `job.error`.
+
+القائمة الكاملة لوسائط `import_model()` هي كالتالي:
+
+| الوسيط | النوع | الافتراضي | الوصف |
+|----------|-------|---------|-------------|
+| `source` | ModelSource | None | مصدر النموذج، مسار أو URL أو معرف مستودع |
+| `config` | Dict[str, Any] | None | تجاوز كل أو جزء من سمات النموذج التي تم فحصها |
+
+تصف الأقسام القليلة التالية الأنواع المختلفة من ModelSource التي يمكن تمريرها إلى `import_model()`.
+
+يمكن استخدام `config` لتجاوز كل أو جزء من سمات التكوين التي أرجعها فاحص النموذج. راجع القسم أدناه للتفاصيل.
+
+#### LocalModelSource
+
+يستخدم هذا لنموذج موجود على نظام ملفات Posix يمكن الوصول إليه محليًا، مثل قرص محلي أو مشاركة ملفات شبكية.
+
+| الوسيط | النوع | الافتراضي | الوصف |
+|----------|------|---------|-------------|
+| `path` | str | Path | None | المسار إلى ملف النموذج أو الدليل |
+| `inplace` | bool | False | إذا تم تعيينه، سيتم ترك ملف (ملفات) النموذج في موقعها؛ وإلا سيتم نسخها إلى دليل `models` الخاص بجذر InvokeAI |
+
+#### URLModelSource
+
+يستخدم هذا لنموذج ذي ملف واحد يمكن الوصول إليه عبر URL. الحقول هي:
+
+| الوسيط | النوع | الافتراضي | الوصف |
+|----------|------|---------|-------------|
+| `url` | AnyHttpUrl | None | عنوان URL لملف النموذج. |
+| `access_token` | str | None | رمز وصول مطلوب للوصول إلى هذا الملف. |
+
+يمكن استيراد فئة `AnyHttpUrl` من `pydantic.networks`.
+
+عادةً، لا يتم استرداد أي بيانات وصفية من هذه المصادر. ومع ذلك، هناك كود حالة خاصة في المثبت يبحث عن HuggingFace ويجلب بيانات النموذج الوصفية المقابلة من المستودع المقابل.
+
+#### HFModelSource
+
+HuggingFace لديها أكثر هيكل `ModelSource` تعقيدًا:
+
+| الوسيط | النوع | الافتراضي | الوصف |
+|----------|------|---------|-------------|
+| `repo_id` | str | None | معرف النموذج المطلوب. |
+| `variant` | ModelRepoVariant | ModelRepoVariant('fp16') | المتغير المطلوب. |
+| `subfolder` | Path | None | ابحث عن النموذج في مجلد فرعي من المستودع. |
+| `access_token` | str | None | رمز وصول مطلوب للوصول إلى نموذج المشتركين فقط. |
+
+`repo_id` هو معرف المستودع، مثل `stabilityai/sdxl-turbo`.
+
+`variant` هو أحد تنسيقات diffusers المختلفة التي يدعمها HuggingFace ويستخدم لاختيار من بين خليط الملفات الموجودة في مستودع HuggingFace نموذجي المكونات المحددة اللازمة لنموذج diffusers كامل. `ModelRepoVariant` هو تعداد يمكن استيراده من `invokeai.backend.model_manager` وله القيم التالية:
+
+| الاسم | قيمة السلسلة |
+|------|--------------|
+| ModelRepoVariant.DEFAULT | "default" |
+| ModelRepoVariant.FP16 | "fp16" |
+| ModelRepoVariant.FP32 | "fp32" |
+| ModelRepoVariant.ONNX | "onnx" |
+| ModelRepoVariant.OPENVINO | "openvino" |
+| ModelRepoVariant.FLAX | "flax" |
+
+يمكنك أيضًا تمرير نماذج السلاسل النصية إلى `variant` مباشرة. لاحظ أن InvokeAI قد لا يكون قادرًا على تحميل وتشغيل جميع المتغيرات. في الوقت الحالي، تحديد `ModelRepoVariant.DEFAULT` سيسترد ملفات النموذج غير المؤهلة، مثل `pytorch_model.safetensors` بدلاً من `pytorch_model.fp16.safetensors`. عادةً ما تكون هذه هي أشكال safetensors 32 بت من النموذج.
+
+إذا تم تحديد `subfolder`، فإن النموذج المطلوب موجود في مجلد فرعي من مستودع النموذج الرئيسي. يستخدم هذا عادةً لجلب وتثبيت VAEs.
+
+بعض النماذج تتطلب منك أن تكون مسجلاً في HuggingFace وداخلًا. لتنزيل هذه الملفات، يجب عليك توفير `access_token`. داخليًا، إذا لم يتم توفير رمز وصول، فسيتم استدعاء `HfFolder.get_token()` لملئه بالرمز المخزن مؤقتًا.
+
+#### مراقبة عملية وظيفة التثبيت
+
+عند إنشاء وظيفة تثبيت باستخدام `import_model()`، فإنها تطلق عملية التنزيل والتثبيت في الخلفية وتعيد كائن `ModelInstallJob` لمراقبة العملية.
+
+فئة `ModelInstallJob` لها الهيكل التالي:
+
+| السمة | النوع | الوصف |
+|-----------|------|-------------|
+| `id` | `int` | معرف رقمي لهذه الوظيفة |
+| `status` | `InstallStatus` | تعداد لـ [waiting, downloading, running, completed, error, cancelled] |
+| `config_in` | `dict` | تجاوز قيم التكوين المقدمة من قبل المتصل |
+| `config_out` | `AnyModelConfig` | بعد الاكتمال الناجح، يحتوي على سجل التكوين المكتوب في قاعدة البيانات |
+| `inplace` | `boolean` | صحيح إذا طلب المتصل تثبيت النموذج في مكانه باستخدام مساره المحلي |
+| `source` | `ModelSource` | المسار المحلي أو URL البعيد أو معرف مستودع النموذج المراد تثبيته |
+| `local_path` | `Path` | إذا كان نموذجًا بعيدًا، يحمل مسار النموذج بعد تنزيله؛ إذا كان نموذجًا محليًا، نفس `source` |
+| `error_type` | `str` | اسم الاستثناء الذي أدى إلى حالة الخطأ |
+| `error` | `str` | تتبع الخطأ |
+
+إذا تم توفير وسيطة `event_bus`، فسيتم أيضًا بث الأحداث إلى ناقل أحداث InvokeAI. ستظهر الأحداث على الناقل كحدث من نوع `EventServiceBase.model_event`، وطابع زمني وأسماء الأحداث التالية:
+
+##### `model_install_downloading`
+
+للنماذج البعيدة فقط، سيتم إصدار أحداث `model_install_downloading` على فترات منتظمة مع تقدم التنزيل. يحتوي حمولة الحدث على المفاتيح التالية:
+
+| المفتاح | النوع | الوصف |
+|-----|------|-------------|
+| `source` | str | تمثيل نصي للمصدر المطلوب |
+| `local_path` | str | تمثيل نصي للمسار إلى النموذج الجاري تنزيله (عادةً دليل مؤقت) |
+| `bytes` | int | عدد البايتات التي تم تنزيلها حتى الآن |
+| `total_bytes` | int | الحجم الإجمالي لجميع الملفات التي يتكون منها النموذج |
+| `parts` | List[Dict] | معلومات حول تقدم الملفات الفردية التي يتكون منها النموذج |
+
+الأجزاء هي قائمة من القواميس التي تعطي معلومات عن كل قطعة من مكونات التنزيل. مفاتيح القاموس هي `source` و `local_path` و `bytes` و `total_bytes`، وتتوافق مع المفاتيح المماثلة في الحدث الرئيسي.
+
+لاحظ أن أحداث التنزيل لن تصدر للنماذج المحلية، وأن أحداث التنزيل تحدث _قبل_ حدث التشغيل.
+
+##### `model_install_running`
+
+يتم إصدار `model_install_running` عند اكتمال جميع التنزيلات المطلوبة (إن وجدت) وبدأت عملية فحص النموذج ونسخه وتسجيله.
+
+ستحتوي الحمولة على المفتاح `source`.
+
+##### `model_install_completed`
+
+يتم إصدار `model_install_completed` مرة واحدة في نهاية التثبيت الناجح. ستحتوي الحمولة على المفاتيح `source` و `total_bytes` و `key`، حيث `key` هو المعرف الذي تم تسجيل النموذج به.
+
+##### `model_install_error`
+
+يتم إصدار `model_install_error` إذا فشلت عملية التثبيت لسبب ما. ستحتوي الحمولة على المفاتيح `source` و `error_type` و `error`. `error_type` هي رسالة قصيرة تشير إلى طبيعة الخطأ، و `error` هو تتبع الخطأ الطويل للمساعدة في تصحيح المشكلة.
+
+##### `model_install_cancelled`
+
+يتم إصدار `model_install_cancelled` إذا تم إلغاء تثبيت النموذج، أو إذا تم إلغاء تنزيل ملف واحد أو أكثر من ملفاته. ستحتوي الحمولة على `source`.
+
+##### متابعة حالة النموذج
+
+يمكنك استقصاء كائن `ModelInstallJob` الذي تم إرجاعه بواسطة `import_model()` للتأكد من حالة التثبيت. يمكن قراءة حالة الوظيفة من سمة `status` الخاصة بالوظيفة، وهي تعداد `InstallStatus` الذي له القيم المعدودة `WAITING` و `DOWNLOADING` و `RUNNING` و `COMPLETED` و `ERROR` و `CANCELLED`.
+
+للراحة، توفر وظائف التثبيت أيضًا الخصائص المنطقية التالية: `waiting` و `downloading` و `running` و `complete` و `errored` و `cancelled`، بالإضافة إلى `in_terminal_state`. الأخير سيعيد True إذا كانت الوظيفة في الحالات المكتملة أو الخاطئة أو الملغاة.
+
+#### تكوين النموذج وفحصه
+
+تستخدم خدمة التثبيت وحدة `invokeai.backend.model_manager.probe` أثناء الاستيراد لتحديد نوع النموذج ونوعه الأساسي ومعلمات التكوين الأخرى. من بين أمور أخرى، تقوم بتعيين اسم ووصف افتراضيين للنموذج بناءً على الحقول التي تم فحصها.
+
+عند تنفيذ تنزيل النماذج البعيدة، سيتم استرداد معلومات تكوين إضافية، مثل قائمة مصطلحات التشغيل، من مستودعات نماذج HuggingFace و Civitai.
+
+يمكن تجاوز القيم التي تم فحصها عن طريق توفير قاموس في الوسيطة الاختيارية `config` التي تم تمريرها إلى `import_model()`. يمكنك توفير قيم متجاوزة لأي من سمات تكوين النموذج. هنا مثال على تعيين `SchedulerPredictionType` و `name` لنموذج sd-2:
+
+```py
+install_job = installer.import_model(
+ source=HFModelSource(repo_id='stabilityai/stable-diffusion-2-1',variant='fp32'),
+ config=dict(
+ prediction_type=SchedulerPredictionType('v_prediction')
+ name='stable diffusion 2 base model',
+ )
+ )
+```
+
+### طرق المثبت الأخرى
+
+يصف هذا القسم طرقًا إضافية توفرها فئة المثبت.
+
+#### jobs = installer.wait_for_installs([timeout])
+
+حظر حتى اكتمال جميع التثبيتات المعلقة أو حدوث خطأ ثم إرجاع قائمة بالوظائف المكتملة. وسيطة `timeout` الاختيارية ستعيد من الاستدعاء إذا لم تكتمل الوظائف في الوقت المحدد. وسيطة 0 (الافتراضي) ستحظر إلى أجل غير مسمى.
+
+#### jobs = installer.wait_for_job(job, [timeout])
+
+مثل `wait_for_installs()`، ولكن حظر حتى تكتمل وظيفة محددة أو يحدث خطأ، ثم إرجاع الوظيفة. وسيطة `timeout` الاختيارية ستعيد من الاستدعاء إذا لم تكتمل الوظيفة في الوقت المحدد. وسيطة 0 (الافتراضي) ستحظر إلى أجل غير مسمى.
+
+#### jobs = installer.list_jobs()
+
+إرجاع قائمة بجميع `ModelInstallJobs` النشطة والمكتملة.
+
+#### jobs = installer.get_job_by_source(source)
+
+إرجاع قائمة من `ModelInstallJob` المقابلة لمصدر النموذج المشار إليه.
+
+#### jobs = installer.get_job_by_id(id)
+
+إرجاع قائمة من `ModelInstallJob` المقابلة لمعرف النموذج المشار إليه.
+
+#### jobs = installer.cancel_job(job)
+
+إلغاء الوظيفة المشار إليها.
+
+#### installer.prune_jobs
+
+إزالة الوظائف في حالة نهائية (أي مكتملة أو خاطئة أو ملغاة) من قائمة الوظائف التي أرجعتها `list_jobs()` و `get_job()`.
+
+#### installer.app_config, installer.record_store, installer.event_bus
+
+خصائص توفر الوصول إلى كائنات `InvokeAIAppConfig` و `ModelRecordServiceBase` و `EventServiceBase` الخاصة بالمثبت.
+
+#### key = installer.register_path(model_path, config), key = installer.install_path(model_path, config)
+
+تتجاوز هذه الطرق قائمة انتظار التنزيل وتقوم مباشرة بتسجيل أو تثبيت النموذج في المسار المشار إليه، مع إعادة المعرف الفريد للنموذج المثبت.
+
+تقبل كلتا الطريقتين كائن Path يتوافق مع نقطة تفتيش أو مجلد diffusers، وقاموسًا اختياريًا من سمات التكوين لاستخدامها في تجاوز القيم المشتقة من فحص النموذج.
+
+الفرق بين `register_path()` و `install_path()` هو أن الأولى تنشئ سجل تكوين نموذج دون تغيير موقع النموذج في نظام الملفات. الأخيرة تقوم بعمل نسخة من النموذج داخل دليل نماذج InvokeAI قبل تسجيله.
+
+#### installer.unregister(key)
+
+سيزيل هذا سجل تكوين النموذج للنموذج في المفتاح، وهو مكافئ لـ `installer.record_store.del_model(key)`
+
+#### installer.delete(key)
+
+هذا مشابه لـ `unregister()` ولكن له تأثير إضافي يتمثل في حذف ملف (ملفات) النموذج الأساسية بشكل مشروط إذا كانت موجودة ضمن دليل نماذج InvokeAI
+
+#### installer.unconditionally_delete(key)
+
+هذه الطريقة مشابهة لـ `unregister()`، ولكنها تحذف أيضًا بشكل غير مشروط ملف (ملفات) أوزان النموذج المقابلة، بغض النظر عما إذا كانت داخل أو خارج هيكل نماذج InvokeAI.
+
+#### path = installer.download_and_cache(remote_source, [access_token], [timeout])
+
+سيعمل روتين الأداة المساعدة هذا على تنزيل ملف النموذج الموجود في المصدر، وتخزينه مؤقتًا، وإرجاع المسار إلى الملف المخزن مؤقتًا. لا يحاول تحديد نوع النموذج أو فحص قيم تكوينه أو تسجيله في قاعدة بيانات النماذج.
+
+يمكنك توفير رمز وصول إذا كان المصدر البعيد يتطلب تفويضًا. ستحظر المكالمة إلى أجل غير مسمى حتى يتم تنزيل الملف بالكامل أو إلغاؤه أو إثارة خطأ من نوع ما. إذا قمت بتوفير مهلة (بالثواني)، ستثير المكالمة استثناء `TimeoutError` إذا لم يكتمل التنزيل في الفترة المحددة.
+
+يمكنك استخدام هذه الآلية لطلب أي نوع من الملفات، وليس فقط نموذجًا. سيتم تخزين الملف في دليل فرعي من `INVOKEAI_ROOT/models/.cache`. إذا تم العثور على الملف المطلوب في ذاكرة التخزين المؤقتة، فسيتم إرجاع مساره دون إعادة تنزيله.
+
+كن على علم بأن ذاكرة التخزين المؤقتة للنماذج يتم مسحها من الملفات والدلائل قليلة الاستخدام على فترات منتظمة عندما يتجاوز حجم ذاكرة التخزين المؤقتة القيمة المحددة في متغير تكوين `convert_cache` الخاص بـ Invoke.
+
+#### installer.start(invoker)
+
+طريقة `start` تُستدعى من قبل روتينات تهيئة API عند بدء تشغيل API. تأثيرها هو استدعاء `sync_to_config()` لمزامنة قاعدة بيانات مخزن سجلات النموذج مع ما هو موجود حاليًا على القرص.
+
+---
+
+## احصل على الخط: قائمة انتظار التنزيل
+
+يمكن لـ InvokeAI تنزيل ملفات عشوائية باستخدام قائمة انتظار تنزيل خلفية متعددة الخيوط. داخليًا، تُستخدم قائمة انتظار التنزيل لتثبيت النماذج الموجودة في المواقع البعيدة. يتم تنفيذ قائمة الانتظار بواسطة `DownloadQueueService` المعرفة في `invokeai.app.services.download_manager`. ومع ذلك، فإن معظم التنفيذ موزع على عدة ملفات في `invokeai/backend/model_manager/download/*`
+
+توجد قائمة انتظار تنزيل افتراضية في `ApiDependencies.invoker.services.download_queue`. ومع ذلك، يمكنك إنشاء مثيلات إضافية إذا كنت بحاجة إلى عزل قائمة الانتظار الخاصة بك عن القائمة الرئيسية.
+
+### وظيفة لكل مهمة
+
+تعمل قائمة الانتظار على سلسلة من كائنات وظائف التنزيل. تحدد هذه الكائنات مصدر ووجهة التنزيل، وتتتبع تقدم التنزيل. تأتي الوظائف في مجموعة متنوعة من الأشكال والألوان حيث يتم تخصصيها تدريجيًا لمهمة تنزيل معينة.
+
+الوظيفة الأساسية هي `DownloadJobBase`، كائن pydantic مع الحقول التالية:
+
+| الحقل | النوع | الافتراضي | الوصف |
+|-------|------|---------|-------------|
+| `id` | int | | معرف الوظيفة، عدد صحيح >= 0 |
+| `priority` | int | 10 | أولوية الوظيفة. الأولويات الأقل تعمل قبل الأولويات الأعلى |
+| `source` | str | | من أين يتم التنزيل (أنواع متخصصة مستخدمة في الفئات الفرعية) |
+| `destination` | Path | | أين يتم التنزيل |
+| `status` | DownloadJobStatus | Idle | حالة الوظيفة (انظر أدناه) |
+| `event_handlers` | List[DownloadEventHandler] | | معالجات الأحداث (انظر أدناه) |
+| `job_started` | float | | طابع زمني وقت بدء الوظيفة |
+| `job_ended` | float | | طابع زمني وقت اكتمال الوظيفة أو حدوث خطأ |
+| `job_sequence` | int | | عداد يزداد في كل مرة يتم فيها إخراج نموذج من قائمة الانتظار |
+| `error` | Exception | | نسخة من الاستثناء الذي تسبب في خطأ أثناء التنزيل |
+
+عند إنشاء وظيفة، يمكنك تعيين `priority` لها. إذا كانت وظائف متعددة في قائمة الانتظار، فإن الوظيفة ذات الأولوية الأقل تعمل أولاً. (لا تلومنا! مطورو Unix جاءوا بهذه الاتفاقية.)
+
+كل وظيفة لها `source` و `destination`. `source` هي سلسلة نصية في الفئة الأساسية، ولكن الفئات الفرعية تعيد تعريفها بشكل أكثر تحديدًا.
+
+يجب أن يكون `destination` مسارًا لملف أو دليل على نظام الملفات المحلي. إذا كان المسار يشير إلى ملف جديد أو موجود، فسيتم تخزين المصدر تحت اسم الملف هذا. إذا كان المسار يشير إلى دليل موجود، فسيتم تخزين الملف الذي تم تنزيله داخل الدليل، عادةً باستخدام الاسم المخصص له في الموقع البعيد في حقل `content-disposition` في HTTP.
+
+عند تقديم الوظيفة، يتم تعيين `id` رقمي لها. يمكن بعد ذلك استخدام المعرف للتحكم في الوظيفة، مثل بدء تنزيلها وإيقافه وإلغائه.
+
+يتم تحديث حقل `status` بواسطة قائمة الانتظار للإشارة إلى مكان الوظيفة في دورة حياتها. يتم تعريف القيم في التعداد النصي `DownloadJobStatus`، وهو رمز متاح من `invokeai.app.services.download_manager`. القيم الممكنة هي:
+
+| القيمة | قيمة السلسلة | الوصف |
+|-------|--------------|-------------|
+| `IDLE` | idle | تم إنشاء الوظيفة، لكن لم يتم تقديمها إلى قائمة الانتظار |
+| `ENQUEUED` | enqueued | الوظيفة تنتظر بصبر في قائمة الانتظار |
+| `RUNNING` | running | الوظيفة قيد التشغيل! |
+| `PAUSED` | paused | تم إيقاف الوظيفة مؤقتًا ويمكن إعادة تشغيلها |
+| `COMPLETED` | completed | أكملت الوظيفة عملها دون خطأ |
+| `ERROR` | error | واجهت الوظيفة خطأ ولن تعمل مرة أخرى |
+| `CANCELLED` | cancelled | تم إلغاء الوظيفة ولن تعمل (مرة أخرى) |
+
+`job_started` و `job_ended` و `job_sequence` تشير إلى وقت بدء الوظيفة (باستخدام طابع زمني لبايثون)، ووقت اكتمالها، والترتيب الذي تم به إخراجها من قائمة الانتظار. تُستخدم هذه في الغالب لتصحيح الأخطاء واختبار الأداء.
+
+في حالة حدوث خطأ، سيتم وضع الاستثناء الذي تسبب في الخطأ في حقل `error`، وسيتم تعيين حالة الوظيفة إلى `DownloadJobStatus.ERROR`.
+
+بعد حدوث خطأ، سيتم حذف أي ملفات تم تنزيلها جزئيًا من القرص، ما لم يتم تعيين `preserve_partial_downloads` على True في وقت إنشاء الوظيفة (أو تعيين على True في أي وقت قبل حدوث الخطأ). لاحظ أنه نظرًا لأن جميع عمليات تثبيت نماذج InvokeAI تتضمن تنزيل ملفات إلى دليل مؤقت له عمر محدود، فإن هذا العلم لا يستخدمه مثبت النموذج.
+
+هناك سلسلة من الفئات الفرعية لـ `DownloadJobBase` التي توفر الدعم لأنواع محددة من التنزيلات. هذه هي:
+
+#### DownloadJobPath
+
+تعيد هذه الفئة الفرعية تعريف `source` ليكون مسار نظام ملفات. تُستخدم لنقل ملف أو دليل من `source` إلى مسار `destination` في الخلفية باستخدام بنية تحتية موحدة قائمة على الأحداث.
+
+#### DownloadJobRemoteSource
+
+تضيف هذه الفئة الفرعية الحقول التالية إلى الوظيفة:
+
+| الحقل | النوع | الافتراضي | الوصف |
+|-------|------|---------|-------------|
+| `bytes` | int | 0 | البايتات التي تم تنزيلها حتى الآن |
+| `total_bytes` | int | 0 | الحجم الإجمالي للتنزيل |
+| `access_token` | Any | None | رمز تفويض لتقديمه إلى المصدر البعيد |
+
+ستبدأ الوظيفة بـ 0/0 في حقول البايتات/إجمالي البايتات. بمجرد بدء التشغيل، سيتم ملء `total_bytes` من المعلومات المقدمة في رأس تنزيل HTTP (إن وجدت)، وسيزداد عدد البايتات التي تم تنزيلها حتى الآن تدريجيًا.
+
+#### DownloadJobURL
+
+هذه فئة فرعية من `DownloadJobBase`. تعيد تعريف `source` ليكون كائن Pydantic `AnyHttpUrl`، والذي يفرض التحقق من صحة عنوان URL على الحقل.
+
+لاحظ أن خدمة المثبت تعرف فئة فرعية إضافية من `DownloadJobRemoteSource` تقبل معرفات مستودعات HuggingFace بالإضافة إلى عناوين URL. تتم مناقشة هذا لاحقًا في هذا المستند.
+
+### معالجات الأحداث
+
+أثناء تنزيل وظيفة، ستصدر قائمة الانتظار أحداثًا على فترات دورية. ستبدو سلسلة نموذجية من الأحداث أثناء جلسة تنزيل ناجحة هكذا:
+
+
+ 1. `enqueued`
+ 2. `running`
+ 3. `running`
+ 4. `running`
+ 5. `completed`
+
+
+سيكون هناك حدث enqueued واحد، متبوعًا بحدث تشغيل واحد أو أكثر، وأخيرًا حدث واحد `completed` أو `error` أو `cancelled`.
+
+من الممكن للمتصل إيقاف التنزيل مؤقتًا بشكل مؤقت، وفي هذه الحالة قد تبدو الأحداث شيئًا كهذا:
+
+
+ 1. `enqueued`
+ 2. `running`
+ 3. `running`
+ 4. `paused` المستخدم أوقف التنزيل مؤقتًا
+ 5. `running`
+ 6. `completed`
+
+
+تقوم قائمة انتظار التنزيل بتسجيل عند بدء التنزيلات وانتهائها (ما لم يتم تعيين `quiet` على True في وقت التهيئة) ولكنها لا تسجل أي أحداث تقدم. ربما سترغب في أن يتم تنبيهك للأحداث أثناء وظيفة التنزيل وتقديم ردود فعل أكثر للمستخدم. من أجل اعتراض الأحداث والاستجابة لها، يمكنك تثبيت سلسلة من معالج أحداث واحد أو أكثر في الوظيفة. عندما تتغير حالة الوظيفة، يتم اجتياز سلسلة معالجات الأحداث وتنفيذها في نفس الخيط الذي تعمل فيه وظيفة التنزيل.
+
+معالجات الأحداث لها التوقيع `Callable[["DownloadJobBase"], None]`، أي:
+
+```py
+def handler(job: DownloadJobBase):
+ pass
+```
+
+سيفحص معالج نموذجي `job.status` ويقرر ما إذا كان هناك شيء يجب فعله. يمكن أن يشمل ذلك إلغاء الوظيفة أو إحداث خطأ، ولكن الأكثر شيوعًا يُستخدم للإبلاغ عن حالة الوظيفة لواجهة المستخدم أو لأداء إجراءات معينة عند الاكتمال الناجح للوظيفة.
+
+يمكن إرفاق معالجات الأحداث بوظيفة في وقت الإنشاء. بالإضافة إلى ذلك، يمكنك إنشاء سلسلة من المعالجات الافتراضية التي يتم إرفاقها بكائن قائمة الانتظار نفسه. سيتم تنفيذ هذه المعالجات لكل وظيفة بعد تشغيل معالجات الوظيفة نفسها (إن وجدت).
+
+أثناء التنزيل، يتم إصدار أحداث التشغيل كلما تم نقل حوالي 1٪ من الملف. هذا لتوفير دقة كافية لتحديث شريط تقدم tqdm بسلاسة.
+
+يمكن إضافة المعالجات إلى وظيفة بعد ذلك باستخدام طريقة `add_event_handler` الخاصة بالوظيفة:
+
+```py
+job.add_event_handler(my_handler)
+```
+
+يمكن مسح جميع المعالجات باستخدام طريقة `clear_event_handlers()` الخاصة بالوظيفة. لاحظ أنه قد يكون من الجيد إيقاف الوظيفة مؤقتًا قبل تغيير معالجاتها.
+
+### إنشاء كائن قائمة انتظار التنزيل
+
+يأخذ مُنشئ `DownloadQueueService` الوسائط التالية:
+
+| الوسيط | النوع | الافتراضي | الوصف |
+|----------|------|---------|-------------|
+| `event_handlers` | List[DownloadEventHandler] | [] | معالجات الأحداث |
+| `max_parallel_dl` | int | 5 | الحد الأقصى لعدد التنزيلات المتزامنة المسموح بها |
+| `requests_session` | requests.sessions.Session | None | كائن Session بديل لاستخدامه في التنزيل |
+| `quiet` | bool | False | قم بالعمل بهدوء دون إصدار رسائل سجل |
+
+سيبدو تسلسل التهيئة النموذجي كما يلي:
+
+```py
+from invokeai.app.services.download_manager import DownloadQueueService
+
+def log_download_event(job: DownloadJobBase):
+ logger.info(f'job={job.id}: status={job.status}')
+
+queue = DownloadQueueService(
+ event_handlers=[log_download_event]
+ )
+```
+
+يمكن توفير معالجات الأحداث لقائمة الانتظار في وقت التهيئة كما هو موضح في المثال. سيتم إلحاق هذه تلقائيًا بقائمة المعالجات لأي وظيفة يتم تقديمها إلى قائمة الانتظار هذه.
+
+`max_parallel_dl` يحدد عدد التنزيلات النشطة المتزامنة المسموح بها. لم يتم قياس الأداء للقيمة الافتراضية خمسة بأي شكل من الأشكال، لكنها تبدو تعطي أداءً مقبولاً.
+
+يمكن استخدام `requests_session` لتوفير كائن Session من وحدة `requests` الذي سيستخدم لدفق عناوين URL البعيدة إلى القرص. تمت إضافة هذه الميزة للاستخدام في اختبارات الوحدة للوحدة النمطية لمحاكاة خادم ويب بعيد، ولكنها قد تكون مفيدة في سياقات أخرى.
+
+`quiet` سيمنع قائمة الانتظار من إصدار أي رسائل سجل على مستوى INFO أو أعلى.
+
+### تقديم وظيفة تنزيل
+
+يمكنك تقديم وظيفة تنزيل إلى قائمة الانتظار إما عن طريق إنشاء الوظيفة يدويًا وتمريرها إلى طريقة `submit_download_job()` الخاصة بقائمة الانتظار، أو باستخدام طريقة `create_download_job()`، التي ستفعل الشيء نفسه بالنيابة عنك.
+
+لاستخدام الطريقة الأولى، اتبع هذا المثال:
+
+```py
+job = DownloadJobRemoteSource(
+ source='http://www.civitai.com/models/13456',
+ destination='/tmp/models/',
+ event_handlers=[my_handler1, my_handler2], # إذا رغبت
+)
+queue.submit_download_job(job, start=True)
+```
+
+`submit_download_job()` تأخذ وسيطتين فقط: الوظيفة المراد تقديمها، وعلم يشير إلى ما إذا كان سيتم بدء الوظيفة على الفور (الافتراضي هو True). إذا اخترت عدم بدء الوظيفة على الفور، يمكنك بدؤها لاحقًا عن طريق استدعاء طرق `start_job()` أو `start_all_jobs()` الخاصة بقائمة الانتظار، والتي تم وصفها لاحقًا.
+
+لجعل قائمة الانتظار تنشئ الوظيفة لك، اتبع هذا المثال بدلاً من ذلك:
+
+```py
+job = queue.create_download_job(
+ source='http://www.civitai.com/models/13456',
+ destdir='/tmp/models/',
+ filename='my_model.safetensors',
+ event_handlers=[my_handler1, my_handler2], # إذا رغبت
+ start=True,
+ )
+```
+
+وسيطة `filename` تجبر أداة التنزيل على استخدام الاسم المحدد للملف بدلاً من الاسم الذي يوفره المصدر البعيد، وهي مكافئة لتحديد وجهة يدويًا مثل `/tmp/models/my_model.safetensors` في الوظيفة المقدمة.
+
+هذه هي القائمة الكاملة للوسائط التي يمكن توفيرها لـ `create_download_job()`:
+
+| الوسيط | النوع | الافتراضي | الوصف |
+|----------|------|---------|-------------|
+| `source` | Union[str, Path, AnyHttpUrl] | | مصدر التنزيل البعيد أو المحلي |
+| `destdir` | Path | | دليل الوجهة للملف الذي تم تنزيله |
+| `filename` | Path | None | اسم ملف للملف الذي تم تنزيله |
+| `start` | bool | True | ضع الوظيفة في قائمة الانتظار فورًا |
+| `priority` | int | 10 | الأولوية الابتدائية لهذه الوظيفة |
+| `access_token` | str | None | رمز التفويض لهذا المورد |
+| `event_handlers` | List[DownloadEventHandler] | [] | معالجات الأحداث لهذه الوظيفة |
+
+داخليًا، لدى `create_download_job()` القليل من المنطق الداخلي الذي ينظر إلى نوع المصدر ويختار الفئة الفرعية الصحيحة من `DownloadJobBase` لإنشائها ووضعها في قائمة الانتظار.
+
+**TODO**: نقل هذا المنطق إلى طريقته الخاصة لتجاوزه في الفئات الفرعية.
+
+### التحكم في الوظائف
+
+قبل الاكتمال، يمكن التحكم في الوظائف بسلسلة من استدعاءات طرق قائمة الانتظار. لا تحاول تعديل الوظائف عن طريق الكتابة مباشرة في حقولها، حيث من المرجح أن يؤدي هذا إلى نتائج غير متوقعة.
+
+أي طريقة تقبل وسيطة وظيفة قد تثير استثناء `UnknownJobIDException` إذا لم يتم تقديم الوظيفة بعد إلى قائمة الانتظار أو لم يتم إنشاؤها بواسطة قائمة الانتظار هذه.
+
+#### queue.join()
+
+ستحظر هذه الطريقة حتى تصل جميع الوظائف النشطة في قائمة الانتظار إلى حالة نهائية (مكتملة أو خاطئة أو ملغاة).
+
+#### queue.wait_for_job(job, [timeout])
+
+ستحظر هذه الطريقة حتى تصل الوظيفة المشار إليها إلى حالة نهائية (مكتملة أو خاطئة أو ملغاة). إذا تم توفير المهلة الاختيارية، فستحظر المكالمة لمدة أقصاها timeout ثانية، وستثير TimeoutError بخلاف ذلك.
+
+#### jobs = queue.list_jobs()
+
+سيعيد هذا قائمة بجميع الوظائف، بما في ذلك تلك التي لم يتم وضعها في قائمة الانتظار بعد وتلك التي اكتملت أو حدث بها خطأ.
+
+#### job = queue.id_to_job(int)
+
+تسمح لك هذه الطريقة باستعادة وظيفة مقدمة باستخدام معرفها.
+
+#### queue.prune_jobs()
+
+إزالة الوظائف المكتملة والخاطئة من قائمة الوظائف.
+
+#### queue.start_job(job)
+
+إذا تم تقديم الوظيفة مع `start=False`، يمكن بدؤها باستخدام هذه الطريقة.
+
+#### queue.pause_job(job)
+
+سيؤدي هذا إلى إيقاف الوظيفة مؤقتًا، إذا كان ذلك ممكنًا. يمكن إعادة تشغيلها لاحقًا واستئنافها من حيث توقفت باستخدام `queue.start_job()`.
+
+#### queue.cancel_job(job)
+
+سيؤدي هذا إلى إلغاء الوظيفة إذا كان ذلك ممكنًا وتنظيف الملفات المؤقتة والموارد الأخرى التي ربما كانت تستخدمها.
+
+#### queue.start_all_jobs(), queue.pause_all_jobs(), queue.cancel_all_jobs()
+
+سيؤدي هذا إلى بدء/إيقاف/إلغاء جميع الوظائف التي تم تقديمها إلى قائمة الانتظار ولم تصل بعد إلى حالة نهائية.
+
+---
+
+## هذه البيانات الوصفية جيدة: تخزين البيانات الوصفية للنموذج
+
+توفر الوحدات الموجودة تحت `invokeai.backend.model_manager.metadata` واجهة برمجة تطبيقات مباشرة لجلب البيانات الوصفية للنموذج من المستودعات عبر الإنترنت. حاليًا، يتم دعم HuggingFace فقط. ومع ذلك، يمكن تمديد الوحدات بسهولة لمستودعات إضافية، بشرط أن تكون لديهم واجهات برمجة تطبيقات محددة للوصول إلى البيانات الوصفية.
+
+تتكون البيانات الوصفية من أي معلومات وصفية غير ضرورية لتشغيل النموذج. على سبيل المثال، "المؤلف" هو بيانات وصفية، بينما "النوع" و "الأساس" و "التنسيق" ليست كذلك. الحقول الأخيرة هي جزء من تكوين النموذج، كما هو محدد في `invokeai.backend.model_manager.config`.
+
+### مثال على الاستخدام
+
+```py
+from invokeai.backend.model_manager.metadata import (
+ AnyModelRepoMetadata,
+)
+# للوصول إلى قاعدة بيانات sql المهيأة
+from invokeai.app.api.dependencies import ApiDependencies
+
+hf = HuggingFaceMetadataFetch()
+
+# جلب البيانات الوصفية
+model_metadata = hf.from_id("")
+
+assert isinstance(model_metadata, HuggingFaceMetadata)
+```
+
+### هيكل كائنات البيانات الوصفية
+
+هناك تسلسل هرمي قصير لكائنات البيانات الوصفية، وكلها تنحدر من `BaseModel` من Pydantic.
+
+#### `ModelMetadataBase`
+
+هذه هي الفئة الأساسية المشتركة للبيانات الوصفية:
+
+| اسم الحقل | النوع | الوصف |
+|------------|------|-------------|
+| `name` | str | اسم المستودع للنموذج |
+| `author` | str | مؤلف النموذج |
+| `tags` | Set[str] | وسوم النموذج |
+
+لاحظ أن سجل تكوين النموذج له أيضًا حقل `name`. من المقصود أن يكون إصدار سجل التكوين قابلاً للتخصيص محليًا، بينما إصدار البيانات الوصفية للقراءة فقط. ومع ذلك، من المتوقع أن يكون فرض هذا جزءًا من منطق الأعمال.
+
+النسل من القاعدة يضيف حقولًا إضافية.
+
+#### `HuggingFaceMetadata`
+
+ينحدر هذا من `ModelMetadataBase` ويضيف الحقول التالية:
+
+| اسم الحقل | النوع | الوصف |
+|------------|------|-------------|
+| `type` | Literal["huggingface"] | يُستخدم للاتحاد المُميَّز لفئات البيانات الوصفية |
+| `id` | str | معرف مستودع HuggingFace |
+| `tag_dict` | Dict[str, Any] | قاموس من أزواج الوسم/القيمة المقدمة بالإضافة إلى `tags` |
+| `last_modified` | datetime | تاريخ آخر التزام لهذا النموذج في المستودع |
+| `files` | List[Path] | قائمة بالملفات في مستودع النموذج |
+
+#### `AnyModelRepoMetadata`
+
+هذا اتحاد مُميَّز من `HuggingFaceMetadata`.
+
+### جلب البيانات الوصفية من المستودعات عبر الإنترنت
+
+ستقوم فئة `HuggingFaceMetadataFetch` باسترداد البيانات الوصفية من مستودعها المقابل وإرجاع كائنات `AnyModelRepoMetadata`. فئتها الأساسية `ModelMetadataFetchBase` هي فئة مجردة تحدد طريقتين: `from_url()` و `from_id()`. الأولى تقبل نوع عناوين URL للنماذج التي سيحاول المستخدم قصها ولصقها في نموذج استيراد النموذج. الأخيرة تقبل معرف سلسلة بالتنسيق المعترف به من قبل المستودع الذي تم اختياره. تعيد كلتا الطريقتين `AnyModelRepoMetadata`.
+
+تحتوي الفئة الأساسية أيضًا على طريقة فئة `from_json()` التي ستأخذ تمثيل JSON لكائن `ModelMetadata`، وتتحقق من صحته، وتعيد كائن `AnyModelRepoMetadata` المقابل.
+
+عند تهيئة إحدى فئات جلب البيانات الوصفية، يمكنك توفير وسيطة `requests.Session`. يتيح لك هذا تخصيص طلبات HTTP منخفضة المستوى ويُستخدم، على سبيل المثال، في مجموعة الاختبارات لتجنب الاتصال بالإنترنت.
+
+تضيف الفئة الفرعية لجالب HuggingFace طرق جلب إضافية خاصة بالمستودع:
+
+#### HuggingFaceMetadataFetch
+
+يتجاوز هذا طريقة `from_json()` لفئته الأساسية لإرجاع كائن `HuggingFaceMetadata` مباشرة.
+
+### تخزين البيانات الوصفية
+
+يخزن `ModelConfigBase` هذه الاستجابة في حقل `source_api_response` ككتلة JSON.
+
+---
+
+## المعلومات الأساسية حول ModelLoadService
+
+`ModelLoadService` مسؤول عن تحميل نموذج مسمى في الذاكرة بحيث يمكن استخدامه للاستدلال. على الرغم من حقيقة أنه يفعل الكثير تحت الغطاء، إلا أنه سهل الاستخدام للغاية.
+
+يتم إنشاء محمل نموذج على مستوى التطبيق في وقت تهيئة API ويتم تخزينه في `ApiDependencies.invoker.services.model_loader`. ومع ذلك، يمكنك إنشاء مثيلات بديلة إذا كنت ترغب في ذلك.
+
+### إنشاء كائن ModelLoadService
+
+يتم تعريف الفئة في `invokeai.app.services.model_load`. تتم تهيئتها بكائن InvokeAIAppConfig، الذي تحصل منه على معلومات التكوين مثل GPU المطلوب للمستخدم والدقة، وكائن `ModelRecordServiceBase` تم إنشاؤه مسبقًا، والذي تحمل منه معلومات تكوين النموذج المطلوب.
+
+هذا نمط تهيئة نموذجي:
+
+```py
+from invokeai.app.services.config import InvokeAIAppConfig
+from invokeai.app.services.model_load import ModelLoadService, ModelLoaderRegistry
+
+config = InvokeAIAppConfig.get_config()
+
+ram_cache = ModelCache(
+ max_cache_size=config.ram_cache_size, max_vram_cache_size=config.vram_cache_size, logger=logger
+)
+
+convert_cache = ModelConvertCache(
+ cache_path=config.models_convert_cache_path, max_size=config.convert_cache_size
+)
+
+loader = ModelLoadService(
+ app_config=config,
+ ram_cache=ram_cache,
+ convert_cache=convert_cache,
+ registry=ModelLoaderRegistry
+)
+```
+
+### load_model(model_config, [submodel_type], [context]) -> LoadedModel
+
+تأخذ طريقة `load_model()` كائن `AnyModelConfig` الذي أعادته `ModelRecordService.get_model()` وتعيد النموذج المحمل المقابل. تقوم بتحميل النموذج في الذاكرة، وتجهز النموذج للاستخدام، وتعيد كائن `LoadedModel`.
+
+الوسيطة الثانية الاختيارية، `subtype` هي تعداد نصي `SubModelType`، مثل "vae". وهي إلزامية عند استخدامها مع نموذج رئيسي، وتستخدم لاختيار أي جزء من النموذج الرئيسي لتحميله.
+
+الوسيطة الثالثة الاختيارية، `context` يمكن أن يوفرها استدعاء لتفعيل الإبلاغ عن حدث تحميل النموذج. انظر أدناه للتفاصيل.
+
+كائن `LoadedModel` الذي تم إرجاعه يحتوي على نسخة من سجل التكوين الذي أعادته طريقة `get_model()` لسجل النموذج، بالإضافة إلى النموذج المحمل في الذاكرة:
+
+| اسم السمة | النوع | الوصف |
+|----------------|------|-------------|
+| `config` | AnyModelConfig | نسخة من سجل تكوين النموذج لاسترداد النوع الأساسي، إلخ. |
+| `model` | AnyModel | النموذج الذي تم إنشاء مثيل له (التفاصيل أدناه) |
+
+### get_model_by_key(key, [submodel]) -> LoadedModel
+
+طريقة `get_model_by_key()` ستسترد النموذج باستخدام مفتاح قاعدة البيانات الفريد الخاص به. على سبيل المثال:
+
+```py
+loaded_model = loader.get_model_by_key('f13dd932c0c35c22dcb8d6cda4203764', SubModelType('vae'))
+```
+
+قد تثير `get_model_by_key()` أيًا من الاستثناءات التالية:
+
+* `UnknownModelException` -- المفتاح غير موجود في قاعدة البيانات
+* `ModelNotFoundException` -- المفتاح موجود في قاعدة البيانات ولكن النموذج غير موجود في المسار
+* `NotImplementedException` -- لا يعرف المحمل كيفية تحميل هذا النوع من النماذج
+
+### استخدام النموذج المحمل في الاستدلال
+
+يعمل `LoadedModel` كمدير سياق. يقوم السياق بتحميل النموذج في جهاز التنفيذ (مثل VRAM على أنظمة CUDA)، ويقفل النموذج في جهاز التنفيذ طوال مدة السياق، ويعيد النموذج. استخدمه هكذا:
+
+```py
+loaded_model_= loader.get_model_by_key('f13dd932c0c35c22dcb8d6cda4203764', SubModelType('vae'))
+with loaded_model as vae:
+ image = vae.decode(latents)[0]
+```
+
+الكائن الذي يعيده مدير السياق LoadedModel هو `AnyModel`، وهو اتحاد من `ModelMixin` و `torch.nn.Module` و `IAIOnnxRuntimeModel` و `IPAdapter` و `IPAdapterPlus` و `EmbeddingModelRaw`. `ModelMixin` هي الفئة الأساسية لجميع نماذج diffusers، و `EmbeddingModelRaw` يستخدم لنماذج LoRA و TextualInversion. الأخرى واضحة.
+
+بالإضافة إلى ذلك، يمكنك استدعاء `LoadedModel.model_on_device()`، وهو مدير سياق يعيد مجموعة (tuple) من قاموس حالة النموذج في CPU والنموذج نفسه في VRAM. يُستخدم لتحسين عملية تصحيح وتصحيح LoRA:
+
+```py
+loaded_model_= loader.get_model_by_key('f13dd932c0c35c22dcb8d6cda4203764', SubModelType('vae'))
+with loaded_model.model_on_device() as (state_dict, vae):
+ image = vae.decode(latents)[0]
+```
+
+نظرًا لأنه ليست كل النماذج تحتوي على قواميس حالة، فإن قيمة الإرجاع `state_dict` يمكن أن تكون None.
+
+### إصدار أحداث تحميل النموذج
+
+عند تمرير وسيطة `context` إلى `load_model_*()`، ستسترجع ناقل حدث الاستدعاء من كائن `InvocationContext` المُمرر لإصدار أحداث على ناقل الاستدعاء. الحدثان هما "model_load_started" و "model_load_completed". كلاهما يحمل الحمولة التالية:
+
+```py
+payload=dict(
+ queue_id=queue_id,
+ queue_item_id=queue_item_id,
+ queue_batch_id=queue_batch_id,
+ graph_execution_state_id=graph_execution_state_id,
+ model_key=model_key,
+ submodel_type=submodel,
+ hash=model_info.hash,
+ location=str(model_info.location),
+ precision=str(model_info.precision),
+)
+```
+
+### إضافة محملات النماذج
+
+محملات النماذج هي فئات صغيرة ترث من الفئة الأساسية `ModelLoader`. تنفذ عادةً طريقة واحدة `_load_model()` التي توقيعها:
+
+```py
+def _load_model(
+ self,
+ model_path: Path,
+ model_variant: Optional[ModelRepoVariant] = None,
+ submodel_type: Optional[SubModelType] = None,
+) -> AnyModel:
+```
+
+سيتم تمرير `_load_model()` إلى مسار النموذج على القرص، ومتغير مستودع اختياري (يستخدمه محملات diffusers لاختيار متغير fp16 مثلاً)، ونوع نموذج فرعي اختياري للنماذج الرئيسية و onnx.
+
+لتثبيت محمل جديد، ضعه في `invokeai/backend/model_manager/load/model_loaders`. ورث من `ModelLoader` واستخدم ديكور `@ModelLoaderRegistry.register()` للإشارة إلى نوع النماذج التي يمكن للمحمل معالجتها.
+
+هذا مثال كامل من `generic_diffusers.py`، القادر على تحميل عدة أنواع مختلفة من diffusers:
+
+```py
+from pathlib import Path
+from typing import Optional
+
+from invokeai.backend.model_manager import (
+ AnyModel,
+ BaseModelType,
+ ModelFormat,
+ ModelRepoVariant,
+ ModelType,
+ SubModelType,
+)
+from .. import ModelLoader, ModelLoaderRegistry
+
+
+@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.CLIPVision, format=ModelFormat.Diffusers)
+@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.T2IAdapter, format=ModelFormat.Diffusers)
+class GenericDiffusersLoader(ModelLoader):
+ """فئة لتحميل نماذج diffusers البسيطة."""
+
+ def _load_model(
+ self,
+ model_path: Path,
+ model_variant: Optional[ModelRepoVariant] = None,
+ submodel_type: Optional[SubModelType] = None,
+ ) -> AnyModel:
+ model_class = self._get_hf_load_class(model_path)
+ if submodel_type is not None:
+ raise Exception(f"لا توجد نماذج فرعية في نماذج من نوع {model_class}")
+ variant = model_variant.value if model_variant else None
+ result: AnyModel = model_class.from_pretrained(model_path, torch_dtype=self._torch_dtype, variant=variant)
+ return result
+```
+
+:::note
+يمكن للمحمل تسجيل نفسه للتعامل مع عدة أنواع نماذج مختلفة. سيتم إثارة استثناء إذا حاول أكثر من محمل تسجيل نفس نوع النموذج.
+:::
+
+#### التحويل
+
+تتطلب بعض النماذج التحويل إلى تنسيق diffusers قبل أن يمكن تحميلها. يجب أن تتجاوز هذه المحملات طريقتين إضافيتين:
+
+```py
+_needs_conversion(self, config: AnyModelConfig, model_path: Path, dest_path: Path) -> bool
+_convert_model(self, config: AnyModelConfig, model_path: Path, output_path: Path) -> Path:
+```
+
+تقبل الطريقة الأولى تكوين النموذج، والمسار إلى حيث تم تثبيت النموذج غير المعدل حاليًا، ووجهة مقترحة للنموذج المحول. تعيد هذه الطريقة True إذا كان النموذج بحاجة إلى التحويل. تقوم بذلك عادةً عن طريق مقارنة وقت التعديل الأخير لملف النموذج الأصلي بوقت تعديل النموذج المحول. في بعض الحالات، ستحتاج أيضًا إلى التحقق من تاريخ تعديل سجل التكوين، في حال قام المستخدم بتغيير شيء مثل نوع توقع الجدولة الذي سيتطلب إعادة تحويل النموذج. راجع `controlnet.py` للحصول على مثال على هذا المنطق.
+
+تقبل الطريقة الثانية تكوين النموذج، والمسار إلى النموذج الأصلي على القرص، ومسار الإخراج المطلوب للنموذج المحول. تفعل ما يلزم للحصول على النموذج في تنسيق diffusers، وتعيد مسار النموذج الناتج. (يجب أن يكون المسار عادةً نفس `output_path`.)
+
+## كائن ModelManagerService
+
+للراحة، يوفر API كائن `ModelManagerService` الذي يعطي نقطة وصول واحدة لخدمات مدير النماذج الرئيسية. يتم إنشاء هذا الكائن في وقت التهيئة ويمكن العثور عليه في الكائن العام `ApiDependencies.invoker.services.model_manager`، أو في `context.services.model_manager` من داخل استدعاء.
+
+في الأمثلة أدناه، قمنا باسترداد المدير باستخدام:
+
+```py
+mm = ApiDependencies.invoker.services.model_manager
+```
+
+الخصائص والطرق التالية ستكون متاحة:
+
+### mm.store
+
+يسترد هذا `ModelRecordService` المرتبط بالمدير. مثال:
+
+```py
+configs = mm.store.get_model_by_attr(name='stable-diffusion-v1-5')
+```
+
+### mm.install
+
+يسترد هذا `ModelInstallService` المرتبط بالمدير. مثال:
+
+```py
+job = mm.install.heuristic_import(`https://civitai.com/models/58390/detail-tweaker-lora-lora`)
+```
+
+### mm.load
+
+يسترد هذا `ModelLoaderService` المرتبط بالمدير. مثال:
+
+```py
+configs = mm.store.get_model_by_attr(name='stable-diffusion-v1-5')
+assert len(configs) > 0
+
+loaded_model = mm.load.load_model(configs[0])
+```
+
+يقدم مدير النماذج أيضًا بعض الاختصارات المريحة لتحميل النماذج:
+
+### mm.load_model_by_config(model_config, [submodel], [context]) -> LoadedModel
+
+نفس `mm.load.load_model()`.
+
+### mm.load_model_by_attr(model_name, base_model, model_type, [submodel], [context]) -> LoadedModel
+
+يقبل هذا مجموعة من اسم النموذج ونوعه وأساسه، ويمررها إلى مخزن سجل تكوين النموذج لاستردادها. إذا تم العثور على تكوين نموذج فريد، تعيد هذه الطريقة `LoadedModel`. يمكن أن تثير الاستثناءات التالية:
+
+- `UnknownModelException` -- النموذج بهذه السمات غير معروف
+- `NotImplementedException` -- لا يعرف المحمل كيفية تحميل هذا النوع من النماذج
+- `ValueError` -- أكثر من نموذج يطابق هذه المجموعة من الأساس/النوع/الاسم
+
+### mm.load_model_by_key(key, [submodel], [context]) -> LoadedModel
+
+تأخذ هذه الطريقة مفتاح نموذج، وتبحث عنه باستخدام كائن `ModelRecordServiceBase` في `mm.store`، وتمرر تكوين النموذج الذي تم إرجاعه إلى `load_model_by_config()`. قد تثير `NotImplementedException`.
+
+## واجهة برمجة تطبيقات مدير النماذج لسياق الاستدعاء
+
+داخل الاستدعاءات، الطرق التالية متاحة من كائن `InvocationContext`:
+
+### context.download_and_cache_model(source) -> Path
+
+تقبل هذه الطريقة `source` لنموذج بعيد، وتقوم بتنزيله وتخزينه مؤقتًا محليًا، ثم تعيد مسارًا إلى النموذج المحلي. يمكن أن يكون المصدر عنوان URL تنزيل مباشر أو معرف مستودع HuggingFace.
+
+في حالة معرف مستودع HuggingFace، يتم التعرف على المتغيرات التالية:
+
+* stabilityai/stable-diffusion-v4 -- النموذج الافتراضي
+* stabilityai/stable-diffusion-v4:fp16 -- متغير fp16
+* stabilityai/stable-diffusion-v4:fp16:vae -- المجلد الفرعي vae لـ fp16
+* stabilityai/stable-diffusion-v4:onnx:vae -- المجلد الفرعي vae لمتغير onnx
+
+يمكنك أيضًا الإشارة إلى ملف فردي عشوائي داخل دليل معرف مستودع باستخدام هذا الصيغة:
+
+* stabilityai/stable-diffusion-v4::/checkpoints/sd4.safetensors
+
+### context.load_local_model(model_path, [loader]) -> LoadedModel
+
+تقوم هذه الطريقة بتحميل نموذج محلي من المسار المشار إليه، مع إرجاع `LoadedModel`. المحمل الاختياري هو Callable يقبل مسارًا للكائن، ويعيد كائن `AnyModel`. إذا لم يتم توفير محمل، فستستخدم الطريقة `torch.load()` لملف نقطة تفتيش .ckpt أو .bin، أو `safetensors.torch.load_file()` لملف نقطة تفتيش safetensors، أو `cls.from_pretrained()` لدليل يشبه دليل diffusers.
+
+### context.load_remote_model(source, [loader]) -> LoadedModel
+
+تقبل هذه الطريقة `source` لنموذج بعيد، وتقوم بتنزيله وتخزينه مؤقتًا محليًا، وتحميله، وإرجاع `LoadedModel`. يمكن أن يكون المصدر عنوان URL تنزيل مباشر أو معرف مستودع HuggingFace.
+
+في حالة معرف مستودع HuggingFace، يتم التعرف على المتغيرات التالية:
+
+* stabilityai/stable-diffusion-v4 -- النموذج الافتراضي
+* stabilityai/stable-diffusion-v4:fp16 -- متغير fp16
+* stabilityai/stable-diffusion-v4:fp16:vae -- المجلد الفرعي vae لـ fp16
+* stabilityai/stable-diffusion-v4:onnx:vae -- المجلد الفرعي vae لمتغير onnx
+
+يمكنك أيضًا الإشارة إلى ملف فردي عشوائي داخل دليل معرف مستودع باستخدام هذا الصيغة:
+
+* stabilityai/stable-diffusion-v4::/checkpoints/sd4.safetensors
diff --git a/docs/src/content/docs/ar/development/Architecture/overview.mdx b/docs/src/content/docs/ar/development/Architecture/overview.mdx
new file mode 100644
index 00000000000..1d4db24996a
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Architecture/overview.mdx
@@ -0,0 +1,104 @@
+---
+title: نظرة عامة على البنية
+sidebar:
+ order: 1
+ label: نظرة عامة
+
+lastUpdated: 2026-02-18
+---
+
+import Mermaid from '@components/Mermaid.astro'
+
+
+```mermaid
+flowchart TB
+
+ subgraph apps[التطبيقات]
+ webui[WebUI]
+ cli[CLI]
+
+ subgraph webapi[Web API]
+ api[HTTP API]
+ sio[Socket.IO]
+ end
+
+ end
+
+ subgraph invoke[استدعاء]
+ direction LR
+ invoker
+ services
+ sessions
+ invocations
+ end
+
+ subgraph core[النواة الأساسية للذكاء الاصطناعي]
+ Generate
+ end
+
+ webui --> webapi
+ webapi --> invoke
+ cli --> invoke
+
+ invoker --> services & sessions
+ invocations --> services
+ sessions --> invocations
+
+ services --> core
+
+ %% الأنماط
+ classDef sg fill:#5028C8,font-weight:bold,stroke-width:2,color:#fff,stroke:#14141A
+ classDef default stroke-width:2px,stroke:#F6B314,color:#fff,fill:#14141A
+
+ class apps,webapi,invoke,core sg
+
+```
+
+
+## التطبيقات
+
+التطبيقات مبنية فوق إطار عمل الاستدعاء. يجب عليها إنشاء `invoker` ثم التفاعل من خلاله. يجب أن تتجنب التفاعل المباشر مع الكود الأساسي لدعم مجموعة متنوعة من التكوينات.
+
+### واجهة المستخدم الرسومية
+
+واجهة المستخدم الرسومية مبنية فوق واجهة برمجة تطبيقات HTTP مبنية باستخدام [FastAPI](https://fastapi.tiangolo.com/) و [Socket.IO](https://socket.io/). يوجد كود الواجهة الأمامية في `/invokeai/frontend` وكود الواجهة الخلفية في `/invokeai/app/api_app.py` و `/invokeai/app/api/`. الكود منظم كذلك على النحو التالي:
+
+| المكون | الوصف |
+| --- | --- |
+| api_app.py | يعد تطبيق API، ويضيف تعليقات توضيحية إضافية إلى مواصفات OpenAPI، ويشغل API |
+| dependencies | ينشئ جميع خدمات الاستدعاء والمنادي، ويوفرها لـ API |
+| events | نظام أحداث يمكن تكييفه في المستقبل لدعم التوسع الأفقي |
+| sockets | واجهة Socket.IO - تتعامل مع الاستماع وإصدار أحداث الجلسة (يتم تعريف الأحداث في وحدة خدمة الأحداث) |
+| routers | تعريفات API لمجالات مختلفة من وظائف API |
+
+### واجهة سطر الأوامر
+
+واجهة سطر الأوامر تُبنى تلقائيًا من بيانات تعريف الاستدعاء، وتدعم أيضًا توجيه الاستدعاء والربط التلقائي. الكود متاح في `/invokeai/frontend/cli`.
+
+## الاستدعاء
+
+يوفر إطار عمل الاستدعاء الواجهة لأنظمة الذكاء الاصطناعي الأساسية وهو مبني مع مراعاة المرونة وقابلية التوسع. هناك أربعة مفاهيم رئيسية: المنادي، الجلسات، الاستدعاءات، والخدمات.
+
+### المنادي (Invoker)
+
+المنادي (`/invokeai/app/services/invoker.py`) هو الواجهة الأساسية التي تتفاعل من خلالها التطبيقات مع الإطار. غرضه الأساسي هو إنشاء وإدارة واستدعاء الجلسات. يحتفظ أيضًا بمجموعتين من الخدمات:
+- **خدمات الاستدعاء**، والتي تستخدمها الاستدعاءات للتفاعل مع الوظائف الأساسية.
+- **خدمات المنادي**، والتي يستخدمها المنادي لإدارة الجلسات وإدارة قائمة انتظار الاستدعاء.
+
+### الجلسات
+
+الاستدعاءات والروابط بينها تشكل رسمًا بيانيًا، يتم الحفاظ عليه في جلسة. يمكن وضع الجلسات في قائمة انتظار للاستدعاء، والذي سينفذ الرسم البياني الخاص بها (إما الاستدعاء التالي الجاهز، أو جميع الاستدعاءات). تحتفظ الجلسات أيضًا بسجل تنفيذ للرسم البياني (بما في ذلك تخزين أي مخرجات). يمكن إضافة استدعاء إلى جلسة في أي وقت، وهناك إمكانية لإضافة رسم بياني كامل مرة واحدة، وكذلك ربط الاستدعاءات الجديدة تلقائيًا بالاستدعاءات السابقة. لا يمكن حذف الاستدعاءات أو تعديلها بمجرد إضافتها.
+
+الرسم البياني للجلسة لا يدعم الحلقات التكرارية. يُترك هذا كمشكلة تطبيقية لمنع التعقيد الإضافي في الرسم البياني.
+
+### الاستدعاءات
+
+الاستدعاءات تمثل وحدات تنفيذ فردية، مع مدخلات ومخرجات. توجد جميع الاستدعاءات في `/invokeai/app/invocations`، ويتم اكتشافها جميعًا تلقائيًا وتوفيرها في التطبيقات. هذه هي الطريقة الأساسية لكشف الوظائف الجديدة في Invoke.AI، ويشرح [دليل التنفيذ](/development/architecture/invocations/) كيفية إضافة استدعاءات جديدة.
+
+### الخدمات
+
+توفر الخدمات للاستدعاءات إمكانية الوصول إلى وظائف النواة الأساسية للذكاء الاصطناعي والوظائف الضرورية الأخرى (مثل تخزين الصور). هذه متاحة في `/invokeai/app/services`. كقاعدة عامة، يجب أن توفر الخدمات الجديدة واجهة كفئة أساسية مجردة، وقد توفر تطبيقًا محليًا خفيفًا افتراضيًا في وحدتها. يجب أن يكون الهدف لجميع الخدمات هو تمكين استخدام تطبيقات مختلفة (مثل استخدام التخزين السحابي لتخزين الصور)، ولكن لا ينبغي تحميل أي تبعيات للوحدة ما لم يتم استخدام هذا التطبيق (أي لا تستورد أي شيء لن يتم استخدامه، خاصة إذا كان استيراده مكلفًا).
+
+## النواة الأساسية للذكاء الاصطناعي
+
+يتم تمثيل النواة الأساسية للذكاء الاصطناعي ببقية قاعدة الكود (أي الكود خارج `/invokeai/app/`).
diff --git a/docs/src/content/docs/ar/development/Documentation/index.mdx b/docs/src/content/docs/ar/development/Documentation/index.mdx
new file mode 100644
index 00000000000..1a959a267d8
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Documentation/index.mdx
@@ -0,0 +1,314 @@
+---
+title: الوثائق
+lastUpdated: 2026-05-14
+---
+
+import { Steps, Tabs, TabItem, FileTree } from '@astrojs/starlight/components'
+
+موقع Invoke AI، بما في ذلك وثائقه، موجود بالكامل داخل دليل `docs`.
+
+## المتطلبات الأساسية
+
+تم بناء الوثائق باستخدام [Astro Starlight](https://starlight.astro.build/). يُقترح أن تتعرف على التقنيات التالية قبل البدء:
+
+
+ 1. [Markdown](https://www.markdownguide.org/) - لغة ترميز خفيفة لإنشاء نص منسق.
+ 2. [MDX](https://mdxjs.com/) - مجموعة شاملة من Markdown تسمح لك باستخدام مكونات React في محتواك.
+ 3. [Astro](https://astro.build/) - أداة بناء مواقع ثابتة حديثة تدعم MDX وتقنيات الواجهة الأمامية الأخرى.
+ 4. [Starlight](https://starlight.astro.build/) - سمة لـ Astro توفر تجربة وثائق نظيفة وحديثة.
+ 5. [Vite](https://vitejs.dev/) - خادم تطوير سريع وأداة بناء لمشاريع الويب الحديثة.
+
+
+يدعم Markdown محتوى كل صفحة على الموقع (بما في ذلك الصفحة الرئيسية)، بمساعدة إضافية من [MDX](https://mdxjs.com/) لجعل الصفحات أكثر تفاعلية باستخدام مكونات React المستوردة.
+
+## التنقل في الوثائق
+
+يتم تنظيم الوثائق في هيكل شجري للملفات. يجب أن يكون هذا مألوفًا جدًا لأي شخص بنى تطبيقات ويب حديثة.
+
+
+ - docs/
+ - dist/ مخرجات البناء الإنتاجي
+ - public/ أصول عامة غير محسّنة
+ - src/ كود المصدر الرئيسي
+ - assets/ أصول محسّنة
+ - config/ إعدادات astro/starlight
+ - content/ صفحات ومحتوى markdown
+ - docs/ محتوى الوثائق
+ - i18n/ محتوى مترجم
+ - generated/ ملفات json مولدة للمحتوى الديناميكي
+ - layouts/ مكونات تستخدم لتغليف الصفحات
+ - lib/ دوال مساعدة وكود مشترك
+ - components/ مكونات مخصصة قابلة لإعادة الاستخدام
+ - pages/ صفحات غير توثيقية
+ - styles/ أنماط عامة وسماات
+
+
+## التطوير
+
+إذا سبق لك العمل ضمن مكتبة أو إطار عمل يعتمد على React أو Astro أو Node، يجب أن تشعر بألفة مع معظم الإعداد هنا.
+
+إذا كنت تُضيف ميزة، أو سلوكًا جديدًا، أو ما شابه ذلك يغير كيفية توقع المستخدمين لعمل Invoke، فإننا نتوقع منك تقديم طلب السحب الخاص بك مع الوثائق المرتبطة لدعمه. للبدء، اتبع الخطوات أدناه.
+
+### بيئة التطوير
+
+هناك طريقتان رئيسيتان لإعداد بيئة التطوير الخاصة بك للوثائق:
+
+
+
+ يجعل ملف Make الخاص بـ Invoke إعداد بيئة التطوير للوثائق سهلاً في بضعة أوامر فقط. يمكنك تشغيلها من جذر المستودع.
+
+
+ 1. أولاً، ثبّت التبعيات المطلوبة.
+
+ ```sh
+ make docs-install
+ ```
+
+ 2. بعد ذلك، شغّل خادم التطوير.
+
+ ```sh
+ make docs-dev
+ ```
+
+ 3. افتح متصفحك وانتقل إلى `http://localhost:4321` لعرض الوثائق.
+
+
+
+
+ إذا كنت تفضل أوامر `cd` و `pnpm` القديمة الجيدة، يمكنك إعداد بيئة التطوير الخاصة بك يدويًا.
+
+
+ 1. أولاً، انتقل إلى دليل docs.
+
+ ```sh
+ cd docs
+ ```
+
+ 2. بعد ذلك، ثبّت التبعيات المطلوبة.
+
+ ```sh
+ pnpm install
+ ```
+
+ 3. شغّل خادم التطوير.
+
+ ```sh
+ pnpm dev
+ ```
+
+ 4. افتح متصفحك وانتقل إلى `http://localhost:4321` لعرض الوثائق.
+
+
+
+
+إذا كان هناك خادم محلي آخر يعمل على المنفذ `4321` قبل تشغيل هذا، فاستخدم المنفذ المحدد في المخرجات.
+
+### إضافة الصفحات
+
+تقع ضمن دليل `src/content/docs/`، حيث يتم تخزين صفحات الوثائق وتنظيمها حسب الفئة. هذه الفئات قائمة على الملفات وتنعكس في شريط التنقل الجانبي.
+
+:::caution
+لا تضع مساهمات محتوى الوثائق الخاصة بك خارج دليل `content`، فلن يتم رؤيتها.
+:::
+
+إذا كنت ترغب في إضافة فئة فرعية جديدة لتوثيق ميزة أو سلوك، ببساطة أنشئ دليلًا جديدًا داخل دليل الفئة الرئيسية ذي الصلة.
+
+على سبيل المثال، إذا أردنا توثيق ميزة جديدة تسمى "Instant Bananas"، سننشئ دليلًا جديدًا داخل `src/content/docs/features/` على النحو التالي:
+
+`src/content/docs/`
+
+ - concepts/
+ - configuration/
+ - contributing/
+ - development/
+ - features/
+ - **instant-bananas/**
+ - **index.md** اكتب وثائقك هنا
+ - **requirements.mdx** يمكنك إضافة المزيد من الصفحات في هذا الدليل
+ - start-here/
+ - troubleshooting/
+ - workflows/
+
+
+الطريقة التي تنظم بها صفحاتك المضافة تحدد كيفية إنشاء هيكل الرابط لصفحات الوثائق الخاصة بك. في هذا المثال، سيكون رابط صفحة `index.md` هو `https://invoke.ai/features/instant-bananas/`، وسيكون رابط صفحة `requirements.mdx` هو `https://invoke.ai/features/instant-bananas/requirements/`.
+
+إذا كنت ترغب في إضافة فئة رئيسية، فستكون هناك حاجة إلى خطوة إضافية واحدة لتظهر الفئة في الشريط الجانبي.
+
+داخل ملف `src/config/sidebar.ts`، ستحتاج إلى إضافة كائن فئة شريط جانبي جديد إلى المصفوفة، نظرًا لأن التحكم الدقيق في الفئات الرئيسية يحتاج إلى أن يكون أكثر وضوحًا.
+
+```diff lang="js"
+const sidebar = [
+ // ...
+ {
+ label: 'مفاهيم',
+ items: [
+ {
+ autogenerate: { directory: 'concepts' },
+ },
+ ],
+ },
++ {
++ label: 'فئة جديدة',
++ items: [
++ {
++ autogenerate: { directory: 'new-category' },
++ },
++ ],
++ },
+ {
+ label: 'الميزات',
+ items: [
+ {
+ autogenerate: { directory: 'features' },
+ },
+ ],
+ },
+ // ...
+]
+```
+
+### بيانات الصفحة الوصفية
+
+قبل أن تصبح صفحتك متاحة، ستحتاج إلى إضافة frontmatter لتحديد بيانات الصفحة الوصفية مثل عنوانها ووصفها وتاريخ آخر تحديث وموضعها في الشريط الجانبي وما إلى ذلك.
+
+تعرف على المزيد حول ماهية frontmatter وكيفية استخدامه في صفحاتك في [وثائق Starlight](https://starlight.astro.build/reference/frontmatter/).
+
+بمجرد تعريف بعض frontmatter الأساسي، يجب أن تكون قادرًا على رؤيته منعكسًا في الشريط الجانبي وعنوان الصفحة.
+
+### إضافة الصور
+
+نشجع على إضافة الصور إلى وثائقك لإنشاء تجربة بصرية أكثر جاذبية للمشاهدين. لإضافة الصور، نفضل أن تستخدم دليل `assets` داخل الفئة المعنية.
+
+
+ - features/
+ - instant-bananas/
+ - **assets/**
+ - **demonstration.webp**
+ - **foobar.avif**
+ - index.mdx
+
+
+محسّن/عارض الصور في Astro مرن جدًا مع تنسيقات وأحجام الصور، لكننا نفضل أن تكون الصور المخزنة بأحجام معقولة (وليست 4k)، وباستخدام تنسيقات محسّنة (webp، avif، jpeg).
+
+لعرض الصورة، يمكنك ببساطة استخدام مسار نسبي في markdown الخاص بك.
+
+```md title="index.mdx"
+
+```
+
+### إضافة الترجمات
+
+حاليًا، الوثائق متاحة باللغة الإنجليزية فقط. إذا كنت ترغب في إضافة ترجمات للغات أخرى، فقد قمنا بالفعل بإعداد الأساس لذلك.
+
+أولاً، أضف مجلدًا جديدًا داخل دليل `src/content/i18n`، وأنشئ نسختك المترجمة من ملف markdown في نفس مسار الأصل.
+
+على سبيل المثال:
+
+
+ - src/
+ - content/
+ - docs/
+ - start-here/
+ - installation.mdx
+ - i18n/
+ - zh-CN رمز البلد هنا
+ - start-here/
+ - installation.mdx
+
+
+نوصي ببساطة بنسخ/لصق الملف وإعادة كتابة النص منه.
+
+تعرف على المزيد حول تعقيدات ترجمة وثائق Astro Starlight [هنا](https://starlight.astro.build/guides/i18n).
+
+## تشغيل البناء
+
+قد تعمل التعديلات على الوثائق بشكل جيد على جهازك، ولكن كما تعلمنا بالطريقة الصعبة، فإن GitHub pages تقلب هذا التوقع رأسًا على عقب. لذلك، أضفنا بعض الطرق لضمان عمل الأمور كما هو متوقع قبل النشر.
+
+تمامًا كما هو الحال مع بيئة التطوير، يمكنك بناء الوثائق بإحدى طريقتين:
+
+
+
+ يجعل ملف Make الخاص بـ Invoke بناء الوثائق سهلاً في أمر واحد فقط. يمكنك تشغيله من جذر المستودع.
+
+
+ 1. أولاً، شغّل أمر البناء.
+
+ ```sh
+ make docs-build
+ ```
+
+ 2. أخيرًا، اعرض المخرجات.
+
+ ```sh
+ make docs-preview
+ ```
+
+
+ وهذا كل شيء.
+
+ :::tip[هدف النشر]
+ أمر make هنا يعيّن متغير البيئة `DEPLOY_TARGET` إلى `custom`، بحيث تتطابق المخرجات النهائية مع ما تتوقعه من النشر النهائي على https://invoke.ai.
+
+ إذا كنت تفضل تعيين هدف نشر مختلف، استخدم الطريقة اليدوية.
+ :::
+
+
+
+ إذا كنت تفضل أوامر `cd` و `pnpm` القديمة الجيدة، أو تريد تحكمًا دقيقًا في متغيرات البيئة، يمكنك تشغيل ما يلي:
+
+
+ 1. أولاً، انتقل إلى دليل `docs`.
+
+ ```sh
+ cd docs
+ ```
+
+ 2. بعد ذلك، شغّل أمر البناء.
+
+ ```sh
+ pnpm run build
+ ```
+
+ 3. أخيرًا، اعرض البناء.
+
+ ```sh
+ pnpm run preview
+ ```
+
+ سيكون رابط المعاينة متاحًا على نفس المنفذ مثل خادم التطوير.
+
+
+
+
+
+## الملفات المُنشأة
+
+تتطور واجهة Invoke API باستمرار، وهي كبيرة جدًا. توثيق كل هذا يدويًا سيكون غير عملي للغاية، لذلك لدينا برنامج نصي قمنا بإعداده لسحب جميع تلك البيانات وإنشاء ملفات json ذات صلة في دليل `generated`.
+
+تُستخدم هذه الملفات لصفحات [تكوين YAML](/configuration/invokeai-yaml) و [تطوير API](/development/guides/api-development). إذا كنت تُضيف ميزة تغير تكوين yaml أو API، فتأكد من تشغيل `pnpm run generate-docs-data` لضمان نجاح الاختبارات وأن الوثائق دقيقة وفقًا لتحديثاتك.
+
+## الاختبارات
+
+تحتوي الوثائق على اختبارات لما يلي:
+
+| الاختبار | الوصف | يُشغّل على... |
+| -- | -- | -- |
+| فحص الروابط | يتحقق من روابط URL داخلية غير صالحة أو مشوهة أو مضللة | خادم التطوير، البناء، النشر |
+| التحقق من مخرجات النشر | يتحقق من أن مسارات الأصول والصفحات لها مسارات الأساس المتوقعة اعتمادًا على أهداف النشر | البناء، النشر |
+| فحص بيانات الوثائق | يتحقق من دقة الملفات المُنشأة | النشر |
+
+## إجراءات GitHub
+
+بمجرد تقديم وثائقك المحدّثة، إما عبر طلب سحب أو دفع رئيسي إلى fork الخاص بك، سيتم تشغيل إجراء `deploy-docs`.
+
+سيقوم إجراء `deploy-docs` بتثبيت التبعيات الضرورية، وتشغيل بناء، واختبار، وتقديم الوثائق على GitHub Pages. أي نشر فاشل سيتطلب إصلاحًا قبل النشر.
+
+## استكشاف الأخطاء وإصلاحها
+
+#### جميع الأنماط مفقودة والروابط خاطئة، ماذا حدث؟
+
+يحدث هذا عادةً عندما لا يتطابق مسار الأساس مع هدف النشر، تحقق من ذلك أولاً ثم أعد تشغيل البناء.
+
+#### إعادة التوجيه لا تعمل في النشر الإنتاجي، ولكنها تعمل محليًا، لماذا؟
+
+لأن بيئة SSR الخاصة بـ GitHub Pages ضعيفة، وبالتالي لا تتعامل مع إعادة التوجيه من جانب الخادم. قمنا بتضمين تكوين إعادة التوجيه فقط في حال طور GitHub ضميرًا، أو إذا تم نشر الوثائق في مكان آخر.
diff --git a/docs/src/content/docs/ar/development/Front End/canvas-projects.mdx b/docs/src/content/docs/ar/development/Front End/canvas-projects.mdx
new file mode 100644
index 00000000000..ef4c5744575
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Front End/canvas-projects.mdx
@@ -0,0 +1,54 @@
+---
+title: مشاريع اللوحة
+---
+
+مشاريع اللوحة تسلسل اللوحة الحالية إلى أرشيف `.invk` محمول. توجد الميزة في `invokeai/frontend/web/src/features/controlLayers/` ويتم عرضها في قائمة أرشيف شريط أدوات اللوحة وقائمة سياق اللوحة ضمن **مشروع**.
+
+## تنسيق الملف
+
+ملفات `.invk` هي أرشيفات ZIP. إصدار البيان الحالي هو `1`.
+
+يحتوي كل أرشيف على:
+
+| الهدف | الوصف |
+| - | - |
+| `manifest.json` | بيانات المشروع الوصفية، بما في ذلك إصدار الأرشيف وإصدار التطبيق وطابع الإنشاء واسم المشروع. |
+| `canvas_state.json` | الطبقات النقطية، طبقات التحكم، أقنعة الطلاء الداخلي، التوجيه الإقليمي، حالة الصندوق المحيط، ومعرفات الكيانات المحددة/المفضلة. |
+| `params.json` | حالة معلمات التوليد. |
+| `ref_images.json` | حالة الصورة المرجعية العامة. |
+| `loras.json` | حالة LoRA النشطة. |
+| `images/` | كتل الصور المشار إليها من اللوحة أو حالة الصورة المرجعية. |
+
+يبني مسار الحفظ هذا الأرشيف في `useCanvasProjectSave.ts`. يجمع جميع قيم `image_name` المشار إليها، ويجلب كل صورة من الخادم، ويكتب الملفات التي تم جلبها بنجاح تحت `images/`، ويقوم بتنزيل ZIP بامتداد `.invk`. يتم تسجيل عمليات جلب الصور الفاشلة وتخطيها بدلاً من إحباط الحفظ.
+
+## جمع الصور
+
+يتم جمع مراجع الصور بواسطة `collectImageNames()` في `canvasProjectFile.ts`.
+
+يتحقق المجمع من:
+
+- كائنات الصور في الطبقات النقطية.
+- كائنات الصور في طبقات التحكم.
+- كائنات الصور في أقنعة الطلاء الداخلي.
+- كائنات الصور والصور المرجعية لـ IP Adapter / Flux Redux في التوجيه الإقليمي.
+- الصور المرجعية العامة، بما في ذلك صور المصدر المقتطعة.
+
+عمليات جلب الصور محدودة التوافق مع `processWithConcurrencyLimit()` حتى لا تغمر المشاريع الكبيرة المتصفح أو الواجهة الخلفية بطلبات متزامنة.
+
+## التحميل وإعادة التعيين
+
+مسار التحميل منفذ في `useCanvasProjectLoad.ts`.
+
+يقوم التحميل بالتحقق من صحة `manifest.json`، ويتطلب `canvas_state.json`، ويقرأ ملفات `params.json` و `ref_images.json` و `loras.json` الاختيارية. قبل استعادة الحالة، يتحقق مما إذا كانت كل صورة مشار إليها موجودة بالفعل على الخادم باستخدام `checkExistingImages()`.
+
+يتم تحميل الصور المفقودة فقط من الأرشيف. إذا كانت الصورة المفقودة المشار إليها غير موجودة في `images/`، يسجل المحمل تحذيرًا ويترك هذا المرجع دون تغيير. إذا أعاد التحميل `image_name` مختلفًا، يسجل المحمل تعيينًا من القديم إلى الجديد ويعيد تعيين مراجع الصور قبل إرسال حالة اللوحة المحملة وحالة الصورة المرجعية.
+
+يتم مسح LoRAs قبل استدعاء LoRAs المشروع. هذا يمنع تسرب LoRAs من جلسة اللوحة السابقة إلى المشروع المحمل.
+
+فحوصات وجود الصور والتحميلات محدودة التوافق أيضًا.
+
+## ملاحظات التوافق
+
+يخزن الأرشيف مراجع للنماذج و LoRAs وموارد التوليد الأخرى، وليس ملفات النماذج نفسها. تحميل مشروع على تثبيت آخر يمكنه استعادة صور اللوحة والحالة، ولكن موارد النموذج المفقودة لا تزال بحاجة إلى التثبيت أو الاستبدال من قبل المستخدم.
+
+يجب أن تزيد تغييرات التنسيق المستقبلية من `CANVAS_PROJECT_VERSION` وأن تبقي التحقق من الصحة في `parseManifest()` صريحًا حتى تفشل ملفات المشروع غير المدعومة مبكرًا.
diff --git a/docs/src/content/docs/ar/development/Front End/state-management.mdx b/docs/src/content/docs/ar/development/Front End/state-management.mdx
new file mode 100644
index 00000000000..9e34903eb65
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Front End/state-management.mdx
@@ -0,0 +1,41 @@
+---
+title: إدارة الحالة
+lastUpdated: 2026-02-18
+---
+
+يستخدم التطبيق بشكل مكثف Redux Toolkit ومكتبة الاستعلام الخاصة به و `nanostores`.
+
+## Redux
+
+نستخدم RTK بشكل موسع - الشرائح، ومهايئات الكيانات، والاستعلامات، وإعادة التحديد، كل شيء. [وثائقهم](https://redux-toolkit.js.org/) ممتازة.
+
+## `nanostores`
+
+[nanostores] هي مكتبة صغيرة لإدارة الحالة. توفر واجهات برمجة أمرية وتصريحية.
+
+### مثال
+
+```ts
+export const $myStringOption = atom(null);
+
+// خارج المكون، أو داخل رد اتصال لمنطق حساس للأداء
+$myStringOption.get();
+$myStringOption.set('قيمة جديدة');
+
+// داخل مكون
+const myStringOption = useStore($myStringOption);
+```
+
+### أين تضع nanostores
+
+- لحالة التطبيق العامة، قم بتصدير مخازنك من `invokeai/frontend/web/src/app/store/nanostores/`.
+- لحالة الميزة، أنشئ ملفًا للمخازن بجوار تعريف شريحة redux (مثل `invokeai/frontend/web/src/features/myFeature/myFeatureNanostores.ts`).
+- للخطافات ذات الحالة العامة، قم بتصدير المخزن من نفس ملف الخطاف، أو ضعه بجواره.
+
+### متى تستخدم nanostores
+
+- للبيانات غير القابلة للتسلسل التي تحتاج إلى أن تكون متاحة في جميع أنحاء التطبيق، استخدم `nanostores` بدلاً من العامة.
+- للحالة العامة المؤقتة (أي حالة لا تحتاج إلى أن تكون مستمرة)، استخدم `nanostores` بدلاً من redux.
+- للكود الحساس للأداء وفي ردود الاتصال، يمكن أن تكون مُحددات redux مشكلة بسبب نظام التفاعل التصريحي. فكر في إعادة الهيكلة لاستخدام `nanostores` إذا كانت هناك مشكلة أداء **قابلة للقياس**.
+
+[nanostores]: https://github.com/nanostores/nanostores/
diff --git a/docs/src/content/docs/ar/development/Front End/text-tool.mdx b/docs/src/content/docs/ar/development/Front End/text-tool.mdx
new file mode 100644
index 00000000000..bbf6acfcaea
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Front End/text-tool.mdx
@@ -0,0 +1,37 @@
+---
+title: "أداة النص على اللوحة"
+---
+
+## نظرة عامة
+
+سير عمل النص على اللوحة مقسم بين وحدة Konva التي تملك حالة الأداة وتراكب React الذي يتعامل مع إدخال النص.
+
+- `invokeai/frontend/web/src/features/controlLayers/konva/CanvasTool/CanvasTextToolModule.ts`
+ - يمتلك الأداة، ومعاينة المؤشر، وحالة جلسة النص (بما في ذلك علامة المؤشر "T").
+ - يدير تباين المؤشر الديناميكي، ويبدأ الجلسات عند الضغط على المؤشر، ويلتزم بالجلسات عن طريق تحويل كتلة النص النشطة إلى طبقة نقطية جديدة.
+- `invokeai/frontend/web/src/features/controlLayers/components/Text/CanvasTextOverlay.tsx`
+ - يعرض المحرر على اللوحة كتراكب `contentEditable` موضوع في مساحة اللوحة.
+ - يزامن إدخال لوحة المفاتيح، ويمنع اختصارات التطبيق، ويُحول الالتزامات/الإلغاءات إلى وحدة Konva.
+- `invokeai/frontend/web/src/features/controlLayers/components/Text/TextToolOptions.tsx`
+ - يوفر القائمة المنسدلة للخط، ومنزلق/مدخل الحجم، ومفاتيح التنسيق، وأزرار المحاذاة التي تظهر عند تنشيط أداة النص.
+
+## خط أنابيب التنقيط
+
+تقوم `renderTextToCanvas()` (`invokeai/frontend/web/src/features/controlLayers/text/textRenderer.ts`) بتحويل محتويات المحرر إلى لوحة شفافة. تقوم وحدة أداة النص بتكوين العارض مع مجموعة الخطوط النشطة والوزن وعلامات التنسيق والمحاذاة ولون اللوحة النشط. يتم ترميز اللوحة الناتجة إلى عنوان URL لبيانات PNG وتخزينها في طبقة نقطية جديدة (كائن `image`) بخلفية شفافة.
+
+موضع الطبقة يحافظ على موقع النقر الأصلي:
+
+- تخزن الجلسة إحداثيات الارتكاز (حيث نقر المستخدم) والمحاذاة الحالية.
+- تحسب `calculateLayerPosition()` موضع الزاوية العلوية اليسرى للطبقة النقطية بعد تطبيق الحشو المكون وإزاحات المحاذاة.
+- يتم إدراج الطبقات الجديدة مباشرة فوق الطبقة النقطية المحددة حاليًا (عند وجودها) ويتم تحديدها تلقائيًا.
+
+## مجموعات الخطوط
+
+تعريفات الخطوط موجودة في `invokeai/frontend/web/src/features/controlLayers/text/textConstants.ts` كعشر مجموعات حتمية (sans، serif، mono، rounded، script، humanist، slab serif، display، narrow، UI serif). كل مجموعة تسرد بدائل آمنة للنظام حتى يتمكن المحرر من اختيار أول خط متاح لكل منصة.
+
+لإضافة أو تعديل الخطوط:
+
+1. قم بتحديث `TEXT_FONT_STACKS` بالـ `id` و `label` الجديدين ومجموعة `font-family` في CSS.
+2. إذا أضفت مجموعة جديدة، قم بتوسيع صف `TEXT_FONT_IDS` وتحديث القيمة الافتراضية لمخطط `canvasTextSlice` (`TEXT_DEFAULT_FONT_ID`).
+3. قدم سلاسل ترجمة لأي تسميات جديدة في `public/locales/*`.
+4. سيلتقط المحرر والعارض المجموعة الجديدة تلقائيًا عبر `getFontStackById()`.
diff --git a/docs/src/content/docs/ar/development/Front End/workflows.mdx b/docs/src/content/docs/ar/development/Front End/workflows.mdx
new file mode 100644
index 00000000000..8f5ddfe0511
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Front End/workflows.mdx
@@ -0,0 +1,314 @@
+---
+title: سير العمل
+lastUpdated: 2026-02-18
+---
+
+يصف هذا المستند، على مستوى عالٍ، تصميم وتنفيذ سير العمل في الواجهة الأمامية لـ InvokeAI. هناك عدد كبير من تفاصيل التنفيذ غير المضمنة، ولكنها واضحة من الكود.
+
+يستخدم الواجهة الخلفية لـ InvokeAI الرسوم البيانية، المكونة من **عقد** و **حواف**، لمعالجة البيانات وتوليد الصور.
+
+العقد تحتوي على أي عدد من **حقول الإدخال** و **حقول الإخراج**. تربط الحواف العقد معًا عبر مدخلاتها ومخرجاتها. الحقول لها أنواع بيانات تملي كيفية توصيلها.
+
+أثناء التنفيذ، يمكن تمرير مخرجات العقدة إلى أي عدد من مدخلات العقد الأخرى.
+
+سير العمل هو تجريد مُثرى فوق الرسم البياني.
+
+## التصميم
+
+يوفر InvokeAI طريقتين لبناء الرسوم البيانية في الواجهة الأمامية: [واجهة المستخدم الخطية](#واجهة-المستخدم-الخطية) و [محرر سير العمل](#محرر-سير-العمل).
+
+لفهم حالة الاستخدام والتحديات المتعلقة بسير العمل بشكل أفضل، سنراجع كلا الوضعين.
+
+### واجهة المستخدم الخطية
+
+تشمل هذه علامات التبويب **نص إلى صورة** و **صورة إلى صورة** و **اللوحة الموحدة**.
+
+يتم تخزين المعلمات التي يديرها المستخدم في هذه العلامات ككائنات بسيطة في حالة التطبيق. عندما يستدعي المستخدم، مضيفًا عملية توليد إلى قائمة الانتظار، نقوم ببناء رسم بياني داخليًا من هذه المعلمات.
+
+يمكن أن يكون هذا المنطق معقدًا إلى حد ما بسبب مجموعة الميزات المتاحة وتفاعلاتها. اعتمادًا على المعلمات المحددة، قد يكون الرسم البياني مختلفًا جدًا. بناء الرسوم البيانية في الكود يمكن أن يكون تحديًا - فأنت تحاول بناء هيكل غير خطي في سياق خطي.
+
+أبسط منطق لبناء الرسم البياني هو لـ **نص إلى صورة** مع نموذج SD1.5: [buildLinearTextToImageGraph.ts]
+
+هناك العديد من بناة الرسوم البيانية الأخرى في نفس الدليل لعلامات تبويب أو نماذج أساسية مختلفة (مثل SDXL). بعضها معقد جدًا.
+
+في واجهة المستخدم الخطية، ننتقل مباشرة من **حالة تطبيق بسيطة** إلى **رسم بياني** عبر هذه البنائين.
+
+### محرر سير العمل
+
+محرر سير العمل هو محرر رسوم بيانية مرئي، يسمح للمستخدمين برسم حواف من عقدة إلى عقدة لبناء رسم بياني. هذه طريقة أكثر سهولة لإنشاء رسوم بيانية معقدة.
+
+يستخدم InvokeAI مكتبة [reactflow] لتشغيل محرر سير العمل. توفر واجهة مستخدم محرر رسوم بيانية وتدير حالتها الداخلية الخاصة.
+
+#### سير العمل
+
+سير العمل هو تمثيل لرسم بياني بالإضافة إلى بيانات وصفية إضافية:
+
+- الاسم
+- الوصف
+- الإصدار
+- الملاحظات
+- [الحقول المكشوفة](#العرض-الخطي-لسير-العمل)
+- المؤلف والوسوم والفئة، إلخ.
+
+يجب أن يتمتع سير العمل بصفات أخرى:
+
+- قابلية النقل: يجب أن تكون قادرًا على تحميل سير عمل أنشأه شخص آخر.
+- المرونة: يجب أن تكون قادرًا على "ترقية" سير العمل مع تغير التطبيق.
+- التجريد: بقدر الإمكان، يجب ألا يكون سير العمل مرتبطًا بتفاصيل تنفيذ محددة للتطبيق.
+
+لدعم هذه الصفات، سير العمل قابل للتسلسل، وله مخططات مرقمة الإصدارات، ويمثل الرسوم البيانية بأقل قدر ممكن. لحسن الحظ، حالة reactflow للعقد والحواف تعمل بشكل مثالي لهذا.
+
+##### سير العمل -> حالة reactflow -> رسم بياني InvokeAI
+
+لدينا سير عمل، نحتاج إلى أن نكون قادرين على اشتقاق حالة reactflow و/أو رسم بياني InvokeAI منه.
+
+الخطوة الأولى - سير العمل إلى حالة reactflow - بسيطة جدًا. المنطق موجود في [nodesSlice.ts]، في المُختزل `workflowLoaded`.
+
+حالة reactflow، مع ذلك، غير متوافقة هيكليًا مع هيكل الرسم البياني للواجهة الخلفية. عندما يستدعي المستخدم على سير عمل، نحتاج إلى تحويل حالة reactflow إلى رسم بياني InvokeAI. هذا أبسط بكثير من منطق بناء الرسم البياني من واجهة المستخدم الخطية: [buildNodesGraph.ts]
+
+##### العقد مقابل الاستدعاءات
+
+غالبًا ما نستخدم المصطلحين "عقدة" و "استدعاء" بالتبادل، لكنهما قد يشيران إلى أشياء مختلفة في الواجهة الأمامية.
+
+لدى reactflow [تعريفاتها الخاصة][reactflow-concepts] لـ "عقدة" و "حافة" و "مقبض" والتي ترتبط ارتباطًا وثيقًا بمفاهيم رسم بياني InvokeAI.
+
+- عقدة reactflow مرتبطة باستدعاء InvokeAI. لها خاصية "data"، التي تحمل بيانات الاستدعاء الخاصة بـ InvokeAI.
+- حافة reactflow مكافئة تقريبًا لحافة InvokeAI.
+- مقبض reactflow مكافئ تقريبًا لحقل إدخال أو إخراج InvokeAI.
+
+##### العرض الخطي لسير العمل
+
+الرسوم البيانية هي هياكل بيانات قادرة جدًا، ولكن ليس الجميع يريد العمل معها طوال الوقت.
+
+للسماح للمستخدمين الأقل تقنية - أو أي شخص يريد مساحة عمل أقل ازدحامًا بصريًا - بالاستفادة من قوة العقد، يحتوي InvokeAI على ميزة سير عمل تسمى العرض الخطي.
+
+يمكن إضافة حقل إدخال سير عمل إلى هذا العرض الخطي، ويمكن تقديم مكون الإدخال الخاص به بشكل مشابه لعلامات تبويب واجهة المستخدم الخطية. داخليًا، نضيف الحقل إلى قائمة الحقول المكشوفة لسير العمل.
+
+#### مخطط OpenAPI
+
+OpenAPI هي مواصفات مخطط يمكنها تمثيل هياكل البيانات والعلاقات المعقدة. الواجهة الخلفية قادرة على توليد مخطط OpenAPI لجميع الاستدعاءات.
+
+عندما تتصل واجهة المستخدم، فإنها تطلب هذا المخطط وتحلل كل استدعاء إلى **قالب استدعاء**. قوالب الاستدعاء لها عدد من الخصائص، مثل العنوان والوصف والنوع، لكن أهمها هي قوالب حقول الإدخال والإخراج الخاصة بها.
+
+قوالب الاستدعاء والحقول هي "مصدر الحقيقة" للرسوم البيانية، لأنها تشير إلى ما تستطيع الواجهة الخلفية معالجته.
+
+عندما يضيف المستخدم عقدة جديدة إلى سير العمل الخاص به، تُستخدم هذه القوالب لإنشاء عقدة بحقول منشأة من قوالب حقول الإدخال والإخراج.
+
+##### مثيلات الحقول والقوالب
+
+تتكون قوالب الحقول من:
+
+- الاسم: معرف الحقل، اسم المتغير في بايثون
+- النوع: مشتق من تعليق نوع الحقل في بايثون (مثل IntegerField, ImageField, MainModelField)
+- القيود: مشتقة من وسائط إنشاء الحقل في بايثون (مثل القيمة الدنيا لعدد صحيح)
+- القيمة الافتراضية: تُقدم اختياريًا في وسائط إنشاء الحقل (مثل 42 لعدد صحيح)
+
+يتم إنشاء مثيلات الحقول من القوالب ولها اسم ونوع وقيمة اختياريًا.
+
+نوع الحقل يحدد مكونات واجهة المستخدم التي يتم عرضها له.
+
+اسم مثيل الحقل يربطه بقالبه.
+
+##### الحقول الحالة مقابل الحقول عديمة الحالة
+
+**الحالة** تخزن الحقول قيمتها في الرسم البياني للواجهة الأمامية. فكر في البدائيات ومعرفات النماذج والصور وما إلى ذلك. الحقول تكون حالة فقط إذا كانت الواجهة الأمامية تسمح للمستخدم بإدخال قيمة مباشرة لها.
+
+العديد من أنواع الحقول، مع ذلك، هي **عديمة الحالة**. مثال على ذلك `UNetField`، الذي يحتوي على بعض البيانات التي تصف UNet. لا يمكن للمستخدمين توفير هذه البيانات مباشرة - يتم إنشاؤها واستهلاكها في الواجهة الخلفية.
+
+الحقول عديمة الحالة لا تخزن قيمتها في العقدة، لذا فإن مثيلات حقولها ليس لها قيم.
+
+الحقول "المخصصة" ستُعامل دائمًا كحقول عديمة الحالة.
+
+##### الحقول المفردة والمجمعة
+
+أنواع الحقول لها خاصية اسم وعددية قد تحددها كحقل **مفرد** أو **مجموعة** أو **مفرد أو مجموعة**.
+
+- إذا تم تعليق حقل في بايثون كقيمة مفردة أو فئة، يتم تحليل نوع الحقل كنوع **مفرد** (مثل `int` و `ImageField` و `str`).
+- إذا تم تعليق حقل في بايثون كقائمة، يتم تحليل نوع الحقل كنوع **مجموعة** (مثل `list[int]`).
+- إذا تم تعليقه كاتحاد من نوع وقائمة من ذلك النوع، سيتم تحليل النوع كنوع **مفرد أو مجموعة** (مثل `Union[int, list[int]]`). لا يمكن أن تكون الحقول اتحادات من أنواع مختلفة (مثل `Union[int, list[str]]` و `Union[int, str]` غير مسموح بها).
+
+## التنفيذ
+
+غالبية هياكل البيانات في الواجهة الخلفية هي نماذج [pydantic]. يوفر Pydantic مخططات OpenAPI لجميع النماذج ثم نقوم بتوليد أنواع TypeScript منها.
+
+يتم تحليل مخطط OpenAPI في وقت التشغيل إلى قوالب الاستدعاء الخاصة بنا.
+
+يتم نمذجة سير العمل وجميع البيانات ذات الصلة في الواجهة الأمامية باستخدام [zod]. يتم استنتاج الأنواع ذات الصلة من مخططات zod.
+
+> في بايثون، الاستدعاءات هي نماذج pydantic مع حقول. تصبح هذه الحقول مدخلات العقدة. دالة `invoke()` الخاصة بالاستدعاء تُرجع نموذج pydantic - مخرجاته. مثل الاستدعاء نفسه، نموذج المخرجات لديه أي عدد من الحقول، التي تصبح مخرجات العقدة.
+
+### مخططات وأنواع zod
+
+مخططات zod والأنواع المستنتجة وأدوات التحقق من الأنواع موجودة في [types/].
+
+تقريبًا بالترتيب من الأدنى مستوى إلى الأعلى:
+
+- `common.ts`: بيانات الحقل الحالة، وبعض الأنواع المتنوعة الأخرى
+- `field.ts`: الحقول - الأنواع والقيم والمثيلات والقوالب
+- `invocation.ts`: الاستدعاءات وأنواع العقد الأخرى
+- `workflow.ts`: سير العمل ومكوناته
+
+نقوم بتخصيص مخطط OpenAPI لتضمين خصائص إضافية على مخططات الاستدعاء والحقل. لتسهيل تحليل هذا المخطط إلى قوالب، نقوم بتعديل/تغليف الأنواع من [openapi-types] في `openapi.ts`.
+
+### تحليل مخطط OpenAPI
+
+نقطة الدخول لتحليل مخطط OpenAPI هي [parseSchema.ts].
+
+تدفق المنطق العام:
+
+- التكرار على جميع كائنات مخطط الاستدعاء
+ - استخراج السمات ذات الصلة على مستوى الاستدعاء (مثل العنوان والنوع والإصدار وما إلى ذلك)
+ - التكرار على حقول الإدخال للاستدعاء
+ - [تحليل نوع كل حقل](#تحليل-أنواع-الحقول)
+ - [بناء قالب إدخال حقل](#بناء-قوالب-إدخال-الحقل) من النوع - إما قالب حالة أو قالب عديم الحالة عام
+ - التكرار على حقول الإخراج للاستدعاء
+ - تحليل نوع الحقل (نفس المدخلات)
+ - [بناء قالب إخراج حقل](#بناء-قوالب-إخراج-الحقل)
+ - تجميع السمات والحقول في قالب استدعاء
+
+معظم هذه تتضمن عمليات `reduce` مباشرة جدًا، لكن الخطوات الأقل بديهية مفصلة أدناه.
+
+#### تحليل أنواع الحقول
+
+يتم تمثيل أنواع الحقول ككائنات منظمة:
+
+```ts
+type FieldType = {
+ name: string;
+ cardinality: 'SINGLE' | 'COLLECTION' | 'SINGLE_OR_COLLECTION';
+};
+```
+
+منطق التحليل موجود في `parseFieldType.ts`.
+
+هناك 4 حالات عامة لتحليل نوع الحقل.
+
+##### الأنواع البدائية
+
+عندما يتم تعليق حقل كقيمة بدائية (مثل `int` و `str` و `float`)، يكون تحليل نوع الحقل مباشرًا إلى حد ما. يتم تمثيل الحقل بواسطة **كائن مخطط** OpenAPI بسيط، له خاصية `type`.
+
+ننشئ اسم نوع حقل من سلسلة `type` هذه (مثل `string` -> `StringField`). العددية هي `"SINGLE"`.
+
+##### الأنواع المعقدة
+
+عندما يتم تعليق حقل كنموذج pydantic (مثل `ImageField` و `MainModelField` و `ControlField`)، يتم تمثيله كـ **كائن مرجعي**. الكائنات المرجعية هي مؤشرات إلى مخطط آخر أو كائن مرجعي داخل المخطط.
+
+نحتاج إلى **إلغاء الإشارة** من المخطط لاستخراج هذه. قد يتطلب إلغاء الإشارة التكرار. نستخدم اسم الكائن المرجعي مباشرة لاسم نوع الحقل.
+
+> لسوء الحظ، في الوقت الحالي، كان نجاحنا محدودًا في استخدام المكتبات الخارجية لإلغاء الإشارة في وقت التشغيل، لذلك نقوم بذلك بأنفسنا.
+
+##### أنواع المجموعات
+
+عندما يتم تعليق حقل كقائمة من نوع واحد، يكون لكائن المخطط خاصية `items`. قد تكون كائن مخطط أو كائن مرجعي ويجب تحليلها لتحديد نوع العنصر.
+
+نستخدم نوع العنصر لاسم نوع الحقل. العددية هي `"COLLECTION"`.
+
+##### الأنواع المفردة أو المجموعات
+
+عندما يتم تعليق حقل كاتحاد من نوع وقائمة من ذلك النوع، يكون لكائن المخطط خاصية `anyOf`، التي تحتوي على قائمة من الأنواع الصالحة للاتحاد.
+
+بعد التحقق من أن الاتحاد له عضوان (نوع وقائمة من نفس النوع)، نستخدم النوع لاسم نوع الحقل، مع عددية `"SINGLE_OR_COLLECTION"`.
+
+##### الحقول الاختيارية
+
+في OpenAPI v3.1، عندما يكون الكائن اختياريًا، يتم وضعه في `anyOf` مع كائن مخطط بدائي بـ `type: 'null'`.
+
+إضافة هذا يضيف قدرًا لا بأس به من التعقيد، حيث يجب علينا الآن تصفية أنواع `'null'` والعمل مع الأنواع المتبقية كما هو موضح أعلاه.
+
+إذا كان هناك كائن مخطط واحد متبقي، يجب علينا استدعاء `parseFieldType()` بشكل متكرر لتحليله.
+
+#### بناء قوالب إدخال الحقل
+
+الآن بعد أن أصبح لدينا نوع حقل، يمكننا بناء قالب إدخال للحقل.
+
+جميع الحقول الحالة تحصل على دالة لبناء قالبها، بينما يتم بناء الحقول عديمة الحالة مباشرة. هذا ممكن لأن الحقول عديمة الحالة ليس لها قيمة افتراضية أو قيود.
+
+انظر [buildFieldInputTemplate.ts].
+
+#### بناء قوالب إخراج الحقل
+
+مخرجات الحقول مشابهة للحقول عديمة الحالة - ليس لها أي قيمة في الواجهة الأمامية. عند بناء قوالبها، لا نحتاج إلى دالة خاصة لكل نوع حقل.
+
+انظر [buildFieldOutputTemplate.ts].
+
+### إدارة حالة reactflow
+
+كما هو موضح أعلاه، حالة محرر سير العمل هي أساسًا حالة reactflow، بالإضافة إلى بعض البيانات الوصفية الإضافية.
+
+نوفر لـ reactflow مصفوفة من العقد والحواف عبر redux، وعددًا من [معالجات الأحداث][reactflow-events]. تقوم هذه المعالجات بإرسال إجراءات redux، وإدارة العقد والحواف.
+
+عناصر حالة redux ذات الصلة بسير العمل هي:
+
+- `state.nodes.nodes`: حالة عقد reactflow
+- `state.nodes.edges`: حالة حواف reactflow
+- `state.nodes.workflow`: بيانات سير العمل الوصفية
+
+#### بناء العقد والحواف
+
+عقدة reactflow لها بعض الخصائص المهمة على المستوى الأعلى:
+
+- `id`: معرف فريد
+- `type`: سلسلة نصية ترتبط بمكون react لتقديم العقدة
+- `position`: إحداثيات XY
+- `data`: بيانات عشوائية
+
+عندما يضيف المستخدم عقدة، نبني **بيانات عقدة استدعاء**، ونخزنها في `data`. يتم نسخ خصائص الاستدعاء (مثل النوع والإصدار والتسمية وما إلى ذلك) من قالب الاستدعاء. يتم بناء المدخلات والمخرجات من قوالب حقول قالب الاستدعاء.
+
+انظر [buildInvocationNode.ts].
+
+تتم إدارة الحواف بواسطة reactflow، ولكن بإيجاز، تتكون من:
+
+- `source`: معرف العقدة المصدر
+- `sourceHandle`: معرف مقبض العقدة المصدر (حقل الإخراج)
+- `target`: معرف العقدة الهدف
+- `targetHandle`: معرف مقبض العقدة الهدف (حقل الإدخال)
+
+> إنشاء الحافة مقيد خلف منطق التحقق من الصحة. يقارن هذا التحقق أنواع حقول الإدخال والإخراج وحالة الرسم البياني الإجمالية.
+
+#### بناء سير عمل
+
+بناء كيان سير عمل هو ببساطة إسقاط العقد والحواف والبيانات الوصفية في كائن.
+
+يتم تحليل كل عقدة وحافة بمخطط zod، والذي يعمل على إزالة أي بيانات غير ضرورية.
+
+انظر [buildWorkflow.ts].
+
+#### تحميل سير عمل
+
+يمكن تحميل سير العمل من مصادر خارجية أو من المثيل المحلي للمستخدم. في جميع الحالات، يجب التعامل مع سير العمل بحذر، ككائن غير موثوق.
+
+التحميل له عدة مراحل قد ترمي أو تحذر إذا كانت هناك مشاكل:
+
+- تحليل هيكل بيانات سير العمل نفسه، [ترحيله](#ترحيل-سير-العمل) إذا لزم الأمر (يرمي)
+- التحقق من وجود قالب لكل عقدة (يحذر)
+- التحقق من إصدار كل عقدة مقابل قالبها (يحذر)
+- التحقق من صحة المصدر والهدف لكل حافة (يحذر)
+
+يحدث هذا التحقق في [validateWorkflow.ts].
+
+إذا لم تكن هناك أخطاء قاتلة، يتم تخزين سير العمل بعد ذلك في حالة redux.
+
+### ترحيل سير العمل
+
+عندما يتغير مخطط سير العمل، قد نحتاج إلى إجراء بعض ترحيلات البيانات. يحدث هذا أثناء تحميل سير العمل. يتم الاحتفاظ بمخططات zod لكل إصدار من مخطط سير العمل لتسهيل عمليات الترحيل.
+
+المخططات السابقة موجودة في مجلدات في `invokeai/frontend/web/src/features/nodes/types/`، مثل `v1/`.
+
+منطق الترحيل موجود في [migrations.ts].
+
+[pydantic]: https://github.com/pydantic/pydantic 'pydantic'
+[zod]: https://github.com/colinhacks/zod 'zod'
+[openapi-types]: https://github.com/kogosoftwarellc/open-api/tree/main/packages/openapi-types 'openapi-types'
+[reactflow]: https://github.com/xyflow/xyflow 'reactflow'
+[reactflow-concepts]: https://reactflow.dev/learn/concepts/terms-and-definitions
+[reactflow-events]: https://reactflow.dev/api-reference/react-flow#event-handlers
+[buildWorkflow.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/util/workflow/buildWorkflow.ts
+[nodesSlice.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
+[buildLinearTextToImageGraph.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/util/graph/buildLinearTextToImageGraph.ts
+[buildNodesGraph.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/util/graph/buildNodesGraph.ts
+[buildInvocationNode.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/util/node/buildInvocationNode.ts
+[validateWorkflow.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/util/workflow/validateWorkflow.ts
+[migrations.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/util/workflow/migrations.ts
+[parseSchema.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/util/schema/parseSchema.ts
+[buildFieldInputTemplate.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputTemplate.ts
+[buildFieldOutputTemplate.ts]: https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldOutputTemplate.ts
diff --git a/docs/src/content/docs/ar/development/Guides/api-development.mdx b/docs/src/content/docs/ar/development/Guides/api-development.mdx
new file mode 100644
index 00000000000..05803d803f3
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Guides/api-development.mdx
@@ -0,0 +1,50 @@
+---
+title: تطوير واجهة برمجة التطبيقات
+---
+
+import InvocationContextDocs from '@lib/components/InvocationContextDocs.astro'
+
+يتم تزويد كل طريقة `invoke` للاستدعاء بوسيط واحد - سياق الاستدعاء.
+
+يوفر هذا الكائن واجهة برمجة تطبيقات يمكن للاستدعاء استخدامها للتفاعل مع خدمات التطبيق، على سبيل المثال:
+
+- حفظ الصور
+- تسجيل الرسائل
+- تحميل النماذج
+
+```py
+class MyInvocation(BaseInvocation):
+ ...
+ def invoke(self, context: InvocationContext) -> ImageOutput:
+ # تحميل صورة
+ image_pil = context.images.get_pil(self.image.image_name)
+ # القيام بشيء ما للصورة
+ output_image = do_something_cool(image_pil)
+ # حفظ الصورة
+ image_dto = context.images.save(output_image)
+ # تسجيل رسالة
+ context.logger.info(f"تم القيام بشيء رائع، تم حفظ الصورة!")
+ # إرجاع المخرجات
+ return ImageOutput.build(image_dto)
+ ...
+```
+
+مرجع واجهة برمجة التطبيقات الكامل المُنشأ موثق أدناه.
+
+## Mixins
+
+يتم توفير اثنين من Mixins مهمين لتسهيل العمل مع البيانات الوصفية وألواح المعرض.
+
+### `WithMetadata`
+
+ورث من هذه الفئة (بالإضافة إلى `BaseInvocation`) لإضافة مدخل `metadata` إلى عقدتك. عندما تفعل ذلك، يمكنك الوصول إلى قاموس البيانات الوصفية من `self.metadata` في دالة `invoke()`.
+
+سيتم ملء القاموس عبر مدخل العقدة، ويمكنك إضافة أي بيانات وصفية تريدها إليه. عند استدعاء `context.images.save()`، إذا كان قاموس البيانات الوصفية يحتوي على أي بيانات، فسيتم تضمينها تلقائيًا في الصورة.
+
+### `WithBoard`
+
+ورث من هذه الفئة (بالإضافة إلى `BaseInvocation`) لإضافة مدخل `board` إلى عقدتك. يتم عرض هذا كقائمة منسدلة لاختيار لوحة. سيكون اختيار المستخدم متاحًا من `self.board` في دالة `invoke()`.
+
+عند استدعاء `context.images.save()`، إذا تم تحديد لوحة، ستتم إضافة الصورة إلى تلك اللوحة أثناء حفظها.
+
+
diff --git a/docs/src/content/docs/ar/development/Guides/creating-node-pack.mdx b/docs/src/content/docs/ar/development/Guides/creating-node-pack.mdx
new file mode 100644
index 00000000000..5768f487e8f
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Guides/creating-node-pack.mdx
@@ -0,0 +1,157 @@
+---
+title: إنشاء حزم العقد
+lastUpdated: 2026-05-23
+---
+
+import { FileTree } from '@astrojs/starlight/components'
+
+يشرح هذا الدليل كيفية تنظيم مستودع Git الخاص بك بحيث يمكن تثبيته عبر مدير العقد المخصصة في InvokeAI.
+
+## هيكل المستودع
+
+مستودعك **هو** حزمة العقد. عندما يقوم المستخدم بتثبيتها، يتم استنساخ المستودع بأكمله داخل دليل `nodes`.
+
+### الحد الأدنى للهيكل المطلوب
+
+
+ - my-node-pack/
+ - `__init__.py` مطلوب: يستورد جميع فئات العقد
+ - my_node.py تنفيذ (تطبيقات) العقدة الخاصة بك
+ - README.md موصى به: صف كيفية عمل عقدك
+
+
+ملف `__init__.py` في الجذر **إجباري**. بدونه، لن يتم تحميل الحزمة.
+
+### الهيكل الموصى به
+
+
+ - my-node-pack/
+ - `__init__.py` مطلوب: يستورد جميع فئات العقد
+ - requirements.txt تبعيات Python (مثبتة من قبل المستخدم)
+ - README.md الوصف والاستخدام والأمثلة
+ - node_one.py تنفيذ العقدة
+ - node_two.py تنفيذ العقدة
+ - utils.py أدوات مساعدة مشتركة
+ - workflows/ اختياري: ملفات سير العمل المضمنة
+ - example_workflow.json
+ - advanced_workflow.json
+
+
+## ملف `__init__.py`
+
+يجب أن يستورد هذا الملف جميع فئات الاستدعاء التي ترغب في تسجيلها. فقط الفئات المستوردة هنا ستكون متاحة في InvokeAI.
+
+```python title="__init__.py"
+from .node_one import MyFirstInvocation
+from .node_two import MySecondInvocation
+```
+
+إذا كانت لديك عقد في أدلة فرعية:
+
+```python
+from .nodes.image_tools import CropInvocation, ResizeInvocation
+from .nodes.text_tools import ConcatInvocation
+```
+
+## التبعيات (`requirements.txt` أو `pyproject.toml`)
+
+إذا كانت عقدك تتطلب حزم Python إضافية، فقم بإدراجها في ملف `requirements.txt` (أو `pyproject.toml`) في جذر المستودع:
+
+```txt title="requirements.txt"
+numpy>=1.24
+opencv-python>=4.8
+```
+
+**لا يقوم** مدير العقد المخصصة بتثبيت هذه التبعيات تلقائيًا — فالتثبيت التلقائي في بيئة InvokeAI قيد التشغيل يخاطر بجلب إصدارات غير متوافقة وتعطيل التطبيق. بعد التثبيت، تعرض الواجهة للمستخدم إشعارًا يخبره بأن التثبيت اليدوي مطلوب، ويجب أن يوثق README الخاص بك أمر التثبيت الدقيق (مثل `pip install -r requirements.txt` من داخل بيئة InvokeAI مفعلة).
+
+**هام:** تجنب تثبيت الإصدارات بشكل صارم جدًا. InvokeAI لها تبعياتها الخاصة، وتضارب الإصدارات يمكن أن يسبب مشاكل. استخدم قيود الحد الأدنى للإصدار (`>=`) حيثما أمكن.
+
+## تضمين سير العمل
+
+إذا كان مستودعك يحتوي على ملفات سير عمل `.json`، فسيتم **استيرادها تلقائيًا** إلى مكتبة سير عمل المستخدم أثناء التثبيت.
+
+### اكتشاف سير العمل
+
+يقوم برنامج التثبيت بمسح مستودعك بشكل متكرر بحثًا عن ملفات `.json`. يتم التعرف على الملف كسير عمل إذا كان يحتوي على مفتاحي `nodes` و `edges` على المستوى الأعلى.
+
+### الوسم
+
+يتم وسم سير العمل المستوردة تلقائيًا بالعلامة `node-pack:<اسم-مستودعك>` ليتمكن المستخدمون من التصفية بناءً عليها في مكتبة سير العمل. عند إلغاء تثبيت حزمة العقد، تتم إزالة سير العمل هذه أيضًا.
+
+### تنسيق سير العمل
+
+يجب أن يتبع سير العمل تنسيق InvokeAI القياسي لسير العمل:
+
+```json title="example_workflow.json"
+{
+ "name": "مثال سير العمل الخاص بي",
+ "author": "اسمك",
+ "description": "يوضح كيفية استخدام MyFirstInvocation",
+ "version": "1.0.0",
+ "contact": "",
+ "tags": "example, my-node-pack",
+ "notes": "",
+ "meta": {
+ "version": "3.0.0",
+ "category": "user"
+ },
+ "exposedFields": [],
+ "nodes": [...],
+ "edges": [...]
+}
+```
+
+**نصيحة:** أسهل طريقة لإنشاء ملف سير عمل هي بناء سير العمل في محرر سير العمل في InvokeAI، ثم تصديره عبر **حفظ باسم** ونسخ ملف `.json` إلى مستودعك.
+
+## تنفيذ العقدة
+
+كل عقدة هي فئة Python مزينة بالديكور `@invocation()`. إليك مثال بسيط:
+
+```python title="example_node.py"
+from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation
+from invokeai.app.invocations.fields import InputField, OutputField
+from invokeai.invocation_api import BaseInvocationOutput, invocation_output
+
+@invocation_output("my_output")
+class MyOutput(BaseInvocationOutput):
+ result: str = OutputField(description="النتيجة")
+
+@invocation(
+ "my_node",
+ title="عقدتي",
+ tags=["example", "custom"],
+ category="custom",
+ version="1.0.0",
+)
+class MyInvocation(BaseInvocation):
+ """يفعل شيئًا مفيدًا."""
+
+ input_text: str = InputField(default="", description="نص الإدخال")
+
+ def invoke(self, context) -> MyOutput:
+ return MyOutput(result=f"تمت المعالجة: {self.input_text}")
+```
+
+للحصول على التفاصيل الكاملة حول واجهة برمجة تطبيقات الاستدعاء، راجع [وثائق واجهة برمجة تطبيقات الاستدعاء](invocation-api.md).
+
+## أفضل الممارسات
+
+- **استخدم اسم مستودع وصفيًا** — يصبح اسم الحزمة المعروض في الواجهة
+- **قم بتضمين README.md** مع الوصف ولقطات الشاشة وتعليمات الاستخدام
+- **قم بإصدار عقدك** باستخدام الإصدار الدلالي في ديكور `@invocation()`
+- **لا تقم بتضمين ملفات ثنائية كبيرة** في مستودعك (نماذج، أوزان، إلخ.)
+- **اختبر عقدك** عن طريق وضع المستودع في دليل `nodes` قبل النشر
+- **قم بتضمين سير عمل أمثلة** حتى يتمكن المستخدمون من البدء بسرعة
+- **وسم مستودع GitHub الخاص بك** بـ `invokeai-node` لسهولة الاكتشاف
+- **تجنب تعارض الأسماء** — اختر سلاسل نوع استدعاء فريدة (مثل `my_pack_resize` بدلاً من `resize` فقط)
+
+## اختبار حزمتك
+
+قبل النشر، تحقق من أن حزمتك تعمل مع مدير العقد المخصصة:
+
+1. أنشئ مستودع Git بحزمة العقد الخاصة بك
+2. ادفعها إلى GitHub (أو أي مستضيف Git)
+3. في InvokeAI، اذهب إلى علامة تبويب العقد وقم بتثبيتها عبر رابط Git
+4. تحقق من ظهور عقدك في محرر سير العمل
+5. تحقق من استيراد أي سير عمل مضمنة
+6. اختبر إلغاء التثبيت — يجب إزالة العقد وسير العمل
diff --git a/docs/src/content/docs/ar/development/Guides/creating-nodes.mdx b/docs/src/content/docs/ar/development/Guides/creating-nodes.mdx
new file mode 100644
index 00000000000..aa9e9225bd4
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Guides/creating-nodes.mdx
@@ -0,0 +1,42 @@
+---
+title: إنشاء العقد
+---
+
+import { Steps, LinkCard } from '@astrojs/starlight/components';
+
+
+ 1. تعرف على تفاصيل إنشاء عقدة جديدة في وثائق إنشاء العقد الخاصة بنا.
+
+
+
+ 2. تأكد من احتواء العقدة في ملف Python جديد (.py). يُفضل أن تكون العقدة في مستودع مع README يوضح استخدام العقدة وأمثلتها لمساعدة الآخرين على استخدام عقدتك بسهولة أكبر. يمكن أن يساعد تضمين الوسم "invokeai-node" في README لمستودعك المستخدمين الآخرين في العثور على عقدتك بسهولة أكبر.
+
+ 3. قدم طلب سحب مع رابط لمستودع عقدتك (عقدك) على GitHub ضد الفرع `main` لإضافة العقدة إلى قائمة [العقد المجتمعية](../../../workflows/community-nodes)
+
+ تأكد من اتباع القالب أدناه وتقديم جميع التفاصيل ذات الصلة حول العقدة وما تقوم به. صور المخرجات وسير العمل الأمثلة مفيدة جدًا للمستخدمين الآخرين الذين يرغبون في استخدام عقدتك.
+
+ 4. سيقوم أحد المشرفين بمراجعة طلب السحب والعقدة. إذا كانت العقدة متوافقة مع اتجاه المشروع، قد يُطلب منك الإذن لتضمينها في المشروع الأساسي.
+
+
+### قالب العقدة المجتمعية
+
+ألحق القالب التالي بطلب السحب وصفحة [العقد المجتمعية](../../../workflows/community-nodes) عند تقديم عقدة لإضافتها إلى قائمة العقد المجتمعية:
+
+```md
+---
+
+### قالب العقدة الرائعة جدًا
+
+**الوصف:** تتيح لك هذه العقدة القيام بأشياء رائعة جدًا مع InvokeAI.
+
+**رابط العقدة:** https://github.com/invoke-ai/InvokeAI/fake_node.py
+
+**مثال لرسم بياني للعقدة:** https://github.com/invoke-ai/InvokeAI/fake_node_graph.json
+
+**أمثلة المخرجات**
+
+
+```
diff --git a/docs/src/content/docs/ar/development/Guides/models.mdx b/docs/src/content/docs/ar/development/Guides/models.mdx
new file mode 100644
index 00000000000..242ccb978cc
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Guides/models.mdx
@@ -0,0 +1,556 @@
+---
+title: دمج بنية نموذجية جديدة
+description: دليل شامل لدمج بنى النماذج الأساسية الجديدة في InvokeAI.
+lastUpdated: 2026-02-19
+---
+
+import { Steps, FileTree } from '@astrojs/starlight/components';
+
+يرشدك هذا الدليل خلال العملية الشاملة لدمج **بنية نموذج أساسي جديدة** في InvokeAI. هذا مطلوب عند إضافة عائلة جديدة تمامًا من النماذج (مثل Stable Diffusion 3، FLUX، Hunyuan، إلخ)، بدلاً من مجرد إضافة نقطة تفتيش جديدة لبنية موجودة.
+
+:::note
+تستخدم أمثلة الكود في هذا الدليل بنية `NewModel` افتراضية. تعد تطبيقات `FLUX` و `SD3` و `SDXL` في قاعدة كود InvokeAI مراجع ممتازة من العالم الحقيقي.
+:::
+
+## نظرة عامة على البنية
+
+يلمس دمج نموذج جديد عدة أجزاء من مكدس InvokeAI، من كود استدلال PyTorch منخفض المستوى وصولاً إلى واجهة React الأمامية:
+
+1. **التصنيف والتكوين (الخلفية)**: الإعلان عن وجود النموذج وتحديد كيفية اكتشافه من أوزانه على القرص.
+2. **تحميل النموذج (الخلفية)**: تحديد كيفية تحميل الملفات المكتشفة إلى نماذج PyTorch في الذاكرة.
+3. **أخذ العينات وإزالة الضوضاء (الخلفية)**: تنفيذ الرياضيات الأساسية لتوليد الضوضاء والجدولة وحلقة إزالة الضوضاء.
+4. **الاستدعاءات (الخلفية)**: تغليف منطق PyTorch في "عُقد" منفصلة يمكن تنفيذها بواسطة محرك الرسم البياني لـ InvokeAI.
+5. **بناء الرسم البياني (الواجهة الأمامية)**: توجيه واجهة المستخدم حول كيفية توصيل هذه العقد بناءً على إعدادات المستخدم.
+6. **الحالة وواجهة المستخدم (الواجهة الأمامية)**: إضافة عناصر تحكم واجهة المستخدم وإدارة الحالة اللازمة لمعلمات النموذج الجديد الفريدة.
+
+---
+
+## 1. التصنيف والإعدادات الافتراضية
+
+الخطوة الأولى هي الإعلان عن نموذجك في تصنيف النظام وتقديم إعدادات افتراضية معقولة.
+
+
+ 1. **إضافة `BaseModelType`**
+
+ قم بتحديث تصنيف النموذج الأساسي ليشمل نموذجك الجديد.
+
+ ```python title="invokeai/backend/model_manager/taxonomy.py" ins={7}
+ class BaseModelType(str, Enum):
+ # الأنواع الموجودة
+ StableDiffusion1 = "sd-1"
+ StableDiffusion2 = "sd-2"
+ StableDiffusionXL = "sdxl"
+ Flux = "flux"
+ NewModel = "newmodel"
+ ```
+
+ 2. **إضافة نوع المتغير (إذا لزم الأمر)**
+
+ إذا كان نموذجك يأتي في متغيرات هيكلية مختلفة (مثل أعداد معاملات مختلفة أو إصدارات مقطرة مثل `schnell` مقابل `dev`)، فعّدّل تعداد المتغير.
+
+ ```python title="invokeai/backend/model_manager/taxonomy.py"
+ class NewModelVariantType(str, Enum):
+ VariantA = "variant_a"
+ VariantB = "variant_b"
+ ```
+
+ 3. **تعريف الإعدادات الافتراضية**
+
+ قدم معلمات توليد افتراضية (الخطوات، مقياس CFG، إلخ) لواجهة المستخدم لاستخدامها عند تحديد هذا النموذج.
+
+ ```python title="invokeai/backend/model_manager/configs/main.py" ins={5-6}
+ class MainModelDefaultSettings:
+ @staticmethod
+ def from_base(base: BaseModelType, variant: AnyVariant | None = None):
+ match base:
+ case BaseModelType.NewModel:
+ return MainModelDefaultSettings(steps=20, cfg_scale=7.0)
+ ```
+
+
+:::tip[قائمة التحقق: التصنيف]{icon="approve-check"}
+ - [ ] توسيع تعداد `BaseModelType` في `taxonomy.py`
+ - [ ] إنشاء تعداد متغير إذا لزم الأمر في `taxonomy.py`
+ - [ ] تحديث اتحاد `AnyVariant` في `taxonomy.py`
+ - [ ] إضافة إعدادات افتراضية في `from_base()` في `configs/main.py`
+:::
+
+---
+
+## 2. تكوينات النموذج والاكتشاف
+
+يحتاج InvokeAI إلى معرفة كيفية التعرف على نموذجك من ملف `.safetensors` أو مجلد diffusers.
+
+
+ 1. **إنشاء تكوين النموذج الرئيسي**
+
+ قم بتعريف مخططات التكوين لتنسيق (تنسيقات) نموذجك.
+
+ ```python title="invokeai/backend/model_manager/configs/main.py"
+ # تنسيق نقطة التفتيش (ملف واحد)
+ @ModelConfigFactory.register
+ class Main_Checkpoint_NewModel_Config(Checkpoint_Config_Base):
+ type: Literal[ModelType.Main] = ModelType.Main
+ base: Literal[BaseModelType.NewModel] = BaseModelType.NewModel
+ format: Literal[ModelFormat.Checkpoint] = ModelFormat.Checkpoint
+ variant: NewModelVariantType = NewModelVariantType.VariantA
+
+ @classmethod
+ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict) -> Self:
+ if not cls._validate_is_newmodel(mod):
+ raise NotAMatchError("ليس نموذج NewModel")
+ variant = cls._get_variant_or_raise(mod)
+ return cls(..., variant=variant)
+
+ # تنسيق Diffusers (مجلد)
+ @ModelConfigFactory.register
+ class Main_Diffusers_NewModel_Config(Diffusers_Config_Base):
+ type: Literal[ModelType.Main] = ModelType.Main
+ base: Literal[BaseModelType.NewModel] = BaseModelType.NewModel
+ format: Literal[ModelFormat.Diffusers] = ModelFormat.Diffusers
+ ```
+
+ 2. **تنفيذ منطق الكشف**
+
+ اكتب دوال مساعدة لفحص مفاتيح وأشكال قاموس الحالة للتعرف الفريد على بنيتك.
+
+ ```python title="invokeai/backend/model_manager/configs/main.py"
+ def _is_newmodel(state_dict: dict) -> bool:
+ """الكشف مما إذا كان قاموس الحالة ينتمي لبنية NewModel."""
+ # مثال: التحقق من اسم طبقة أو شكل محدد للغاية
+ required_keys = ["transformer_blocks.0.attn.to_q.weight"]
+ return all(key in state_dict for key in required_keys)
+
+ def _get_newmodel_variant(state_dict: dict) -> NewModelVariantType:
+ """تحديد المتغير من قاموس الحالة."""
+ # مثال: التمييز بين المتغيرات بناءً على حجم البعد المخفي
+ context_dim = state_dict["context_embedder.weight"].shape[1]
+ if context_dim == 7680:
+ return NewModelVariantType.VariantA
+ return NewModelVariantType.VariantB
+ ```
+
+ 3. **النماذج الفرعية (VAE ومشفر النص)**
+
+ إذا كان نموذجك يستخدم VAE أو مشفر نص جديد غير موجود بالفعل في InvokeAI، يجب عليك تكرار هذه العملية لإنشاء تكوينات لهما (مثل في `configs/vae.py` و `configs/[encoder_type].py`).
+
+ 4. **تحديث اتحاد التكوين**
+
+ سجّل تكويناتك الجديدة حتى يعرف التطبيق أنه يجب عليه التحقق منها عند مسح الدلائل.
+
+ ```python title="invokeai/backend/model_manager/configs/factory.py" ins={4-5}
+ AnyModelConfig = Annotated[
+ # ... التكوينات الموجودة
+ Main_Checkpoint_NewModel_Config |
+ Main_Diffusers_NewModel_Config,
+ Discriminator(...)
+ ]
+ ```
+
+
+:::tip[قائمة التحقق: التكوينات]{icon="approve-check"}
+ - [ ] إنشاء تكوين نقطة التفتيش الرئيسية (`configs/main.py`)
+ - [ ] إنشاء تكوين diffusers الرئيسية (`configs/main.py`)
+ - [ ] إنشاء دوال مساعدة للكشف (`_is_newmodel()`، `_get_variant()`)
+ - [ ] إنشاء تكوينات VAE ومشفر النص إذا كانت تستخدم بنى جديدة
+ - [ ] تحديث اتحاد `AnyModelConfig` (`configs/factory.py`)
+:::
+
+---
+
+## 3. محملات النماذج
+
+المحملات مسؤولة عن تحويل الملفات على القرص (الموصوفة بواسطة التكوين) إلى نماذج PyTorch في الذاكرة.
+
+
+ 1. **إنشاء محمل النموذج**
+
+ ```python title="invokeai/backend/model_manager/load/model_loaders/[newmodel].py"
+ @ModelLoaderRegistry.register(
+ base=BaseModelType.NewModel,
+ type=ModelType.Main,
+ format=ModelFormat.Checkpoint
+ )
+ class NewModelLoader(ModelLoader):
+ def _load_model(self, config: AnyModelConfig, submodel_type: SubModelType | None) -> AnyModel:
+ # 1. تحميل الأوزان الخام من القرص
+ state_dict = self._load_state_dict(config.path)
+
+ # 2. تحويل مفاتيح قاموس الحالة إذا لزم الأمر (مثل من تنسيق المستودع الأصلي إلى Diffusers)
+ if self._is_original_format(state_dict):
+ state_dict = self._convert_to_diffusers_format(state_dict)
+
+ # 3. إنشاء نموذج PyTorch الفارغ
+ model = NewModelTransformer(config=model_config)
+
+ # 4. تحميل الأوزان في النموذج
+ model.load_state_dict(state_dict)
+ return model
+ ```
+
+ 2. **محملات VAE/المشفر المخصصة (إذا كان ذلك مناسبًا)**
+
+ إذا قمت بإنشاء تكوينات مخصصة لـ VAE أو مشفر النص، يجب عليك أيضًا إنشاء محملات لها، بتسجيلها باستخدام `ModelType` المناسب.
+
+
+:::tip[قائمة التحقق: المحملات]{icon="approve-check"}
+- [ ] إنشاء وتسجيل محمل النموذج الرئيسي
+- [ ] إنشاء محملات VAE/المشفر إذا لزم الأمر
+- [ ] تنفيذ تحويل قاموس الحالة إذا كان دعم التنسيقات غير التابعة لـ diffusers مطلوبًا
+:::
+
+---
+
+## 4. نواة أخذ العينات وإزالة الضوضاء
+
+هذا هو المكان الذي يعيش فيه التنفيذ الرياضي الفعلي للنموذج.
+
+
+
+ 1. **أدوات أخذ العينات**
+
+ أنشئ دوال مساعدة محددة لكيفية تعامل نموذجك مع الضوضاء والتعبئة والجدولة.
+
+ ```python title="invokeai/backend/[newmodel]/sampling_utils.py"
+ def get_noise_newmodel(num_samples: int, height: int, width: int, seed: int, device: torch.device, dtype: torch.dtype) -> torch.Tensor:
+ # غالبًا ما تحتوي النماذج على أعداد مختلفة من القنوات الكامنة (مثل SD1.5 لديه 4، FLUX لديه 16)
+ latent_channels = 32
+ latent_h, latent_w = height // 8, width // 8
+ generator = torch.Generator(device=device).manual_seed(seed)
+ return torch.randn((num_samples, latent_channels, latent_h, latent_w), generator=generator, device=device, dtype=dtype)
+
+ def pack_newmodel(x: torch.Tensor) -> torch.Tensor:
+ # بعض النماذج القائمة على المحولات تتطلب تعبئة الكمونات في تسلسل
+ return rearrange(x, "b c (h ph) (w pw) -> b (h w) (c ph pw)", ph=2, pw=2)
+ ```
+
+ إذا كانت البنية تدعم الضوضاء الخارجية، فضّل توسيع محدد `noise_type` لعقدة
+ `invokeai/app/invocations/noise.py` القياسية بدلاً من
+ إضافة عقدة ضوضاء جديدة تمامًا. أضف استدعاء ضوضاء مخصصًا فقط عندما
+ لا يمكن التعبير عن رتبة أو تخطيط موتر الضوضاء للبنية بواسطة
+ العقدة القياسية.
+
+ 2. **حلقة إزالة الضوضاء**
+
+ قم بتنفيذ حلقة أخذ العينات الأساسية. تتفاعل هذه مع المجدولين وتتعامل مع التوجيه الخالي من المصنف (CFG).
+
+ ```python title="invokeai/backend/[newmodel]/denoise.py"
+ def denoise(model: nn.Module, img: torch.Tensor, txt: torch.Tensor, timesteps: list[float], cfg_scale: list[float], scheduler: Any = None) -> torch.Tensor:
+ """حلقة إزالة الضوضاء الرئيسية."""
+ total_steps = len(timesteps) - 1
+
+ for step_index in range(total_steps):
+ t_curr = timesteps[step_index]
+
+ # التعامل مع CFG (التوجيه الخالي من المصنف)
+ if cfg_scale[step_index] > 1.0:
+ # تجميع الاستدعاءات الإيجابية والسلبية إذا كان ذلك مناسبًا
+ pred_pos = model(img, t_curr, txt)
+ # ...
+ else:
+ pred = model(img, t_curr, txt)
+
+ # تقدم المجدول
+ img = scheduler.step(pred, t_curr, img).prev_sample
+
+ return img
+ ```
+
+ 3. **المجدولون**
+
+ إذا كان نموذجك يتطلب مجدولًا جديدًا، أضفه إلى تعيين المجدول (مثل `invokeai/backend/[newmodel]/schedulers.py`).
+
+
+:::tip[قائمة التحقق: الاستدلال الأساسي]{icon="approve-check"}
+ - [ ] توليد الضوضاء (`get_noise_newmodel()`)
+ - [ ] دوال التعبئة/فك التعبئة (إذا كانت قائمة على المحولات)
+ - [ ] توليد جدول الخطوات الزمنية
+ - [ ] تنفيذ حلقة إزالة الضوضاء
+ - [ ] تعيين المجدولين المدعومين
+:::
+
+---
+
+## 5. الاستدعاءات
+
+تكشف الاستدعاءات عن دوال PyTorch الخاصة بك كعقد تنفيذ منفصلة في الرسم البياني لـ InvokeAI.
+
+
+ 1. **استدعاء محمل النموذج**
+
+ يقوم بتحميل المكونات (المحول، VAE، إلخ) وتوفيرها للعقد النهائية.
+
+ ```python title="invokeai/app/invocations/[newmodel]_model_loader.py"
+ @invocation("newmodel_model_loader", title="محمل NewModel", category="model_loader")
+ class NewModelModelLoaderInvocation(BaseInvocation):
+ model: ModelIdentifierField = InputField(description="النموذج الرئيسي")
+
+ def invoke(self, context: InvocationContext) -> NewModelLoaderOutput:
+ transformer = self.model.model_copy(update={"submodel_type": SubModelType.Transformer})
+ vae = self.model.model_copy(update={"submodel_type": SubModelType.VAE})
+ return NewModelLoaderOutput(transformer=transformer, vae=vae)
+ ```
+
+ 2. **استدعاء مشفر النص**
+
+ يقوم بتقطيع الاستدعاء وتشغيل المشفر (المشفرات) النصية.
+
+ ```python title="invokeai/app/invocations/[newmodel]_text_encoder.py"
+ @invocation("newmodel_text_encode", title="مشفر نص NewModel", category="conditioning")
+ class NewModelTextEncoderInvocation(BaseInvocation):
+ prompt: str = InputField()
+ encoder: EncoderField = InputField()
+
+ def invoke(self, context: InvocationContext) -> ConditioningOutput:
+ # 1. تقطيع الاستدعاء
+ # 2. تشغيل المشفر للحصول على التضمينات
+ # 3. حفظ في السياق وإرجاع
+ conditioning_name = context.conditioning.save(ConditioningFieldData(...))
+ return ConditioningOutput(conditioning=ConditioningField(conditioning_name=conditioning_name))
+ ```
+
+ 3. **استدعاء إزالة الضوضاء**
+
+ يغلف حلقة `denoise` التي كتبتها في القسم السابق.
+
+ ```python title="invokeai/app/invocations/[newmodel]_denoise.py"
+ @invocation("newmodel_denoise", title="إزالة ضوضاء NewModel", category="latents")
+ class NewModelDenoiseInvocation(BaseInvocation):
+ latents: LatentsField | None = InputField(default=None)
+ noise: LatentsField | None = InputField(default=None)
+ positive_conditioning: ConditioningField = InputField()
+ transformer: TransformerField = InputField()
+ steps: int = InputField(default=20)
+ cfg_scale: float = InputField(default=7.0)
+
+ def invoke(self, context: InvocationContext) -> LatentsOutput:
+ # توليد الضوضاء، الحصول على الجدول، واستدعاء دالة denoise()
+ pass
+ ```
+
+ إذا أضفت دعمًا للضوضاء الخارجية، أبقِه اختياريًا حتى تستمر
+ سير العمل المعتمدة على البذرة في العمل. تحقق من الضوضاء المتصلة مقابل
+ الشكل المتوقع للبنية قبل استخدامها.
+
+ 4. **استدعاءات تشفير/فك تشفير VAE**
+
+ أنشئ عقدًا للانتقال بين مساحة البكسل (الصور) والمساحة الكامنة.
+
+
+:::tip[قائمة التحقق: الاستدعاءات]{icon="approve-check"}
+ - [ ] تعريف فئات المخرجات (مثل `NewModelLoaderOutput`)
+ - [ ] استدعاء محمل النموذج (`[newmodel]_model_loader.py`)
+ - [ ] استدعاء مشفر النص (`[newmodel]_text_encoder.py`)
+ - [ ] استدعاء إزالة الضوضاء (`[newmodel]_denoise.py`)
+ - [ ] توسيع استدعاء `noise` القياسي إذا كانت البنية تدعم الضوضاء الخارجية
+ - [ ] استدعاءات تشفير/فك تشفير VAE (`[newmodel]_vae_encode.py`، `[newmodel]_vae_decode.py`)
+:::
+
+---
+
+## 6. الواجهة الأمامية: بناء الرسم البياني
+
+لا تعرف واجهة المستخدم شيئًا عن دوال بايثون؛ إنها تعرف فقط كيفية بناء رسوم بيانية من الاستدعاءات.
+
+
+ 1. **إنشاء باني الرسم البياني**
+
+ اكتب دالة TypeScript تقوم ببناء رسم بياني للعقد لنموذجك.
+
+ ```typescript title="invokeai/frontend/web/src/features/nodes/util/graph/generation/buildNewModelGraph.ts"
+ export const buildNewModelGraph = async (arg: GraphBuilderArg): Promise => {
+ const { state, manager } = arg;
+ const { model } = state.params;
+ const g = new Graph();
+
+ // 1. إضافة المحمل
+ const modelLoader = g.addNode({
+ id: NEWMODEL_MODEL_LOADER,
+ type: 'newmodel_model_loader',
+ model: Graph.getModelMetadataField(model),
+ });
+
+ // 2. إضافة مشفرات النص
+ const positivePrompt = g.addNode({
+ id: POSITIVE_CONDITIONING,
+ type: 'newmodel_text_encode',
+ prompt: state.params.positivePrompt,
+ });
+ g.addEdge(modelLoader, 'encoder', positivePrompt, 'encoder');
+
+ // 3. إضافة إزالة الضوضاء
+ const denoise = g.addNode({
+ id: NEWMODEL_DENOISE,
+ type: 'newmodel_denoise',
+ steps: state.params.steps,
+ cfg_scale: state.params.cfg,
+ });
+ g.addEdge(modelLoader, 'transformer', denoise, 'transformer');
+ g.addEdge(positivePrompt, 'conditioning', denoise, 'positive_conditioning');
+
+ // 4. إضافة فك تشفير VAE
+ const l2i = g.addNode({
+ id: NEWMODEL_VAE_DECODE,
+ type: 'newmodel_vae_decode',
+ });
+ g.addEdge(modelLoader, 'vae', l2i, 'vae');
+ g.addEdge(denoise, 'latents', l2i, 'latents');
+
+ return { g, denoise, posCond: positivePrompt };
+ };
+ ```
+
+ 2. **تسجيل باني الرسم البياني**
+
+ اربط باني الرسم البياني الخاص بك بمنطق التوجيه الرئيسي.
+
+ ```typescript title="invokeai/frontend/web/src/features/queue/hooks/useEnqueueCanvas.ts" ins={5-6}
+ switch (base) {
+ case 'sdxl':
+ return buildSDXLGraph(arg);
+ case 'flux':
+ return buildFLUXGraph(arg);
+ case 'newmodel':
+ return buildNewModelGraph(arg);
+ }
+ ```
+
+ 3. **تحديث تعريفات الأنواع**
+
+ أضف عقدك الجديدة إلى اتحادات الأنواع الصارمة للواجهة الأمامية.
+
+ ```typescript title="invokeai/frontend/web/src/features/nodes/util/graph/types.ts" ins="| 'newmodel_vae_decode'"
+ export type ImageOutputNodes =
+ | 'l2i' | 'flux_vae_decode' | 'sd3_l2i' | 'newmodel_vae_decode';
+ ```
+
+ 4. **أنماط التوليد**
+
+ قم بتحديث `invokeai/app/invocations/metadata.py` ليشمل أنماطك الجديدة في `GENERATION_MODES` (مثل `"newmodel_txt2img"`، `"newmodel_img2img"`).
+
+
+:::tip[قائمة التحقق: بناء الرسم البياني]{icon="approve-check"}
+ - [ ] إنشاء باني الرسم البياني (`buildNewModelGraph.ts`)
+ - [ ] تسجيل باني الرسم البياني في `useEnqueueCanvas.ts`
+ - [ ] تحديث اتحادات العقد في `types.ts`
+ - [ ] إضافة أنماط التوليد إلى `metadata.py` في بايثون
+:::
+
+---
+
+## 7. الواجهة الأمامية: الحالة وواجهة المستخدم
+
+أخيرًا، أضف أي عناصر تحكم مخصصة لواجهة المستخدم (مثل قائمة منسدلة لمجدول معين) وإدارة حالتها.
+
+
+ 1. **الإضافة إلى حالة Redux**
+
+ قم بتحديث شريحة المعلمات لإعدادات النموذج الخاص بك.
+
+ ```typescript title="invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts"
+ interface ParamsState {
+ // ...
+ newmodelScheduler: 'euler' | 'heun';
+ }
+
+ const initialState: ParamsState = {
+ // ...
+ newmodelScheduler: 'euler',
+ };
+
+ // إضافة المخفضات وتصدير المحددات...
+ ```
+
+ 2. **استدعاء المعلمة**
+
+ تأكد من أن المستخدمين يمكنهم استخراج المعلمات من الصور المولدة سابقًا عن طريق تحديث `invokeai/frontend/web/src/features/metadata/parsing.tsx`.
+
+ ```typescript title="invokeai/frontend/web/src/features/metadata/parsing.tsx"
+ const recallNewmodelScheduler = (metadata: CoreMetadata) => {
+ if (metadata.scheduler) {
+ dispatch(setNewmodelScheduler(metadata.scheduler));
+ }
+ };
+ ```
+
+
+:::tip[قائمة التحقق: الحالة وواجهة المستخدم]{icon="approve-check"}
+ - [ ] توسيع واجهة الحالة للمعلمات الخاصة بالنموذج
+ - [ ] إنشاء المخفضات والمحددات
+ - [ ] إضافة معالجات استدعاء المعلمة في `parsing.tsx`
+:::
+
+---
+
+## 8. الميزات الاختيارية
+
+اعتمادًا على النموذج، قد ترغب في دعم ميزات إضافية.
+
+### دعم ControlNet
+يتطلب تكوينًا خلفيًا (`configs/controlnet.py`)، واستدعاءً مخصصًا (`[newmodel]_controlnet.py`)، وتكامل رسم بياني أمامي (`addControlNets`).
+
+### دعم LoRA
+يتطلب تعريف تكوين LoRA (`configs/lora.py`)، وتحديث محمل النموذج لتمرير حقول LoRA، وتوصيل `addLoRAs` في باني الرسم البياني للواجهة الأمامية.
+
+### IP-Adapter
+يتطلب استدعاءً مخصصًا للاستدعاء بالصور (`[newmodel]_ip_adapter.py`) وتكاملًا أماميًا عبر `addIPAdapters`.
+
+---
+
+## 9. نماذج البداية
+
+للسماح للمستخدمين بتنزيل نموذجك بسهولة من واجهة مدير النماذج، أضفه إلى قائمة نماذج البداية.
+
+```python title="invokeai/backend/model_manager/starter_models.py"
+newmodel_main = StarterModel(
+ name="NewModel الرئيسي",
+ base=BaseModelType.NewModel,
+ source="organization/newmodel-main", # مستودع HuggingFace
+ description="المحول الرئيسي لنموذج NewModel.",
+ type=ModelType.Main,
+)
+
+STARTER_MODELS.append(newmodel_main)
+```
+
+:::tip[قائمة التحقق: نماذج البداية]{icon="approve-check"}
+- [ ] تعريف StarterModel للنموذج الرئيسي
+- [ ] تعريف StarterModels لـ VAE/المشفر إذا كانت منفصلة
+- [ ] تعيين التبعيات بشكل صحيح إذا كانت مطلوبة
+- [ ] الإضافة إلى قائمة `STARTER_MODELS`
+:::
+
+---
+
+## ملخص ملفات التكامل
+
+يلمس تكامل `txt2img` كامل الحد الأدنى المجالات التالية:
+
+
+- invokeai
+ - app/invocations
+ - metadata.py
+ - `[newmodel]_model_loader.py`
+ - `[newmodel]_text_encoder.py`
+ - `[newmodel]_denoise.py`
+ - `[newmodel]_vae_decode.py`
+ - backend
+ - model_manager
+ - taxonomy.py
+ - configs
+ - main.py
+ - factory.py
+ - load/model_loaders
+ - `[newmodel].py`
+ - starter_models.py
+ - `[newmodel]`
+ - sampling_utils.py
+ - denoise.py
+ - frontend/web/src/features
+ - nodes/util/graph
+ - generation/buildNewModelGraph.ts
+ - types.ts
+ - queue/hooks/useEnqueueCanvas.ts
+ - controlLayers/store/paramsSlice.ts
+ - metadata/parsing.tsx
+
diff --git a/docs/src/content/docs/ar/development/Guides/recall-api.mdx b/docs/src/content/docs/ar/development/Guides/recall-api.mdx
new file mode 100644
index 00000000000..c978421cea1
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Guides/recall-api.mdx
@@ -0,0 +1,522 @@
+---
+title: واجهة برمجة تطبيقات استدعاء المعلمات
+---
+
+## نظرة عامة
+
+واجهة برمجة تطبيقات استدعاء المعلمات هي نقطة نهاية REST على الخادم الخلفي لـ InvokeAI
+تسمح للعمليات الخارجية بتعيين معلمات توليد قابلة للاستدعاء على
+الواجهة الأمامية. تشمل المعلمات المدعومة:
+
+- معلمات النص والأرقام الأساسية (الاستدعاءات، النموذج، الخطوات، CFG، الأبعاد، البذرة، ...)
+- LoRAs
+- طبقات التحكم (ControlNet، T2I Adapter، Control LoRA) مع صور تحكم اختيارية
+- محولات IP وصور مرجعية لـ FLUX Redux مع صور اختيارية
+- صور مرجعية بدون نموذج (FLUX.2 Klein، FLUX Kontext، Qwen Image Edit)
+
+عند تحديث المعلمات عبر API، يقوم الخادم الخلفي بتخزينها في
+استمرارية حالة العميل لقائمة الانتظار المستهدفة ويبث حدث WebSocket
+`recall_parameters_updated`. أي عميل واجهة أمامية مشترك في قائمة الانتظار تلك يطبق
+القيم الجديدة فورًا — بدون حاجة إلى إعادة تحميل يدوي.
+
+حالات الاستخدام النموذجية:
+
+- متصفح صور خارجي يريد "استدعاء" أو "إعادة مزج" معلمات
+ التوليد المحفوظة في بيانات وصفية لصورة PNG.
+- برنامج نصي يسبق تحميل المعلمات قبل تشغيل المستخدم للتوليد.
+- الاختبار الآلي أو سير العمل الدفعي الذي يريد إعادة استخدام تكوينات
+ النماذج والمحولات الموجودة.
+
+## كيف يعمل
+
+1. **طلب API** — عميلك يُرسل طلب POST مع جسم JSON من المعلمات إلى
+ `/api/v1/recall/{queue_id}`.
+2. **التخزين** — يتم تخزين المعلمات غير الفارغة تحت
+ مفاتيح `recall_*` في خدمة استمرارية حالة العميل، محددة النطاق
+ لـ `queue_id` المعطى.
+3. **الحل** — يتم حل النماذج من أسماء قابلة للقراءة البشرية إلى
+ مفاتيح النماذج الداخلية المستخدمة من قبل الواجهة الأمامية، ويتم التحقق من
+ أسماء ملفات الصور مقابل `{INVOKEAI_ROOT}/outputs/images`.
+4. **البث** — يتم إرسال حدث `recall_parameters_updated` على
+ غرفة websocket لـ `queue_id`.
+5. **تحديث الواجهة الأمامية** — أي عميل متصل مشترك في قائمة الانتظار تلك
+ يطبق التحديث على مخزن Redux الخاص به، بحيث تمتلئ حقول واجهة المستخدم و LoRAs
+ وطبقات التحكم ومحولات IP والصور المرجعية فورًا.
+
+## نقطة النهاية
+
+**الرابط الأساسي:** `http://localhost:9090/api/v1/recall/{queue_id}`
+
+عادة ما يكون معرف قائمة الانتظار هو `default`.
+
+### POST — تحديث معلمات الاستدعاء
+
+يقوم بتحديث معلمات الاستدعاء لـ `queue_id` المعطى.
+
+```http
+POST /api/v1/recall/{queue_id}
+Content-Type: application/json
+
+{
+ "positive_prompt": "منظر طبيعي جميل",
+ "negative_prompt": "ضبابي، جودة منخفضة",
+ "model": "sd-1.5",
+ "steps": 20,
+ "cfg_scale": 7.5,
+ "width": 512,
+ "height": 512,
+ "seed": 12345
+}
+```
+
+جميع المعلمات اختيارية — أرسل فقط الحقول التي تريد تحديثها.
+
+### GET — استرداد معلمات الاستدعاء
+
+```http
+GET /api/v1/recall/{queue_id}
+```
+
+```json
+{
+ "status": "success",
+ "queue_id": "queue_123",
+ "note": "استخدم الواجهة الأمامية للوصول إلى معلمات الاستدعاء المخزنة، أو عيّن معلمات محددة باستخدام POST"
+}
+```
+
+## مخطط الطلب
+
+### المعلمات الأساسية
+
+| المعامل | النوع | الوصف |
+|-----------|------|-------------|
+| `positive_prompt` | string | نص الاستدعاء الإيجابي |
+| `negative_prompt` | string | نص الاستدعاء السلبي |
+| `model` | string | اسم/معرف النموذج الرئيسي |
+| `refiner_model` | string | اسم/معرف نموذج المُحسّن |
+| `vae_model` | string | اسم/معرف نموذج VAE |
+| `scheduler` | string | اسم المجدول |
+| `steps` | integer | عدد خطوات التوليد (≥1) |
+| `refiner_steps` | integer | عدد خطوات المُحسّن (≥0) |
+| `cfg_scale` | number | مقياس CFG للتوجيه |
+| `cfg_rescale_multiplier` | number | مضاعف إعادة قياس CFG |
+| `refiner_cfg_scale` | number | مقياس CFG للمُحسّن |
+| `guidance` | number | مقياس التوجيه |
+| `width` | integer | عرض الصورة بالبكسل (≥64) |
+| `height` | integer | ارتفاع الصورة بالبكسل (≥64) |
+| `seed` | integer | البذرة العشوائية (≥0) |
+| `denoise_strength` | number | قوة إزالة الضوضاء (0–1) |
+| `refiner_denoise_start` | number | بداية إزالة الضوضاء للمُحسّن (0–1) |
+| `clip_skip` | integer | طبقات تخطي CLIP (≥0) |
+| `seamless_x` | boolean | تفعيل التثليث السلس X |
+| `seamless_y` | boolean | تفعيل التثليث السلس Y |
+| `refiner_positive_aesthetic_score` | number | درجة الجمالية الإيجابية للمُحسّن |
+| `refiner_negative_aesthetic_score` | number | درجة الجمالية السلبية للمُحسّن |
+
+### معلمات المجموعات
+
+```typescript
+{
+ // LoRAs
+ loras?: Array<{
+ model_name: string; // اسم نموذج LoRA
+ weight?: number; // الافتراضي: 0.75، النطاق: -10 إلى 10
+ is_enabled?: boolean; // الافتراضي: true
+ }>;
+
+ // طبقات التحكم (ControlNet، T2I Adapter، Control LoRA)
+ control_layers?: Array<{
+ model_name: string; // اسم نموذج محول التحكم
+ image_name?: string; // اسم ملف صورة اختياري من outputs/images
+ weight?: number; // الافتراضي: 1.0، النطاق: -1 إلى 2
+ begin_step_percent?: number; // الافتراضي: 0.0، النطاق: 0 إلى 1
+ end_step_percent?: number; // الافتراضي: 1.0، النطاق: 0 إلى 1
+ control_mode?: "balanced" | "more_prompt" | "more_control"; // ControlNet فقط
+ }>;
+
+ // محولات IP (تشمل FLUX Redux)
+ ip_adapters?: Array<{
+ model_name: string; // اسم نموذج محول IP / FLUX Redux
+ image_name?: string; // اسم ملف صورة مرجعية اختياري من outputs/images
+ weight?: number; // الافتراضي: 1.0، النطاق: -1 إلى 2
+ begin_step_percent?: number; // الافتراضي: 0.0، النطاق: 0 إلى 1
+ end_step_percent?: number; // الافتراضي: 1.0، النطاق: 0 إلى 1
+ method?: "full" | "style" | "composition"; // الافتراضي: "full"
+ image_influence?: "lowest" | "low" | "medium" | "high" | "highest"; // FLUX Redux فقط
+ }>;
+
+ // صور مرجعية بدون نموذج (FLUX.2 Klein، FLUX Kontext، Qwen Image Edit)
+ reference_images?: Array<{
+ image_name: string; // اسم ملف الصورة المرجعية من outputs/images
+ }>;
+}
+```
+
+## حل اسم النموذج
+
+يقوم الخادم الخلفي بحل أسماء النماذج إلى مفاتيحها الداخلية:
+
+1. **النماذج الرئيسية** — يتم حلها من الاسم إلى مفتاح النموذج.
+2. **LoRAs** — يتم البحث عنها في قاعدة بيانات نموذج LoRA.
+3. **محولات التحكم** — تُجرّب بالترتيب: ControlNet ← T2I Adapter ← Control LoRA.
+4. **محولات IP** — يتم البحث عنها في قاعدة بيانات محول IP؛ التراجع إلى FLUX Redux.
+
+يتم تخطي النماذج التي لا يمكن حلها مع تحذير في السجلات —
+يتم تطبيق باقي المعلمات still.
+
+## معالجة ملفات الصور
+
+عند تقديم `image_name`، يقوم الخادم الخلفي بـ:
+
+1. حل `{INVOKEAI_ROOT}/outputs/images/{image_name}` عبر خدمة
+ ملفات الصور (والتي تتحقق أيضًا من المسار).
+2. فتح الصورة لاستخراج العرض/الارتفاع.
+3. تضمين بيانات الصورة الوصفية في الحدث المرسل إلى الواجهة الأمامية.
+4. تسجيل ما إذا تم العثور على الصورة.
+
+يجب الإشارة إلى الصور باسم ملفها كما يظهر في دليل
+outputs/images:
+
+- ✅ `"image_name": "example.png"`
+- ✅ `"image_name": "my_control_image_20240110.jpg"`
+- ❌ `"image_name": "outputs/images/example.png"` (بدون بادئة)
+- ❌ `"image_name": "/full/path/to/example.png"` (بدون مسارات مطلقة)
+
+يتم تسجيل الصور المفقودة كتحذيرات ولكنها **لا** تفشل الطلب —
+يتم تطبيق المعلمات المتبقية still.
+
+## تفاصيل الميزة
+
+### LoRAs
+
+- يتم مسح LoRAs الموجودة قبل إضافة الجديدة.
+- يتم جلب وتطبيق تكوين نموذج كل LoRA بالوزن المحدد.
+- تظهر LoRAs في لوحة اختيار LoRA.
+
+### طبقات التحكم
+
+- مدعومة بالكامل مع صور اختيارية من `outputs/images`.
+- يشمل التكوين النموذج والأوزان ونسب الخطوة ووضع التحكم
+ ومرجع الصورة.
+- يتم تسجيل توفر الصورة في وحدة تحكم الواجهة الأمامية.
+
+### محولات IP / FLUX Redux
+
+- يتم التحقق من الصور المرجعية المحملة من `outputs/images` وتمريرها.
+- يشمل التكوين النموذج والأوزان ونسب الخطوة والطريقة ومرجع
+ الصورة.
+- يستخدم FLUX Redux `image_influence` بدلاً من الوزن الرقمي.
+
+### الصور المرجعية بدون نموذج
+
+تُستخدم من قبل البنى التي تستهلك صورة مرجعية مباشرة، بدون
+نموذج محول منفصل:
+
+- **FLUX.2 Klein** — دعم صور مرجعية مدمج.
+- **FLUX Kontext** — صورة مرجعية مرتبطة بالنموذج الرئيسي.
+- **Qwen Image Edit** — صورة مرجعية مرتبطة بالنموذج الرئيسي.
+
+نظرًا لعدم وجود نموذج محول لحله، تحمل هذه الإدخالات فقط
+`image_name`. عندما تستقبلها الواجهة الأمامية، تختار النوع
+المناسب (`flux2_reference_image`، `flux_kontext_reference_image`،
+أو `qwen_image_reference_image`) بناءً على النموذج الرئيسي
+المحدد حاليًا، مطابقة لسلوك السحب والإفلات اليدوي.
+
+## أمثلة الاستخدام
+
+### cURL
+
+```bash
+# المعلمات الأساسية
+curl -X POST http://localhost:9090/api/v1/recall/default \
+ -H "Content-Type: application/json" \
+ -d '{
+ "positive_prompt": "مدينة سايبربانك ليلاً",
+ "negative_prompt": "مظلم، غير واضح",
+ "model": "sd-1.5",
+ "steps": 30
+ }'
+
+# مجرد البذرة
+curl -X POST http://localhost:9090/api/v1/recall/default \
+ -H "Content-Type: application/json" \
+ -d '{"seed": 99999}'
+```
+
+### LoRAs فقط
+
+```bash
+curl -X POST http://localhost:9090/api/v1/recall/default \
+ -H "Content-Type: application/json" \
+ -d '{
+ "loras": [
+ {"model_name": "add-detail-xl", "weight": 0.8, "is_enabled": true},
+ {"model_name": "sd_xl_offset_example-lora_1.0", "weight": 0.5}
+ ]
+ }'
+```
+
+### طبقات تحكم مع صورة
+
+```bash
+curl -X POST http://localhost:9090/api/v1/recall/default \
+ -H "Content-Type: application/json" \
+ -d '{
+ "control_layers": [
+ {
+ "model_name": "controlnet-canny-sdxl-1.0",
+ "image_name": "my_control_image.png",
+ "weight": 0.75,
+ "begin_step_percent": 0.0,
+ "end_step_percent": 0.8,
+ "control_mode": "balanced"
+ }
+ ]
+ }'
+```
+
+### محولات IP مع صورة مرجعية
+
+```bash
+curl -X POST http://localhost:9090/api/v1/recall/default \
+ -H "Content-Type: application/json" \
+ -d '{
+ "ip_adapters": [
+ {
+ "model_name": "ip-adapter-plus-face_sd15",
+ "image_name": "reference_face.png",
+ "weight": 0.7,
+ "method": "composition"
+ }
+ ]
+ }'
+```
+
+### صور مرجعية بدون نموذج (FLUX.2 Klein / FLUX Kontext / Qwen Image Edit)
+
+```bash
+curl -X POST http://localhost:9090/api/v1/recall/default \
+ -H "Content-Type: application/json" \
+ -d '{
+ "model": "FLUX.2 Klein",
+ "reference_images": [
+ {"image_name": "style_reference.png"}
+ ]
+ }'
+```
+
+### تكوين كامل
+
+```bash
+curl -X POST http://localhost:9090/api/v1/recall/default \
+ -H "Content-Type: application/json" \
+ -d '{
+ "positive_prompt": "تحفة، صورة مفصلة بأسلوب محدد",
+ "negative_prompt": "ضبابي، جودة منخفضة",
+ "model": "FLUX Schnell",
+ "steps": 25,
+ "cfg_scale": 8.0,
+ "width": 1024,
+ "height": 768,
+ "seed": 42,
+ "loras": [
+ {"model_name": "add-detail-xl", "weight": 0.6}
+ ],
+ "control_layers": [
+ {
+ "model_name": "controlnet-depth-sdxl-1.0",
+ "image_name": "depth_map.png",
+ "weight": 1.0,
+ "end_step_percent": 0.7
+ }
+ ],
+ "ip_adapters": [
+ {
+ "model_name": "ip-adapter-plus-face_sd15",
+ "image_name": "style_reference.png",
+ "weight": 0.5,
+ "method": "style"
+ }
+ ]
+ }'
+```
+
+### Python
+
+```python
+import requests
+
+API_URL = "http://localhost:9090/api/v1/recall/default"
+
+params = {
+ "positive_prompt": "غابة هادئة",
+ "negative_prompt": "أشخاص، مبانٍ",
+ "steps": 25,
+ "cfg_scale": 7.0,
+ "seed": 42,
+}
+
+response = requests.post(API_URL, json=params)
+result = response.json()
+print(f"الحالة: {result['status']}")
+print(f"تم تحديث {result['updated_count']} معامل")
+```
+
+### JavaScript
+
+```javascript
+const API_URL = 'http://localhost:9090/api/v1/recall/default';
+
+fetch(API_URL, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ positive_prompt: 'غروب شمس جميل',
+ steps: 20,
+ width: 768,
+ height: 768,
+ seed: 12345,
+ }),
+})
+ .then((res) => res.json())
+ .then((data) => console.log(data));
+```
+
+## تنسيق الاستجابة
+
+```json
+{
+ "status": "success",
+ "queue_id": "default",
+ "updated_count": 15,
+ "parameters": {
+ "positive_prompt": "...",
+ "steps": 25,
+ "loras": [
+ {"model_key": "abc123...", "weight": 0.6, "is_enabled": true}
+ ],
+ "control_layers": [
+ {
+ "model_key": "controlnet-xyz...",
+ "weight": 1.0,
+ "image": {"image_name": "depth_map.png", "width": 1024, "height": 768}
+ }
+ ],
+ "ip_adapters": [
+ {
+ "model_key": "ip-adapter-xyz...",
+ "weight": 0.5,
+ "image": {"image_name": "style_reference.png", "width": 1024, "height": 1024}
+ }
+ ],
+ "reference_images": [
+ {"image": {"image_name": "style_reference.png", "width": 1024, "height": 1024}}
+ ]
+ }
+}
+```
+
+## أحداث WebSocket
+
+تصدر تحديثات المعلمات حدث `recall_parameters_updated` إلى غرفة
+قائمة الانتظار. عملاء الواجهة الأمامية المتصلون يقومون تلقائيًا بـ:
+
+1. تطبيق المعلمات القياسية (الاستدعاءات، الخطوات، الأبعاد، إلخ).
+2. تحميل وإضافة LoRAs إلى قائمة LoRA.
+3. تطبيق تكوينات طبقة التحكم.
+4. تطبيق تكوينات محول IP / FLUX Redux مع صورهم.
+5. إلحاق الصور المرجعية بدون نموذج، باستخدام نوع التكوين الذي
+ يطابق النموذج الرئيسي المحدد حاليًا.
+
+## معالجة الأخطاء
+
+- **400 Bad Request** — معاملات أو قيم معاملات غير صالحة.
+- **500 Internal Server Error** — فشل تخزين أو استرجاع من جانب الخادم.
+
+تتضمن الأخطاء رسائل مفصلة. الصور المفقودة وأسماء النماذج
+غير محلولة **ليست** أخطاء — يتم تسجيلها ويتم تطبيق
+المعلمات المتبقية still.
+
+## التسجيل
+
+### الخادم الخلفي
+
+```
+INFO: تم حل اسم نموذج ControlNet 'controlnet-canny-sdxl-1.0' إلى المفتاح 'controlnet-xyz...'
+INFO: تم العثور على ملف الصورة: depth_map.png (1024x768)
+INFO: تم تحديث 12 معامل استدعاء لقائمة الانتظار default
+INFO: تم حل 1 LoRA
+INFO: تم حل 1 طبقة تحكم
+INFO: تم حل 1 محول IP
+INFO: تم حل 1 صورة مرجعية
+```
+
+### الواجهة الأمامية
+
+عيّن `localStorage.ROARR_FILTER = 'debug'` في المتصفح لرؤية جميع رسائل
+التصحيح تحت مساحة الاسم `events`.
+
+```
+INFO: تم تطبيق 5 معاملات استدعاء على المخزن
+INFO: تم تطبيق 1 محول IP، استبدال القائمة الموجودة
+INFO: تم تطبيق 1 صورة مرجعية بدون نموذج
+DEBUG: تم بناء حالة صورة محول IP: ip-adapter-xyz... (الوزن: 0.7)
+DEBUG: صورة محول IP: outputs/images/depth_map.png (1024x768)
+```
+
+## تفاصيل التنفيذ
+
+- يتم تخزين المعلمات في خدمة استمرارية حالة العميل تحت
+ مفاتيح `recall_*`، محددة النطاق لـ `queue_id`.
+- يعمل التحقق من الصحة الرقمية في طبقة FastAPI (مثل `steps ≥ 1`، `width ≥ 64`).
+- تتم معالجة وتخزين وبث المعلمات غير الفارغة فقط.
+- يتم حل مفتاح النموذج **بعد** تخزين المعلمات الخام، لذلك
+ اسم النموذج غير القابل للحل يسقط ببساطة من البث ولكنه لا
+ يفسد الحالة المحفوظة.
+- تحتوي حمولة البث على مفاتيح النموذج المُحلّة وبيانات الصور الوصفية
+ (العرض/الارتفاع) حتى تتمكن الواجهة الأمامية من ملء مخزنها دون
+ جولات إضافية.
+
+## استكشاف الأخطاء وإصلاحها
+
+### لم يتم العثور على الصورة
+
+إذا رأيت "لم يتم العثور على ملف الصورة" في السجلات:
+
+1. تحقق من تطابق اسم الملف تمامًا (حساس لحالة الأحرف).
+2. تأكد من أن الصورة موجودة في `{INVOKEAI_ROOT}/outputs/images/`.
+3. تحقق من أن اسم الملف لا يتضمن البادئة `outputs/images/`.
+
+### لم يتم العثور على النموذج
+
+إذا رأيت "لم يتم العثور على النموذج":
+
+1. تحقق من تطابق اسم النموذج تمامًا (حساس لحالة الأحرف).
+2. تأكد من تثبيت النموذج.
+3. تحقق من الاسم عبر لوحة مدير النماذج.
+
+### لم يتم استلام الحدث
+
+1. تحقق من وحدة تحكم المتصفح بحثًا عن أخطاء اتصال المقبس.
+2. تحقق من أن `queue_id` يطابق قائمة انتظار الواجهة الأمامية (عادةً `default`).
+3. تحقق من سجلات الخادم الخلفي بحثًا عن أخطاء إصدار الأحداث.
+
+## القيود
+
+- **توفر النموذج** — يجب تثبيت النماذج المشار إليها في الحمولة.
+- **توفر الصورة** — يجب أن توجد الصور في `outputs/images`؛ عناوين
+ URL البعيدة غير مدعومة.
+- **إنشاء الطبقات التلقائي للوحة** — طبقات التحكم ومحولات IP مع
+ الصور تملأ حالة الاستدعاء، ولكن إنشاء طبقة لوحة من
+ بينها لا يزال يتم عبر واجهة المستخدم.
+
+## التحسينات المستقبلية
+
+تحسينات محتملة لم تُنفذ بعد:
+
+1. إنشاء طبقات لوحة تلقائيًا من صور طبقة التحكم في الحمولة.
+2. إنشاء طبقات صور مرجعية تلقائيًا من صور محول IP في الحمولة.
+3. دعم عناوين URL للصور البعيدة بالإضافة إلى أسماء ملفات `outputs/images` المحلية.
+4. إمكانية رفع الصور (قبول base64 أو رفع ملف مباشرة عبر API).
+5. عمليات دفعية تستهدف عدة `queue_id` في طلب واحد.
diff --git a/docs/src/content/docs/ar/development/Guides/tests.mdx b/docs/src/content/docs/ar/development/Guides/tests.mdx
new file mode 100644
index 00000000000..bd221f17dde
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Guides/tests.mdx
@@ -0,0 +1,102 @@
+---
+title: كتابة الاختبارات
+lastUpdated: 2026-02-20
+---
+
+## اختبارات الواجهة الأمامية
+
+نستخدم `vitest` لتشغيل اختبارات الواجهة الأمامية. (راجع [vite.config.ts](https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/frontend/web/vite.config.mts) لخيارات `vitest` الافتراضية.)
+
+{/* TODO: إنهاء وثائق اختبارات الواجهة الأمامية */}
+
+## اختبارات الواجهة الخلفية
+
+نستخدم `pytest` لتشغيل اختبارات بايثون للواجهة الخلفية. (راجع [pyproject.toml](https://github.com/invoke-ai/InvokeAI/blob/main/pyproject.toml) لخيارات `pytest` الافتراضية.)
+
+### سريع مقابل بطيء
+جميع الاختبارات مصنفة إما كـ 'سريعة' (بدون تعليق توضيحي) أو 'بطيئة' (معلّقة بمزخرف `@pytest.mark.slow`).
+
+يتم تشغيل الاختبارات 'السريعة' للتحقق من كل طلب سحب، وهي سريعة بما يكفي لتشغيلها بشكل روتيني أثناء التطوير.
+
+الاختبارات 'البطيئة' تُشغّل حاليًا يدويًا فقط على أساس مخصص. في المستقبل، قد تتم أتمتتها لتُشغّل ليلاً. معظم المطورين من المتوقع أن يشغلوا فقط الاختبارات 'البطيئة' المرتبطة مباشرة بالميزة (الميزات) التي يعملون عليها.
+
+كقاعدة عامة، يجب وضع علامة 'بطيء' على الاختبارات إذا كان هناك احتمال أن تستغرق >1 ثانية (مثل على جهاز CPU فقط مع اتصال إنترنت بطيء). الأمثلة الشائعة للاختبارات البطيئة هي الاختبارات التي تعتمد على تنزيل نموذج، أو تشغيل استدلال النموذج.
+
+### تشغيل الاختبارات
+
+فيما يلي بعض أوامر الاختبار الشائعة:
+
+```bash
+# تشغيل الاختبارات السريعة. (يستخدم هذا ضمنيًا الخيار الافتراضي المُهيأ: `-m "not slow"`.)
+pytest tests/
+
+# أمر مكافئ لتشغيل الاختبارات السريعة.
+pytest tests/ -m "not slow"
+
+# تشغيل الاختبارات البطيئة.
+pytest tests/ -m "slow"
+
+# تشغيل الاختبارات البطيئة من ملف محدد.
+pytest tests/path/to/slow_test.py -m "slow"
+
+# تشغيل جميع الاختبارات (سريعة وبطيئة).
+pytest tests -m ""
+```
+
+### تنظيم الاختبارات
+
+جميع اختبارات الواجهة الخلفية موجودة في دليل [`tests/`](https://github.com/invoke-ai/InvokeAI/tree/main/tests). يعكس هذا الدليل تنظيم دليل `invokeai/`. على سبيل المثال، سيتم العثور على اختبارات `invokeai/model_management/model_manager.py` في `tests/model_management/test_model_manager.py`.
+
+TODO: البيان أعلاه طموح. إعادة تنظيم الاختبارات القديمة مطلوبة لجعله صحيحًا.
+
+### الاختبارات التي تعتمد على النماذج
+
+هناك بعض الأمور التي يجب مراعاتها عند إضافة اختبارات تعتمد على النماذج.
+
+1. إذا لم يكن النموذج المطلوب موجودًا بالفعل، فيجب تنزيله تلقائيًا كجزء من إعداد الاختبار.
+2. إذا كان النموذج قد تم تنزيله بالفعل، فلا يجب إعادة تنزيله دون داع.
+3. اتخذ عناية معقولة للحفاظ على العدد الإجمالي للنماذج المطلوبة للاختبارات منخفضًا. كلما أمكن، أعد استخدام النماذج المطلوبة بالفعل لاختبارات أخرى. إذا كنت تُضيف نموذجًا جديدًا، ففكر في تضمين تعليق لشرح سبب كونه مطلوبًا/فريدًا.
+
+هناك العديد من الأدوات المساعدة للمساعدة في إعداد النموذج للاختبارات. إليك نموذج اختبار يعتمد على نموذج:
+
+```python
+import pytest
+import torch
+
+from invokeai.backend.model_management.models.base import BaseModelType, ModelType
+from invokeai.backend.util.test_utils import install_and_load_model
+
+@pytest.mark.slow
+def test_model(model_installer, torch_device):
+ model_info = install_and_load_model(
+ model_installer=model_installer,
+ model_path_id_or_url="HF/dummy_model_id",
+ model_name="dummy_model",
+ base_model=BaseModelType.StableDiffusion1,
+ model_type=ModelType.Dummy,
+ )
+
+ dummy_input = build_dummy_input(torch_device)
+
+ with torch.no_grad(), model_info as model:
+ model.to(torch_device, dtype=torch.float32)
+ output = model(dummy_input)
+
+ # التحقق من المخرجات...
+```
+
+### تغطية الاختبارات
+
+لمراجعة تغطية الاختبارات، ألحق `--cov` بأمر pytest الخاص بك:
+
+```bash
+pytest tests/ --cov
+```
+
+سيتم الإبلاغ عن نتائج الاختبار والتغطية في الطرفية. بالإضافة إلى ذلك، يتم إنشاء تقرير أكثر تفصيلاً بتنسيق XML و HTML في مجلد `./coverage`. مخرجات HTML مفيدة بشكل خاص في تحديد العبارات غير المختبرة حيث يجب تحسين التغطية. يمكن عرض تقرير HTML بفتح `./coverage/html/index.html`.
+
+:::note مثال على مخرجات تقرير تغطية HTML
+ 
+
+ 
+:::
diff --git a/docs/src/content/docs/ar/development/Process/pr-merge-policy.mdx b/docs/src/content/docs/ar/development/Process/pr-merge-policy.mdx
new file mode 100644
index 00000000000..53815c99e99
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Process/pr-merge-policy.mdx
@@ -0,0 +1,72 @@
+---
+title: سياسة دمج طلبات السحب
+lastUpdated: 2026-02-19
+---
+
+import { Steps } from '@astrojs/starlight/components';
+
+توضح هذه الوثيقة عملية مراجعة ودمج طلبات السحب (PRs) في مستودع InvokeAI.
+
+## عملية المراجعة
+
+
+ 1. التعيين
+
+ سيقوم أحد المشرفين على المستودع بتعيين متعاونين لمراجعة طلب السحب. سيكون المراجع (المراجعون) المعينون مسؤولين عن إجراء مراجعة الكود.
+
+ 2. المراجعة والتكرار
+
+ يتحمل المسؤول عن:
+ - مراجعة طلب السحب بدقة
+ - تقديم ملاحظات بناءة
+ - التكرار مع مؤلف طلب السحب حتى يقتنع المسؤول بأن طلب السحب مناسب للدمج
+ - ضمان أن طلب السحب يلبي معايير جودة الكود، ويتبع اتفاقيات المشروع، ولا يقدم أخطاء أو تراجعات
+
+ 3. الموافقة والإخطار
+
+ بمجرد أن يقتنع المسؤول بطلب السحب:
+ - يوافق المسؤول على طلب السحب
+ - ينبه المسؤول أحد المشرفين بأن طلب السحب جاهز للدمج باستخدام **قناة #request-reviews على Discord**
+
+ 4. الدمج النهائي
+
+ أحد المشرفين مسؤول عن:
+ - إجراء فحص نهائي لطلب السحب
+ - دمج طلب السحب في الفرع المناسب
+
+ :::caution[مهم]
+ يُثبط بشدة قيام المتعاونين بدمج طلبات السحب بأنفسهم، إلا في حالة الطوارئ (مثل إصلاح خطأ حرج وعدم توفر مشرف).
+ :::
+
+ 5. سياسة الإصدار
+
+ بمجرد نشر مرشح إصدار لميزة، لا يُسمح بدمج أي طلبات سحب لميزات في الفرع الرئيسي.
+ يُسمح فقط بإصلاحات الأخطاء حتى الإصدار
+ النهائي.
+
+
+## أفضل الممارسات
+
+### سجل commits نظيف
+
+لتشجيع سجل تطوير نظيف، يُشجّع مؤلفو طلبات السحب على استخدام `git rebase -i` لإزالة رسائل commits التافهة (مثل إصلاحات تنسيق `ruff` و `prettier`) بعد قبول طلب السحب ولكن قبل دمجه.
+
+### استراتيجية الدمج
+
+سيقوم المشرف بإما **دمج ثلاثي الاتجاهات** أو **دمج Squash** عند دمج طلب السحب في الفرع `main`. يساعد هذا النهج في تجنب فوضى تعارض إعادة الأساس والحفاظ على تاريخ مشروع أنظف.
+
+### الإسناد
+
+يجب على مؤلف طلب السحب الإشارة إلى أي أوراق بحثية أو كود مصدري
+أو وثائق استخدمها أثناء إنشاء الكود سواء في طلب السحب
+أو كتعليقات في الكود نفسه. إذا كانت هناك أي قيود
+على الترخيص، فيجب ربطها و/أو إعادة إنتاجها في جذر
+المستودع.
+
+## ملخص
+
+تضمن هذه السياسة أن:
+- جميع طلبات السحب تحصل على مراجعة مناسبة من المتعاونين المعينين
+- المشرفين لديهم الإشراف النهائي قبل دخول الكود إلى الفرع الرئيسي
+- يبقى سجل commits نظيفًا وذا معنى
+- يتم تقليل تعارضات الدمج من خلال استراتيجيات الدمج المناسبة
diff --git a/docs/src/content/docs/ar/development/Process/release-process.mdx b/docs/src/content/docs/ar/development/Process/release-process.mdx
new file mode 100644
index 00000000000..ce475791b3e
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Process/release-process.mdx
@@ -0,0 +1,157 @@
+---
+title: عملية الإصدار
+lastUpdated: 2025-12-26
+---
+
+يتم نشر تطبيق Invoke كحزمة بايثون على [PyPI]. يتضمن ذلك توزيعة المصدر وتوزيعة مبنية (عجلة).
+
+معظم المستخدمين يقومون بتثبيته باستخدام [المُشغّل](https://github.com/invoke-ai/launcher/)، وآخرون باستخدام `pip`.
+
+يستخدم المُشغّل GitHub كمصدر رئيسي للإصدارات المتاحة.
+
+## الخطوط العريضة
+
+- دمج جميع التغييرات ورفع الإصدار في قاعدة الكود.
+- وضع علامة (tag) على commit الإصدار.
+- انتظار اكتمال سير عمل الإصدار.
+- الموافقة على وظائف نشر PyPI.
+- كتابة ملاحظات الإصدار على GitHub.
+
+## التحضير العام
+
+قم بدعوة المطورين لدمج طلبات السحب. ادمج واختبر الأمور.
+أنشئ فرعًا باسم مثل user/chore/vX.X.X-prep وقم برفع الإصدار عن طريق تحرير
+`invokeai/version/invokeai_version.py` واعمل commit محليًا.
+
+## سير عمل الإصدار
+
+يقوم سير العمل `release.yml` بتشغيل عدد من الوظائف للتعامل مع فحوصات الكود والاختبارات والبناء والنشر على PyPI.
+
+يتم تشغيله عند **دفع علامة (tag push)**، عندما تتطابق العلامة مع `v*`.
+
+### تشغيل سير العمل
+
+تأكد من دمج جميع commits التي يجب أن تكون في الإصدار في هذا الفرع، وأنك قمت بسحبها محليًا.
+
+شغّل `make tag-release` لوضع علامة على commit الحالي وبدء سير العمل. سيُطلب منك تقديم رسالة - استخدم معرف الإصدار.
+
+إذا كانت علامة هذا الإصدار موجودة بالفعل لسبب ما (ربما كان عليك إجراء تغيير في اللحظة الأخيرة)، فسيقوم البرنامج النصي بالكتابة فوقها.
+
+ادفع commit لتشغيل سير العمل.
+
+> في حال لم تتمكن من استخدام هدف Make، يمكن أيضًا بدء الإصدار [يدويًا] عبر GH.
+
+### وظائف سير العمل والعملية
+
+يتكون سير العمل من عدد من الفحوصات والاختبارات التي تُجرى بالتزامن، ثم وظيفتي نشر نهائيتين.
+
+تتطلب وظائف النشر موافقة يدوية ولا يتم تشغيلها إلا إذا نجحت الوظائف الأخرى.
+
+#### وظيفة `check-version`
+
+تضمن هذه الوظيفة أن معرف إصدار حزمة بايثون `invokeai` يطابق علامة الإصدار. يتم سحب معرف الإصدار من متغير `__version__` في `invokeai/version/invokeai_version.py`.
+
+تستخدم هذه الوظيفة [samuelcolvin/check-python-version].
+
+> أي [معرف إصدار] صالح يعمل، طالما أن العلامة تطابق الإصدار. يعمل سير عمل الإصدار بنفس الطريقة تمامًا لـ `RC` و `post` و `dev`، إلخ.
+
+#### وظائف الفحص والاختبار
+
+بعد ذلك، يتم تشغيل هذه الوظائف ويجب أن تمر. إنها نفس الوظائف التي يتم تشغيلها لكل طلب سحب.
+
+- **`python-tests`**: تشغيل `pytest` على مصفوفة من المنصات
+- **`python-checks`**: تشغيل `ruff` (تنسيق وفحص)
+- **`frontend-tests`**: تشغيل `vitest`
+- **`frontend-checks`**: تشغيل `prettier` (تنسيق)، `eslint` (فحص)، `dpdm` (مراجع دائرية)، `tsc` (فحص الأنواع الثابتة) و `knip` (واردات غير مستخدمة)
+- **`typegen-checks`**: التأكد من مزامنة أنواع الواجهة الأمامية والخلفية
+
+#### وظيفة `build-wheel`
+
+تقوم هذه بإعداد تبعيات بايثون والواجهة الأمامية وبناء حزمة بايثون. داخليًا، يشغل هذا `./scripts/build_wheel.sh` ويرفع `dist.zip`، الذي يحتوي على العجلة والبناء غير المؤرشف.
+
+لا تحتاج إلى تنزيل أو اختبار هذه القطع الأثرية.
+
+#### فحص السلامة والاختبار السريع
+
+في هذه المرحلة، يتوقف سير عمل الإصدار حيث أن وظائف النشر المتبقية تتطلب موافقة.
+
+من الممكن اختبار حزمة بايثون قبل نشرها على PyPI. لم نواجه مشاكل معها مطلقًا، لذلك ليس من الضروري القيام بذلك.
+
+ولكن، إذا كنت تريد أن تكون حذرًا جدًا، إليك كيفية اختبارها:
+
+- قم بتنزيل القطعة الأثرية `dist.zip` من وظيفة `build-wheel`
+- قم بفك ضغطها وابحث عن ملف العجلة
+- أنشئ تثبيت Invoke جديدًا باتباع [دليل التثبيت اليدوي](/start-here/manual/) - ولكن بدلاً من التثبيت من PyPI، قم بالتثبيت من العجلة
+- اختبر التطبيق
+
+##### هناك شيء غير صحيح
+
+إذا كشف الاختبار عن أي مشكلات، لا تقلق. ألغِ سير العمل، والذي سيلغي وظائف النشر المعلقة (لم توافق عليها قبل الأوان، أليس كذلك؟) وابدأ من جديد.
+
+#### وظائف نشر PyPI
+
+لن يتم تشغيل وظائف النشر إذا فشلت أي من الوظائف السابقة.
+
+يستخدمون [بيئات GitHub]، والتي تم تكوينها كـ [ناشرين موثوقين] على PyPI.
+
+تتطلب كلتا الوظيفتين موافقة من @lstein أو @blessedcoolant من علامة تبويب **Summary** في سير العمل.
+
+- انقر على زر **Review deployments**
+- اختر البيئة (إما `testpypi` أو `pypi` - عادةً تختار كليهما)
+- انقر على **Approve and deploy**
+
+> **إذا كان الإصدار موجودًا بالفعل على PyPI، فستفشل وظائف النشر.** يسمح PyPI بنشر إصدار معين مرة واحدة فقط - لا يمكنك تغييره. إذا كان الإصدار المنشور على PyPI به مشكلة، فستحتاج إلى "الفشل إلى الأمام" عن طريق رفع إصدار التطبيق ونشر إصدار متابعة.
+
+##### فشل نشر PyPI
+
+تحقق من [صفحة حالة البنية التحتية لبايثون] لمعرفة الحوادث.
+
+إذا لم تكن هناك حوادث، اتصل بـ @lstein أو @blessedcoolant، الذين لديهم وصول مالك إلى GH و PyPI، لمعرفة ما إذا كان الوصول قد انتهى أو شيء من هذا القبيل.
+
+#### وظيفة `publish-testpypi`
+
+تنشر التوزيعة على فهرس [Test PyPI]، باستخدام بيئة GitHub `testpypi`.
+
+هذه الوظيفة غير مطلوبة لنشر PyPI الإنتاجي، ولكنها مدرجة فقط في حال كنت تريد اختبار إصدار PyPI لسبب ما:
+
+- وافق على وظيفة النشر هذه دون الموافقة على النشر الإنتاجي
+- دعها تنتهي
+- أنشئ تثبيت Invoke جديدًا باتباع [دليل التثبيت اليدوي](/start-here/manual/)، مع التأكد من استخدام رابط فهرس Test PyPI: `https://test.pypi.org/simple/`
+- اختبر التطبيق
+
+#### وظيفة `publish-pypi`
+
+تنشر التوزيعة على فهرس PyPI الإنتاجي، باستخدام بيئة GitHub `pypi`.
+
+من الجيد الانتظار للموافقة وتشغيل هذه الوظيفة حتى تكون ملاحظات الإصدار جاهزة!
+
+## التحضير ونشر إصدار GitHub
+
+1. [أنشئ إصدارًا جديدًا] على GitHub، واختر العلامة التي شغّلت الإصدار.
+2. زر **Generate release notes** يقوم تلقائيًا بإدراج سجل التغييرات والمساهمين الجدد. تأكد من تحديد العلامات الصحيحة لهذا الإصدار وآخر إصدار مستقر. غالبًا ما يختار GitHub العلامات الخاطئة - قم بذلك يدويًا.
+3. اكتب ملاحظات الإصدار، موصِفًا التغييرات المهمة. يجب الإشادة بمساهمات أعضاء المجتمع. استخدم سجل التغييرات الذي يولده GitHub لرؤية جميع المساهمين. إذا كانت هناك تحديثات ترجمة من Weblate، افتح طلب السحب هذا واشكر كل شخص ساهم بترجمة.
+4. حدد **Set as a pre-release** إذا كان إصدارًا تجريبيًا.
+5. وافق وانتظر حتى تنتهي وظيفة `publish-pypi` إذا لم تكن قد فعلت ذلك بالفعل.
+6. انشر إصدار GitHub.
+7. انشر الإصدار في Discord في قناة [الإصدارات](https://discord.com/channels/1020123559063990373/1149260708098359327) مع ملاحظات مختصرة. على سبيل المثال:
+ > Invoke v5.7.0 (مستقر): [https://github.com/invoke-ai/InvokeAI/releases/tag/v5.7.0](https://github.com/invoke-ai/InvokeAI/releases/tag/v5.7.0)
+ >
+ > إنه إصدار كبير جدًا - منشئ النماذج، عُقد البيانات الوصفية (شكرًا @SkunkWorxDark!)، وأكثر من ذلك بكثير.
+8. انقر بزر الماوس الأيمن على الرسالة في الإصدارات وانسخ الرابط إليها. ثم انشر هذا الرابط في قناة [مناقشة الإصدار الجديد](https://discord.com/channels/1020123559063990373/1149506274971631688). على سبيل المثال:
+ > Invoke v5.7.0 (مستقر): [https://discord.com/channels/1020123559063990373/1149260708098359327/1344521744916021248](https://discord.com/channels/1020123559063990373/1149260708098359327/1344521744916021248)
+
+## الإصدار اليدوي
+
+يمكن بدء سير عمل الإصدار يدويًا. يجب بدء سير العمل من العلامة الصحيحة، وإلا فسيفشل فحص الإصدار.
+
+هذه الوظيفة متاحة كخيار احتياطي في حال حدث خطأ ما. عادةً، يجب تشغيل الإصدارات عبر دفع العلامة كما هو موضح أعلاه.
+
+[PyPI]: https://pypi.org/
+[أنشئ إصدارًا جديدًا]: https://github.com/invoke-ai/InvokeAI/releases/new
+[Test PyPI]: https://test.pypi.org/
+[معرف الإصدار]: https://packaging.python.org/en/latest/specifications/version-specifiers/
+[بيئات GitHub]: https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment
+[ناشرين موثوقين]: https://docs.pypi.org/trusted-publishers/
+[samuelcolvin/check-python-version]: https://github.com/samuelcolvin/check-python-version
+[يدويًا]: #manual-release
+[صفحة حالة البنية التحتية لبايثون]: https://status.python.org/
diff --git a/docs/src/content/docs/ar/development/Setup/dev-environment.mdx b/docs/src/content/docs/ar/development/Setup/dev-environment.mdx
new file mode 100644
index 00000000000..b948ca7f2fc
--- /dev/null
+++ b/docs/src/content/docs/ar/development/Setup/dev-environment.mdx
@@ -0,0 +1,275 @@
+---
+title: بيئة التطوير
+lastUpdated: 2026-02-19
+---
+
+import { LinkCard, Steps, Tabs, TabItem, FileTree, LinkButton } from '@astrojs/starlight/components'
+import SystemRequirementsLink from '@components/SystemRequirmentsLink.astro'
+
+:::caution
+ يستخدم Invoke قاعدة بيانات SQLite. عند تشغيل التطبيق كتثبيت تطويري، فإنك تتحمل مسؤولية قاعدة البيانات الخاصة بك. هذا يعني عمل نسخ احتياطية منتظمة (خاصة قبل السحب) و/أو إصلاحها بنفسك في حال قدم طلب سحب تغييرًا في هيكل المخطط.
+
+ إذا لم تكن بحاجة إلى الاحتفاظ بقاعدة البيانات الخاصة بك، يمكنك استخدام قاعدة بيانات مؤقتة في الذاكرة عن طريق تعيين `use_memory_db: true` في ملف `invokeai.yaml`. ستحتاج أيضًا إلى تعيين `scan_models_on_startup: true` لتسجيل نماذجك عند بدء التشغيل.
+:::
+
+## الإعداد الأولي
+
+
+ 1. راجع متطلبات النظام.
+
+
+
+ 2. انسخ (Fork) واستنسخ (Clone) مستودع InvokeAI git.
+
+
+ نسخ المستودع
+
+
+ بعد ذلك، استنسخ المستودع المنسوخ إلى جهازك المحلي. يمكنك استخدام HTTPS أو SSH، حسب إعدادات git الخاصة بك.
+
+ 3. يستخدم هذا المستودع Git LFS لإدارة الملفات الكبيرة. لضمان تنزيل جميع الأصول:
+ - ثبّت git-lfs → [تنزيل من هنا](https://git-lfs.com/)
+ - فعّل الجلب التلقائي لـ LFS لهذا المستودع:
+ ```shell
+ git config lfs.fetchinclude "*"
+ ```
+ - جلب الملفات من LFS (يتم ذلك مرة واحدة فقط؛ عمليات `git pull` اللاحقة ستجلب التغييرات تلقائيًا):
+ ```shell
+ git lfs pull
+ ```
+ 4. أنشئ دليلًا لبيانات المستخدم (الصور، النماذج، قاعدة البيانات، إلخ). يكون هذا عادةً في `~/invokeai`، ولكن إذا كان لديك بالفعل تثبيت غير تطويري، فقد ترغب في إنشاء دليل منفصل للتثبيت التطويري.
+ 5. اتبع دليل [التثبيت اليدوي](/start-here/manual/)، مع بعض التعديلات على أمر التثبيت:
+
+ - استخدم `.` بدلاً من `invokeai` للتثبيت من الدليل الحالي. لا تحتاج إلى تحديد الإصدار.
+ - استخدم `uv sync` بدلاً من `uv pip install` لمزامنة البيئة من ملف قفل المستودع.
+ - يتم تثبيت المشروع الحالي كتثبيت قابل للتعديل افتراضيًا. هذا يعني أن تغييراتك على كود بايثون ستنعكس عند إعادة تشغيل خادم Invoke.
+ - أضف خيارات الحزمة `dev` و `test` و `docs` و GPU المناسبة باستخدام `--extra`. قد تحتاج أو لا تحتاج إلى خيار `xformers` - اتبع دليل التثبيت اليدوي لمعرفة ذلك.
+
+ مع إجراء التعديلات، يجب أن يبدو أمر المزامنة شيئًا كهذا:
+
+ ```sh
+ uv sync --frozen \
+ --python 3.12 \
+ --managed-python \
+ --extra dev \
+ --extra test \
+ --extra docs \
+ --extra cuda \
+ --extra xformers
+ ```
+ 6. في هذه المرحلة، يجب أن يكون Invoke مثبتًا، وتم إعداد وتفعيل البيئة الافتراضية، والخادم قيد التشغيل. ولكن ستظهر رسالة تحذير في الطرفية تفيد بعدم العثور على واجهة المستخدم. إذا ذهبت إلى رابط الخادم، لن تحصل على واجهة المستخدم.
+
+ هذا لأن بناء واجهة المستخدم لا يتم توزيعه مع الكود المصدري. تحتاج إلى بنائه يدويًا. أنهِ تشغيل الخادم الحالي.
+
+ *(إذا كنت ترغب فقط في تحرير الوثائق، يمكنك التوقف هنا والانتقال إلى قسم **الوثائق** أدناه.)*
+
+ 7. ثبّت مجموعة أدوات تطوير الواجهة الأمامية، مع الانتباه إلى الإصدارات:
+
+ - [`nodejs`](https://nodejs.org/) (تم اختباره على LTS، v22)
+ - [`pnpm`](https://pnpm.io/installation) (تم اختباره على v10)
+
+ 8. قم ببناء إنتاجي للواجهة الأمامية:
+
+ ```sh
+ cd /invokeai/frontend/web
+ pnpm i
+ pnpm build
+ ```
+
+ 9. أعد تشغيل الخادم وانتقل إلى الرابط. يجب أن تحصل على واجهة المستخدم. بعد إجراء تغييرات على كود بايثون، أعد تشغيل الخادم لرؤية تلك التغييرات.
+
+
+## تطوير الواجهة الخلفية
+
+تجربة التغييرات على كود بايثون المصدر تكون مملة إذا كان عليك إعادة تشغيل الخادم وإعادة تحميل نماذج بحجم غيغابايت متعددة بعد كل تغيير.
+
+لسير عمل تطوير أسرع، أضف العلامة `--dev_reload` عند تشغيل الخادم. سيقوم الخادم بمراقبة التغييرات على جميع ملفات بايثون في دليل `invokeai` وتطبيق تلك التغييرات على الخادم الجاري أثناء العمل.
+
+سيسمح لك هذا بتجنب إعادة تشغيل الخادم (وإعادة تحميل النماذج) في معظم الحالات، ولكن هناك بعض المحاذير؛ راجع [وثائق jurigged](https://github.com/breuleux/jurigged#caveats) للتفاصيل.
+
+### الاختبارات
+
+تتطلب اختبارات الواجهة الخلفية مجموعة تبعيات `test`، والتي قمت بتثبيتها أثناء الإعداد الأولي.
+
+راجع وثائق [الاختبارات](../tests) للحصول على معلومات حول تشغيل الاختبارات وكتابتها.
+
+## تطوير الواجهة الأمامية
+
+ستحتاج إلى تشغيل `pnpm build` في كل مرة تسحب فيها تغييرات جديدة إلى الواجهة الأمامية.
+
+خيار آخر هو تخطي البناء وتشغيل واجهة المستخدم في وضع التطوير بدلاً من ذلك:
+
+```sh
+cd invokeai/frontend/web
+pnpm dev
+```
+
+يبدأ هذا خادم تطوير vite لواجهة المستخدم على `127.0.0.1:5173`، والذي ستستخدمه بدلاً من `127.0.0.1:9090`.
+
+وضع التطوير أبطأ بشكل ملحوظ من البناء الإنتاجي ولكنه قد يكون أكثر ملاءمة إذا كنت تحتاج فقط إلى اختبار الأشياء. سيقوم بإعادة التحميل الساخن لواجهة المستخدم أثناء إجراء تغييرات على كود الواجهة الأمامية. في بعض الأحيان لا تعمل إعادة التحميل الساخن، وتحتاج إلى تحديث علامة تبويب المتصفح يدويًا.
+
+## الوثائق
+
+تم بناء هذه الوثائق على [Astro Starlight](https://starlight.astro.build/). إنها توفر بيئة تطوير ممتعة لكتابة وثائق جذابة، وهي مبنية على أعلى مولد المواقع الثابتة Astro، الذي يوفر إطار عمل قوي ومرن لبناء مواقع سريعة وحديثة.
+
+للمساهمة في الوثائق، ببساطة قم بتحرير ملفات markdown في دليل `./docs`. يمكنك تشغيل خادم تطوير محلي مع إعادة التحميل الساخن للتغييرات التي تجريها على الوثائق.
+
+
+ - **docs**
+ - public/
+ - src
+ - content docs content lives here
+ - docs
+ - lib
+ - components/
+ - utils/
+ - content.config.ts
+ - scripts/
+ - tests/
+ - invokeai/
+ - docker/
+ - coverage/
+
+
+
+ 1. انتقل إلى دليل `docs` وقم بتثبيت التبعيات:
+
+ ```sh
+ cd docs
+ pnpm install
+ ```
+ 2. ابدأ خادم التطوير:
+
+ ```sh
+ pnpm run dev
+ ```
+
+
+## إعداد VSCode
+
+يقدم VSCode أدوات ممتازة لتطوير InvokeAI، بما في ذلك مصحح أخطاء بايثون، وتفعيل البيئة الافتراضية تلقائيًا، وإمكانيات التطوير عن بُعد.
+
+### المتطلبات الأساسية
+
+أولاً، تأكد من تثبيت الإضافات التالية:
+- [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)
+- [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)
+
+يوصى أيضًا بشدة بتثبيت إضافات Jupyter إذا كنت تخطط للعمل مع الدفاتر:
+- [Jupyter](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter)
+- [Jupyter Cell Tags](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vscode-jupyter-cell-tags)
+- [Jupyter Notebook Renderers](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter-renderers)
+- [Jupyter Slide Show](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vscode-jupyter-slideshow)
+
+### الإعدادات
+
+
+
+ يُوصى بشدة بإنشاء مساحة عمل VSCode للعمل على InvokeAI لحفظ الإعدادات والتكوينات الخاصة بـ InvokeAI.
+
+ 1. افتح دليل مستودع InvokeAI في VSCode
+ 2. اذهب إلى `File` > `Save Workspace As` واحفظها *خارج* المستودع
+
+ **مفسر بايثون الافتراضي**
+
+ لتفعيل البيئة الافتراضية تلقائيًا:
+ 1. افتح لوحة الأوامر (`Ctrl+Shift+P` / `Cmd+Shift+P`) وشغّل `Preferences: Open Workspace Settings (JSON)`
+ 2. أضف `python.defaultInterpreterPath` إلى إعداداتك، مشيرًا إلى ملف بايثون القابل للتنفيذ في بيئتك الافتراضية:
+
+ ```jsonc
+ {
+ "folders": [
+ { "path": "InvokeAI" },
+ { "path": "/path/to/invokeai_root" }
+ ],
+ "settings": {
+ "python.defaultInterpreterPath": "/path/to/invokeai_root/.venv/bin/python"
+ }
+ }
+ ```
+ الآن، فتح الطرفية المدمجة أو تشغيل بايثون سيستخدم تلقائيًا بيئة InvokeAI الافتراضية الخاصة بك.
+
+
+
+ نستخدم نظام الأنواع في بايثون في InvokeAI. ستتضمن مراجعات طلبات السحب التحقق من وجود الأنواع وصحتها.
+
+ يوفر Pylance التحقق من الأنواع في المحرر. لتفعيله:
+
+ 1. افتح ملف بايثون
+ 2. انظر على طول شريط الحالة في VSCode للعثور على `{ } Python`
+ 3. انقر على `{ }`
+ 4. شغّل التحقق من الأنواع (Basic كافٍ)
+
+ سترى الآن خطوطًا متعرجة حمراء حيث يتم اكتشاف مشكلات في الأنواع. حرّك مؤشرك فوق الرموز المشار إليها لترى ما هو الخطأ.
+
+
+
+ تتم إدارة إعدادات التصحيح في ملف `launch.json`. اتبع [الدليل الرسمي](https://code.visualstudio.com/docs/python/debugging) لإعداد ملف `launch.json` الخاص بك وتجربته.
+
+ أضف تكوينات تصحيح InvokeAI هذه إلى ملف `launch.json` الخاص بك:
+
+ ```jsonc
+ {
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "InvokeAI Web",
+ "type": "python",
+ "request": "launch",
+ "program": "scripts/invokeai-web.py",
+ "args": [
+ "--root", "/path/to/invokeai_root",
+ "--host", "0.0.0.0"
+ ],
+ "justMyCode": true
+ },
+ {
+ "name": "InvokeAI CLI",
+ "type": "python",
+ "request": "launch",
+ "program": "scripts/invokeai-cli.py",
+ "justMyCode": true
+ },
+ {
+ "name": "InvokeAI Test",
+ "type": "python",
+ "request": "launch",
+ "module": "pytest",
+ "args": ["--capture=no"],
+ "justMyCode": true
+ },
+ {
+ "name": "InvokeAI Single Test",
+ "type": "python",
+ "request": "launch",
+ "module": "pytest",
+ "args": ["tests/nodes/test_invoker.py"],
+ "justMyCode": true
+ }
+ ]
+ }
+ ```
+
+
+
+ يوفر هذا تجربة سلسة لتشغيل الواجهة الخلفية على جهاز Linux قوي أثناء التطوير على جهاز آخر.
+
+ استشر [الدليل الرسمي](https://code.visualstudio.com/docs/remote/remote-overview) لإعداده. نقترح استخدام مزامنة الإعدادات المضمنة في VSCode بحيث يكون لدى مضيف التطوير عن بُعد الخاص بك نفس إعدادات التطبيق والإضافات تلقائيًا.
+
+ :::tip[إعادة توجيه المنافذ]
+ قد تكون إعادة توجيه المنافذ التلقائية غير مستقرة. يمكنك تعطيلها في `Preferences: Open Remote Settings (ssh: hostname)` عن طريق إلغاء تحديد `remote.autoForwardPorts`.
+
+ لإعادة توجيه المنافذ بشكل موثوق، استخدم SSH على عميل التطوير عن بُعد:
+ ```bash
+ ssh -L 9090:localhost:9090 -L 5173:localhost:5173 user@remote-dev-host
+ ```
+ قم بتشغيل هذا خارج الطرفية المدمجة في VSCode ليستمر عبر عمليات إعادة تشغيل VSCode.
+ :::
+
+
diff --git a/docs/src/content/docs/ar/development/index.mdx b/docs/src/content/docs/ar/development/index.mdx
new file mode 100644
index 00000000000..722e6e44434
--- /dev/null
+++ b/docs/src/content/docs/ar/development/index.mdx
@@ -0,0 +1,48 @@
+---
+title: تطوير InvokeAI
+sidebar:
+ order: 1
+lastUpdated: 2026-02-19
+---
+
+import { Card, CardGrid, LinkButton } from '@astrojs/starlight/components';
+
+هذا القسم من الوثائق مخصص للمطورين المهتمين بالمساهمة في قاعدة كود InvokeAI، أو البناء فوقها. يتضمن أدلة لإعداد بيئة التطوير الخاصة بك، وفهم هيكل المشروع، وتقديم مساهمتك الأولى.
+
+
+
+ إرشادات لإعداد بيئة التطوير المحلية الخاصة بك، بما في ذلك كيفية تشغيل المشروع محليًا وكيفية إعداد أدواتك.
+
+
+ اعرف المزيد
+
+
+
+ مقدمة إلى قاعدة كود الواجهة الأمامية، بما في ذلك التقنيات المستخدمة وكيفية البدء.
+
+
+ اعرف المزيد
+
+
+
+ مجموعة من الأدلة لمهام التطوير الشائعة، مثل إضافة بنى نموذجية جديدة، وإجراء الاختبارات، وأكثر من ذلك.
+
+
+ اعرف المزيد
+
+
+
+ نظرة عامة على بنية InvokeAI، بما في ذلك المكونات الرئيسية وكيفية تفاعلها.
+
+
+ اعرف المزيد
+
+
+
+ نظرة عامة على عمليات التطوير التي نتبعها، بما في ذلك سياسة دمج طلبات السحب وعملية الإصدار.
+
+
+ اعرف المزيد
+
+
+
diff --git a/docs/src/content/docs/ar/features/Canvas/canvas-projects.mdx b/docs/src/content/docs/ar/features/Canvas/canvas-projects.mdx
new file mode 100644
index 00000000000..56e00b13327
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Canvas/canvas-projects.mdx
@@ -0,0 +1,60 @@
+---
+title: مشاريع اللوحة
+sidebar:
+ badge: جديد
+ order: 7
+---
+
+import { Steps } from '@astrojs/starlight/components';
+
+مشاريع اللوحة تتيح لك حفظ الحالة الكاملة للوحة — بما في ذلك جميع الطبقات والأقنعة والصور المرجعية ومعلمات التوليد و LoRAs — في ملف `.invk` واحد يمكنك إعادة فتحه لاحقًا أو مشاركته مع شخص آخر.
+
+ملفات `.invk` هي أرشيفات ZIP. عندما يمكن جلب الصور المحفوظة بنجاح من الخادم، فإنها تدمج بايتات الصورة الفعلية لكل طبقة وكل صورة مرجعية، لذلك يكون المشروع مكتفيًا ذاتيًا: فتحه على جهاز آخر أو بعد مسح المعرض يمكنه استعادة تلك الصور.
+
+## حفظ مشروع
+
+
+1. افتح اللوحة ورتب طبقاتك وأقنعتك وصورك المرجعية ومعلماتك بالطريقة التي تريدها.
+2. افتح قائمة الأرشيف في شريط أدوات اللوحة، أو افتح قائمة سياق اللوحة واختر **مشروع**.
+3. اختر **حفظ مشروع اللوحة**.
+4. يمكنك إعادة تسمية المشروع (الاسم الافتراضي هو **مشروع اللوحة**).
+5. احفظ ملف `.invk` على القرص.
+
+
+ما يتم حفظه:
+
+- جميع الطبقات النقطية والطلاء الداخلي والتحكم، مع بيانات صورها وتحويلاتها وعتامة وحالة القفل.
+- جميع الأقنعة.
+- الصور المرجعية.
+- معلمات التوليد المهيأة حاليًا (النموذج، المطالبات، الجدول، البذرة، الأبعاد، إلخ).
+- LoRAs وأوزانها.
+
+## تحميل مشروع
+
+
+1. افتح قائمة الأرشيف في شريط أدوات اللوحة، أو افتح قائمة سياق اللوحة واختر **مشروع**.
+2. اختر **تحميل مشروع اللوحة**.
+3. اختر ملف `.invk`.
+
+
+عند تحميل مشروع، يتم استبدال اللوحة بحالة المشروع. يتم إعادة تعيين LoRAs أولاً، ثم إعادة تطبيقها من المشروع، لذلك فتح مشروع لا يترك أبدًا LoRAs قديمة من جلستك السابقة ملحقة.
+
+### إلغاء تكرار الصور
+
+تحميل مشروع **لا** يعيد رفع كل صورة مضمنة بشكل أعمى. يقوم Invoke بمقارنة كل صورة مضمنة بما هو موجود بالفعل في معرضك ويقوم فقط برفع الصور المفقودة. إعادة فتح نفس المشروع مرة ثانية، أو فتحه بعد وقت قصير من حفظه، سريع جدًا — معظم أو كل الصور ستكون موجودة بالفعل على الخادم.
+
+هذا يعني أيضًا أن مشروعًا مشاركًا مع مستخدم آخر سيرفع صوره المضمنة المفقودة في المرة الأولى التي يتم فتحه فيها على جهاز ذلك المستخدم، ثم يصبح مجانيًا تقريبًا لإعادة الفتح بعد ذلك.
+
+للحفاظ على استجابة المعرض أثناء الاستيرادات الكبيرة، يتم تقييد جلب الصور ورفعها بعدد صغير من الطلبات المتزامنة.
+
+## ما لا يحفظه `.invk`
+
+ملف `.invk` هو لقطة لحالة اللوحة. لا يحتوي على:
+
+- النماذج أو LoRAs أو التضمينات نفسها — فقط مراجع لها. إذا شاركت مشروعًا، يحتاج المستلم إلى نفس النماذج المثبتة (أو بدائل متوافقة).
+- حالة محرر مهام سير العمل (استخدم **حفظ مهمة سير العمل** في محرر مهام سير العمل لذلك).
+- لوحات المعرض أو الصور خارج اللوحة.
+
+## مشاركة المشاريع
+
+ملفات `.invk` آمنة للمشاركة المباشرة. يقوم المستلم بتحميل الملف من قائمة أرشيف شريط أدوات اللوحة أو قائمة سياق اللوحة. سيحتاج إلى أي نماذج/LoRAs مرجعية مثبتة محليًا؛ إذا كان نموذج مرجعي مفقودًا، سيكون حقل المعلمة فارغًا ويمكنه اختيار بديل قبل التوليد.
diff --git a/docs/src/content/docs/ar/features/Canvas/gradient-tool.mdx b/docs/src/content/docs/ar/features/Canvas/gradient-tool.mdx
new file mode 100644
index 00000000000..e905fff1520
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Canvas/gradient-tool.mdx
@@ -0,0 +1,71 @@
+---
+title: أداة التدرج
+description: تعلم كيفية رسم تدرجات خطية وشعاعية على الطبقات النقطية للوحة.
+lastUpdated: 2026-05-16
+sidebar:
+ order: 4
+---
+
+import { Card, CardGrid } from '@astrojs/starlight/components';
+
+أداة التدرج ترسم انتقالًا سلسًا بين ألوان المقدمة والخلفية الحالية على اللوحة.
+
+يمكنك تفعيل أداة التدرج من شريط أدوات اللوحة.
+
+## أين يرسم التدرج
+
+يرسم التدرج فقط في **الطبقة النقطية النشطة**:
+
+- لا يرسم في أقنعة الطلاء الداخلي.
+- لا يرسم في أنواع الطبقات غير النقطية الأخرى.
+- يتم دائمًا قص النتيجة إلى **مربع التوليد الحالي**.
+
+إذا لم يتم تحديد طبقة نقطية، تكون الأداة غير متاحة.
+
+## السلوك المشترك
+
+- انقر واسحب لتحديد التدرج.
+- حرر المؤشر لتأكيد التدرج.
+- اضغط على Esc لتجاهل التدرج الجاري.
+- اضغط مع الاستمرار على Alt للتبديل مؤقتًا إلى قطارة الألوان.
+- اضغط مع الاستمرار على Space للتبديل مؤقتًا إلى التنقل.
+
+تستخدم أداة التدرج **زوج الألوان الأمامي/الخلفي** الحالي:
+
+- عينة اللون **النشط** تصبح لون البداية.
+- عينة اللون **غير النشط** تصبح لون النهاية.
+
+## أوضاع التدرج
+
+
+
+ انقر واسحب لتحديد اتجاه التدرج. يحدد السحب الانتقال من لون البداية إلى لون النهاية.
+
+
+ انقر لوضع المركز، ثم اسحب للخارج لتحديد نصف القطر. يتلاشى التدرج من لون البداية في المركز إلى لون النهاية نحو الخارج.
+
+
+
+## قص التدرج
+
+يشمل شريط الأدوات مفتاح **قص التدرج**:
+
+- **مفعل:** يحد التدرج إلى المنطقة المسحوبة.
+- **معطل:** يسمح للتدرج بالامتداد عبر مربع التوليد الحالي بالكامل.
+
+عمليًا:
+
+- التدرج **الخطي** المقصور يقتصر على المدى الذي سحبته.
+- التدرج **الشعاعي** المقصور يقتصر على الدائرة التي سحبتها.
+- مع تعطيل القص، يمكن استخدام كلا الوضعين لطلاء مربع التوليد بالكامل بتدرج كامل.
+
+## أمثلة عملية
+
+- استخدم **خطي** لتدرجات السماء، ومنحدرات الظل، والإضاءة الاتجاهية الواسعة.
+- استخدم **شعاعي** للتظليل، والتوهجات، والأضواء الكاشفة، والتلاشي الناعم حول نقطة محورية.
+- عطل **قص التدرج** عندما تريد انتقال لوني عبر مربع التوليد بالكامل.
+- أبقِ **قص التدرج** مفعلًا عندما تريد فقط التأثير على منطقة موضعية.
+
+## ملخص
+
+أداة التدرج هي أداة لوحة مخصصة للنقطيات فقط لرسم انتقالات لونية خطية وشعاعية. استخدمها عندما تريد مزجًا ناعمًا بين ألوان المقدمة والخلفية، واستخدم **قص التدرج** لتقرير ما إذا كان التأثير يبقى محليًا أو يملأ مربع التوليد بالكامل.
diff --git a/docs/src/content/docs/ar/features/Canvas/lasso-tool.mdx b/docs/src/content/docs/ar/features/Canvas/lasso-tool.mdx
new file mode 100644
index 00000000000..0e466e2369e
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Canvas/lasso-tool.mdx
@@ -0,0 +1,68 @@
+---
+title: أداة اللاسو
+description: تعلم كيفية إنشاء وتحسين أقنعة الطلاء الداخلي باستخدام أداة اللاسو.
+lastUpdated: 2026-05-15
+sidebar:
+ order: 2
+---
+
+import { Card, CardGrid } from '@astrojs/starlight/components';
+
+أداة اللاسو هي أداة القناع المخصصة للوحة. ترسم دائمًا في **طبقات قناع الطلاء الداخلي** وهي مصممة لتحديد المناطق غير المنتظمة بسرعة للطلاء الداخلي.
+
+يمكنك تفعيل أداة اللاسو من شريط أدوات اللوحة أو باستخدام المفتاح الافتراضي L.
+
+## أين يرسم اللاسو
+
+يستهدف اللاسو دائمًا **قناع طلاء داخلي مفعل**:
+
+- إذا كان قناع طلاء داخلي مفعل محددًا حاليًا، يرسم اللاسو في ذلك القناع.
+- إذا لم يكن هناك قناع طلاء داخلي مفعل متاح، يقوم اللاسو بإنشاء قناع طلاء داخلي جديد تلقائيًا ويؤكد المحيط هناك.
+
+:::ملاحظة
+إذا تم تحديد قناع طلاء داخلي معطل، لا يرسم اللاسو في القناع المعطل. إنه ينشئ قناعًا مفعلًا جديدًا للمحيط التالي بدلاً من ذلك.
+:::
+
+## السلوك المشترك
+
+- يلتزم اللاسو دائمًا بـ **محيط مغلق**.
+- اضغط مع الاستمرار على Ctrl في ويندوز/لينكس أو Cmd في ماك للتبديل إلى وضع **الطرح** وإزالة مساحة من القناع بدلاً من إضافتها.
+- اضغط على Esc لإلغاء جلسة اللاسو الحالية.
+- اضغط مع الاستمرار على Space أثناء جلسة نشطة لتحريك منفذ العرض دون تجاهل المحيط غير المكتمل.
+
+## أوضاع اللاسو
+
+
+
+ انقر واسحب لرسم محيط غير منتظم. تحرير المؤشر يغلق المحيط ويؤكده تلقائيًا.
+
+
+ انقر لوضع الرؤوس. انقر على النقطة الأولى لإغلاق المحيط وتأكيده. اضغط مع الاستمرار على Shift أثناء وضع الحافة التالية لتثبيتها عند الزوايا الأفقية والرأسية و45 درجة.
+
+
+
+## التحريك والتنقل أثناء الرسم
+
+تستخدم أداة اللاسو Space للتنقل في كلا الوضعين:
+
+- **رسم حر:** أثناء الرسم، اضغط مع الاستمرار على Space لتحريك منفذ العرض دون تجاهل المحيط غير المكتمل. حرر Space لمواصلة الرسم.
+- **مضلع:** أثناء جلسة مضلع نشطة، اضغط مع الاستمرار على Space لتحريك منفذ العرض دون تجاهل المحيط غير المكتمل. حرر Space واستمر في وضع النقاط.
+
+هذا مفيد بشكل خاص عند رسم مناطق قناع كبيرة تمتد خارج منفذ العرض الحالي.
+
+## العمل مع الأقنعة
+
+- استخدم **رسم حر** للأشكال العضوية مثل الشعر، الدخان، أوراق الشجر، القماش، والتحديد السريع.
+- استخدم **مضلع** عندما تحتاج إلى حواف مستقيمة ووضع زوايا متعمد.
+- استخدم **وضع الطرح** لقص أو عمل ثقوب في قناع طلاء داخلي موجود.
+- استخدم اللاسو عندما تريد سلوك تحرير يعتمد على القناع أولاً دون إنشاء طبقة قناع يدويًا أولاً.
+
+## ملاحظات عملية
+
+- وضع المضلع يظهر نقطة البداية حتى تتمكن من إغلاق المحيط بدقة.
+- بعد ثلاث نقاط مضلع على الأقل، الاقتراب من نقطة البداية يسمح لك بالنقر عليها لإنهاء الشكل.
+- الرسم الحر أسرع للصور الظلية الفضفاضة. المضلع أفضل عندما يكون وضع الحواف مهمًا.
+
+## ملخص
+
+أداة اللاسو هي أسرع طريقة لإنشاء وتحسين أقنعة الطلاء الداخلي على اللوحة. استخدم الرسم الحر للمناطق العضوية، والمضلع للحواف الصلبة، واضغط مع الاستمرار على Ctrl/Cmd عندما تحتاج إلى الطرح من القناع بدلاً من الإضافة إليه.
diff --git a/docs/src/content/docs/ar/features/Canvas/layers-and-drops.mdx b/docs/src/content/docs/ar/features/Canvas/layers-and-drops.mdx
new file mode 100644
index 00000000000..06f94db2afa
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Canvas/layers-and-drops.mdx
@@ -0,0 +1,35 @@
+---
+title: نصائح الطبقات
+sidebar:
+ order: 6
+---
+
+بعض السلوكيات المتعلقة بالطبقات التي ليست واضحة من واجهة اللوحة وحدها.
+
+## أهداف السحب والإفلات
+
+سحب صورة إلى اللوحة يكشف عن **خمس** مناطق إفلات، مرتبة كمنطقتين في الأعلى وثلاث في الأسفل:
+
+| الصف العلوي | |
+| :--- | :--- |
+| **طبقة نقطية جديدة** | إنشاء طبقة نقطية عادية من الصورة المسحوبة. |
+| **طبقة تحكم جديدة** | إنشاء طبقة تحكم من الصورة المسحوبة. |
+
+| الصف السفلي | |
+| :--- | :--- |
+| **مرجع إقليمي جديد** | استخدام الصورة كمرجع إقليمي. |
+| **قناع طلاء داخلي جديد** | إنشاء طبقة قناع طلاء داخلي جديدة باستخدام الصورة كمصدر القناع. |
+| **طبقة تحكم بحجم جديد** | إنشاء طبقة تحكم بحجم يتناسب مع أبعاد اللوحة الحالية. |
+
+يمكنك الإفلات من المعرض، أو من القرص، أو من أي لوحة تعرض صورة قابلة للسحب.
+
+## قفل الشفافية على الطبقات النقطية
+
+كل طبقة نقطية تحتوي على مفتاح **قفل الشفافية** (أيقونة القطرة) في رأس الطبقة. عند التفعيل، تؤثر ضربات الفرشاة فقط على البكسلات غير الشفافة الموجودة — الرسم فوق المناطق الشفافة لا يفعل شيئًا. يتصرف هذا مثل "قفل البكسلات الشفافة" في فوتوشوب.
+
+الاستخدامات النموذجية:
+
+- **إعادة تلوين شكل موجود** دون تسرب الطلاء إلى المساحة الفارغة حوله.
+- **تحسين التفاصيل على موضوع** تم رسمه على طبقة شفافة، دون خطر توسيع صورته الظلية.
+
+قم بإيقاف تشغيله لاستئناف الرسم العادي. القفل لكل طبقة، لذا يمكن قفل أو فتح طبقات مختلفة بشكل مستقل. إدخال القلم الحساس للضغط والتراجع/الإعادة يحترمان القفل.
diff --git a/docs/src/content/docs/ar/features/Canvas/run-workflow.mdx b/docs/src/content/docs/ar/features/Canvas/run-workflow.mdx
new file mode 100644
index 00000000000..a4e8a9aba8b
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Canvas/run-workflow.mdx
@@ -0,0 +1,70 @@
+---
+title: تشغيل مهمة سير العمل على اللوحة
+sidebar:
+ order: 5
+---
+
+import { Steps } from '@astrojs/starlight/components';
+
+يمكنك تشغيل أي مهمة سير عمل ضد طبقة نقطية مباشرة من اللوحة. يتم تمرير الطبقة المحددة كإدخال صورة لمهمة سير العمل، وتهبط النتائج في منطقة التدريج على اللوحة حيث يمكنك مراجعتها وقبولها — دون مغادرة علامة تبويب اللوحة.
+
+## متطلبات مهمة سير العمل
+
+لكي تكون مهمة سير العمل متاحة من اللوحة، يجب أن تستوفي ثلاثة شروط:
+
+1. **مُنشئ النموذج مفعل.** يتم عرض معلمات مهمة سير العمل من خلال واجهة منشئ النموذج عند تشغيل مهمة سير العمل من اللوحة، لذلك تحتاج مهمة سير العمل إلى نموذج مهيأ.
+2. **حقل إدخال صورة واحد على الأقل.** يتم تمرير الطبقة التي تنقر عليها بزر الفأرة الأيمن إلى أول حقل صورة مؤهل كمدخل لمهمة سير العمل.
+3. **عقدة `مخرج اللوحة` واحدة على الأقل.** هذه هي العقدة التي تحدد أي الصور يجب إعادة توجيهها إلى منطقة تدريج اللوحة.
+
+يتم تصفية مهام سير العمل التي لا تستوفي الشروط الثلاثة من محدد مهام سير العمل على اللوحة.
+
+## عقدة `مخرج اللوحة`
+
+`مخرج اللوحة` هي عقدة مهام سير عمل مخصصة تحدد بوضوح الصور التي تريد عرضها في منطقة تدريج اللوحة. أضفها في نهاية أي فرع يجب أن يظهر مخرجاته على اللوحة.
+
+يمكن أن تتضمن مهمة سير العمل **عُقد `مخرج اللوحة` متعددة**. تصبح كل واحدة منها إدخالًا خاصًا بها في منطقة التدريج، مع صورة مصغرة قابلة للتحديد بشكل فردي. يمكنك التنقل بين الإدخالات باستخدام مفاتيح الأسهم وقبول واحد منها فقط على اللوحة.
+
+:::ملاحظة[لماذا عقدة صريحة؟]
+الإصدارات السابقة كانت تكتشف صور المخرجات بطريقة إرشادية (عن طريق المسح بحثًا عن حقول `board`). كان ذلك هشًا وتسبب في اعتبار عقد غير ذات صلة — على سبيل المثال، `save_image` — كمخرجات لوحة خطأً. `مخرج اللوحة` يجعل التوجيه مقصودًا.
+:::
+
+## تشغيل مهمة سير العمل
+
+
+1. على اللوحة، **انقر بزر الفأرة الأيمن على طبقة نقطية** لفتح قائمة السياق الخاصة بها.
+2. اختر **تشغيل مهمة سير العمل**.
+3. اختر مهمة سير عمل من القائمة. تظهر فقط مهام سير العمل التي تستوفي [المتطلبات](#متطلبات-مهمة-سير-العمل) هنا.
+4. اضبط أي معلمات مكشوفة في النموذج. جميع أنواع حقول النموذج مدعومة: نص، أرقام، قيم منطقية، تعدادات، جدولة، لوحات، نماذج، وصور.
+5. انقر على **تشغيل**. يتم وضع مهمة سير العمل في قائمة الانتظار وتتدفق النتائج إلى منطقة التدريج فور اكتمالها.
+
+
+يتم تمرير الطبقة الحالية تلقائيًا إلى إدخال الصورة لمهمة سير العمل — لست بحاجة إلى تحديد صورة يدويًا.
+
+## مراجعة النتائج وقبولها
+
+تظهر النتائج في شريط منطقة تدريج اللوحة في أسفل اللوحة:
+
+- إذا كانت مهمة سير العمل تحتوي على `مخرج لوحة` واحد، تحصل على صورة مصغرة واحدة لكل تشغيل.
+- إذا كانت تحتوي على عُقد `مخرج لوحة` متعددة، ينتج كل تشغيل صورًا مصغرة متعددة، واحدة لكل عقدة مخرج.
+- استخدم عناصر التحكم التالي/السابق في منطقة التدريج (أو مفاتيح الأسهم) للتنقل بين الإدخالات. يلتف التنقل عبر حدود التشغيل.
+- انقر على **قبول** لتأكيد الإدخال المحدد حاليًا على اللوحة. يتم تأكيد تلك الصورة الواحدة فقط — تبقى الصور الشقيقة في منطقة التدريج حتى تقبلها أو تتجاهلها.
+
+## استكشاف الأخطاء وإصلاحها
+
+### مهمة سير العمل الخاصة بي لا تظهر في المحدد
+
+تحقق، بالترتيب:
+
+- أن مهمة سير العمل لديها منشئ النموذج مفعلًا.
+- أن مهمة سير العمل تحتوي على حقل إدخال صورة واحد على الأقل.
+- أن مهمة سير العمل تحتوي على عقدة `مخرج لوحة` واحدة على الأقل.
+
+إذا كان أي من هذه مفقودًا، يتم إخفاء مهمة سير العمل.
+
+### فشل وضعها في قائمة الانتظار مع خطأ التحقق من صحة "BoardField"
+
+هذه مشكلة معروفة مع مهام سير العمل التي تجمع بين عقد `save_image` و`canvas_output`. تم إصلاحها — قم بتحديث Invoke وحاول مرة أخرى.
+
+### أخطاء أثناء التنفيذ
+
+تظهر أخطاء مهام سير العمل كإشعارات منبثقة ويتم تنظيف منطقة التدريج بحيث تعود إلى حالة قابلة للاستخدام. افتح لوحة قائمة الانتظار للحصول على رسالة الخطأ الكاملة.
diff --git a/docs/src/content/docs/ar/features/Canvas/shapes-tool.mdx b/docs/src/content/docs/ar/features/Canvas/shapes-tool.mdx
new file mode 100644
index 00000000000..a3f7c958da0
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Canvas/shapes-tool.mdx
@@ -0,0 +1,87 @@
+---
+title: أداة الأشكال
+description: تعلم كيفية رسم أشكال مملوءة على الطبقات النقطية وطبقات قناع الطلاء الداخلي باستخدام أداة الأشكال.
+lastUpdated: 2026-05-11
+sidebar:
+ order: 1
+---
+
+import { Card, CardGrid } from '@astrojs/starlight/components';
+
+أداة الأشكال هي أداة رسم أشكال مملوءة للأغراض العامة على اللوحة. تحل محل أداة المستطيل القديمة وتضيف أربعة أوضاع شكل تحت زر شريط أدوات واحد:
+
+- **مستطيل**
+- **بيضاوي**
+- **مضلع**
+- **رسم حر**
+
+يمكنك تفعيل أداة الأشكال من شريط أدوات اللوحة أو باستخدام المفتاح الافتراضي U.
+
+## أين ترسم الأشكال
+
+ترسم الأشكال دائمًا على **الهدف النقطي النشط**:
+
+- على طبقة نقطية عادية، تضيف الأشكال بكسلًا مملوءًا إلى تلك الطبقة.
+- على طبقة قناع طلاء داخلي نشطة، ترسم الأشكال مباشرة في القناع.
+
+:::ملاحظة
+تتداخل الأشكال مع بعض مهام سير عمل اللاسو على طبقات القناع، لكن الأدوات ليست متطابقة. لا يزال اللاسو أداة القناع الأكثر تخصصًا ويمكنه إنشاء طبقة قناع جديدة تلقائيًا عند عدم وجود واحدة. راجع [دليل أداة اللاسو](./lasso-tool/) للسلوك الخاص بالقناع.
+:::
+
+## السلوك المشترك
+
+- تعرض الأشكال معاينة حية أثناء الرسم.
+- لون التعبئة يستخدم اللون النشط الحالي.
+- على طبقة نقطية، يتم احترام شفافية اللون النشط عند إضافة البكسل.
+- اضغط مع الاستمرار على Ctrl في ويندوز/لينكس أو Cmd في ماك للتبديل إلى وضع **الطرح** وقص البكسل من الطبقة النشطة.
+- في وضع الطرح، يتم تجاهل الشفافية ويقوم الشكل بمسح البكسل بالكامل.
+- اضغط على Esc لإلغاء جلسة الشكل الحالية.
+
+:::تلميح
+عند تفعيل وضع الطرح، يظهر مؤشر اللوحة شارة ناقص صغيرة حتى تتمكن من معرفة في لمحة أن الشكل التالي سيمسح بدلاً من أن يملأ.
+:::
+
+## أوضاع الشكل
+
+
+
+ اسحب لرسم مستطيل. اضغط مع الاستمرار على Shift لتقييده بمربع. اضغط مع الاستمرار على Alt للرسم من المركز بدلاً من الزاوية.
+
+
+ اسحب لرسم قطع ناقص. اضغط مع الاستمرار على Shift لتقييده بدائرة كاملة. اضغط مع الاستمرار على Alt للرسم من المركز.
+
+
+ انقر لوضع الرؤوس. انقر على النقطة الأولى لإغلاق الشكل وتأكيده. اضغط مع الاستمرار على Shift لتثبيت الحافة المعلقة عند الزوايا الأفقية والرأسية و45 درجة.
+
+
+ انقر واسحب لرسم محيط حر مملوء. حرر المؤشر لتأكيد الشكل.
+
+
+
+## التحريك والتنقل أثناء الرسم
+
+تدعم أداة الأشكال سلوك Space مختلفًا اعتمادًا على الوضع الحالي:
+
+- **مستطيل / بيضاوي:** أثناء الضغط على المؤشر، اضغط مع الاستمرار على Space لتحريك الشكل غير المؤكد بدلاً من تغيير حجمه. حرر Space لمواصلة تغيير الحجم.
+- **مضلع / رسم حر:** اضغط مع الاستمرار على Space أثناء جلسة نشطة لتحريك منفذ العرض دون تجاهل الشكل غير المكتمل.
+
+هذا مفيد بشكل خاص عند رسم أشكال كبيرة تمتد خارج منفذ العرض الحالي.
+
+## اختيار اللون أثناء استخدام الأشكال
+
+يتصرف المفتاح Alt بشكل مختلف اعتمادًا على وضع الأشكال النشط:
+
+- **مستطيل / بيضاوي:** قبل بدء السحب، يمكن استخدام Alt للتبديل المؤقت لقطارة الألوان. بمجرد أن يصبح السحب نشطًا، يتم حجز Alt للرسم من المركز.
+- **مضلع:** يظل Alt متاحًا للتبديل المؤقت لقطارة الألوان بين وضع الرؤوس.
+- **رسم حر:** Alt متاح قبل بدء الضربة، ولكن ليس أثناء الضربة النشطة.
+
+## أمثلة عملية
+
+- استخدم **مستطيل** أو **بيضاوي** لإضافة مناطق مملوءة نظيفة بسرعة.
+- استخدم **مضلع** عندما تحتاج إلى حواف مستقيمة ووضع زوايا متعمد.
+- استخدم **رسم حر** للمناطق العضوية غير المنتظمة.
+- استخدم **وضع الطرح** لقطع ثقوب من منطقة مملوءة موجودة.
+
+## ملخص
+
+أداة الأشكال هي أسرع طريقة لإضافة مناطق هندسية أو حرة مملوءة إلى طبقات اللوحة. استخدمها للتعبئة المنظمة، وإنشاء الأقنعة، والتحرير الطرحي الدقيق دون التبديل من الهدف النقطي الحالي.
diff --git a/docs/src/content/docs/ar/features/Canvas/text-tool.mdx b/docs/src/content/docs/ar/features/Canvas/text-tool.mdx
new file mode 100644
index 00000000000..967325ad635
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Canvas/text-tool.mdx
@@ -0,0 +1,33 @@
+---
+title: أداة النص
+sidebar:
+ order: 3
+---
+
+import { LinkCard } from '@astrojs/starlight/components';
+
+## اختيار الخط
+
+تستخدم أداة النص مجموعة من حزم الخطوط المحددة مسبقًا. عند اختيار خط، يقوم التطبيق بحل أول خط متاح على نظامك من تلك الحزمة ويستخدمه لكل من تراكب المحرر والنتيجة المحولة إلى نقاط. يوفر هذا تنسيقًا متناسقًا عبر المنصات مع العودة إلى خطوط النظام الآمنة إذا كان الخط المفضل مفقودًا.
+
+## الحجم والتباعد
+
+- **الحجم** يتحكم في حجم الخط بالبكسل.
+- **التباعد** يتحكم في مضاعف ارتفاع السطر (كثيف، عادي، واسع). يؤثر هذا على المسافة بين الأسطر أثناء تحرير النص.
+
+## الحالة غير المؤكدة
+
+أثناء عدم تأكيد النص، يظل قابلًا للتحرير على اللوحة. يتم حظر الوصول إلى الأدوات الأخرى. التبديل إلى علامات تبويب أخرى (توليد، تحسين، مهام سير العمل، إلخ) يتجاهل النص. يمكن تحريك وتدوير مربع النص غير المؤكد:
+
+- **تحريك:** اضغط مع الاستمرار على Ctrl (ويندوز/لينكس) أو Command (ماك) واسحب لتحريك مربع النص.
+- **تدوير:** اسحب مقبض التدوير أعلى المربع. اضغط مع الاستمرار على **Shift** أثناء التدوير للتثبيت عند زيادات 15 درجة.
+
+يتم تأكيد النص إلى طبقة ممسوحة ضوئيًا عند الضغط على **Enter**. اضغط على **Esc** لتجاهل جلسة النص الحالية.
+
+## للمطورين
+
+
diff --git a/docs/src/content/docs/ar/features/External Models/alibabacloud.mdx b/docs/src/content/docs/ar/features/External Models/alibabacloud.mdx
new file mode 100644
index 00000000000..c79c7b1ab37
--- /dev/null
+++ b/docs/src/content/docs/ar/features/External Models/alibabacloud.mdx
@@ -0,0 +1,54 @@
+---
+title: Alibaba Cloud DashScope
+---
+
+import { Steps } from '@astrojs/starlight/components'
+
+يدعم Invoke خدمة توليد الصور **DashScope** من Alibaba Cloud، مما يعطي الوصول إلى عائلة **Qwen Image** و **Wan 2.6** لتحويل النص إلى صورة. Qwen Image قوي بشكل خاص في عرض النص ثنائي اللغة (صيني/إنجليزي).
+
+## الحصول على مفتاح API
+
+
+1. سجل الدخول إلى [Alibaba Cloud Model Studio](https://www.alibabacloud.com/en/product/modelstudio) (بوابة DashScope الدولية).
+2. فعّل **DashScope** ونشّط نماذج توليد الصور التي تخطط لاستخدامها.
+3. أنشئ مفتاح API من قسم **مفاتيح API** في وحدة التحكم.
+
+
+## الإعدادات
+
+أضف مفتاحك إلى `api_keys.yaml` في دليل Invoke الجذري:
+
+```yaml
+external_alibabacloud_api_key: "مفتاح-dashscope-api-الخاص-بك"
+
+# اختياري — الافتراضي هو نقطة النهاية الدولية. استخدم نقطة نهاية الصين إذا كان حسابك هناك:
+# https://dashscope.aliyuncs.com
+external_alibabacloud_base_url: "https://dashscope-intl.aliyuncs.com"
+```
+
+أعد تشغيل Invoke لتفعيل التغيير.
+
+:::ملاحظة[نقاط النهاية الدولية مقابل الصين]
+لدى DashScope نشر منفصل دولي (`dashscope-intl.aliyuncs.com`) وصيني (`dashscope.aliyuncs.com`). مفتاح API الخاص بك يعمل فقط على النشر الذي صدر عليه — إذا حصلت على أخطاء مصادقة، تحقق من تطابق `external_alibabacloud_base_url`.
+:::
+
+## النماذج المتاحة
+
+| النموذج | الأوضاع | نسب الأبعاد | الدفعة | ملاحظات |
+| --- | --- | --- | --- | --- |
+| **Qwen Image 2.0 Pro** | txt2img | 1:1, 4:3, 3:4, 16:9, 9:16 | حتى 4 | أفضل جودة، مخرجات 2K، نص ثنائي اللغة ممتاز. |
+| **Qwen Image 2.0** | txt2img | 1:1, 4:3, 3:4, 16:9, 9:16 | حتى 4 | نسخة 2K أسرع/أرخص من 2.0 Pro. |
+| **Qwen Image Max** | txt2img | 1:1, 4:3, 3:4, 16:9, 9:16 | حتى 4 | جودة عالية بحجم أصلي ~1.3K. |
+| **Qwen Image Edit Max** | txt2img (مع صور مرجعية) | 1:1, 4:3, 3:4, 16:9, 9:16 | حتى 4 | توليد مدفوع بالصور المرجعية مع استدلال صناعي/هندسي. يقبل حتى 14 صورة مرجعية. |
+| **Wan 2.6 Text-to-Image** | txt2img | 1:1, 4:3, 3:4, 16:9, 9:16 | حتى 4 | T2I واقعي بدقة 1K. |
+
+جميع النماذج تدعم **البذرة**. المطالبات السلبية غير موصلة حاليًا إلى DashScope، لذلك يتم تجاهل إدخال المطالبة السلبية لهذه الموفرين. لا يدعم أي من نماذج Alibaba Cloud img2img (تحرير قوة إزالة الضوضاء) أو الطلاء الداخلي (تحرير قائم على القناع) في Invoke اليوم.
+
+## نصائح
+
+
+1. **المطالبات ثنائية اللغة.** Qwen Image جيد بشكل غير عادي في عرض النص الصيني والمطالبات المختلطة اللغة — إنه خيار قوي عندما تحتوي مطالبتك أو مخرجاتك المرغوبة على نص غير لاتيني.
+2. إدخال الصور المرجعية مقبول فقط بواسطة Qwen Image Edit Max — قدم الصور من خلال لوحة الصور المرجعية. الأقنعة وقوة إزالة الضوضاء غير مدعومة لأي نموذج من Alibaba Cloud.
+3. الحد الأقصى للدفعات هو 4 صور لكل طلب. تُقسَّم الدفعات الأكبر عبر استدعاءات API متعددة.
+4. تختلف التكاليف حسب النموذج — Qwen Image 2.0 Pro هو الأغلى، Qwen Image 2.0 الأرخص من عائلة 2.0. تحقق من صفحة تسعير Alibaba Cloud قبل تشغيل دفعات كبيرة.
+
diff --git a/docs/src/content/docs/ar/features/External Models/gemini.mdx b/docs/src/content/docs/ar/features/External Models/gemini.mdx
new file mode 100644
index 00000000000..18a3966664b
--- /dev/null
+++ b/docs/src/content/docs/ar/features/External Models/gemini.mdx
@@ -0,0 +1,48 @@
+---
+title: Google Gemini
+---
+
+import { Steps } from '@astrojs/starlight/components'
+
+يدعم Invoke نماذج توليد الصور Gemini من Google من خلال واجهة Gemini API. هذا الموفر خيار جيد إذا كنت تريد تحويل نص إلى صورة عالي الجودة وتحرير صور قائم على المرجع دون تشغيل نموذج محلي.
+
+## الحصول على مفتاح API
+
+
+1. افتح [Google AI Studio](https://aistudio.google.com/) وسجل الدخول بحساب Google الخاص بك.
+2. أنشئ مفتاح API جديد.
+3. دوّن المفتاح — سيظهر مرة واحدة فقط.
+
+
+## الإعدادات
+
+أضف مفتاحك إلى `api_keys.yaml` في دليل Invoke الجذري:
+
+```yaml
+external_gemini_api_key: "مفتاح-gemini-api-الخاص-بك"
+
+# اختياري — اضبطه فقط إذا كنت بحاجة إلى توجيه الطلبات من خلال نقطة نهاية مختلفة
+external_gemini_base_url: "https://generativelanguage.googleapis.com"
+```
+
+أعد تشغيل Invoke لتفعيل التغيير.
+
+## النماذج المتاحة
+
+| النموذج | الأوضاع | الصور المرجعية | ملاحظات |
+| --- | --- | --- | --- |
+| **Gemini 2.5 Flash Image** | txt2img | نعم | 10 نسب أبعاد، دقة ثابتة لكل نسبة. |
+| **Gemini 3 Pro Image Preview** | txt2img | حتى 14 (6 كائن + 5 شخصية) | إعدادات دقة مسبقة 1K / 2K / 4K. |
+| **Gemini 3.1 Flash Image Preview** | txt2img | حتى 14 (10 كائن + 4 شخصية) | إعدادات دقة مسبقة 512 / 1K / 2K / 4K. |
+
+يُستخدم إدخال الصورة المرجعية لتكييف التوليد لكنه يُحسب ضمن txt2img — لا يتم دعم img2img (قوة إزالة الضوضاء) أو الطلاء الداخلي (القناع) لجيميني.
+
+جميع نماذج Gemini هي صورة واحدة لكل طلب — حجم الدفعة ثابت عند 1. لتوليد أشكال متعددة، ضع استدعاءات متعددة في قائمة الانتظار.
+
+## نصائح
+
+
+1. تُرسل الصور المرجعية مباشرة إلى API كبيانات PNG مضمنة. المراجع الكبيرة تزيد من زمن الاستجابة والتكلفة — قص الصور بإحكام حيثما أمكن.
+2. تُعيّن نسب الأبعاد إلى أقرب نسبة مدعومة من Gemini. لنماذج Gemini 3، استخدم إعدادات الدقة المسبقة للبقاء عند أحجام المخرجات الأصلية للموفر وتجنب إعادة القياس غير الضرورية.
+3. تختلف التسعيرة حسب النموذج والمنطقة. تحقق من وثائق Google قبل تشغيل دفعات كبيرة.
+
diff --git a/docs/src/content/docs/ar/features/External Models/index.mdx b/docs/src/content/docs/ar/features/External Models/index.mdx
new file mode 100644
index 00000000000..52521fb9811
--- /dev/null
+++ b/docs/src/content/docs/ar/features/External Models/index.mdx
@@ -0,0 +1,58 @@
+---
+title: النماذج الخارجية
+---
+
+النماذج الخارجية تتيح لك توليد الصور في Invoke عن طريق استدعاء واجهات برمجة تطبيقات توليد الصور من طرف ثالث بدلاً من تشغيل نموذج محليًا. هذا مفيد عندما:
+
+- لا تملك وحدة معالجة رسوميات أو ذاكرة وصول عشوائي كافية لتشغيل نموذج محليًا.
+- تريد الوصول إلى نماذج مغلقة المصدر (مثل GPT Image، Gemini).
+- تحتاج إلى قدرة موفر معينة (دقة عالية جدًا، دفعات سريعة، عرض نص ثنائي اللغة، إلخ).
+
+تظهر النماذج الخارجية في منتقي النماذج بجانب النماذج المثبتة محليًا. يتم توجيه التوليدات إلى API الموفر، وتُفوتر لحسابك لدى الموفر، ويتم استيراد الصور الناتجة مرة أخرى إلى Invoke مثل أي توليد آخر.
+
+## الموفرون المدعومون
+
+- [Google Gemini](/features/external-models/gemini/) — Gemini 2.5 Flash Image، Gemini 3 Pro Image Preview، Gemini 3.1 Flash Image Preview
+- [OpenAI](/features/external-models/openai/) — GPT Image 1 / 1.5 / 1-mini، DALL·E 3
+- [BytePlus Seedream](/features/external-models/seedream/) — Seedream 5.0، 5.0 Lite، 4.5، 4.0
+- [Alibaba Cloud DashScope](/features/external-models/alibabacloud/) — Qwen Image 2.0 / 2.0 Pro / Max / Edit Max، Wan 2.6 T2I
+
+## إعداد مفاتيح API
+
+تُخزَّن بيانات اعتماد الموفر الخارجي في ملف `api_keys.yaml` مخصص بجانب `invokeai.yaml` في دليل Invoke الجذري.
+
+```yaml
+# api_keys.yaml
+external_gemini_api_key: "مفتاح-gemini-api-الخاص-بك"
+external_openai_api_key: "مفتاح-openai-api-الخاص-بك"
+
+# اختياري: تجاوز عنوان URL الأساسي للموفر (مثل لوكيل متوافق أو نقطة نهاية إقليمية)
+external_gemini_base_url: "https://generativelanguage.googleapis.com"
+external_openai_base_url: "https://api.openai.com"
+```
+
+أعد تشغيل Invoke بعد تحرير `api_keys.yaml` ليتم التقاط القيم الجديدة.
+
+!!! تحذير "حافظ على سرية مفاتيحك"
+ `api_keys.yaml` يحتوي على أسرار. لا تقم بتضمينه في التحكم بالإصدارات ولا تشاركه مع مستخدمين آخرين لجهازك.
+
+## تثبيت النماذج الخارجية
+
+تُدرج النماذج الخارجية في مربع حوار النماذج الأولية تحت موفرها. قم بتثبيتها مثل أي نموذج أولي — يسجل Invoke مرجع نموذج لكنه لا ينزل الأوزان (لا توجد أوزان لتنزيلها).
+
+بمجرد التثبيت، تظهر النماذج الخارجية في كل مكان يمكن اختيار نموذج فيه. اختر واحدًا، واضبط المعلمات المعتادة (المطالبة، الأبعاد، عدد الصور، إلخ)، واستدعِ التوليد كالمعتاد.
+
+## القدرات ورؤية الإعدادات
+
+يعلن كل نموذج خارجي عن **قدراته** الخاصة — على سبيل المثال:
+
+- أوضاع التوليد التي يدعمها (`txt2img`، `img2img`). الطلاء الداخلي غير مدعوم حاليًا من قبل أي موفر خارجي.
+- ما إذا كان يقبل الصور المرجعية، وكم عددها.
+- نسب الأبعاد والدقة التي يسمح بها.
+- ما إذا كان يدعم المطالبة السلبية أو البذرة أو حجم الدفعة > 1.
+
+يستخدم Invoke هذه القدرات لتشغيل واجهة المستخدم: فقط الإعدادات التي يدعمها النموذج المحدد فعليًا ستظهر في لوحة المعلمات. إذا كان حقل تتوقعه مفقودًا، فهذا لأن النموذج المحدد لا يدعمه.
+
+## التكاليف وحدود المعدل
+
+يفرض الموفرون الخارجيون رسومًا على كل طلب. تحقق من صفحة تسعير الموفر قبل تشغيل دفعات كبيرة. تظهر أخطاء حد المعدل من الموفر في Invoke كفشل في التوليد — انتظر لحظة وحاول مرة أخرى، أو قلل حجم دفعتك المتزامنة.
diff --git a/docs/src/content/docs/ar/features/External Models/openai.mdx b/docs/src/content/docs/ar/features/External Models/openai.mdx
new file mode 100644
index 00000000000..7251ffe0bd9
--- /dev/null
+++ b/docs/src/content/docs/ar/features/External Models/openai.mdx
@@ -0,0 +1,65 @@
+---
+title: OpenAI
+---
+
+import { Steps } from '@astrojs/starlight/components'
+
+يدعم Invoke نماذج توليد الصور من OpenAI — عائلة GPT Image و DALL·E 3 — من خلال واجهة OpenAI API.
+
+:::ملاحظة[تمت إزالة DALL·E 2]
+تم إهمال DALL·E 2 من قبل OpenAI ومن المقرر إيقاف تشغيله في 2026-05-12. لم يعد يُعرض كنموذج أولي في Invoke.
+:::
+
+## الحصول على مفتاح API
+
+
+1. افتح [منصة OpenAI API](https://platform.openai.com/api-keys) وسجل الدخول.
+2. أنشئ مفتاح API سري جديد.
+3. تأكد من إعداد الفواتير لحسابك — نقاط نهاية الصور تُدفع لكل طلب.
+
+
+## الإعدادات
+
+أضف مفتاحك إلى `api_keys.yaml` في دليل Invoke الجذري:
+
+```yaml
+external_openai_api_key: "sk-..."
+
+# اختياري — استخدمه لتوجيه إلى وكيل متوافق أو نشر Azure OpenAI
+external_openai_base_url: "https://api.openai.com"
+```
+
+أعد تشغيل Invoke لتفعيل التغيير.
+
+## النماذج المتاحة
+
+| النموذج | الأوضاع | نسب الأبعاد | الدفعة | ملاحظات |
+| --- | --- | --- | --- | --- |
+| **GPT Image 1.5** | txt2img, img2img | 1:1, 3:2, 2:3 | حتى 10 | أسرع وأرخص نموذج GPT Image. |
+| **GPT Image 1** | txt2img, img2img | 1:1, 3:2, 2:3 | حتى 10 | أعلى جودة في عائلة GPT Image. |
+| **GPT Image 1 Mini** | txt2img, img2img | 1:1, 3:2, 2:3 | حتى 10 | أرخص بحوالي 80% من GPT Image 1. |
+| **DALL·E 3** | txt2img فقط | 1:1, 7:4, 4:7 | 1 | لا يدعم الصور المرجعية / التحرير. |
+
+الطلاء الداخلي (التحرير القائم على القناع) غير مدعوم حاليًا لأي نموذج OpenAI في Invoke. يتم توجيه img2img لعائلة GPT Image عبر نقطة نهاية `/v1/images/edits` بدون قناع.
+
+## خيارات خاصة بالموفر
+
+لنماذج **GPT Image**، يكشف Invoke عن خيارين خاصين بالموفر في لوحة المعلمات:
+
+- **الجودة** — `منخفضة`، `متوسطة`، `عالية`، أو `تلقائي`. الجودة الأعلى تكلف أكثر وتستغرق وقتًا أطول.
+- **الخلفية** — `تلقائي`، `شفاف`، أو `معتم`. استخدم `شفاف` لإخراج PNG بقناة ألفا.
+
+DALL·E 2 و DALL·E 3 لا يكشفان عن هذه الخيارات.
+
+## كيف يتم توجيه الطلبات
+
+- طلبات تحويل النص إلى صورة البحتة تصل إلى `/v1/images/generations`.
+- أي طلب يحتوي على صورة أولية أو صور مرجعية يتم إرساله إلى `/v1/images/edits` بدلاً من ذلك. يتم ذلك بشفافية — لست بحاجة إلى اختيار نقطة نهاية.
+
+## نصائح
+
+
+1. الدفعات على GPT Image تبلغ حدها الأقصى 10 لكل طلب. يتم تقسيم الدفعات الأكبر إلى استدعاءات API متعددة.
+2. يمكن أن ترتفع التكاليف بسرعة مع توليدات GPT Image عالية الجودة. ابدأ بـ GPT Image 1 Mini عند التكرار على المطالبات.
+3. حدود المعدل من OpenAI تظهر كاستدعاءات فاشلة — أعد المحاولة بعد انتظار قصير.
+
diff --git a/docs/src/content/docs/ar/features/External Models/seedream.mdx b/docs/src/content/docs/ar/features/External Models/seedream.mdx
new file mode 100644
index 00000000000..c2f0c0467f1
--- /dev/null
+++ b/docs/src/content/docs/ar/features/External Models/seedream.mdx
@@ -0,0 +1,68 @@
+---
+title: BytePlus Seedream
+---
+
+import { Steps } from '@astrojs/starlight/components'
+
+يدعم Invoke عائلة توليد الصور **Seedream** من BytePlus من خلال واجهة BytePlus Ark API. Seedream مناسب بقوة لتوليدات 2K/4K وتكوين الصور متعدد المرجع.
+
+## الحصول على مفتاح API
+
+
+1. افتح [وحدة تحكم BytePlus](https://console.byteplus.com/) وسجل الدخول.
+2. فعّل منتج **Ark** (تقديم النماذج).
+3. أنشئ مفتاح API مع الوصول إلى نماذج Seedream التي تخطط لاستخدامها.
+
+
+## الإعدادات
+
+أضف مفتاحك إلى `api_keys.yaml` في دليل Invoke الجذري:
+
+```yaml
+external_seedream_api_key: "مفتاح-seedream-api-الخاص-بك"
+
+# اختياري — غيّره فقط إذا كنت بحاجة إلى نقطة نهاية إقليمية مختلفة
+external_seedream_base_url: "https://ark.ap-southeast.bytepluses.com"
+```
+
+أعد تشغيل Invoke لتفعيل التغيير.
+
+## النماذج المتاحة
+
+| النموذج | الأوضاع | الصور المرجعية | الدفعة | الحجم الأصلي |
+| --- | --- | --- | --- | --- |
+| **Seedream 5.0** | txt2img, img2img | حتى 14 | حتى 15 | 2K |
+| **Seedream 5.0 Lite** | txt2img, img2img | حتى 14 | حتى 15 | 2K |
+| **Seedream 4.5** | txt2img, img2img | حتى 14 | حتى 15 | 2K |
+| **Seedream 4.0** | txt2img, img2img | حتى 14 | حتى 15 | 2K |
+
+نماذج 4.x / 5.x قادرة على الدفعات وتقبل حتى 14 صورة مرجعية لكل طلب.
+
+:::ملاحظة[معرفات النماذج]
+تستخدم BytePlus معرفات نماذج مؤرخة (مثل `seedream-5-0-260128`). عندما تصدر BytePlus إصدارًا مؤرخًا جديدًا، يجب تحديث معرفات النماذج الأولية في Invoke. تم إهمال Seedream 3.0 T2I (`seedream-3-0-t2i-250415`) من قبل BytePlus واستبداله بـ Seedream 4.0.
+:::
+
+### نسب الأبعاد المدعومة
+
+جميع نماذج Seedream تشترك في نفس مجموعة نسب الأبعاد: `1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `9:16`, `16:9`, `21:9`، معروضة بدقة 2K.
+
+## خيارات خاصة بالموفر
+
+يكشف Seedream عن مفتاحين خاصين بالموفر في لوحة المعلمات:
+
+- **العلامة المائية** — عند التفعيل، يضيف BytePlus علامة مائية صغيرة إلى المخرجات. معطل افتراضيًا.
+- **تحسين المطالبة** — عند التفعيل، يعيد BytePlus كتابة مطالبتك من جانب الخادم لجودة توليد أفضل. مفيد للمطالبات القصيرة؛ عطله إذا كنت تريد الحفاظ على النص الدقيق.
+
+**البذرة** و**مقياس التوجيه** غير مقبولة من قبل عائلة 4.x / 5.x.
+
+## الصور المرجعية
+
+نماذج Seedream 4.x و5.x تقبل حتى 14 صورة مرجعية بجانب المطالبة. تُستخدم لوحة الصور المرجعية القياسية في Invoke — اسحب الصور إليها، ويتم إعادة توجيهها كصور PNG بتشفير base64 إلى API.
+
+## نصائح
+
+
+1. لتكوين الصور المتعددة (مثل شخصية + منتج)، Seedream 4.5 خيار افتراضي جيد.
+2. عند تشغيل دفعات كبيرة (`num_images > 1` على 4.x / 5.x)، يستخدم Invoke علامة API `sequential_image_generation` — يتم إرجاع كل صورة عند اكتمالها.
+3. اضبط `external_seedream_base_url` إذا كنت بحاجة إلى التوجيه من خلال نقطة نهاية Ark إقليمية محددة.
+
diff --git a/docs/src/content/docs/ar/features/Multi-User Mode/admin-guide.mdx b/docs/src/content/docs/ar/features/Multi-User Mode/admin-guide.mdx
new file mode 100644
index 00000000000..61e53a1e689
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Multi-User Mode/admin-guide.mdx
@@ -0,0 +1,610 @@
+---
+title: دليل مسؤول متعدد المستخدمين
+description: كيفية إعداد وإدارة تثبيت InvokeAI متعدد المستخدمين.
+sidebar:
+ order: 4
+---
+
+import { Steps } from '@astrojs/starlight/components'
+
+## نظرة عامة
+
+هذا الدليل مخصص للمسؤولين الذين يديرون تثبيت InvokeAI متعدد المستخدمين. يغطي الإعداد الأولي وإدارة المستخدمين وأفضل ممارسات الأمان واستكشاف الأخطاء وإصلاحها.
+
+## المتطلبات الأساسية
+
+قبل تمكين دعم متعدد المستخدمين، تأكد من أن لديك:
+
+- InvokeAI مثبتاً وقيد التشغيل
+- إمكانية الوصول إلى نظام ملفات الخادم (للإعداد الأولي)
+- فهم لبيئة النشر الخاصة بك
+- نسخة احتياطية من بياناتك الحالية (موصى به)
+
+## الإعداد الأولي
+
+### تفعيل وضع متعدد المستخدمين
+
+لوضع InvokeAI في وضع متعدد المستخدمين، ستحتاج إلى إضافة الخيار `multiuser: true` إلى ملف التكوين الخاص به. هذا الملف موجود في `INVOKEAI_ROOT/invokeai.yaml`. مع إيقاف خادم InvokeAI الخلفي، أضف خيار التكوين الجديد إلى نهاية الملف باستخدام محرر نصوص بحيث يبدو هكذا:
+
+```yaml
+# بيانات وصفية داخلية - لا تقم بالتعديل:
+schema_version: 4.0.2
+
+# تمكين/تعطيل الوضع متعدد المستخدمين
+multiuser: true
+```
+
+ثم أعد تشغيل خادم InvokeAI الخلفي من سطر الأوامر أو باستخدام المشغل.
+
+:::note[العودة إلى وضع المستخدم الفردي]
+إذا أردت في أي وقت العودة إلى وضع المستخدم الفردي، ببساطة قم بتعليق سطر `multiuser`، أو غيّر "true" إلى "false". ثم أعد تشغيل الخادم. بسبب الطريقة التي تخزن بها المتصفحات الصفحات مؤقتاً، قد يحتاج المستخدمون الذين لديهم جلسات InvokeAI مفتوحة إلى تحديث متصفحاتهم بقوة.
+:::
+
+### حساب المسؤول الأول
+
+عند بدء تشغيل InvokeAI لأول مرة في وضع متعدد المستخدمين، سترى حوار **إعداد المسؤول**.
+
+**خطوات الإعداد:**
+
+
+1. **عنوان البريد الإلكتروني**: أدخل عنوان بريد إلكتروني صالحاً (يصبح اسم المستخدم الخاص بك)
+
+ - مثال: `admin@example.com` أو `admin@localhost` للاختبار
+ - يجب أن يكون بتنسيق بريد إلكتروني صالح
+ - لا يمكن تغييره لاحقاً دون الوصول إلى قاعدة البيانات
+
+2. **الاسم المعروض**: أدخل اسماً ودوداً
+
+ - مثال: "System Administrator" أو اسمك الحقيقي
+ - يمكن تغييره لاحقاً في ملفك الشخصي
+ - مرئي للمستخدمين الآخرين في السياقات المشتركة
+
+3. **كلمة المرور**: أنشئ كلمة مرور مسؤول قوية
+
+ - **المتطلبات الدنيا:**
+
+ - 8 أحرف على الأقل
+ - تحتوي على أحرف كبيرة (A-Z)
+ - تحتوي على أحرف صغيرة (a-z)
+ - تحتوي على أرقام (0-9)
+
+ - **موصى به:**
+
+ - استخدم 12+ حرفاً
+ - قم بتضمين أحرف خاصة (!@#$%^&*)
+ - استخدم مدير كلمات مرور للتوليد والتخزين
+ - لا تعيد استخدام كلمات المرور من خدمات أخرى
+
+4. **تأكيد كلمة المرور**: أعد إدخال كلمة المرور
+
+5. انقر على **إنشاء حساب مسؤول**
+
+
+:::caution[هام]
+قم بتخزين بيانات الاعتماد هذه بشكل آمن! يمكن لحساب المسؤول الأول إعادة تعيين كلمة المرور إلى كلمة جديدة، لكن لا يمكنه استعادة كلمة مفقودة.
+:::
+
+### التكوين
+
+يمكن لـ InvokeAI العمل في وضع المستخدم الفردي أو متعدد المستخدمين، يتحكم فيه خيار التكوين `multiuser` في `invokeai.yaml`:
+
+```yaml
+# تمكين/تعطيل الوضع متعدد المستخدمين
+multiuser: true # تمكين الوضع متعدد المستخدمين (يتطلب مصادقة)
+
+# سياسة كلمة المرور الاختيارية
+strict_password_checking: true # فرض متطلبات الأحرف الكبيرة/الصغيرة/الأرقام
+```
+
+يتم إنشاء أسرار JWT تلقائياً وتخزينها في قاعدة البيانات. عمر الجلسات الافتراضي هو 24 ساعة، أو 7 أيام عندما يختار المستخدم "تذكرني". راجع إدارة المفتاح السري أدناه إذا كنت بحاجة إلى تدوير مفتاح JWT السري.
+
+:::caution[سلوك تبديل الوضع]
+**التبديل إلى وضع المستخدم الفردي:** إذا تم إنشاء لوحات أو صور في وضع متعدد المستخدمين، سيتم دمجها جميعاً في عرض موحد واحد عند التبديل إلى وضع المستخدم الفردي.
+
+**التبديل إلى وضع متعدد المستخدمين:** اللوحات والصور القديمة التي تم إنشاؤها تحت وضع المستخدم الفردي ستكون مملوكة لمستخدم داخلي اسمه "system". فقط المسؤول سيكون لديه حق الوصول إلى هذه الأصول القديمة. ستكون أداة ترحيل هذه الأصول القديمة إلى مستخدم آخر جزءاً من إصدار مستقبلي.
+:::
+
+### الهجرة من مستخدم فردي
+
+عند الترقية من تثبيت مستخدم فردي أو تبديل الأوضاع:
+
+
+1. **الهجرة التلقائية**: ستهاجر قاعدة البيانات تلقائياً إلى مخطط متعدد المستخدمين عند تمكين الوضع متعدد المستخدمين لأول مرة
+2. **ملكية البيانات القديمة**: يتم تعيين البيانات الموجودة (اللوحات، الصور، سير العمل) التي تم إنشاؤها في وضع المستخدم الفردي لمستخدم داخلي اسمه "system"
+3. **وصول المسؤول**: فقط المسؤولون سيكون لديهم حق الوصول إلى الأصول القديمة المملوكة لـ "system" في وضع متعدد المستخدمين
+4. **لا فقدان للبيانات**: يتم الحفاظ على جميع المحتويات الموجودة
+
+
+**عملية الهجرة:**
+
+```bash
+# قم بنسخ قاعدة البيانات احتياطياً أولاً
+cp databases/invokeai.db databases/invokeai.db.backup
+
+# تمكين وضع متعدد المستخدمين في invokeai.yaml
+# multiuser: true
+
+# بدء InvokeAI (تحدث الهجرة تلقائياً)
+invokeai-web
+
+# أكمل حوار إعداد المسؤول
+# البيانات القديمة ستكون مملوكة لمستخدم "system"
+```
+
+:::note[ترحيل الأصول القديمة]
+أداة لترحيل الأصول القديمة المملوكة لـ "system" إلى حسابات مستخدمين محددة ستكون متاحة في إصدار مستقبلي. حتى ذلك الحين، يمكن للمسؤولين الوصول إلى جميع المحتويات القديمة وإدارتها.
+:::
+
+## إدارة المستخدمين
+
+### إنشاء المستخدمين
+
+يمكن للمسؤولين إنشاء وتعديل المستخدمين (بما في ذلك المسؤولين الآخرين) عبر واجهة ويب مدمجة أو باستخدام نصوص سطر الأوامر.
+
+#### **عبر واجهة الويب الأمامية:**
+
+يرجى الاطلاع على قسم دليل متعدد المستخدمين حول [إضافة وتعديل المستخدمين](./user-guide#adding-and-modifying-users) للحصول على شرح.
+
+#### **عبر نصوص سطر الأوامر:**
+
+##### نصوص إدارة المستخدمين عبر سطر الأوامر
+
+يمكن للمسؤولين أيضاً استخدام سلسلة من نصوص سطر الأوامر لإضافة أو تعديل أو حذف المستخدمين. إذا كنت تستخدم المشغل، انقر على أيقونة ">" للدخول إلى واجهة سطر الأوامر. بخلاف ذلك، إذا كنت مستخدماً أصلياً لسطر الأوامر، قم بتفعيل بيئة InvokeAI من الطرفية الخاصة بك.
+
+جميع وسائط سطر الأوامر اختيارية. ستطالبك النصوص بتقديم أي وسائط مفقودة.
+
+الأوامر هي:
+
+| الاسم | الوظيفة | مثال استخدام CLI |
+|---|---|---|
+| **invoke-useradd** | إضافة مستخدم | `invoke-useradd --email user@example.com --name "Example User" --password "badpassword"` |
+| **invoke-usermod** | تعديل مستخدم | `invoke-usermod --email user@example.com --name "Mr. Example User" --password "8adsf2**%"` |
+| **invoke-userdel** | حذف مستخدم | `invoke-userdel --email user@example.com --force` |
+| **invoke-userlist** | قائمة بجميع المستخدمين | `invoke-userlist` |
+
+مرر وسيطة `--help` للحصول على استخدام كل نص. على سبيل المثال:
+
+```bash
+> invoke-useradd --help
+usage: invoke-useradd [-h] [--root ROOT] [--email EMAIL] [--password PASSWORD] [--name NAME] [--admin]
+
+إضافة مستخدم إلى قاعدة بيانات InvokeAI
+
+options:
+ -h, --help عرض رسالة المساعدة هذه والخروج
+ --root ROOT, -r ROOT المسار إلى دليل InvokeAI الجذر. إذا تم حذفه، يتم حل الجذر بهذا الترتيب: متغير البيئة $INVOKEAI_ROOT،
+ الدليل الأصل للبيئة الافتراضية النشطة، أو $HOME/invokeai.
+ --email EMAIL, -e EMAIL
+ عنوان البريد الإلكتروني للمستخدم
+ --password PASSWORD, -p PASSWORD
+ كلمة مرور المستخدم
+ --name NAME, -n NAME الاسم المعروض للمستخدم (اختياري)
+ --admin, -a جعل المستخدم مسؤولاً
+
+إذا لم يتم تقديم وسائط، سيعمل النص في وضع تفاعلي.
+```
+
+:::danger[فقدان البيانات]
+حذف مستخدم يزيل سجل المستخدم ويتتالى إلى جلساتهم ومشاركات اللوحات والدعوات المرسلة وحالة العميل لكل مستخدم. **لا** يحذف اللوحات أو الصور أو سير العمل أو عناصر قائمة الانتظار أو إعدادات الأنماط التي أنشأوها — تظل هذه الصفوف في قاعدة البيانات، مملوكة لـ user_id لم يعد موجوداً، ولن تظهر في معرض أي مستخدم. ملفات الصور الفعلية في `outputs/images` تظل أيضاً في مكانها حتى يتم تشغيل برنامج صيانة المعرض لإزالة الصور اليتيمة.
+
+إذا كنت تريد أن تختفي محتوياتهم أيضاً، قم بإعادة تعيينها أو حذفها قبل حذف المستخدم. قم بنسخ قاعدة البيانات احتياطياً أولاً إذا قد تكون الاسترداد مطلوبة.
+:::
+
+### عرض نشاط المستخدم
+
+**إدارة قائمة الانتظار:**
+
+لا توجد طريقة عرض منفصلة خاصة بالمسؤول فقط. عند تسجيل الدخول كمسؤول، تعرض لوحة قائمة الانتظار العادية تلقائياً عناصر قائمة انتظار كل مستخدم (كل عنصر مُسمى باسم المستخدم المقدم أو بريده الإلكتروني)، ويمكنك إلغاء أو مسح أي منها. لا توجد واجهة مستخدم مدمجة لتصفية قائمة الانتظار حسب المستخدم؛ استخدم ميزة البحث في الصفحة في متصفحك للبحث بالاسم إذا لزم الأمر.
+
+## إدارة النماذج
+
+كمسؤول، لديك حق الوصول الكامل إلى [مدير النماذج](/concepts/models) ويمكنك تثبيت وتعديل وحذف النماذج تماماً كما في وضع المستخدم الفردي. المستخدمون غير المميزين، مع ذلك، يمكنهم عرض النماذج المثبتة مسبقاً، لكن لا يمكنهم إضافتها أو تعديلها.
+
+## الأمان
+
+:::note[التحقق الصارم من كلمة المرور]
+يوصى بتمكين التحقق الصارم من كلمة المرور. سيجبر هذا جميع المستخدمين على اختيار كلمات مرور جيدة تتبع "المتطلبات الدنيا" أدناه. قم بذلك عن طريق إضافة `strict_password_checking` إلى ملف التكوين `invokeai.yaml`:
+
+```
+strict_password_checking: true
+```
+:::
+
+### سياسات كلمة المرور
+
+**المتطلبات الدنيا:**
+
+- 8 أحرف على الأقل
+- يجب أن تحتوي على أحرف كبيرة
+- يجب أن تحتوي على أحرف صغيرة
+- يجب أن تحتوي على أرقام
+
+إذا كان `strict_password_checking` نشطاً (موصى به)، فسيتم فرض هذه المتطلبات الدنيا ولن يتمكن المستخدمون من المتابعة حتى يختاروا كلمة مرور تفي بها. بخلاف ذلك، سيتم تحذير المستخدم ببساطة عند استخدام كلمة مرور ضعيفة.
+
+**السياسات الموصى بها:**
+
+- طلب كلمات مرور مكونة من 12+ حرفاً
+- تضمين أحرف خاصة
+- تنفيذ تدوير كلمة المرور كل 90 يوماً
+- منع إعادة استخدام كلمة المرور
+
+### إدارة الجلسة
+
+**أمان الجلسة وإدارة الرمز المميز:**
+
+يستخدم هذا النظام رموز JWT عديمة الحالة مع توقيعات HMAC لتحديد المستخدمين بعد تقديم بيانات الاعتماد الأولية الخاصة بهم. ستستمر الرموز لمدة 24 ساعة افتراضياً، أو لمدة 7 أيام إذا قام المستخدم بالنقر على مربع "تذكرني" عند تسجيل الدخول. يتم رفض الرموز منتهية الصلاحية تلقائياً وسيضطر المستخدم إلى تسجيل الدخول مرة أخرى.
+
+في جانب العميل، يتم تخزين الرموز في localStorage للمتصفح. يؤدي تسجيل الخروج إلى مسحها. لا يلزم تخزين جلسة من جانب الخادم.
+
+تتضمن الرموز معرف المستخدم والبريد الإلكتروني وحالة المسؤول، بالإضافة إلى توقيع HMAC.
+
+### إدارة المفتاح السري
+
+**هام:** يجب الحفاظ على سرية مفتاح JWT السري.
+
+لتوليد الرموز، كل مثيل InvokeAI له مفتاح JWT سري متميز يجب الحفاظ على سريته. يتم تخزين المفتاح في جدول `app_settings` لقاعدة بيانات InvokeAI ضمن قيمة حقل باسم `jwt_secret`.
+
+يتم إنشاء المفتاح السري تلقائياً أثناء إنشاء قاعدة البيانات أو الهجرة. إذا كنت ترغب في تغيير المفتاح، يمكنك توليد بديل باستخدام أي من هذين الأمرين:
+
+```bash
+# Python
+python -c "import secrets; print(secrets.token_urlsafe(32))"
+
+# OpenSSL
+openssl rand -base64 32
+```
+
+ثم قص والصق السر المطبوع في أمر Sqlite3 هذا:
+
+```bash
+sqlite3 INVOKE_ROOT/databases/invokeai.db 'update app_settings set value="THE_SECRET" where key="jwt_secret"'
+```
+
+(استبدل INVOKE_ROOT بدليل InvokeAI الجذر الخاص بك و THE_SECRET بالسر الجديد).
+
+بعد ذلك، أعد تشغيل الخادم. سيتم تسجيل خروج جميع المستخدمين المسجلين وسيحتاجون إلى تقديم أسماء المستخدمين وكلمات المرور الخاصة بهم مرة أخرى.
+
+### استضافة مثيل InvokeAI مشترك
+
+تتيح لك ميزة متعدد المستخدمين تشغيل خادم InvokeAI خلفي يمكن لأصدقائك وعائلتك الوصول إليه عبر شبكتك المنزلية. من الممكن أيضاً استضافة خادم خلفي يمكن الوصول إليه عبر الإنترنت.
+
+بشكل افتراضي، يعمل InvokeAI على `localhost`، عنوان IP `127.0.0.1`، والذي يمكن الوصول إليه فقط من قبل المتصفحات التي تعمل على نفس جهاز الخادم الخلفي. لجعل الخادم الخلفي قابلاً للوصول لأي جهاز على شبكتك المنزلية أو العمل، أضف السطر `host: 0.0.0.0` إلى ملف تكوين InvokeAI، المخزن عادة في `INVOKE_ROOT/invokeai.yaml`.
+
+إليك مثال بسيط.
+
+```yaml
+# بيانات وصفية داخلية - لا تقم بالتعديل:
+schema_version: 4.0.2
+
+# ضع إعدادات المستخدم هنا - راجع https://invoke-ai.github.io/InvokeAI/configuration/:
+multiuser: true
+host: 0.0.0.0
+```
+
+بعد إعادة تشغيل الخادم الخلفي، ستتمكن من الوصول إلى الخادم من أجهزة أخرى على الشبكة المحلية باستخدام عنوان IP لجهاز الخادم أو اسم المضيف والمنفذ 9090.
+
+#### جعل InvokeAI قابلاً للوصول إلى الإنترنت
+
+:::danger[الاستخدام على مسؤوليتك الخاصة]
+لقد بذل فريق InvokeAI قصارى جهده لجعل البرنامج خالياً من الأخطاء القابلة للاستغلال، لكن البرنامج لم يخضع لتدقيق أمني صارم أو اختبار اختراق. الاستخدام على مسؤوليتك الخاصة.
+:::
+
+من الممكن أيضاً إنشاء خادم (شبه) عام يمكن الوصول إليه من الإنترنت. تفاصيل كيفية القيام بذلك تعتمد بشكل كبير على نظام جهاز التوجيه/جدار الحماية المنزلي أو المؤسسي الخاص بك وهي خارج نطاق هذا المستند.
+
+إذا قمت بتعريض InvokeAI للإنترنت، هناك عدد من الاحتياطات الواجب اتخاذها. إليك قائمة مختصرة بممارسات أمان الشبكة الموصى بها.
+
+**تكوين HTTPS:**
+
+لنشر الإنترنت، استخدم دائماً HTTPS:
+
+```nginx
+# استخدم وكيل عكسي مثل nginx أو Traefik
+# مثال تكوين nginx:
+
+server {
+ listen 443 ssl http2;
+ server_name invoke.example.com;
+
+ ssl_certificate /path/to/cert.pem;
+ ssl_certificate_key /path/to/key.pem;
+
+ location / {
+ proxy_pass http://localhost:9090;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+
+ # دعم WebSocket
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ }
+}
+```
+
+**قواعد جدار الحماية:**
+
+من الأفضل تقييد الوصول إلى الشبكات الموثوقة وعناوين IP البعيدة، أو استخدام VPN للاتصال بشبكتك المنزلية. قم بتحديد معدل الاتصالات بنقطة نهاية المصادقة في InvokeAI `http://your.host:9090/api/v1/auth/login`.
+
+**النسخ الاحتياطي والاسترداد:**
+
+من الجيد دائماً عمل نسخة احتياطية دورية لقاعدة بيانات InvokeAI والصور، ولكن بشكل خاص إذا كان الخادم قابلاً للوصول للإنترنت بشكل عام.
+
+**النسخ الاحتياطي اليدوي:**
+
+```bash
+# إيقاف InvokeAI
+# نسخ ملف قاعدة البيانات
+cd INVOKE_ROOT
+cp databases/invokeai.db databases/invokeai.db.$(date +%Y%m%d)
+
+# أو إنشاء نسخة احتياطية مضغوطة
+tar -czf invokeai_backup_$(date +%Y%m%d).tar.gz databases/
+```
+
+**برنامج النسخ الاحتياطي الآلي:**
+
+```bash
+#!/bin/bash
+# backup_invokeai.sh
+
+INVOKE_ROOT="/path/to/invoke_root"
+BACKUP_DIR="/path/to/backups"
+DB_PATH="$INVOKE_ROOT/databases/invokeai.db"
+DATE=$(date +%Y%m%d_%H%M%S)
+
+# إنشاء دليل النسخ الاحتياطي
+mkdir -p "$BACKUP_DIR"
+
+# نسخ قاعدة البيانات
+cp "$DB_PATH" "$BACKUP_DIR/invokeai_$DATE.db"
+
+# الاحتفاظ فقط بآخر 30 يوماً
+find "$BACKUP_DIR" -name "invokeai_*.db" -mtime +30 -delete
+
+echo "اكتمل النسخ الاحتياطي: invokeai_$DATE.db"
+```
+
+**الجدولة مع cron:**
+
+```bash
+# تحرير crontab
+crontab -e
+
+# إضافة نسخ احتياطي يومي في الساعة 2 صباحاً
+0 2 * * * /path/to/backup_invokeai.sh
+```
+
+**الاستعادة من النسخة الاحتياطية:**
+
+```bash
+# إيقاف InvokeAI
+# استبدال قاعدة البيانات الحالية بالنسخة الاحتياطية
+cd INVOKE_ROOT
+cp databases/invokeai.db databases/invokeai.db.old # حفظ الحالية
+cp databases/invokeai_backup.db databases/invokeai.db
+
+# إعادة تشغيل InvokeAI
+invokeai-web
+```
+
+**استرداد الكوارث — نسخ احتياطي كامل للنظام:**
+
+قم بتضمين هذه الدلائل/الملفات:
+
+- `databases/` — جميع ملفات قاعدة البيانات
+- `models/` — النماذج المثبتة (إذا كانت مخزنة محلياً)
+- `outputs/` — الصور المنشأة
+- `invokeai.yaml` — ملف التكوين
+- أي نصوص أو تعديلات مخصصة
+
+**عملية الاسترداد:**
+
+
+1. تثبيت InvokeAI على نظام جديد
+2. استعادة ملف التكوين
+3. استعادة دليل قاعدة البيانات
+4. استعادة النماذج والمخرجات
+5. التحقق من أذونات الملف
+6. بدء InvokeAI واختباره
+
+
+## استكشاف الأخطاء وإصلاحها
+
+### المستخدم لا يمكنه تسجيل الدخول
+
+**العَرَض:** يبلغ المستخدم عن عدم قدرته على تسجيل الدخول
+
+**التشخيص:**
+
+1. تحقق من وجود الحساب ونشاطه
+
+ ```bash
+ sqlite3 databases/invokeai.db "SELECT * FROM users WHERE email = 'user@example.com';"
+ ```
+
+2. تحقق من كلمة المرور (اطلب من المستخدم محاولة إعادة تعيينها)
+3. تحقق من أن الحساب نشط (`is_active = 1`)
+4. تحقق من قفل الحساب (إذا تم تطبيقه)
+
+**الحلول:**
+
+- إعادة تعيين كلمة مرور المستخدم
+- إعادة تنشيط الحساب المعطل
+- التحقق من صحة عنوان البريد الإلكتروني
+- التحقق من سجلات النظام بحثاً عن أخطاء المصادقة
+
+### أخطاء قاعدة البيانات مقفلة
+
+**العَرَض:** أخطاء "قاعدة البيانات مقفلة"
+
+**الأسباب:**
+
+- عمليات كتابة متزامنة
+- معاملات طويلة المدى
+- عملية النسخ الاحتياطي تصل إلى قاعدة البيانات
+- مشكلات نظام الملفات
+
+**الحلول:**
+
+```bash
+# التحقق من الأقفال
+fuser databases/invokeai.db
+
+# زيادة المهلة (في التكوين)
+# أو التبديل إلى وضع WAL:
+sqlite3 databases/invokeai.db "PRAGMA journal_mode=WAL;"
+```
+
+### نسيان كلمة مرور المسؤول
+
+**عملية الاسترداد:**
+
+
+1. إيقاف InvokeAI
+2. الوصول المباشر إلى قاعدة البيانات:
+
+ ```bash
+ sqlite3 databases/invokeai.db
+ ```
+
+3. إعادة تعيين كلمة مرور المسؤول (يتطلب تجزئة كلمة المرور):
+
+ ```sql
+ -- قم بتوليد التجزئة أولاً باستخدام Python:
+ -- from passlib.context import CryptContext
+ -- pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+ -- print(pwd_context.hash("NewPassword123"))
+
+ UPDATE users
+ SET password_hash = '$2b$12$...'
+ WHERE email = 'admin@example.com';
+ ```
+
+4. إعادة تشغيل InvokeAI
+
+
+:::note[الخطوة 3 البديلة]
+قم بإزالة المسؤول من قاعدة البيانات بالكامل لتشغيل عملية الإعداد عند إعادة تشغيل InvokeAI:
+
+```sql
+DELETE FROM users
+WHERE email = 'admin@example.com';
+```
+:::
+
+
+### مشكلات الأداء
+
+**العَرَض:** توليد بطيء أو واجهة مستخدم بطيئة
+
+**التشخيص:**
+
+
+1. التحقق من عدد التوليدات النشطة
+2. مراجعة استخدام الموارد (CPU/GPU/RAM)
+3. التحقق من حجم قاعدة البيانات والأداء
+4. مراجعة زمن استجابة الشبكة
+
+
+**الحلول:**
+
+- تحديد عدد التوليدات المتزامنة
+- زيادة موارد الأجهزة
+- تحسين قاعدة البيانات (`VACUUM` و `ANALYZE`)
+- إضافة فهارس للاستعلامات البطيئة
+- النظر في موازنة التحميل
+
+### فشل الهجرة
+
+**العَرَض:** فشل هجرة قاعدة البيانات عند الترقية
+
+**الوقاية:**
+
+- قم دائماً بالنسخ الاحتياطي قبل الترقية
+- اختبر الهجرة على نسخة من قاعدة البيانات
+- راجع سجلات الهجرة
+
+**الاسترداد:**
+
+```bash
+# استعادة النسخة الاحتياطية
+cp databases/invokeai.db.backup databases/invokeai.db
+
+# حاول الهجرة مرة أخرى مع تسجيل مفصل
+invokeai-web --log-level DEBUG
+```
+
+## مرجع التكوين
+
+### مثال تكوين كامل لموقع عام
+
+```yaml
+# invokeai.yaml - تكوين متعدد المستخدمين
+
+# بيانات وصفية داخلية - لا تقم بالتعديل:
+schema_version: 4.0.2
+
+# ضع إعدادات المستخدم هنا
+multiuser: true
+
+# الخادم
+host: "0.0.0.0"
+port: 9090
+
+# الأداء
+enable_partial_loading: true
+precision: float16
+pytorch_cuda_alloc_conf: "backend:cudaMallocAsync"
+hashing_algorithm: blake3_multi
+```
+
+## الأسئلة الشائعة
+
+### كم عدد المستخدمين الذي يمكن لـ InvokeAI دعمه؟
+
+سيدعم الخادم الخلفي عشرات المستخدمين المتزامنين. ومع ذلك، نظراً لأن قائمة انتظار توليد الصور أحادية الخيط، تتم معالجة مهام توليد الصور على أساس من يأتي أولاً يخدم أولاً. هذا يعني أنه قد يضطر المستخدم إلى انتظار اكتمال جميع مهام توليد الصور للمستخدمين الآخرين قبل بدء تنفيذ مهمة التوليد الخاصة به.
+
+قد يدعم إصدار مستقبلي من InvokeAI التنفيذ المتزامن على أنظمة تحتوي على وحدات معالجة رسومية/بطاقات رسومات متعددة.
+
+### هل يمكنني التكامل مع أنظمة المصادقة الموجودة؟
+
+دعم OAuth2/OpenID Connect مخطط له لإصدار مستقبلي. حالياً، يستخدم InvokeAI نظام المصادقة الخاص به.
+
+### كيف يمكنني تدقيق إجراءات المستخدم؟
+
+تسجيل التدقيق الكامل مخطط له لإصدار مستقبلي. حالياً، يمكنك:
+
+- مراقبة قائمة انتظار التوليد
+- مراجعة تغييرات قاعدة البيانات
+- التحقق من سجلات التطبيق
+
+### هل يمكن أن يكون للمستخدمين وصول مختلف للنماذج؟
+
+حالياً، يمكن لجميع المستخدمين عرض واستخدام جميع النماذج المثبتة. الوصول إلى النموذج لكل مستخدم هو تحسين محتمل. يرجى إعلام فريق التطوير إذا كنت تريد هذه الميزة.
+
+### كيف أتعامل مع بيانات المستخدم عندما يغادر؟
+
+أفضل الممارسات:
+
+
+1. قم بتعطيل الحساب أولاً
+2. نقل ملكية اللوحات المشتركة
+3. بعد فترة انتقالية، احذف الحساب
+4. أو أبقِ الحساب معطلاً لأغراض التدقيق
+
+
+### ما هو تأثير الترخيص لوضع متعدد المستخدمين؟
+
+يبقى InvokeAI تحت ترخيصه الحالي. الوضع متعدد المستخدمين لا يغير شروط الترخيص.
+
+## الحصول على المساعدة
+
+### الدعم
+
+- **الوثائق العامة**: [InvokeAI Docs](https://invoke.ai/)
+- **دليل المستخدم**: [للمستخدمين](/features/multi-user-mode/user-guide/)
+- **دليل واجهة برمجة التطبيقات**: [للمطورين](/features/multi-user-mode/api-guide/)
+- **Discord**: [انضم إلى المجتمع](https://discord.gg/ZmtBAhwWhy)
+- **GitHub Issues**: [الإبلاغ عن المشكلات](https://github.com/invoke-ai/InvokeAI/issues)
diff --git a/docs/src/content/docs/ar/features/Multi-User Mode/api-guide.mdx b/docs/src/content/docs/ar/features/Multi-User Mode/api-guide.mdx
new file mode 100644
index 00000000000..180c4319436
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Multi-User Mode/api-guide.mdx
@@ -0,0 +1,1227 @@
+---
+title: دليل واجهة برمجة التطبيقات متعدد المستخدمين
+description: كيفية المصادقة والتفاعل مع واجهة برمجة تطبيقات InvokeAI في الوضع متعدد المستخدمين.
+sidebar:
+ order: 5
+---
+import { Steps } from '@astrojs/starlight/components'
+
+## نظرة عامة
+
+يشرح هذا الدليل كيفية التفاعل مع واجهة برمجة تطبيقات InvokeAI في كل من وضع المستخدم الفردي والمتعدد المستخدمين. يعتمد سلوك واجهة برمجة التطبيقات على إعداد التكوين `multiuser`.
+
+### وضع المستخدم الفردي مقابل وضع متعدد المستخدمين
+
+**وضع المستخدم الفردي** (`multiuser: false` أو الخيار غير موجود):
+
+- لا حاجة للمصادقة
+- جميع نقاط نهاية واجهة برمجة التطبيقات قابلة للوصول بدون رموز مميزة
+- وصول مباشر لواجهة برمجة التطبيقات مثل إصدارات InvokeAI السابقة
+- جميع المحتويات مرئية في عرض موحد
+
+**وضع متعدد المستخدمين** (`multiuser: true`):
+
+- مصادقة رمز JWT مطلوبة
+- وصول محدد بنطاق المستخدم إلى الموارد
+- تفويض قائم على الدور (مسؤول مقابل مستخدم عادي)
+- عزل البيانات بين المستخدمين
+
+## المصادقة (وضع متعدد المستخدمين فقط)
+
+### تدفق المصادقة
+
+عند تمكين الوضع متعدد المستخدمين، تتطلب معظم نقاط نهاية واجهة برمجة التطبيقات مصادقة باستخدام رموز JWT الحاملة. نقاط نهاية المصادقة غير المصادقة هي `GET /api/v1/auth/status` و `POST /api/v1/auth/setup` و `POST /api/v1/auth/login`.
+
+**عملية المصادقة:**
+
+
+1. **الحصول على الرمز**: إرسال بيانات الاعتماد إلى `/api/v1/auth/login`
+2. **تخزين الرمز**: حفظ رمز JWT بشكل آمن
+3. **استخدام الرمز**: تضمين الرمز في رأس `Authorization` لجميع الطلبات
+4. **التحديث**: إعادة المصادقة عندما ينتهي الرمز
+
+
+:::note[وضع المستخدم الفردي]
+عند التشغيل في وضع المستخدم الفردي (`multiuser: false`)، نقاط نهاية المصادقة غير متاحة ورؤوس المصادقة غير مطلوبة.
+:::
+
+### نقطة نهاية تسجيل الدخول
+
+**نقطة النهاية:** `POST /api/v1/auth/login`
+
+**الطلب:**
+
+```json
+{
+ "email": "user@example.com",
+ "password": "SecurePassword123",
+ "remember_me": false
+}
+```
+
+**الاستجابة (نجاح):**
+
+```json
+{
+ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
+ "user": {
+ "user_id": "abc123",
+ "email": "user@example.com",
+ "display_name": "John Doe",
+ "is_admin": false,
+ "is_active": true,
+ "created_at": "2024-01-15T10:00:00Z",
+ "updated_at": "2024-01-15T10:00:00Z",
+ "last_login_at": "2024-01-15T15:30:00Z"
+ },
+ "expires_in": 86400
+}
+```
+
+**الاستجابة (خطأ):**
+
+```json
+{
+ "detail": "بريد إلكتروني أو كلمة مرور غير صحيحة"
+}
+```
+
+**رموز الحالة:**
+
+- `200 OK` — المصادقة ناجحة
+- `401 Unauthorized` — بيانات اعتماد غير صالحة
+- `403 Forbidden` — الحساب معطل
+- `422 Unprocessable Entity` — تنسيق طلب غير صالح
+
+### استخدام الرمز المميز
+
+قم بتضمين رمز JWT في رأس `Authorization` باستخدام مخطط `Bearer`:
+
+**رأس HTTP:**
+
+```
+Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
+```
+
+**مثال طلب HTTP:**
+
+```http
+GET /api/v1/boards HTTP/1.1
+Host: localhost:9090
+Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
+Content-Type: application/json
+```
+
+### انتهاء صلاحية الرمز المميز
+
+للرموز المميزة عمر محدود:
+
+- **افتراضي**: 24 ساعة (86400 ثانية)
+- **تذكرني**: 7 أيام (604800 ثانية)
+
+**معالجة انتهاء الصلاحية:**
+
+```python
+import requests
+import time
+
+def api_request(url, token, max_retries=1):
+ headers = {"Authorization": f"Bearer {token}"}
+ response = requests.get(url, headers=headers)
+
+ if response.status_code == 401: # الرمز منتهي
+ # إعادة المصادقة والمحاولة
+ new_token = login()
+ headers = {"Authorization": f"Bearer {new_token}"}
+ response = requests.get(url, headers=headers)
+
+ return response
+```
+
+### نقطة نهاية تسجيل الخروج
+
+**نقطة النهاية:** `POST /api/v1/auth/logout`
+
+**الطلب:**
+
+```http
+POST /api/v1/auth/logout HTTP/1.1
+Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
+```
+
+**الاستجابة:**
+
+```json
+{
+ "success": true
+}
+```
+
+**ملاحظة:** مع رموز JWT، تسجيل الخروج هو في الأساس من جانب العميل (حذف الرمز). قد يتم إضافة إبطال جلسة الخادم في الإصدارات المستقبلية.
+
+## أمثلة على الكود
+
+### Python
+
+**باستخدام مكتبة `requests`:**
+
+```python
+import requests
+import json
+
+class InvokeAIClient:
+ def __init__(self, base_url="http://localhost:9090"):
+ self.base_url = base_url
+ self.token = None
+
+ def login(self, email, password, remember_me=False):
+ """المصادقة وتخزين الرمز المميز."""
+ url = f"{self.base_url}/api/v1/auth/login"
+ payload = {
+ "email": email,
+ "password": password,
+ "remember_me": remember_me
+ }
+
+ response = requests.post(url, json=payload)
+ response.raise_for_status()
+
+ data = response.json()
+ self.token = data["token"]
+ return data["user"]
+
+ def _get_headers(self):
+ """الحصول على الرؤوس مع رمز المصادقة."""
+ if not self.token:
+ raise Exception("غير مصادق. قم باستدعاء login() أولاً.")
+
+ return {
+ "Authorization": f"Bearer {self.token}",
+ "Content-Type": "application/json"
+ }
+
+ def get_boards(self):
+ """الحصول على لوحات المستخدم."""
+ url = f"{self.base_url}/api/v1/boards/"
+ response = requests.get(url, headers=self._get_headers())
+ response.raise_for_status()
+ return response.json()
+
+ def create_board(self, board_name):
+ """إنشاء لوحة جديدة."""
+ url = f"{self.base_url}/api/v1/boards/"
+ response = requests.post(
+ url,
+ params={"board_name": board_name},
+ headers=self._get_headers()
+ )
+ response.raise_for_status()
+ return response.json()
+
+ def logout(self):
+ """تسجيل الخروج ومسح الرمز المميز."""
+ url = f"{self.base_url}/api/v1/auth/logout"
+ response = requests.post(url, headers=self._get_headers())
+ self.token = None
+ return response.json()
+
+# الاستخدام
+client = InvokeAIClient()
+user = client.login("user@example.com", "SecurePassword123")
+print(f"تم تسجيل الدخول باسم: {user['display_name']}")
+
+boards = client.get_boards()
+print(f"المستخدم لديه {len(boards['items'])} لوحة")
+
+new_board = client.create_board("لوحتي الجديدة")
+print(f"تم إنشاء اللوحة: {new_board['board_name']}")
+
+client.logout()
+```
+
+**معالجة الأخطاء:**
+
+```python
+import requests
+from requests.exceptions import HTTPError
+
+def safe_api_call(client, method, *args, **kwargs):
+ """إجراء استدعاء واجهة برمجة تطبيقات مع معالجة الأخطاء."""
+ try:
+ func = getattr(client, method)
+ return func(*args, **kwargs)
+
+ except HTTPError as e:
+ if e.response.status_code == 401:
+ print("فشلت المصادقة أو الرمز منتهي")
+ # إعادة المصادقة
+ client.login(email, password)
+ # إعادة المحاولة
+ return func(*args, **kwargs)
+ elif e.response.status_code == 403:
+ print("تم رفض الإذن")
+ elif e.response.status_code == 404:
+ print("الموارد غير موجودة")
+ else:
+ print(f"خطأ في واجهة برمجة التطبيقات: {e.response.status_code}")
+ print(e.response.text)
+
+ raise
+
+# الاستخدام
+try:
+ boards = safe_api_call(client, "get_boards")
+except Exception as e:
+ print(f"فشل في الحصول على اللوحات: {e}")
+```
+
+### JavaScript/TypeScript
+
+**باستخدام واجهة برمجة تطبيقات `fetch`:**
+
+```javascript
+class InvokeAIClient {
+ constructor(baseUrl = 'http://localhost:9090') {
+ this.baseUrl = baseUrl;
+ this.token = null;
+ }
+
+ async login(email, password, rememberMe = false) {
+ const response = await fetch(`${this.baseUrl}/api/v1/auth/login`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ email,
+ password,
+ remember_me: rememberMe,
+ }),
+ });
+
+ if (!response.ok) {
+ throw new Error(`فشل تسجيل الدخول: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ this.token = data.token;
+
+ // تخزين الرمز في localStorage
+ localStorage.setItem('invokeai_token', data.token);
+
+ return data.user;
+ }
+
+ getHeaders() {
+ if (!this.token) {
+ throw new Error('غير مصادق. قم باستدعاء login() أولاً.');
+ }
+
+ return {
+ 'Authorization': `Bearer ${this.token}`,
+ 'Content-Type': 'application/json',
+ };
+ }
+
+ async getBoards() {
+ const response = await fetch(`${this.baseUrl}/api/v1/boards/`, {
+ headers: this.getHeaders(),
+ });
+
+ if (!response.ok) {
+ throw new Error(`فشل في الحصول على اللوحات: ${response.statusText}`);
+ }
+
+ return response.json();
+ }
+
+ async createBoard(boardName) {
+ const url = new URL(`${this.baseUrl}/api/v1/boards/`);
+ url.searchParams.set('board_name', boardName);
+ const response = await fetch(url, {
+ method: 'POST',
+ headers: this.getHeaders(),
+ });
+
+ if (!response.ok) {
+ throw new Error(`فشل في إنشاء اللوحة: ${response.statusText}`);
+ }
+
+ return response.json();
+ }
+
+ async logout() {
+ const response = await fetch(`${this.baseUrl}/api/v1/auth/logout`, {
+ method: 'POST',
+ headers: this.getHeaders(),
+ });
+
+ this.token = null;
+ localStorage.removeItem('invokeai_token');
+
+ return response.json();
+ }
+}
+
+// الاستخدام
+(async () => {
+ const client = new InvokeAIClient();
+
+ try {
+ const user = await client.login('user@example.com', 'SecurePassword123');
+ console.log(`تم تسجيل الدخول باسم: ${user.display_name}`);
+
+ const boards = await client.getBoards();
+ console.log(`المستخدم لديه ${boards.items.length} لوحة`);
+
+ const newBoard = await client.createBoard('لوحتي الجديدة');
+ console.log(`تم إنشاء اللوحة: ${newBoard.board_name}`);
+
+ await client.logout();
+ } catch (error) {
+ console.error('خطأ:', error.message);
+ }
+})();
+```
+
+**TypeScript مع الأنواع:**
+
+```typescript
+interface LoginRequest {
+ email: string;
+ password: string;
+ remember_me?: boolean;
+}
+
+interface User {
+ user_id: string;
+ email: string;
+ display_name: string;
+ is_admin: boolean;
+ is_active: boolean;
+ created_at: string;
+}
+
+interface LoginResponse {
+ token: string;
+ user: User;
+ expires_in: number;
+}
+
+interface Board {
+ board_id: string;
+ board_name: string;
+ created_at: string;
+ updated_at: string;
+ deleted_at?: string;
+ cover_image_name?: string;
+}
+
+class InvokeAIClient {
+ private baseUrl: string;
+ private token: string | null = null;
+
+ constructor(baseUrl: string = 'http://localhost:9090') {
+ this.baseUrl = baseUrl;
+ }
+
+ async login(
+ email: string,
+ password: string,
+ rememberMe: boolean = false
+ ): Promise {
+ const response = await fetch(`${this.baseUrl}/api/v1/auth/login`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ email, password, remember_me: rememberMe }),
+ });
+
+ if (!response.ok) {
+ const error = await response.json();
+ throw new Error(error.detail || 'فشل تسجيل الدخول');
+ }
+
+ const data: LoginResponse = await response.json();
+ this.token = data.token;
+ return data.user;
+ }
+
+ private getHeaders(): HeadersInit {
+ if (!this.token) {
+ throw new Error('غير مصادق');
+ }
+ return {
+ 'Authorization': `Bearer ${this.token}`,
+ 'Content-Type': 'application/json',
+ };
+ }
+
+ async getBoards(): Promise<{ items: Board[] }> {
+ const response = await fetch(`${this.baseUrl}/api/v1/boards/`, {
+ headers: this.getHeaders(),
+ });
+
+ if (!response.ok) {
+ throw new Error('فشل في الحصول على اللوحات');
+ }
+
+ return response.json();
+ }
+}
+```
+
+### cURL
+
+**تسجيل الدخول:**
+
+```bash
+# تسجيل الدخول واستخراج الرمز
+TOKEN=$(curl -X POST http://localhost:9090/api/v1/auth/login \
+ -H "Content-Type: application/json" \
+ -d '{
+ "email": "user@example.com",
+ "password": "SecurePassword123",
+ "remember_me": false
+ }' | jq -r '.token')
+
+echo "الرمز: $TOKEN"
+```
+
+**الحصول على اللوحات:**
+
+```bash
+curl -X GET http://localhost:9090/api/v1/boards/ \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "Content-Type: application/json"
+```
+
+**إنشاء لوحة:**
+
+```bash
+curl -X POST "http://localhost:9090/api/v1/boards/?board_name=My%20API%20Board" \
+ -H "Authorization: Bearer $TOKEN"
+```
+
+## تغييرات نقاط نهاية واجهة برمجة التطبيقات
+
+### المصادقة مطلوبة
+
+جميع نقاط النهاية تتطلب الآن مصادقة باستثناء:
+
+- `GET /api/v1/auth/status` — التحقق مما إذا كان إعداد متعدد المستخدمين مطلوباً
+- `POST /api/v1/auth/setup` — إعداد المسؤول الأولي
+- `POST /api/v1/auth/login` — تسجيل دخول المستخدم
+- `GET /api/v1/images/i/{image_name}/full` — ملف الصورة كامل الدقة
+- `GET /api/v1/images/i/{image_name}/thumbnail` — صورة مصغرة
+- `GET /api/v1/workflows/i/{workflow_id}/thumbnail` — صورة مصغرة لسير العمل
+
+نقاط نهاية الصورة والصورة المصغرة غير مصادقة عن قصد لأن المتصفحات تحمل هذه الموارد عبر علامات `
`، التي لا يمكنها إرسال رؤوس `Authorization`. يعتمد الأمن على حقيقة أن معرفات الصور وسير العمل هي UUIDs وبالتالي لا يمكن تخمينها.
+
+### الموارد المحددة بنطاق المستخدم
+
+يتم الآن تصفية الموارد حسب المستخدم المصادق:
+
+**اللوحات:**
+
+```python
+# قبل (مستخدم فردي)
+GET /api/v1/boards/?all=true # يرجع جميع اللوحات
+
+# بعد (متعدد المستخدمين)
+GET /api/v1/boards/?all=true # يرجع اللوحات التي يمكن للمستخدم الحالي الوصول إليها، بما في ذلك لوحاته الخاصة بالإضافة إلى اللوحات المشتركة/العامة؛ يمكن للمسؤولين رؤية جميع اللوحات
+```
+
+**الصور:**
+
+```python
+# يتم تصفية الصور حسب ملكية اللوحة
+GET /api/v1/images/ # يعرض فقط الصور على لوحات المستخدم
+```
+
+**سير العمل:**
+
+```python
+# يرجع سير عمل المستخدم + سير العمل العامة
+GET /api/v1/workflows/
+```
+
+**قائمة الانتظار:**
+
+```python
+# المستخدمون العاديون يرون عناصر قائمة الانتظار الخاصة بهم كاملة وقد يرون تفاصيل محجوبة لعناصر المستخدمين الآخرين في نقاط نهاية حالة قائمة الانتظار
+GET /api/v1/queue/... # بيانات قائمة الانتظار، منقاة للمشاهدين غير المسؤولين
+
+# المسؤولون يرون جميع عناصر قائمة الانتظار كاملة
+GET /api/v1/queue/... # بيانات قائمة الانتظار كاملة
+```
+
+### نقاط نهاية المسؤول
+
+بعض نقاط النهاية تتطلب صلاحيات المسؤول:
+
+**إدارة المستخدمين:**
+
+```python
+GET /api/v1/auth/users # قائمة المستخدمين (المسؤول فقط)
+POST /api/v1/auth/users # إنشاء مستخدم (المسؤول فقط)
+GET /api/v1/auth/users/{id} # الحصول على مستخدم (المسؤول فقط)
+PATCH /api/v1/auth/users/{id} # تحديث مستخدم (المسؤول فقط)
+DELETE /api/v1/auth/users/{id} # حذف مستخدم (المسؤول فقط)
+```
+
+**إدارة النماذج (عمليات الكتابة):**
+
+```python
+POST /api/v2/models/install # تثبيت نموذج (المسؤول فقط)
+DELETE /api/v2/models/i/{key} # حذف نموذج (المسؤول فقط)
+PATCH /api/v2/models/i/{key} # تحديث نموذج (المسؤول فقط)
+PUT /api/v2/models/convert/{key} # تحويل نموذج (المسؤول فقط)
+```
+
+**إدارة النماذج (عمليات القراءة):**
+
+```python
+GET /api/v2/models/ # قائمة النماذج (جميع المستخدمين)
+GET /api/v2/models/i/{key} # الحصول على تفاصيل النموذج (جميع المستخدمين)
+```
+
+### استجابات الخطأ
+
+**401 غير مصرح:**
+
+```json
+{
+ "detail": "بيانات اعتماد المصادقة غير صالحة"
+}
+```
+
+يحدث عندما:
+
+- الرمز المميز مفقود
+- الرمز المميز غير صالح
+- الرمز المميز منتهي الصلاحية
+- توقيع الرمز المميز غير صالح
+
+**403 ممنوع:**
+
+```json
+{
+ "detail": "صلاحيات المسؤول مطلوبة"
+}
+```
+
+يحدث عندما:
+
+- يحاول المستخدم عملية خاصة بالمسؤول فقط
+- الحساب معطل
+- أذونات غير كافية
+
+**404 غير موجود:**
+
+```json
+{
+ "detail": "الموارد غير موجودة"
+}
+```
+
+يحدث عندما:
+
+- المورد غير موجود
+- المستخدم ليس لديه حق الوصول إلى المورد
+
+## نقاط نهاية واجهة برمجة التطبيقات متعددة المستخدمين
+
+### نقاط نهاية المصادقة
+
+#### التحقق مما إذا كان إعداد المسؤول الأولي مطلوباً
+
+**نقطة النهاية:** `GET /api/v1/auth/status`
+
+**الوصف:** يرجع SetupStatusResponse يشير إلى ما إذا كان الإعداد مطلوباً وحالة الوضع متعدد المستخدمين.
+
+**الطلب:** لا توجد معاملات
+
+**الاستجابة (الإعداد الأولي لم يكتمل بعد):**
+```json
+{
+ "setup_required": true,
+ "multiuser_enabled": true,
+ "strict_password_checking": true,
+ "admin_email": "admin@example.com"
+}
+```
+
+**الاستجابة (الإعداد مكتمل بالفعل، أو تم تعطيل متعدد المستخدمين):**
+```json
+{
+ "setup_required": false,
+ "multiuser_enabled": true,
+ "strict_password_checking": true,
+ "admin_email": null
+}
+```
+
+:::note
+يتم ملء `admin_email` فقط بينما `setup_required` هو `true` (للمساعدة في تحديد موقع حساب المسؤول المسبق التعبئة أثناء الإعداد الأولي). بمجرد إنشاء مسؤول — وعندما يكون الوضع متعدد المستخدمين معطلاً — يتم إرجاعه كـ `null` لتجنب تسريب هوية المسؤول على النشرات العامة.
+:::
+
+
+#### إعداد المسؤول
+
+**نقطة النهاية:** `POST /api/v1/auth/setup`
+
+**الوصف:** إنشاء حساب المسؤول الأولي (يعمل فقط إذا لم يكن هناك مسؤول موجود)
+
+**الطلب:**
+
+```json
+{
+ "email": "admin@example.com",
+ "display_name": "Administrator",
+ "password": "SecureAdminPass123"
+}
+```
+
+**الاستجابة:**
+
+```json
+{
+ "success": true,
+ "user": {
+ "user_id": "abc123",
+ "email": "admin@example.com",
+ "display_name": "Administrator",
+ "is_admin": true,
+ "is_active": true
+ }
+}
+```
+
+
+#### الحصول على المستخدم الحالي
+
+**نقطة النهاية:** `GET /api/v1/auth/me`
+
+**الوصف:** الحصول على معلومات المستخدم المصادق حالياً
+
+**الطلب:**
+
+```http
+GET /api/v1/auth/me
+Authorization: Bearer
+```
+
+**الاستجابة:**
+
+```json
+{
+ "user_id": "abc123",
+ "email": "user@example.com",
+ "display_name": "John Doe",
+ "is_admin": false,
+ "is_active": true,
+ "created_at": "2024-01-15T10:00:00Z",
+ "updated_at": "2024-01-15T10:00:00Z",
+ "last_login_at": "2024-01-15T15:30:00Z"
+}
+```
+
+### نقاط نهاية إدارة المستخدمين (للمسؤول فقط)
+
+#### قائمة المستخدمين
+
+**نقطة النهاية:** `GET /api/v1/auth/users`
+
+**الطلب:**
+
+```http
+GET /api/v1/auth/users
+Authorization: Bearer
+```
+
+**الاستجابة:**
+
+```json
+[
+ {
+ "user_id": "abc123",
+ "email": "user@example.com",
+ "display_name": "John Doe",
+ "is_admin": false,
+ "is_active": true,
+ "created_at": "2024-01-15T10:00:00Z",
+ "updated_at": "2024-04-25T17:23:00Z",
+ "last_login_at": "2024-01-15T15:30:00Z"
+ }
+]
+```
+
+#### إنشاء مستخدم
+
+**نقطة النهاية:** `POST /api/v1/auth/users`
+
+**الطلب:**
+
+```json
+{
+ "email": "newuser@example.com",
+ "display_name": "New User",
+ "password": "TempPassword123",
+ "is_admin": false
+}
+```
+
+**الاستجابة:**
+
+```json
+{
+ "user_id": "xyz789",
+ "email": "newuser@example.com",
+ "display_name": "New User",
+ "is_admin": false,
+ "is_active": true,
+ "created_at": "2024-01-15T16:00:00Z"
+}
+```
+
+#### تحديث مستخدم
+
+**نقطة النهاية:** `PATCH /api/v1/auth/users/{user_id}`
+
+**الطلب:**
+
+```json
+{
+ "display_name": "Updated Name",
+ "is_active": true,
+ "is_admin": false
+}
+```
+
+**الاستجابة:**
+
+```json
+{
+ "user_id": "xyz789",
+ "email": "newuser@example.com",
+ "display_name": "Updated Name",
+ "is_admin": false,
+ "is_active": true
+}
+```
+
+#### حذف مستخدم
+
+**نقطة النهاية:** `DELETE /api/v1/auth/users/{user_id}`
+
+**الاستجابة:**
+
+يرجع `204 No Content` عند النجاح.
+
+عند حدوث خطأ، يرجع `422 Unprocessable Content` و JSON التالي:
+
+```json
+{
+ "detail": [
+ {
+ "loc": [
+ "string",
+ 0
+ ],
+ "msg": "string",
+ "type": "string"
+ }
+ ]
+}
+```
+
+#### قائمة لوحات الصور
+
+**نقطة النهاية:** `GET /api/v1/boards/`
+
+**الاستجابة:**
+
+```json
+{
+ "limit": 0,
+ "offset": 0,
+ "total": 0,
+ "items": [
+ {
+ "board_id": "8b31a33d-0acb-46fe-8612-83601481cf2c",
+ "board_name": "Testing Board",
+ "user_id": "string",
+ "created_at": "2026-05-07T03:04:00.738Z",
+ "updated_at": "2026-05-07T03:04:00.738Z",
+ "deleted_at": "2026-05-07T03:04:00.738Z",
+ "cover_image_name": "string",
+ "archived": false,
+ "board_visibility": "private",
+ "image_count": 0,
+ "asset_count": 0,
+ "owner_username": "string"
+ }
+ ]
+}
+```
+
+يرجع هذا استجابة مقسمة إلى صفحات. راجع صفحة swagger (`http://localhost:9090/docs#/boards/list_boards`) للحصول على التفاصيل.
+سيكون حقل `board_visibility` واحداً من:
+
+- `private` — خاص للمالك والمسؤول
+- `shared` — قراءة/كتابة للمالك والمسؤول، قراءة فقط للجميع
+- `public` — قراءة/كتابة للجميع
+
+#### الحصول على لوحة واحدة
+
+**نقطة النهاية:** `GET /api/v1/boards/{board_id}`
+
+**الاستجابة:**
+
+```json
+{
+ "board_id": "8b31a33d-0acb-46fe-8612-83601481cf2c",
+ "board_name": "Testing Board",
+ "user_id": "3c59a0ba-f4c7-4275-b96f-82179e8aaff8",
+ "created_at": "2026-03-09 16:10:47.095",
+ "updated_at": "2026-03-09 16:10:55",
+ "deleted_at": null,
+ "cover_image_name": "08689e4b-f084-4c49-83a8-4fc1edb167c4.png",
+ "archived": false,
+ "board_visibility": "shared",
+ "image_count": 55,
+ "asset_count": 0,
+ "owner_username": null
+}
+```
+
+
+## أفضل الممارسات
+
+### تخزين الرمز المميز
+
+**افعل:**
+
+- تخزين الرموز بشكل آمن (سلسلة المفاتيح، تخزين آمن)
+- استخدام HTTPS لنقل الرموز
+- مسح الرموز عند تسجيل الخروج
+- التعامل مع انتهاء صلاحية الرمز بلطف
+
+**لا تفعل:**
+
+- تخزين الرموز في معاملات URL
+- تسجيل الرموز في نص عادي
+- مشاركة الرموز بين المستخدمين
+- تخزين الرموز في التحكم في الإصدارات
+
+### معالجة الأخطاء
+
+تعامل دائماً مع أخطاء المصادقة:
+
+```python
+def make_request(client, func, *args, **kwargs):
+ max_retries = 3
+ retry_count = 0
+
+ while retry_count < max_retries:
+ try:
+ return func(*args, **kwargs)
+ except AuthenticationError:
+ if retry_count >= max_retries - 1:
+ raise
+ # إعادة المصادقة
+ client.login(email, password)
+ retry_count += 1
+ except Exception as e:
+ logger.error(f"فشل الطلب: {e}")
+ raise
+```
+
+### تحديد المعدل
+
+كن حذراً من حدود معدل واجهة برمجة التطبيقات:
+
+- تنفيذ تراجع أسي لإعادة المحاولات
+- تخزين البيانات التي يتم الوصول إليها بشكل متكرر مؤقتاً
+- تجميع الطلبات عندما يكون ذلك ممكناً
+- لا تضرب نقطة نهاية تسجيل الدخول بشكل متكرر
+
+### إدارة الاتصال
+
+```python
+import requests
+from requests.adapters import HTTPAdapter
+from urllib3.util.retry import Retry
+
+def create_session():
+ """إنشاء جلسة مع منطق إعادة المحاولة."""
+ session = requests.Session()
+
+ retry = Retry(
+ total=3,
+ backoff_factor=0.3,
+ status_forcelist=[500, 502, 503, 504],
+ )
+
+ adapter = HTTPAdapter(max_retries=retry)
+ session.mount('http://', adapter)
+ session.mount('https://', adapter)
+
+ return session
+```
+
+## دليل الهجرة
+
+### تحديث الكود الموجود
+
+**قبل (وضع المستخدم الفردي):**
+
+```python
+import requests
+
+def get_boards():
+ response = requests.get("http://localhost:9090/api/v1/boards/")
+ return response.json()
+```
+
+**بعد (وضع متعدد المستخدمين):**
+
+```python
+import requests
+
+class APIClient:
+ def __init__(self):
+ self.token = None
+
+ def login(self, email, password):
+ response = requests.post(
+ "http://localhost:9090/api/v1/auth/login",
+ json={"email": email, "password": password}
+ )
+ self.token = response.json()["token"]
+
+ def get_boards(self):
+ headers = {"Authorization": f"Bearer {self.token}"}
+ response = requests.get(
+ "http://localhost:9090/api/v1/boards/",
+ headers=headers
+ )
+ return response.json()
+
+# الاستخدام
+client = APIClient()
+client.login("user@example.com", "password")
+boards = client.get_boards()
+```
+
+### التوافق مع الإصدارات السابقة
+
+يدعم InvokeAI كلاً من وضع المستخدم الفردي والمتعدد المستخدمين عبر خيار التكوين `multiuser`.
+
+**التكوين:**
+
+```yaml
+# invokeai.yaml
+
+# وضع المستخدم الفردي (لا مصادقة)
+multiuser: false # أو حذف الخيار تماماً
+
+# وضع متعدد المستخدمين (مصادقة مطلوبة)
+multiuser: true
+```
+
+**التحقق من الوضع برمجياً:**
+
+```python
+def is_multiuser_enabled(base_url):
+ response = requests.get(f"{base_url}/api/v1/auth/status")
+ response.raise_for_status()
+ return response.json()["multiuser_enabled"]
+
+# مثال استخدام
+base_url = "http://localhost:9090"
+if is_multiuser_enabled(base_url):
+ print("وضع متعدد المستخدمين: المصادقة مطلوبة")
+ # استخدام استدعاءات واجهة برمجة التطبيقات المصادق عليها
+else:
+ print("وضع المستخدم الفردي: لا حاجة للمصادقة")
+ # استخدام استدعاءات واجهة برمجة التطبيقات المباشرة
+```
+
+**عميل متكيف:**
+
+```python
+class AdaptiveInvokeAIClient:
+ def __init__(self, base_url="http://localhost:9090"):
+ self.base_url = base_url
+ self.token = None
+ self.multiuser_mode = self._check_multiuser_mode()
+
+ def _check_multiuser_mode(self):
+ """الكشف عن تمكين الوضع متعدد المستخدمين."""
+ try:
+ response = requests.get(f"{self.base_url}/api/v1/boards/")
+ return response.status_code == 401
+ except:
+ return False
+
+ def login(self, email, password):
+ """تسجيل الدخول (مطلوب فقط في الوضع متعدد المستخدمين)."""
+ if not self.multiuser_mode:
+ print("وضع المستخدم الفردي: تسجيل الدخول غير مطلوب")
+ return
+
+ response = requests.post(
+ f"{self.base_url}/api/v1/auth/login",
+ json={"email": email, "password": password}
+ )
+ self.token = response.json()["token"]
+
+ def _get_headers(self):
+ """الحصول على الرؤوس (مع رمز المصادقة إذا كان في وضع متعدد المستخدمين)."""
+ if self.multiuser_mode and self.token:
+ return {"Authorization": f"Bearer {self.token}"}
+ return {}
+
+ def get_boards(self):
+ """الحصول على اللوحات (يعمل في كلا الوضعين)."""
+ response = requests.get(
+ f"{self.base_url}/api/v1/boards/",
+ headers=self._get_headers()
+ )
+ return response.json()
+```
+
+## توثيق OpenAPI/Swagger
+
+يوفر InvokeAI توثيق OpenAPI لجميع نقاط النهاية.
+
+**الوصول إلى واجهة Swagger UI:**
+
+```
+http://localhost:9090/docs
+```
+
+**تنزيل مخطط OpenAPI:**
+
+```bash
+curl http://localhost:9090/openapi.json > invokeai_openapi.json
+```
+
+**توليد كود العميل:**
+
+استخدم أدوات مثل `openapi-generator` لتوليد مكتبات العميل:
+
+```bash
+# توليد عميل Python
+openapi-generator generate \
+ -i http://localhost:9090/openapi.json \
+ -g python \
+ -o ./invokeai-client
+
+# توليد عميل TypeScript
+openapi-generator generate \
+ -i http://localhost:9090/openapi.json \
+ -g typescript-fetch \
+ -o ./invokeai-client-ts
+```
+
+## اعتبارات الأمان
+
+### HTTPS
+
+استخدم دائماً HTTPS في الإنتاج:
+
+```python
+# التطوير
+client = InvokeAIClient("http://localhost:9090")
+
+# الإنتاج
+client = InvokeAIClient("https://invoke.example.com")
+```
+
+### أمان الرمز المميز
+
+حماية رموز JWT:
+
+```python
+# لا تقم أبداً بتسجيل الرموز
+logger.info(f"تم تسجيل دخول المستخدم") # جيد
+logger.info(f"الرمز: {token}") # سيء!
+
+# استخدم متغيرات البيئة لبيانات الاعتماد
+import os
+email = os.environ.get("INVOKEAI_EMAIL")
+password = os.environ.get("INVOKEAI_PASSWORD")
+```
+
+### التحقق من صحة الإدخال
+
+تحقق دائماً من صحة إدخال المستخدم:
+
+```python
+import re
+
+def validate_email(email):
+ pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
+ return re.match(pattern, email) is not None
+
+def validate_password(password):
+ """التحقق من أن كلمة المرور تفي بالمتطلبات."""
+ if len(password) < 8:
+ return False, "يجب أن تكون كلمة المرور 8 أحرف على الأقل"
+ if not any(c.isupper() for c in password):
+ return False, "يجب أن تحتوي كلمة المرور على أحرف كبيرة"
+ if not any(c.islower() for c in password):
+ return False, "يجب أن تحتوي كلمة المرور على أحرف صغيرة"
+ if not any(c.isdigit() for c in password):
+ return False, "يجب أن تحتوي كلمة المرور على أرقام"
+ return True, ""
+```
+
+## استكشاف الأخطاء وإصلاحها
+
+### المشكلات الشائعة
+
+**المشكلة: "بيانات اعتماد المصادقة غير صالحة"**
+
+- الرمز منتهي — أعد المصادقة
+- الرمز مشوه — تحقق من سلسلة الرمز
+- توقيع الرمز غير صالح — تحقق من أن المفتاح السري لم يتغير
+
+**المشكلة: "صلاحيات المسؤول مطلوبة"**
+
+- المستخدم ليس مسؤولاً
+- استخدم حساب مسؤول لهذه العملية
+
+**المشكلة: الرمز لا يتم إرساله**
+
+- تحقق من وجود رأس `Authorization`
+- تحقق من تضمين بادئة `Bearer`
+- تحقق من أن الرمز لم يتم اقتطاعه
+
+**المشكلة: أخطاء CORS**
+
+قم بتكوين CORS في InvokeAI:
+
+```yaml
+# invokeai.yaml
+allow_origins:
+ - "http://localhost:3000"
+ - "https://myapp.example.com"
+allow_credentials: true
+allow_methods:
+ - "*"
+allow_headers:
+ - "*"
+```
+
+## موارد إضافية
+
+- [دليل المستخدم](./user-guide/) — للمستخدمين النهائيين
+- [دليل المسؤول](./admin-guide/) — للمسؤولين
+- [مستودع GitHub](https://github.com/invoke-ai/InvokeAI) — الكود المصدري
+
+---
+
+**أسئلة؟** قم بزيارة [InvokeAI Discord](https://discord.gg/ZmtBAhwWhy) أو تحقق من [الأسئلة الشائعة](/troubleshooting/faq/).
diff --git a/docs/src/content/docs/ar/features/Multi-User Mode/user-guide.mdx b/docs/src/content/docs/ar/features/Multi-User Mode/user-guide.mdx
new file mode 100644
index 00000000000..012993115ac
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Multi-User Mode/user-guide.mdx
@@ -0,0 +1,365 @@
+---
+title: دليل المستخدم متعدد المستخدمين
+description: كيفية استخدام InvokeAI في وضع متعدد المستخدمين كمستخدم نهائي.
+sidebar:
+ order: 3
+---
+import { Steps } from '@astrojs/starlight/components'
+
+## نظرة عامة
+
+الوضع متعدد المستخدمين هو ميزة حديثة (تم تقديمها في الإصدار 6.12)، والتي تسمح لعدة أفراد بمشاركة خادم InvokeAI واحد مع الحفاظ على عملهم منفصلاً ومنظماً. لكل مستخدم اسم مستخدم وكلمة مرور خاصة به، وصور، وأصول، ولوحات صور، وإعدادات تخصيص، وسير عمل خاصة به.
+
+يتم التعرف على نوعين من المستخدمين:
+
+- المستخدم ذو حالة **المسؤول** يمكنه إضافة وإزالة وتعديل المستخدمين الآخرين، ويمكنه تثبيت النماذج. لديه أيضاً القدرة على عرض قائمة الانتظار الكاملة وإيقاف أو إنهاء مهام المستخدمين الآخرين.
+- المستخدمون **غير المسؤولين** يمكنهم تعديل ملفهم الشخصي الخاص ولكن ليس ملفات الآخرين. كما ليس لديهم القدرة على تثبيت أو تكوين النماذج، ولكن يجب عليهم طلب مسؤول للقيام بهذه المهمة. عند عرض قائمة انتظار التوليد، يمكنهم رؤية التفاصيل الكاملة لمهامهم الخاصة، ولكن المهام المملوكة من قبل مستخدمين آخرين سيكون لها معرف المستخدم ومعاملات التوليد والتفاصيل الأخرى محجوبة.
+
+يمكن منح حالة المسؤول لعدة مستخدمين.
+
+---
+
+## البدء
+
+لتفعيل الوضع متعدد المستخدمين، افتح ملف التكوين `INVOKEAI_ROOT/invokeai.yaml` في محرر نصوص. أضف هذا السطر في أي مكان في الملف:
+
+```yaml
+multiuser: true
+```
+
+قد ترغب أيضاً في جعل InvokeAI متاحاً للأجهزة الأخرى على شبكتك المحلية. أضف سطراً إضافياً إلى `invokeai.yaml`:
+
+```yaml
+host: 0.0.0.0
+```
+
+أعد تشغيل الخادم. سيكون الآن في الوضع متعدد المستخدمين. إذا قمت بتمكين خيار `host`، سيتمكن المستخدمون الآخرون على شبكتك المنزلية أو المكتبية من الوصول إليه من خلال تصفح عنوان IP للجهاز الذي يعمل عليه الخادم الخلفي (`http://host-ip-address:9090`).
+
+:::tip[لا تعرض InvokeAI للإنترنت]
+لا يُنصح بتعريض مضيف InvokeAI للإنترنت لأسباب أمنية.
+:::
+
+### الإعداد الأولي (أول مرة في الوضع متعدد المستخدمين)
+
+إذا كنت أول شخص يصل إلى تثبيت جديد لـ InvokeAI في الوضع متعدد المستخدمين، سترى حوار **إعداد المسؤول**:
+
+
+
+الآن:
+
+
+1. أدخل عنوان بريدك الإلكتروني (سيكون هذا اسم تسجيل الدخول الخاص بك)
+2. أنشئ اسماً معروضاً (سيكون هذا الاسم الذي يراه المستخدمون الآخرون)
+3. اختر كلمة مرور قوية. المعايير التالية مطلوبة مع `strict_password_checking: true`.
+ - 8 أحرف على الأقل
+ - تحتوي على أحرف كبيرة
+ - تحتوي على أحرف صغيرة
+ - تحتوي على أرقام
+4. قم بتأكيد كلمة المرور الخاصة بك
+5. انقر على **إنشاء حساب مسؤول**
+
+
+مع تعطيل `strict_password_checking`، سيتم تحذيرك إذا اخترت كلمة مرور ضعيفة، لكن لن يتم منعك من القيام بذلك.
+
+سيتم الآن نقلك إلى شاشة تسجيل الدخول ويمكنك إدخال بيانات الاعتماد التي أنشأتها للتو.
+
+### إضافة وتعديل المستخدمين
+
+إذا كنت مسجلاً للدخول كمسؤول، يمكنك إضافة مستخدمين إضافيين. انقر على أيقونة "شخص صغير" الصغيرة في أسفل يسار الشاشة الرئيسية لـ Invoke واختر "إدارة المستخدمين"
+
+
+
+سينقلك هذا إلى شاشة إدارة المستخدمين...
+
+
+
+...حيث يمكنك النقر على "إنشاء مستخدم" لإضافة مستخدم جديد.
+
+
+
+تتيح لك شاشة إدارة المستخدمين أيضاً:
+
+
+1. تغيير حالة المستخدم مؤقتاً إلى غير نشط، مما يمنعه من تسجيل الدخول إلى Invoke.
+2. تعديل مستخدم (بالنقر على أيقونة القلم الرصاص) لتغيير اسم المستخدم المعروض أو كلمة المرور.
+3. حذف مستخدم بشكل دائم.
+4. منح مستخدم صلاحيات المسؤول.
+
+
+---
+
+## تسجيل الدخول كمستخدم غير مسؤول
+
+إذا كنت مستخدماً مسجلاً على النظام، أدخل عنوان بريدك الإلكتروني وكلمة المرور لتسجيل الدخول. سيكون المسؤول قادراً على تزويدك بالقيم المراد استخدامها:
+
+
+
+كمستخدم غير مميز، يمكنك فعل أي شيء تقريباً مسموح به في وضع المستخدم الفردي — توليد الصور، استخدام LoRAs، إنشاء وتشغيل سير العمل، إنشاء لوحات الصور — لكنك مقيد بعدم تثبيت نماذج جديدة، أو تغيير إعدادات الخادم منخفضة المستوى، أو التدخل مع المستخدمين الآخرين. مزيد من المعلومات حول أدوار المستخدمين مذكورة أدناه.
+
+### تغيير ملفك الشخصي
+
+لتغيير اسمك المعروض أو ملفك الشخصي، انقر على أيقونة شكل الشخص في أسفل يسار الشاشة واختر "ملفي الشخصي". سينقلك هذا إلى شاشة تتيح لك تغيير هذه القيم. في الوقت الحالي، يمكنك تغيير اسمك المعروض ولكن ليس معرف تسجيل الدخول الخاص بك (عادة عنوان بريدك الإلكتروني للاتصال).
+
+---
+
+## فهم أدوار المستخدمين
+
+في وضع المستخدم الفردي، لديك حق الوصول إلى جميع الميزات دون قيود. في الوضع متعدد المستخدمين، يحتوي InvokeAI على دورين للمستخدم:
+
+### مستخدم عادي
+
+كمستخدم عادي، يمكنك:
+
+- إنشاء وإدارة لوحات الصور الخاصة بك
+- توليد الصور باستخدام جميع أدوات الذكاء الاصطناعي (Linear و Canvas و Upscale و Workflows)
+- إنشاء وحفظ وتحميل سير العمل الخاص بك
+- عرض التفاصيل الكاملة للمهام التي تملكها في قائمة انتظار الجلسة
+- عرض المعلومات المحجوبة للمهام التي يتم تشغيلها من قبل مستخدمين آخرين
+- تخصيص تفضيلات واجهة المستخدم الخاصة بك (السمة، الاختصارات، إلخ.)
+- عرض النماذج المتاحة (وصول للقراءة فقط إلى مدير النماذج)
+- عرض اللوحات المشتركة والعامة التي أنشأها مستخدمون آخرون
+- عرض واستخدام سير العمل المميزة كمشاركة من قبل مستخدمين آخرين
+
+لا يمكنك:
+
+- إضافة أو حذف أو تعديل النماذج
+- عرض أو تعديل اللوحات أو الصور أو سير العمل الخاصة للمستخدمين الآخرين
+- إدارة حسابات المستخدمين
+- الوصول إلى تكوين النظام
+- إلغاء مهام التوليد للمستخدمين الآخرين
+
+:::tip[قائمة انتظار التوليد]
+عندما يقوم مستخدمان أو أكثر بالوصول إلى InvokeAI في نفس الوقت، سيتم وضع مهام توليد الصور الخاصة بهم في قائمة انتظار الجلسة على أساس من يأتي أولاً يخدم أولاً. هذا يعني أنه سيتعين عليك الانتظار حتى اكتمال مهام عرض الصور للمستخدمين الآخرين قبل أن تبدأ مهمتك.
+
+أثناء تشغيل مهام المستخدمين الآخرين، سترى شريط تقدم توليد الصور المشترك، وستظهر شارة قائمة الانتظار رقماً واحداً — عدد مهامك المعلقة أو قيد التنفيذ. لا تظهر أعداد المستخدمين الآخرين.
+
+افتح علامة تبويب قائمة الانتظار لترى أين تقع مهمتك بالنسبة للمهام الأخرى في قائمة الانتظار.
+:::
+
+### المسؤول
+
+المسؤولون لديهم جميع قدرات المستخدم العادي، بالإضافة إلى:
+
+- إدارة النماذج بالكامل (إضافة، حذف، تكوين النماذج)
+- إنشاء وإدارة حسابات المستخدمين
+- عرض وإدارة قوائم انتظار التوليد لجميع المستخدمين
+- عرض وإدارة لوحات وصور وسير عمل جميع المستخدمين (بما في ذلك المحتوى القديم المملوك للنظام)
+- الوصول إلى تكوين النظام
+- منح أو سحب صلاحيات المسؤول
+
+---
+
+## العمل مع محتواك في الوضع متعدد المستخدمين
+
+### لوحات الصور
+
+في الوضع متعدد المستخدمين، يمكن لكل مستخدم إنشاء عدد غير محدود من اللوحات وتنظيم صوره وأصوله كما يراه مناسباً. اللوحات لها ثلاثة مستويات من الرؤية:
+
+- **خاص** (افتراضي): فقط أنت (والمسؤولون) يمكنهم رؤية وتعديل اللوحة.
+- **مشارك**: يمكن لجميع المستخدمين عرض اللوحة ومحتوياتها، لكن فقط أنت (والمسؤولون) يمكنهم تعديلها (إعادة تسمية، أرشفة، حذف، أو إضافة/إزالة الصور).
+- **عام**: يمكن لجميع المستخدمين عرض اللوحة. فقط أنت (والمسؤولون) يمكنهم تعديل هيكل اللوحة (إعادة تسمية، أرشفة، حذف).
+
+لتغيير رؤية اللوحة، انقر بزر الماوس الأيمن على اللوحة واختر خيار الرؤية المطلوب.
+
+يمكن للمسؤولين رؤية وإدارة جميع لوحات الصور للمستخدمين ومحتوياتها بغض النظر عن إعدادات الرؤية.
+
+### الانتقال من وضع متعدد المستخدمين إلى وضع مستخدم فردي
+
+إذا كان مثيل InvokeAI في وضع متعدد المستخدمين ثم أعيد تشغيله في وضع مستخدم فردي (عن طريق تعيين `multiuser: false` في ملف التكوين)، سيتم دمج لوحات جميع المستخدمين في مكان واحد. أي صور كانت في "غير مصنفة" سيتم دمجها معاً في لوحة غير مصنفة واحدة. إذا تم إعادة تشغيل الخادم في وضع متعدد المستخدمين في تاريخ لاحق، سيتم تعيين اللوحات والصور لمستخدم "النظام" الداخلي. يمكن للمسؤولين الوصول إلى هذا المحتوى القديم، ولن يتم استعادته للمالكين الأصليين.
+
+### سير العمل
+
+كل مستخدم لديه مكتبة سير عمل خاصة به. سير العمل التي تنشئها تكون مرئية لك فقط بشكل افتراضي.
+
+يمكنك مشاركة سير عمل مع مستخدمين آخرين عن طريق وضع علامة عليه كـ **مشارك** (عام). تظهر سير العمل المشاركة في مكتبات سير العمل لجميع المستخدمين ويمكن لأي شخص فتحها، لكن فقط المالك (أو المسؤول) يمكنه تعديلها أو حذفها.
+
+لمشاركة سير عمل، افتحه واستخدم عناصر التحكم في المشاركة لتبديل حالته العامة/المشاركة.
+
+:::caution[سير العمل الموجودة مسبقاً بعد تمكين الوضع متعدد المستخدمين]
+عند تمكين الوضع متعدد المستخدمين لأول مرة على تثبيت InvokeAI موجود، ستظهر جميع سير العمل التي تم إنشاؤها قبل تفعيل الوضع متعدد المستخدمين في قسم **سير العمل المشتركة**. سير العمل الموجودة مسبقاً مملوكة لحساب "النظام" الداخلي ومرئية لجميع المستخدمين. يمكن للمسؤولين تعديل أو حذف سير العمل القديمة المشتركة هذه. المستخدمون العاديون يمكنهم عرضها واستخدامها ولكن لا يمكنهم تعديلها.
+:::
+
+### قائمة انتظار التوليد
+
+تعرض قائمة الانتظار مهام التوليد المعلقة والجاري تنفيذها.
+
+**ميزات قائمة الانتظار:**
+
+- عرض توليداتك الحالية والمكتملة
+- إلغاء المهام المعلقة
+- إعادة تشغيل التوليدات السابقة
+- مراقبة التقدم في الوقت الفعلي
+
+**عزل قائمة الانتظار:**
+
+- سترى عناصر قائمة الانتظار الخاصة بك، بالإضافة إلى العناصر التي تم إنشاؤها من قبل مستخدمين آخرين، لكن معاملات التوليد (مثل الموجهات) لمهام المستخدمين الآخرين مخفية لأسباب تتعلق بالخصوصية.
+- يمكن للمسؤولين عرض جميع قوائم الانتظار لاستكشاف الأخطاء وإصلاحها.
+- لن تتداخل توليداتك مع مهام المستخدمين الآخرين.
+
+---
+
+## تخصيص تجربتك
+
+### التفضيلات الشخصية
+
+يتم حفظ تفضيلات واجهة المستخدم الخاصة بك في حسابك ويتم استعادتها عند تسجيل الدخول:
+
+- **الاختصارات**: تخصيص اختصارات لوحة المفاتيح
+- **إعدادات اللوحة**: التكبير الافتراضي، رؤية الشبكة، إلخ.
+- **إعدادات التوليد الافتراضية**: القيم الافتراضية للعرض والارتفاع والخطوات، إلخ.
+
+يتم تخزين هذه الإعدادات لكل مستخدم ولن تؤثر على المستخدمين الآخرين.
+
+---
+
+## استكشاف الأخطاء وإصلاحها
+
+### لا يمكن تسجيل الدخول
+
+**المشكلة:** فشل تسجيل الدخول مع "بريد إلكتروني أو كلمة مرور غير صحيحة"
+
+**الحلول:**
+
+- تأكد من إدخال عنوان البريد الإلكتروني الصحيح
+- تحقق من إيقاف تشغيل Caps Lock
+- حاول كتابة كلمة المرور ببطء لتجنب الأخطاء
+- اتصل بالمسؤول الخاص بك إذا نسيت كلمة المرور
+
+**المشكلة:** فشل تسجيل الدخول مع "الحساب معطل"
+
+**الحل:** اتصل بالمسؤول الخاص بك لإعادة تنشيط حسابك
+
+### انتهت الجلسة
+
+**المشكلة:** يتم تسجيل خروجك فجأة وترى "انتهت الجلسة"
+
+**التفسير:** تنتهي الجلسات بعد 24 ساعة (أو 7 أيام مع "تذكرني")
+
+**الحل:** ببساطة قم بتسجيل الدخول مرة أخرى ببيانات اعتمادك
+
+### لا يمكن الوصول إلى الميزات
+
+**المشكلة:** تظهر ميزات مثل مدير النماذج "صلاحيات المسؤول مطلوبة"
+
+**التفسير:** بعض الميزات مقصورة على المسؤولين
+
+**الحل:**
+
+- لعرض النماذج: يمكنك عرض النماذج وليس تعديلها
+- لإدارة المستخدمين: اتصل بمسؤول
+- لتكوين النظام: اتصل بمسؤول
+
+### لوحات أو صور مفقودة
+
+**المشكلة:** اللوحات أو الصور التي أنشأتها غير مرئية
+
+**الأسباب المحتملة:**
+
+
+1. **تم تطبيق فلتر:** تحقق مما إذا كان الفلتر يخفي المحتوى
+2. **مستخدم خاطئ:** تأكد من تسجيل الدخول باستخدام الحساب الصحيح
+3. **لوحة مؤرشفة:** تحقق من خيار "إظهار المؤرشف"
+
+
+**الحل:**
+
+- قم بمسح أي مرشحات نشطة
+- تحقق من أنك مسجل الدخول كمستخدم صحيح
+- تحقق من العناصر المؤرشفة
+
+### أداء بطيء
+
+**المشكلة:** التوليد أو واجهة المستخدم أبطأ من المتوقع
+
+**الأسباب المحتملة:**
+
+- مستخدمون آخرون يولدون صوراً في وقت واحد
+- قيود موارد الخادم
+- زمن استجابة الشبكة
+
+**الحلول:**
+
+- تحقق من قائمة الانتظار لمعرفة ما إذا كان الآخرون يولدون
+- انتظر حتى تكتمل التوليدات الحالية
+- اتصل بالمسؤول إذا استمرت المشكلة
+
+### التوليد عالق في قائمة الانتظار
+
+**المشكلة:** توليدك في قائمة الانتظار ولكن لا يبدأ
+
+**الأسباب المحتملة:**
+
+- الخادم يعالج توليدات المستخدمين الآخرين
+- موارد الخادم مستغلة بالكامل
+- مشكلة فنية في الخادم
+
+**الحلول:**
+
+- انتظر دورك في قائمة الانتظار
+- تحقق مما إذا كان توليدك متوقفاً مؤقتاً
+- اتصل بالمسؤول إذا بقي عالقاً لفترة طويلة
+
+---
+
+## الأسئلة الشائعة
+
+### هل يمكن للمستخدمين الآخرين رؤية صوري؟
+
+ليس إلا إذا قمت بتغيير رؤية لوحتك إلى "مشارك" أو "عام". جميع اللوحات والصور الشخصية خاصة بشكل افتراضي.
+
+### هل يمكنني مشاركة سير العمل الخاص بي مع الآخرين؟
+
+نعم. يمكنك وضع علامة على أي سير عمل كمشارك (عام)، مما يجعله مرئياً لجميع المستخدمين. يمكن للمستخدمين الآخرين عرض واستخدام سير العمل المشتركة، لكن فقط أنت أو المسؤول يمكنكم تعديلها أو حذفها.
+
+### كم تدوم الجلسات؟
+
+- 24 ساعة بشكل افتراضي
+- 7 أيام إذا قمت بتحديد "تذكرني" أثناء تسجيل الدخول
+
+### هل يمكنني استخدام واجهة برمجة التطبيقات مع الوضع متعدد المستخدمين؟
+
+نعم، لكن ستحتاج إلى المصادقة باستخدام رمز JWT. راجع [دليل واجهة برمجة التطبيقات](./api-guide/) للحصول على التفاصيل.
+
+### ماذا يحدث إذا نسيت كلمة المرور الخاصة بي؟
+
+اتصل بالمسؤول الخاص بك. يمكنه إعادة تعيين كلمة المرور الخاصة بك.
+
+### هل يمكنني الحصول على جلسات متعددة؟
+
+نعم، يمكنك تسجيل الدخول من أجهزة أو متصفحات متعددة في وقت واحد. جميع الجلسات ستستخدم نفس الحساب وسترى نفس المحتوى.
+
+### لماذا لا أستطيع رؤية علامة التبويب "إضافة نماذج" في مدير النماذج؟
+
+يمكن للمستخدمين العاديين رؤية علامة تبويب النماذج ولكن مع وصول للقراءة فقط. تحقق من أنك مسجل الدخول وحاول تحديث الصفحة.
+
+### كيف أعرف إذا كنت مسؤولاً؟
+
+انقر على أيقونة المستخدم بالقرب من أسفل شريط التنقل الأيسر لفتح قائمة المستخدم. إذا كنت مسؤولاً، تظهر شارة "مسؤول" تحت اسمك في تلك القائمة ويظهر عنصر "إدارة المستخدمين" بجانب الإجراءات المعتادة للملف الشخصي وتسجيل الخروج.
+
+### هل يمكنني طلب صلاحيات المسؤول؟
+
+نعم، اطلب من المسؤول الحالي منحك صلاحيات المسؤول. ستمنحك صلاحيات المسؤول القدرة على رؤية لوحات وصور جميع المستخدمين الآخرين، بالإضافة إلى إضافة النماذج وتغيير إعدادات مختلفة على مستوى الخادم.
+
+## الحصول على المساعدة
+
+### قنوات الدعم
+
+- **المسؤول:** اتصل بمسؤول النظام الخاص بك لمشاكل الحساب
+- **الوثائق:** تحقق من [الأسئلة الشائعة](/troubleshooting/faq/) للمشاكل الشائعة
+- **المجتمع:** انضم إلى [Discord](https://discord.gg/ZmtBAhwWhy) للمساعدة
+- **تقارير الأخطاء:** قدم المشكلات على [GitHub](https://github.com/invoke-ai/InvokeAI/issues)
+
+### الإبلاغ عن المشكلات
+
+عند الإبلاغ عن مشكلة، قم بتضمين:
+
+- دورك (مستخدم عادي أو مسؤول)
+- ما كنت تحاول فعله
+- ما حدث بدلاً من ذلك
+- أي رسائل خطأ رأيتها
+- متصفحك ونظام التشغيل الخاص بك
+
+## موارد إضافية
+
+- [دليل المسؤول](./admin-guide/) — للمسؤولين الذين يديرون المستخدمين والنظام
+- [دليل واجهة برمجة التطبيقات](./api-guide/) — للمطورين الذين يستخدمون واجهة برمجة تطبيقات InvokeAI
diff --git a/docs/src/content/docs/ar/features/Workflows/adding-nodes.mdx b/docs/src/content/docs/ar/features/Workflows/adding-nodes.mdx
new file mode 100644
index 00000000000..024b5ed8fa0
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Workflows/adding-nodes.mdx
@@ -0,0 +1,170 @@
+---
+title: إضافة العقد
+description: تعلم كيفية إضافة وتوصيل وتكوين العقد في محرر سير العمل في InvokeAI.
+sidebar:
+ order: 3
+lastUpdated: 2026-03-16
+---
+
+import { Card, CardGrid, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
+
+العقد هي اللبنات الأساسية لسير العمل. كل عقدة تؤدي عملية محددة — تحميل نموذج، توليد ضوضاء، تطبيق تكييف، إزالة ضوضاء من الكامنات، وأكثر. بإضافة العقد إلى اللوحة وتوصيلها معاً، يمكنك إنشاء خط أنابيب كامل لتوليد الصور.
+
+## فتح منتقي العقد
+
+منتقي العقد هو لوحة أوامر قابلة للبحث تعرض كل عقدة متاحة. هناك ثلاث طرق لفتحه:
+
+
+
+ اضغط Shift + A أو Space أثناء التركيز على محرر سير العمل.
+
+
+ انقر على الزر **+** في الزاوية العلوية اليسرى من اللوحة.
+
+
+ اسحب اتصالاً من أي منفذ إدخال أو إخراج وأفلته فوق اللوحة الفارغة. سيفتح المنتقي مع نتائج **مصفاة للعقد المتوافقة فقط**.
+
+
+
+## العثور على عقدة
+
+عند فتح منتقي العقد، يمكنك البدء فوراً في الكتابة للبحث. البحث ضبابي ويطابق عدة خصائص لكل عقدة:
+
+- **العنوان** — اسم العرض (مثال "Denoise Latents")
+- **النوع** — المعرف الداخلي
+- **الوصف** — ملخص قصير لما تفعله العقدة
+- **العلامات** — كلمات مفتاحية للفئة
+- **حزمة العقدة** — الوحدة الأصلية (مثل `invokeai` للعقد المضمنة، أو اسم حزمة مجتمع)
+
+يظهر كل إدخال في المنتقي:
+
+- **شارة تصنيف** تشير إلى الاستقرار — _Stable_ و _Beta_ (أصفر) و _Prototype_ (أحمر) أو _Special_ (أخضر)
+- **عنوان العقدة** واسم **حزمة العقدة**
+- **وصف** مختصر
+
+انقر على عقدة أو اضغط Enter لإضافتها إلى اللوحة. ستوضع العقدة بالقرب من وسط نافذة العرض الحالية، أو في موضع المؤشر إذا فتحت المنتقي بالسحب من منفذ.
+
+:::tip
+إذا فتحت المنتقي بالسحب من منفذ، يتم تصفية القائمة تلقائياً لإظهار العقد التي لديها مدخل أو مخرج متوافق فقط. هذه طريقة سريعة لاكتشاف العقد التي تعمل معاً.
+:::
+
+## العقد الخاصة
+
+بالإضافة إلى عقد الاستدعاء (التي تؤدي عمليات توليد الصور)، يتضمن المنتقي عقدتين خاصتين للأداة:
+
+
+
+ منطقة نصية مثل الملاحظات اللاصقة لتوثيق سير العمل الخاص بك. مفيدة لترك تذكيرات لنفسك أو شرح أقسام من رسم بياني معقد للآخرين.
+
+
+ تعرض الصورة الحالية التي يتم توليدها أو أحدث مخرج. مفيدة لمراقبة التقدم في سير العمل الطويل.
+
+
+
+## توصيل العقد
+
+تحتوي العقد على **منافذ إدخال** على حافتها اليسرى و **منافذ إخراج** على حافتها اليمنى. المنافذ مرمزة بالألوان حسب نوع البيانات حتى تتمكن من تحديد الاتصالات المتوافقة بسرعة.
+
+
+1. **اسحب من منفذ إخراج** على عقدة نحو اللوحة.
+2. **أفلت على منفذ إدخال متوافق** على عقدة أخرى. ستظل المنافذ المتوافقة مظللة؛ وستظهر المنافذ غير المتوافقة باللون الرمادي.
+3. يتم رسم **حافة بيزير** بين المنفذين، تمثل تدفق البيانات.
+
+
+:::note
+يمكنك أيضاً إفلات اتصال على عقدة دون استهداف منفذ معين. سيتصل InvokeAI تلقائياً بـ **أول منفذ متوافق** يجده في تلك العقدة.
+:::
+
+### قواعد التوصيل
+
+- يجب أن تكون الاتصالات بين أنواع بيانات متوافقة (ألوان متطابقة).
+- لا يمكن للعقدة الاتصال بنفسها.
+- كل منفذ إدخال يقبل اتصالاً واحداً فقط (لكن يمكن للإخراج الاتصال بعدة مدخلات).
+- تستقر الاتصالات ضمن نصف قطر 30 بكسل من المنفذ لسهولة الاستهداف.
+
+### إعادة التوصيل وإزالة الحواف
+
+- **أعد توصيل** حافة بسحبها من منفذها الحالي إلى منفذ جديد.
+- **أزل** حافة بسحبها بعيداً عن منفذها وإفلاتها فوق اللوحة الفارغة.
+- **احذف** الحواف المحددة باستخدام Delete أو Backspace.
+
+### الموصلات
+
+الموصلات هي عقد صغيرة خاصة بالمحرر موجودة فقط **لإعادة توجيه الحواف** للحصول على رسم بياني أنظف. يتم حفظها مع سير العمل ولكن يتم تسويتها خارج الرسم البياني قبل التنفيذ، لذا فإن وقت التشغيل لا يراها أبداً — لا يمكنك استخدامها لإضافة منطق، فقط لترتيب الأسلاك.
+
+طرق إضافة موصل:
+
+- **انقر بزر الماوس الأيمن على لوحة فارغة ← إضافة موصل**، ثم اسحب الاتصالات من وإليه.
+- **انقر مرتين على حافة موجودة** لإدراج موصل عند تلك النقطة، مع ربطه.
+
+سلوكيات أخرى تستحق المعرفة:
+
+- **التوصيل الهادف أولاً يعمل.** يمكنك توصيل مخرج موصل بحقل هدف نهائي *قبل* توصيل مصدره العلوي. يظل الموصل دون حل حتى يتم توصيل مصدر متوافق؛ المصادر غير المتوافقة العلوية يتم رفضها.
+- **يتم فرض توافق النوع** من خلال الموصل، تماماً كما هو الحال مع الحواف العادية.
+- **حذف موصل يمرر** أي حواف تمر عبره:
+ - `1 → 1`: يتم إعادة توصيل المصدر مباشرة بالهدف.
+ - `1 → N`: يتم إعادة توصيل المصدر بكل هدف نهائي متوافق.
+ - `1 → 0`: تتم إزالة الموصل، لا يتم إنشاء حواف.
+ - إذا كان التمرير سينتج رسماً بيانياً غير صالح، يتم **تعطيل حذف الموصل**.
+- **تستمر الموصلات** عبر حفظ / تحميل سير العمل.
+
+## تكوين العقد
+
+بمجرد وجود عقدة على اللوحة، يمكنك تكوينها عن طريق تحرير حقول الإدخال الخاصة بها مباشرة. تعرض كل عقدة مجموعة من الحقول الخاصة بوظيفتها — على سبيل المثال، عقدة الضوضاء لها حقل **Seed**، بينما محمل النموذج له محدد **Model**.
+
+- **التحرير المضمن** — انقر على أي حقل إدخال لتحرير قيمته مباشرة على العقدة.
+- **إعادة التسمية** — انقر بزر الماوس الأيمن على عنوان عقدة أو أي تسمية إدخال لإعادة تسميتها.
+- **استخدام التخزين المؤقت** — بدّل خيار التخزين المؤقت في تذييل العقدة لإعادة استخدام القيم المحسوبة مسبقاً وتسريع التشغيل المتكرر.
+- **الطي** — انقر على زر الطي في رأس العقدة لتصغيرها، مع الحفاظ على اللوحة مرتبة.
+
+## إدارة العقد
+
+استخدم هذه الاختصارات للعمل بكفاءة مع العقد على اللوحة:
+
+| الإجراء | الاختصار |
+| :--- | :--- |
+| إضافة عقدة | Shift + A أو Space |
+| نسخ | Ctrl/Cmd + C |
+| لصق | Ctrl/Cmd + V |
+| لصق مع الحواف | Ctrl/Cmd + Shift + V |
+| تحديد الكل | Ctrl/Cmd + A |
+| حذف | Delete أو Backspace |
+| تراجع | Ctrl/Cmd + Z |
+| إعادة | Ctrl/Cmd + Shift + Z |
+| تحديد متعدد | Shift + النقر والسحب |
+
+:::tip
+جميع اختصارات لوحة المفاتيح قابلة للتخصيص. افتح نافذة الاختصارات باستخدام Shift + ? لعرض أو تغيير أي ارتباط.
+:::
+
+## الإضافة إلى العرض الخطي
+
+يمكن ترقية أي حقل إدخال على عقدة إلى **العرض الخطي**، الذي يوفر واجهة مستخدم مبسطة لسير العمل الخاص بك — مثالية للمشاركة مع الآخرين أو للتكرار السريع.
+
+
+1. انقر بزر الماوس الأيمن على **تسمية إدخال** على أي عقدة.
+2. اختر **"إضافة إلى العرض الخطي"**.
+3. يظهر الإدخال الآن في لوحة العرض الخطي، حيث يمكنك ضبطه دون التنقل في الرسم البياني الكامل.
+
+
+الأسماء المخصصة التي تحددها لحقول الإدخال ستنتقل إلى العرض الخطي.
+
+## تثبيت عقد المجتمع
+
+نظام العقد في InvokeAI قابل للتوسيع. يمكن للعقد المنشأة من قبل المجتمع إضافة قدرات جديدة إلى سير العمل الخاص بك — من معالجة الصور المتخصصة إلى توليد الموجهات المدعومة بـ LLM.
+
+أسهل طريقة لتثبيت حزمة عقد مجتمع هي من خلال **[مدير العقد المخصصة](/features/workflows/custom-node-manager/)**: الصق رابط Git في علامة تبويب **العقد** في الشريط الجانبي وسيتم استنساخ الحزمة وتحميلها وإتاحتها دون إعادة تشغيل.
+
+إذا كنت تفضل التثبيت اليدوي:
+
+
+1. ابحث عن حزمة عقد من قائمة [عقد المجتمع](/features/workflows/community-nodes/).
+2. استنسخ أو حمل حزمة العقد في مجلد `nodes` داخل دليل تثبيت InvokeAI الخاص بك.
+3. في مدير العقد المخصصة، انقر على **إعادة التحميل** (أو أعد تشغيل InvokeAI). ستظهر العقد الجديدة في منتقي العقد.
+
+
+:::note
+`git clone` مفضل على تنزيل ZIP — فهو يسهل تحديث حزم العقد لاحقاً باستخدام `git pull`.
+:::
+
+لمزيد من التفاصيل وكتالوج كامل لعقد المجتمع المتاحة، راجع صفحة [عقد المجتمع](/features/workflows/community-nodes/).
diff --git a/docs/src/content/docs/ar/features/Workflows/comfyui-migration.mdx b/docs/src/content/docs/ar/features/Workflows/comfyui-migration.mdx
new file mode 100644
index 00000000000..5ae7c1c1568
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Workflows/comfyui-migration.mdx
@@ -0,0 +1,119 @@
+---
+title: الهجرة من ComfyUI
+lastUpdated: 2026-05-23
+---
+
+import { Card, CardGrid } from '@astrojs/starlight/components';
+
+إذا كنت قادماً إلى InvokeAI من ComfyUI، مرحباً بك! ستجد الأمور متشابهة ولكنها مختلفة - الخبر السار هو أنك تعرف بالفعل كيف يجب أن تعمل الأمور، والأمر مجرد مسألة توصيلها!
+
+
+ تميل عقد InvokeAI إلى أن تكون أكثر تفصيلاً من العقد الافتراضية في Comfy. هذا يعني أن كل عقدة في Invoke ستقوم بمهمة محددة، وقد تحتاج إلى استخدام عقد متعددة لتحقيق نفس النتيجة. التفصيل الإضافي يحسن التحكم الذي لديك على سير العمل الخاصة بك.
+
+
+ خلفية InvokeAI وخلفية ComfyUI مختلفتان جداً، مما يعني أنه لا يمكن استيراد سير عمل Comfy مباشرة إلى InvokeAI. ومع ذلك، قمنا بإنشاء [قائمة بسير العمل الشائعة](../community-nodes) لتبدأ بها مع العقد في InvokeAI!
+
+
+## مكافئات العقد
+
+العثور على العقدة الصحيحة هو أصعب جزء في التبديل. استخدم الفئات أدناه للعثور على مكافئات InvokeAI لعقد ComfyUI التي اعتدت عليها.
+
+### Sampling
+
+| عقدة ComfyUI | المكافئ في Invoke |
+| :--- | :--- |
+| KSampler | Denoise Latents |
+| Ksampler Advanced | Denoise Latents |
+
+### Loaders
+
+| عقدة ComfyUI | المكافئ في Invoke |
+| :--- | :--- |
+| Load Checkpoint | Main Model Loader _أو_ SDXL Main Model Loader |
+| Load VAE | VAE Loader |
+| Load Lora | LoRA Loader _أو_ SDXL Lora Loader |
+| Load ControlNet Model | ControlNet |
+| Load ControlNet Model (diff) | ControlNet |
+| Load Style Model | Reference Only ControlNet سيكون متاحاً في إصدار مستقبلي من InvokeAI |
+| unCLIPCheckpointLoader | N/A |
+| GLIGENLoader | N/A |
+| Hypernetwork Loader | N/A |
+| Load Upscale Model | يحدث داخل "Upscale (RealESRGAN)" |
+
+### Conditioning
+
+| عقدة ComfyUI | المكافئ في Invoke |
+| :--- | :--- |
+| CLIP Text Encode (Prompt) | Compel (Prompt) أو SDXL Compel (Prompt) |
+| CLIP Set Last Layer | CLIP Skip |
+| Conditioning (Average) | استخدم ميزة .blend() للموجهات |
+| Conditioning (Combine) | N/A |
+| Conditioning (Concat) | راجع عقدة المجتمع Prompt Tools |
+| Conditioning (Set Area) | N/A |
+| Conditioning (Set Mask) | Mask Edge |
+| CLIP Vision Encode | N/A |
+| unCLIPConditioning | N/A |
+| Apply ControlNet | ControlNet |
+| Apply ControlNet (Advanced) | ControlNet |
+
+### Latent
+
+| عقدة ComfyUI | المكافئ في Invoke |
+| :--- | :--- |
+| VAE Decode | Latents to Image |
+| VAE Encode | Image to Latents |
+| Empty Latent Image | Noise |
+| Upscale Latent | Resize Latents |
+| Upscale Latent By | Scale Latents |
+| Latent Composite | Blend Latents |
+| LatentCompositeMasked | N/A |
+
+### Image
+
+| عقدة ComfyUI | المكافئ في Invoke |
+| :--- | :--- |
+| Save Image | Image |
+| Preview Image | Current |
+| Load Image | Image |
+| Empty Image | Blank Image |
+| Invert Image | Invert Lerp Image |
+| Batch Images | ربط عقد "Image" في عقدة "Image Collection" |
+| Pad Image for Outpainting | يمكن إنجاز Outpainting بسهولة في Unified Canvas |
+| ImageCompositeMasked | Paste Image |
+| Upscale Image | Resize Image |
+| Upscale Image By | Upscale Image |
+| Upscale Image (using Model) | Upscale Image |
+| ImageBlur | Blur Image |
+| ImageQuantize | N/A |
+| ImageSharpen | N/A |
+| Canny | Canny Processor |
+
+### Mask
+
+| عقدة ComfyUI | المكافئ في Invoke |
+| :--- | :--- |
+| Load Image (as Mask) | Image |
+| Convert Mask to Image | Image |
+| Convert Image to Mask | Image |
+| SolidMask | N/A |
+| InvertMask | Invert Lerp Image |
+| CropMask | Crop Image |
+| MaskComposite | Combine Mask |
+| FeatherMask | Blur Image |
+
+### Advanced
+
+| عقدة ComfyUI | المكافئ في Invoke |
+| :--- | :--- |
+| Load CLIP | Main Model Loader _أو_ SDXL Main Model Loader |
+| UNETLoader | Main Model Loader _أو_ SDXL Main Model Loader |
+| DualCLIPLoader | Main Model Loader _أو_ SDXL Main Model Loader |
+| Load Checkpoint | Main Model Loader _أو_ SDXL Main Model Loader |
+| ConditioningZeroOut | N/A |
+| ConditioningSetTimestepRange | N/A |
+| CLIPTextEncodeSDXLRefiner | Compel (Prompt) أو SDXL Compel (Prompt) |
+| CLIPTextEncodeSDXL | Compel (Prompt) أو SDXL Compel (Prompt) |
+| ModelMergeSimple | دمج النماذج متاح في Model Manager |
+| ModelMergeBlocks | دمج النماذج متاح في Model Manager |
+| CheckpointSave | حفظ النماذج متاح في Model Manager |
+| CLIPMergeSimple | N/A |
diff --git a/docs/src/content/docs/ar/features/Workflows/community-nodes.mdx b/docs/src/content/docs/ar/features/Workflows/community-nodes.mdx
new file mode 100644
index 00000000000..6d6ec803031
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Workflows/community-nodes.mdx
@@ -0,0 +1,730 @@
+---
+title: عقد المجتمع
+---
+
+هذه عقد تم تطويرها بواسطة المجتمع، ومن أجل المجتمع. إذا لم تكن متأكداً مما هي العقدة، يمكنك معرفة المزيد عن العقد [هنا](/concepts/nodes-workflows/).
+
+إذا كنت ترغب في تقديم عقدة للمجتمع، يرجى الرجوع إلى [نظرة عامة على إنشاء العقد](/development/guides/creating-nodes/).
+
+لاستخدام عقدة، أضف العقدة إلى مجلد `nodes` الموجود في موقع تثبيت InvokeAI الخاص بك.
+
+الطريقة المقترحة هي استخدام `git clone` لاستنساخ المستودع الذي توجد فيه العقدة. هذا يسمح بتحديثات سهلة للعقدة في المستقبل.
+
+إذا كنت تفضل، يمكنك أيضاً تنزيل مجلد العقدة بالكامل من المستودع المرتبط وإضافته إلى مجلد `nodes`.
+
+لاستخدام سير عمل مجتمعي، قم بتنزيل ملف الرسم البياني `.json` للعقد وقم بتحميله إلى Invoke AI عبر زر **تحميل سير العمل** في محرر سير العمل.
+
+---
+
+### أدوات Anamorphic
+
+**الوصف:** مجموعة من العقد لإجراء تعديلات anamorphic على الصور، مثل ضبابية العدسة، والخطوط، والتشوه الكروي، والتظليل.
+
+**رابط العقدة:** https://github.com/JPPhoto/anamorphic-tools
+
+---
+
+### عقد المحولات المرتبطة
+
+**الوصف:** مجموعة من العقد للمحولات المرتبطة (ControlNet و IP-Adaptor و T2I-Adapter). هذا يسمح بربط عدة محولات معاً دون استخدام عقدة `collect` مما يعني أنه يمكن استخدامها داخل عقدة `iterate` دون أي مشاكل تجميع في كل تكرار.
+
+- `ControlNet-Linked` - يجمع معلومات ControlNet لتمريرها إلى عقد أخرى.
+- `IP-Adapter-Linked` - يجمع معلومات IP-Adapter لتمريرها إلى عقد أخرى.
+- `T2I-Adapter-Linked` - يجمع معلومات T2I-Adapter لتمريرها إلى عقد أخرى.
+
+ملاحظة: هذه موروثة من العقد الأساسية لذا أي تحديث للعقد الأساسية يجب أن ينعكس في هذه.
+
+**رابط العقدة:** https://github.com/skunkworxdark/adapters-linked-nodes
+
+---
+
+### عقد Autostereogram
+
+**الوصف:** توليد صور autostereogram من خريطة العمق. هذه ليست عقدة مفيدة عملياً بل هي أكثر تسلياً بتسعينيات القرن الماضي لأنني كنت أحب هذه الصور عندما كنت طفلاً.
+
+**رابط العقدة:** https://github.com/skunkworxdark/autostereogram_nodes
+
+**مثال استخدام:**
+
+
->
->
+
+---
+
+### متوسط الصور
+
+**الوصف:** تأخذ هذه العقدة مجموعة من الصور بنفس الحجم وتحسب متوسطها كمخرج. تقوم أولاً بتحويل كل شيء إلى وضع RGB.
+
+**رابط العقدة:** https://github.com/JPPhoto/average-images-node
+
+---
+
+### إزالة الخلفية BiRefNet
+
+**الوصف:** إزالة خلفيات الصور باستخدام BiRefNet (شبكة المرجع الثنائي)، نموذج تجزئة عالي الجودة. يدعم متغيرات نماذج متعددة بما في ذلك المعيار، عالي الدقة، التطعيم، الصور الشخصية، والنماذج المتخصصة لحالات الاستخدام المختلفة.
+
+**رابط العقدة:** https://github.com/veeliks/invoke_birefnet
+
+**أمثلة على المخرجات**
+
+
+
+
+
+
+---
+
+### تنظيف آثار الصورة بعد القص
+
+الوصف: يزيل الآثار المتبقية بعد فصل الصورة عن خلفيتها.
+
+رابط العقدة: https://github.com/VeyDlin/clean-artifact-after-cut-node
+
+عرض:
+
+
+
+---
+
+### قناع الألوان المتقاربة
+
+الوصف: يولّد قناعاً للصور بناءً على لون متقارب، مفيد للاختيارات المستندة إلى اللون.
+
+رابط العقدة: https://github.com/VeyDlin/close-color-mask-node
+
+عرض:
+
+
+
+---
+
+### قناع الملابس
+
+الوصف: يستخدم شبكة عصبية U2NET مدربة لتجزئة عناصر الملابس في الصور.
+
+رابط العقدة: https://github.com/VeyDlin/clothing-mask-node
+
+عرض:
+
+
+
+---
+
+### معادلة الرسم البياني التكيفية محدودة التباين
+
+الوصف: يعزز تباين الصورة المحلي باستخدام معادلة الرسم البياني التكيفية مع تحديد التباين.
+
+رابط العقدة: https://github.com/VeyDlin/clahe-node
+
+عرض:
+
+
+
+---
+
+### المنحنيات
+
+**الوصف:** ضبط منحنى الصورة بناءً على سلسلة نصية يحددها المستخدم.
+
+**رابط العقدة:** https://github.com/JPPhoto/curves-node
+
+---
+
+### خريطة العمق من Wavefront OBJ
+
+**الوصف:** عرض خرائط العمق من ملفات Wavefront .obj (مثلثة) باستخدام هذا العارض ثلاثي الأبعاد البسيط الذي يستخدم numpy و matplotlib لحساب وتلوين المشهد. هناك معاملات بسيطة لتغيير مجال الرؤية وموضع الكاميرا واتجاه النموذج.
+
+لاستيراده، يجب أن يستخدم ملف .obj شبكات مثلثة، لذا تأكد من تمكين هذا الخيار إذا كنت تقوم بالتصدير من برنامج نمذجة ثلاثية الأبعاد. هذا العارض يجعل كل مثلث بلون صلب بناءً على متوسط عمقه، لذلك قد يتسبب في تشوهات إذا كان ملف .obj الخاص بك يحتوي على مثلثات كبيرة. في Blender، يمكن أن يكون معدل Remesh مفيداً لتقسيم شبكة إلى قطع صغيرة تعمل بشكل جيد في ظل هذه القيود.
+
+**رابط العقدة:** https://github.com/dwringer/depth-from-obj-node
+
+**مثال استخدام:**
+
+
+
+---
+
+### تحسين التفاصيل
+
+**الوصف:** عقدة واحدة يمكنها تحسين التفاصيل في الصورة. زيادة أو تقليل التفاصيل في الصورة باستخدام مرشح موجه (بدلاً من التمويه الغاوسي النموذجي الذي تستخدمه معظم مرشحات الشحذ.) مبنية على عقدة `Enhance Detail` من ComfyUI من https://github.com/spacepxl/ComfyUI-Image-Filters
+
+**رابط العقدة:** https://github.com/skunkworxdark/enhance-detail-node
+
+**مثال استخدام:**
+
+
+
+---
+
+### حبيبات الفيلم
+
+**الوصف:** تضيف هذه العقدة تأثير حبيبات الفيلم إلى الصورة المدخلة بناءً على معاملات الأوزان والبذور ونصف قطر التمويه. تعمل مع صور RGB فقط.
+
+**رابط العقدة:** https://github.com/JPPhoto/film-grain-node
+
+---
+
+### قلب الوضعية
+
+**الوصف:** تقوم هذه العقدة بقلب صورة openpose أفقياً، وإعادة تلوينها للتأكد من أنها لا تواجه الاتجاه الخاطئ. لاحظ أنها لا تعمل مع أيادي openpose.
+
+**رابط العقدة:** https://github.com/JPPhoto/flip-pose-node
+
+---
+
+### الحجم المثالي لـ Flux
+
+**الوصف:** تعيد هذه العقدة الحجم المثالي لاستخدامه في المرحلة الأولى من خط أنابيب توليد صور Flux. التوليد بالحجم المناسب يساعد في الحد من التكرار ووضع الموضوع بشكل غريب.
+
+**رابط العقدة:** https://github.com/JPPhoto/flux-ideal-size
+
+---
+
+### عقد موجهات القواعد النحوية التوليدية
+
+**الوصف:** هذه المجموعة المكونة من 3 عقد تولد موجهات من قواعد نحوية بسيطة يحددها المستخدم (يتم تحميلها من ملفات مخصصة - أمثلة مقدمة أدناه). يتم إنشاء الموجهات عن طريق توسيع سلسلة قالب خاصة بشكل متكرر، واستبدال "أجزاء الكلام" غير النهائية حتى لا تبقى أي مصطلحات غير نهائية في السلسلة.
+
+يتضمن ذلك 3 عقد:
+- *جدول البحث من ملف* - يقوم بتحميل قسم "prompt" من ملف YAML (أو مجلد كامل من ملفات YAML) إلى قاموس بتنسيق JSON (مخرجات Lookups)
+- *إدخال Lookups من موجه* - يضع إدخالاً واحداً في مخرج Lookups جديد تحت العنوان المحدد
+- *موجه من جدول بحث* - يستخدم مجموعة من Lookups كقواعد نحوية لتوليد موجهات عشوائية منها.
+
+**رابط العقدة:** https://github.com/dwringer/generative-grammar-prompt-nodes
+
+**مثال استخدام:**
+
+
+
+---
+
+### GPT2RandomPromptMaker
+
+**الوصف:** عقدة لـ InvokeAI تستخدم نموذج اللغة GPT-2 لتوليد موجهات عشوائية بناءً على بذرة وسياق محددين.
+
+**رابط العقدة:** https://github.com/mickr777/GPT2RandomPromptMaker
+
+**أمثلة على المخرجات**
+
+الموجه المُنشأ: سلاح مسحور سيكون قابلاً للاستخدام من قبل أي شخصية بغض النظر عن توجهها.
+
+
+
+---
+
+### شبكة إلى Gif
+
+**الوصف:** عقدة واحدة تحول صورة شبكية إلى مجموعة صور، وعقدة واحدة تحول مجموعة صور إلى gif.
+
+**رابط العقدة:** https://github.com/mildmisery/invokeai-GridToGifNode/blob/main/GridToGif.py
+
+**رسم بياني عقدة مثال:** https://github.com/mildmisery/invokeai-GridToGifNode/blob/main/Grid%20to%20Gif%20Example%20Workflow.json
+
+**أمثلة على المخرجات**
+
+
+
+
+---
+
+### الألوان النصفية
+
+**الوصف:** Halftone يحول الصورة المصدر إلى تدرج رمادي ثم يقوم بالتنقيط النصفي. CMYK Halftone يحول الصورة إلى CMYK ويطبق تنقيطاً نصفياً لكل قناة لجعل الصورة المصدر تبدو كمجلة أو صحيفة. لكلا العقدتين، يمكنك تحديد الزوايا وتباعد نقاط التنقيط.
+
+**رابط العقدة:** https://github.com/JPPhoto/halftone-node
+
+**مثال**
+
+الإدخال:
+
+
+
+مخرج Halftone:
+
+
+
+مخرج CMYK Halftone:
+
+
+
+---
+
+### محسّن اليد باستخدام MeshGraphormer
+
+**الوصف:** يأخذ Hand Refiner صورتك ويولد تلقائياً خريطة عمق ثابتة لليدين مع قناع لمنطقة اليدين مما سيسمح لك بسهولة باستخدامها مع ControlNet لإصلاح الأيدي غير المنتظمة التي يولدها Stable Diffusion
+
+**رابط العقدة:** https://github.com/blessedcoolant/invoke_meshgraphormer
+
+**عرض**
+
+
+---
+
+### حزمة تركيب الصور والأقنعة
+
+**الوصف:** هذه حزمة من العقد لتكوين الأقنعة والصور، بما في ذلك منشئ قناع نصي بسيط وعقد إزاحة للصور والكامنات. تلتف الإزاحات حولها، لذا يمكن استخدامها مع عقدة Seamless لتوليد تدريجي متمركز على أجزاء مختلفة من التجانب السلس.
+
+يتضمن ذلك 15 عقدة:
+
+- *ضبط تدرج الصورة Plus* - تدوير تدرج الصورة في أحد فضاءات الألوان المختلفة.
+- *مزج الكامنات/الضوضاء (مقنع)* - استخدام قناع لمزج جزء من موتر كامنات [بما في ذلك مخرجات الضوضاء] في آخر. يمكن استخدامه "لإعادة تشويش" أقسام أثناء عملية إزالة ضوضاء متعددة المراحل [مقنعة].
+- *تحسين الصورة* - تعزيز أو تقليل تشبع اللون، التباين، السطوع، الحدة، أو عكس ألوان أي صورة في أي مرحلة باستخدام هذا الغلاف البسيط لوحدة ImageEnhance من Pillow [PIL].
+- *الإضاءة اللونية المكافئة* - حساب إضاءة الصورة مع مراعاة تأثير Helmholtz-Kohlrausch بناءً على طريقة وصفها High و Green و Nussbaum (2023).
+- *نص إلى قناع (Clipseg)* - إدخال موجه وصورة لتوليد قناع يمثل مناطق الصورة المطابقة للموجه.
+- *نص إلى قناع متقدم (Clipseg)* - إخراج ما يصل إلى أربعة أقنعة موجهة مدمجة مع "و" المنطقية، أو "أو" المنطقية، أو كقنوات منفصلة لصورة RGBA.
+- *مزج طبقة الصورة* - إجراء مزج متعدد الطبقات لصورتين باستخدام مزج ألفا. شفافية الطبقة العليا قابلة للتحديد، مع قناع اختياري وعدة أوضاع مزج وفضاءات ألوان مختلفة.
+- *مركب الصور* - أخذ موضوع من صورة بخلفية مسطحة وطبقه على صورة أخرى باستخدام مفتاح الكروما أو إزالة الخلفية بتحديد الفيضان.
+- *توسيع أو تآكل الصورة* - توسيع أو تمديد قناع (أو أي صورة!). هذا يعادل عملية توسيع/انكماش.
+- *عتبات قيمة الصورة* - قص الصورة إلى أسود/أبيض نقي بعد عتبات محددة.
+- *إزاحة الكامنات* - إزاحة موتر كامنات في الأبعاد الرأسية و/أو الأفقية، مع لفه حولها.
+- *إزاحة الصورة* - إزاحة صورة في الأبعاد الرأسية و/أو الأفقية، مع لفها حولها.
+- *تدوير/قلب الصورة* - تدوير صورة بالدرجات في اتجاه عقارب الساعة أو عكسها حول مركزها، مع إمكانية تغيير حجم حدود الصورة لتناسب، أو قلبها حول المحاور الرأسية و/أو الأفقية.
+- *الظلال/الإضاءات/الدرجات المتوسطة* - استخراج ثلاثة أقنعة (مع عتبات صلبة أو ناعمة قابلة للتعديل) تمثل مناطق الظلال والدرجات المتوسطة والإضاءات في الصورة.
+- *قناع النص (2D بسيط)* - إنشاء ووضع سطر نص أبيض على أسود (أو أسود على أبيض) باستخدام أي خط متاح محلياً لـ Invoke.
+
+**رابط العقدة:** https://github.com/dwringer/composition-nodes
+
+
+
+---
+
+### اللون السائد في الصورة
+
+الوصف: يحدد ويستخرج اللون السائد من الصورة باستخدام تجميع k-means.
+
+رابط العقدة: https://github.com/VeyDlin/image-dominant-color-node
+
+عرض:
+
+
+
+---
+
+### تصدير الصور
+
+**الوصف:** تصدير الصور بتنسيقات متعددة (AVIF و JPEG و PNG و TIFF و WebP) مع خيارات ضغط وجودة خاصة بكل تنسيق.
+
+**رابط العقدة:** https://github.com/veeliks/invoke_image_export
+
+**العقد:**
+
+
+
+---
+
+### عقد تحويل الصورة إلى فن حرفي
+
+**الوصف:** مجموعة من العقد لتحويل صورة إدخال إلى صورة فنية ascii/unicode
+
+**رابط العقدة:** https://github.com/mickr777/imagetoasciiimage
+
+**أمثلة على المخرجات**
+
+
+
+
+
+
+
+
+
+---
+
+### منتقي الصور
+
+**الوصف:** تأخذ عقدة InvokeAI هذه مجموعة من الصور وتختار واحدة عشوائياً. يمكن أن يكون هذا مفيداً عندما يكون لديك عدد من الأوضاع للاختيار منها لعقدة ControlNet، أو عدد من صور الإدخال لغرض آخر.
+
+**رابط العقدة:** https://github.com/JPPhoto/image-picker-node
+
+---
+
+### تغيير حجم الصورة Plus
+
+الوصف: يوفر خيارات متنوعة لتغيير حجم الصورة مثل الملء والتمدد والملاءمة والتوسيط والاقتصاص.
+
+رابط العقدة: https://github.com/VeyDlin/image-resize-plus-node
+
+عرض:
+
+
+
+---
+
+### تكبير الكامنات
+
+**الوصف:** تستخدم هذه العقدة نموذجاً صغيراً (~2.4mb) لتكبير الكامنات المستخدمة في توليد صور Stable Diffusion 1.5 أو Stable Diffusion XL، بدلاً من طريقة الاستيفاء التقليدية، متجنبة العيوب التقليدية لتقنية تكبير الكامنات.
+
+**رابط العقدة:** [https://github.com/gogurtenjoyer/latent-upscale](https://github.com/gogurtenjoyer/latent-upscale)
+
+---
+
+### تحميل إطار الفيديو
+
+**الوصف:** هذا موفر إطارات فيديو + عقد إنشاء فهرسة/فيديو لتوصيلها بالمكررات والنطاقات و ControlNet وما شابه ذلك لتجارب عقد InvokeAI. فكر في الرسوم المتحركة + مخرجات ControlNet.
+
+**رابط العقدة:** https://github.com/helix4u/load_video_frame
+
+**مثال على المخرجات:**
+
+
+
+---
+### صنع ثلاثي الأبعاد
+
+**الوصف:** إنشاء صور ستيريو ثلاثية الأبعاد مقنعة من أصول ثنائية الأبعاد.
+
+**رابط العقدة:** [https://gitlab.com/srcrr/shift3d/-/raw/main/make3d.py](https://gitlab.com/srcrr/shift3d)
+
+**رسم بياني عقدة مثال:** https://gitlab.com/srcrr/shift3d/-/raw/main/example-workflow.json?ref_type=heads&inline=false
+
+**أمثلة على المخرجات**
+
+
+
+
+---
+
+### عمليات القناع
+
+الوصف: يقدم عمليات منطقية (OR و SUB و AND) لدمج ومعالجة أقنعة الصور.
+
+رابط العقدة: https://github.com/VeyDlin/mask-operations-node
+
+عرض:
+
+
+
+---
+
+### مطابقة الرسم البياني
+
+**الوصف:** عقدة InvokeAI لمطابقة رسم بياني من صورة إلى أخرى. هذا يشبه إلى حد ما عقدة `color correct` في InvokeAI الرئيسي ولكن هذا يعمل في فضاء الألوان YCbCr ويمكنه معالجة صور بأحجام مختلفة. كما لا يتطلب مدخل قناع.
+- خيار لنقل قناة الإضاءة فقط.
+- خيار لحفظ المخرج بتدرج رمادي
+
+حالة استخدام جيدة لهذه العقدة هي تطبيع ألوان صورة مرت عبر سير عمل التوسيع المبلط لعقد XYGrid الخاصة بي.
+
+انظر الوثائق الكاملة هنا: https://github.com/skunkworxdark/Prompt-tools-nodes/edit/main/README.md
+
+**رابط العقدة:** https://github.com/skunkworxdark/match_histogram
+
+**أمثلة على المخرجات**
+
+
+
+---
+
+### عقد البيانات الوصفية المرتبطة
+
+**الوصف:** مجموعة من العقد للبيانات الوصفية. جمع البيانات الوصفية من داخل عقدة `iterate` واستخراج البيانات الوصفية من الصورة.
+
+- `Metadata Item Linked` - يسمح بجمع البيانات الوصفية أثناء وجودك داخل عقدة iterate دون الحاجة إلى عقدة collect أو تحويل إلى عقدة بيانات وصفية
+- `Metadata From Image` - يوفر بيانات وصفية من الصورة
+- `Metadata To String` - يستخرج قيمة نصية لتسمية من البيانات الوصفية
+- `Metadata To Integer` - يستخرج قيمة عددية صحيحة لتسمية من البيانات الوصفية
+- `Metadata To Float` - يستخرج قيمة عشرية لتسمية من البيانات الوصفية
+- `Metadata To Scheduler` - يستخرج قيمة جدولة من البيانات الوصفية
+- `Metadata To Bool` - يستخرج أنواع Boolean من البيانات الوصفية
+- `Metadata To Model` - يستخرج أنواع النماذج من البيانات الوصفية
+- `Metadata To SDXL Model` - يستخرج أنواع نماذج SDXL من البيانات الوصفية
+- `Metadata To LoRAs` - يستخرج LoRAs من البيانات الوصفية
+- `Metadata To SDXL LoRAs` - يستخرج SDXL LoRAs من البيانات الوصفية
+- `Metadata To ControlNets` - يستخرج ControlNets من البيانات الوصفية
+- `Metadata To IP-Adapters` - يستخرج IP-Adapters من البيانات الوصفية
+- `Metadata To T2I-Adapters` - يستخرج T2I-Adapters من البيانات الوصفية
+- `Denoise Latents + Metadata` - هذه نسخة موروثة من عقدة `Denoise Latents` الموجودة ولكن مع مدخل ومخرج بيانات وصفية.
+
+**رابط العقدة:** https://github.com/skunkworxdark/metadata-linked-nodes
+
+---
+
+### الصورة السلبية
+
+الوصف: ينشئ نسخة سلبية من الصورة، فعالة للتأثيرات البصرية وعكس القناع.
+
+رابط العقدة: https://github.com/VeyDlin/negative-image-node
+
+عرض:
+
+
+
+---
+
+### مولد موجهات الكابوس
+
+**الوصف:** مولد موجهات الكابوس - يستخدم نموذج توليد نص محلي لإنشاء موجهات إبداعية فريدة (لكنها عادة كابوسية) لـ InvokeAI. افتراضياً، يسمح لك بالاختيار من بين بعض نماذج gpt-neo التي قمت بضبطها على أكثر من 2500 من موجهات InvokeAI الخاصة بي بتنسيق Compel، ولكن يمكنك إضافة نماذجك الخاصة أيضاً. يقدم دعماً لاستبدال أي كلمات إشكالية باختيار عشوائي من قائمة يمكنك أيضاً تعريفها.
+
+**رابط العقدة:** [https://github.com/gogurtenjoyer/nightmare-promptgen](https://github.com/gogurtenjoyer/nightmare-promptgen)
+
+---
+
+### عقدة Ollama
+
+**الوصف:** يستخدم واجهة برمجة تطبيقات Ollama لتوسيع موجهات النص لتوليد النص إلى صورة باستخدام LLMs محلية. يعمل بشكل رائع لتوسيع الموجهات الأساسية إلى موجهات لغة طبيعية مفصلة لـ Flux. يوفر أيضاً مفتاحاً لتفريغ نموذج LLM فوراً بعد التوسيع، لتحرير VRAM لـ Invoke لمواصلة سير عمل توليد الصور.
+
+**رابط العقدة:** https://github.com/Jonseed/Ollama-Node
+
+**رسم بياني عقدة مثال:** https://github.com/Jonseed/Ollama-Node/blob/main/Ollama-Node-Flux-example.json
+
+**عرض:**
+
+
+
+---
+
+### موجه زر واحد
+
+
+
+**الوصف:** مجموعة واسعة من عقد التوليد التلقائي للموجهات والمساعدة في الموجهات بناءً على منطق شامل. كن مبدعاً مع أفضل مولد موجهات في العالم.
+
+تولد العقدة الرئيسية موجهات مثيرة للاهتمام بناءً على مجموعة من المعاملات. هناك أيضاً بعض العقد الإضافية مثل Auto Negative Prompt و One Button Artify و Create Prompt Variant وألعاب موجهات رائعة أخرى للعب بها.
+
+**رابط العقدة:** [https://github.com/AIrjen/OneButtonPrompt_X_InvokeAI](https://github.com/AIrjen/OneButtonPrompt_X_InvokeAI)
+
+**العقد:**
+
+
+
+---
+
+### Oobabooga
+
+**الوصف:** يطلب من LLM محلي يعمل في Text-Generation-Webui الخاص بـ Oobabooga كتابة موجه بناءً على إدخال المستخدم.
+
+**الرابط:** https://github.com/sammyf/oobabooga-node
+
+**مثال:**
+
+"صف مخلوقاً أسطورياً جديداً في بيئته الطبيعية"
+
+*قد يُرجع*
+
+"المخلوق الأسطوري الذي أصفه لكم يسمى 'Glimmerwing'. إنه كائن مهيب قزحي الألوان يسكن أعماق الغابات المسحورة والبحيرات المتلألئة. جسده مغطى بقشور لامعة تعكس كل ألوان قوس قزح، وله أجنحة رقيقة شفافة تتلألأ كالماس في ضوء الشمس. موطن Glimmerwing هو بحيرة صافية كالكريستال، محاطة بأشجار شاهقة بأوراق تتلألأ كالجواهر. في هذه البيئة الهادئة، يقضي Glimmerwing أيامه في السباحة برشاقة عبر الماء، مطارداً أسراب الأسماك البراقة ولاعباً مع التموجات اللطيفة على سطح البحيرة.
+عندما تغرب الشمس، يجثم Glimmerwing على غصن إحدى الأشجار، ناشراً جناحيه لالتقاط آخر أشعة الضوء. تتوهج قشور المخلوق بهدوء، مطلقة قوس قزح من الألوان عبر أرضية الغابة. يغني Glimmerwing لحناً ساحراً، صداه يتردد عبر سكون الليل. يقال أن أغنيتها لديها القدرة على شفاء المرضى وجلب السلام للأرواح المضطربة. أولئك المحظوظون بما يكفي لسماع أغنية Glimmerwing يتغيرون إلى الأبد بجمالها ورقتها."
+
+
+
+**المتطلبات**
+
+مثيل Text-Generation-Webui (قد يعمل عن بعد أيضاً، لكني لم أجربه أبداً) وبالطبع InvokeAI 3.x
+
+**ملاحظة**
+
+تعمل هذه العقدة بشكل أفضل مع نماذج SDXL، خاصة حيث يمكن وصف الأسلوب بشكل مستقل عن مخرج LLM.
+
+---
+
+### أدوات الموجه
+
+**الوصف:** مجموعة من عقد InvokeAI التي تضيف أدوات معالجة للموجهات (سلاسل نصية). مصممة لمرافقة عقدة `Prompts From File` وعقد توليد موجهات أخرى.
+
+1. `Prompt To File` - يحفظ موجه أو مجموعة موجهات إلى ملف. واحد لكل سطر. يوجد خيار إلحاق/استبدال.
+2. `PTFields Collect` - يحول حقول توليد الصور إلى سلسلة بتنسيق Json يمكن تمريرها إلى Prompt to file.
+3. `PTFields Expand` - يأخذ سلسلة Json ويحولها إلى معاملات توليد فردية. يمكن تغذيتها من عقدة Prompts to file.
+4. `Prompt Strength` - ينسق الموجه مع القوة مثل تنسيق الوزن لـ compel
+5. `Prompt Strength Combine` - يجمع الموجهات الموزونة لـ .and()/.blend()
+6. `CSV To Index String` - يحصل على سلسلة من CSV حسب الفهرس. يتضمن خيار فهرس عشوائي
+
+العقد التالية مضمنة الآن في الإصدار 3.2 من Invoke ولم تعد موجودة في هذه المجموعة من الأدوات.
+
+- `Prompt Join` -> `String Join`
+- `Prompt Join Three` -> `String Join Three`
+- `Prompt Replace` -> `String Replace`
+- `Prompt Split Neg` -> `String Split Neg`
+
+انظر الوثائق الكاملة هنا: https://github.com/skunkworxdark/Prompt-tools-nodes/edit/main/README.md
+
+**رابط العقدة:** https://github.com/skunkworxdark/Prompt-tools-nodes
+
+**أمثلة على سير العمل**
+
+
+
+---
+
+### الصورة عن بعد
+
+**الوصف:** هذه حزمة من العقد للتفاعل مع الخدمات الأخرى، سواء كانت مواقع ويب عامة أو خوادم محلية مخصصة. تتكون الحزمة من هذه العقد:
+
+- *Load Remote Image* - يتيح لك تحميل الصور عن بعد مثل صورة كاميرا ويب فورية أو صورة اليوم أو صور منشأة ديناميكياً.
+- *Post Image to Remote Server* - يتيح لك تحميل صورة إلى خادم بعيد باستخدام طلب HTTP POST، مثلاً للتخزين أو العرض أو المعالجة الإضافية.
+
+**رابط العقدة:** https://github.com/fieldOfView/InvokeAI-remote_image
+
+---
+
+### BriaAI إزالة الخلفية
+
+**الوصف:** ينفذ إزالة الخلفية بنقرة واحدة باستخدام نموذج الإصدار 1.4 الجديد من BriaAI والذي يبدو أنه ينتج نتائج أفضل من أي أداة سابقة لإزالة الخلفية.
+
+**رابط العقدة:** https://github.com/blessedcoolant/invoke_bria_rmbg
+
+**عرض**
+
+
+---
+
+### إزالة الخلفية
+
+الوصف: تكامل لحزمة rembg لإزالة خلفيات الصور باستخدام نماذج U2NET متعددة.
+
+رابط العقدة: https://github.com/VeyDlin/remove-background-node
+
+عرض:
+
+
+
+---
+
+### Retroize
+
+**الوصف:** Retroize هي مجموعة من العقد لـ InvokeAI "لجعل الصور رجعية". يمكن إعطاء أي صورة طبقة جديدة من الطلاء الرجعي باستخدام هذه العقد، إما من معرضك أو من داخل الرسم البياني نفسه. تتضمن عقداً لتحويل الصور إلى بكسل، وتكميم، وتلوين، وتنقيط؛ بالإضافة إلى استرداد لوحات الألوان من الصور الموجودة.
+
+**رابط العقدة:** https://github.com/Ar7ific1al/invokeai-retroizeinode/
+
+**أمثلة على مخرجات Retroize**
+
+
+
+---
+
+### عقد Stereogram
+
+**الوصف:** مجموعة من العقد المخصصة لـ InvokeAI لإنشاء صور ستيريو منظورية متقاطعة أو متوازية. الصور الستيريو هي صور ثنائية الأبعاد عندما يتم عرضها بشكل صحيح تكشف عن مشهد ثلاثي الأبعاد. تحقق من [r/crossview](https://www.reddit.com/r/CrossView/) للحصول على دروس تعليمية.
+
+**رابط العقدة:** https://github.com/simonfuhrmann/invokeai-stereo
+
+**مثال سير عمل ومخرج**
+
+
+
+---
+
+### كشف البشرة البسيط
+
+الوصف: يكتشف البشرة في الصور بناءً على عتبات لونية محددة مسبقاً.
+
+رابط العقدة: https://github.com/VeyDlin/simple-skin-detection-node
+
+عرض:
+
+
+
+---
+
+### عقد خطوات الحجم
+
+**الوصف:** هذه مجموعة من العقد لحساب زيادات الحجم اللازمة للقيام بسير عمل التكبير. استخدم عقدة *Final Size & Orientation* لإدخال أبعاد الحجم الكامل والاتجاه (صورة عمودية/أفقية/عشوائية)، ثم قم بتوصيل ذلك وأبعاد التوليد الأولية الخاصة بك في *Ideal Size Stepper* واحصل على 1 أو 2 أو 3 أزواج وسيطة من الأبعاد للتكبير. لاحظ أن هذا لا يُخرج الحجم الأولي أو أبعاد الحجم الكامل: المخرجات 1 أو 2 أو 3 لهذه العقدة هي الأحجام الوسيطة فقط.
+
+عقدة ثالثة مضمنة، *Random Switch (Integers)*، وهي مجرد نسخة عامة من Final Size بدون اختيار الاتجاه.
+
+**رابط العقدة:** https://github.com/dwringer/size-stepper-nodes
+
+**مثال استخدام:**
+
+
+
+---
+
+### نص خط إلى صورة
+
+**الوصف:** عقدة نص خط إلى صورة نصية لـ InvokeAI، قم بتنزيل خط لاستخدامه (أو إذا كان في ذاكرة التخزين المؤقت للخطوط يستخدمه من هناك)، يتم تغيير حجم النص دائماً لحجم الصورة، ولكن يمكن التحكم في ذلك باستخدام الحشوة، سطر ثاني اختياري
+
+**رابط العقدة:** https://github.com/mickr777/textfontimage
+
+**أمثلة على المخرجات**
+
+
+
+النتائج بعد استخدام depth controlnet
+
+
+
+
+
+---
+
+### العتبات
+
+**الوصف:** تولد هذه العقدة أقنعة للإضاءات والدرجات المتوسطة والظلال بناءً على صورة إدخال. يمكنك اختيارياً تحديد تمويه لجدول البحث المستخدم في صنع تلك الأقنعة من الصورة المصدر.
+
+**رابط العقدة:** https://github.com/JPPhoto/thresholding-node
+
+**أمثلة**
+
+الإدخال:
+
+
+
+الإضاءات/الدرجات المتوسطة/الظلال:
+
+
+
+
+
+الإضاءات/الدرجات المتوسطة/الظلال (مع تمكين تمويه LUT):
+
+
+
+
+
+---
+
+### قناع Unsharp
+
+**الوصف:** يطبق مرشح قناع unsharp على الصورة، محافظاً على قناة ألفا في هذه العملية.
+
+**رابط العقدة:** https://github.com/JPPhoto/unsharp-mask-node
+
+---
+
+### عقد XY Image to Grid و Images to Grids
+
+**الوصف:** تضيف هذه العقد ما يلي إلى InvokeAI:
+- توليد شبكات من الصور من صور إدخال متعددة
+- إنشاء صور شبكية XY مع تسميات من المعاملات
+- تقسيم الصور إلى بلاطات متداخلة للمعالجة (لسير العمل فائقة الدقة)
+- إعادة دمج بلاطات الصور في صورة مخرجة واحدة مع مزج اللحامات
+
+تتضمن العقد:
+1. `Images To Grids` - دمج صور متعددة في شبكة من الصور
+2. `XYImage To Grid` - أخذ معاملات X & Y وإنشاء شبكة صور م labelled
+3. `XYImage Tiles` - تغيير حجم مبلط على نمط (embiggen) فائق الدقة
+4. `Image Tot XYImages` - أخذ صورة وتقطيعها إلى عدد من الأعمدة والصفوف
+5. عقد داعمة متعددة - عقد مساعدة لمعالجة البيانات وبناء مجموعات `XYImage`
+
+انظر الوثائق الكاملة هنا: https://github.com/skunkworxdark/XYGrid_nodes/edit/main/README.md
+
+**رابط العقدة:** https://github.com/skunkworxdark/XYGrid_nodes
+
+**أمثلة على المخرجات**
+
+
+
+---
+
+### قالب عقدة مثال
+
+**الوصف:** تسمح لك هذه العقدة بفعل أشياء رائعة جداً مع InvokeAI.
+
+**رابط العقدة:** https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/app/invocations/prompt.py
+
+**مثال سير عمل:** https://github.com/invoke-ai/InvokeAI/blob/docs/main/docs/workflows/Prompt_from_File.json
+
+**أمثلة على المخرجات**
+
+
+
+
+## إخلاء مسؤولية
+
+تم تطوير العقد المرتبطة والمساهمة بها من قبل أعضاء مجتمع Invoke AI. بينما نسعى لضمان جودة وسلامة هذه المساهمات، إلا أننا لا نضمن موثوقية أو أمان العقد. إذا كانت لديك مشكلات أو مخاوف مع أي من العقد أدناه، يرجى رفعها على GitHub أو في Discord.
+
+
+## المساعدة
+إذا واجهت أي مشكلة مع عقدة، يرجى النشر في [InvokeAI Discord](https://discord.gg/ZmtBAhwWhy).
diff --git a/docs/src/content/docs/ar/features/Workflows/custom-node-manager.mdx b/docs/src/content/docs/ar/features/Workflows/custom-node-manager.mdx
new file mode 100644
index 00000000000..e28c67abed8
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Workflows/custom-node-manager.mdx
@@ -0,0 +1,76 @@
+---
+title: مدير العقد المخصصة
+sidebar:
+ order: 5
+---
+
+import { Steps } from '@astrojs/starlight/components';
+
+يقوم مدير العقد المخصصة بتثبيت وتحديث وإزالة حزم عقد المجتمع مباشرة من واجهة InvokeAI — بدون نسخ ملفات يدوي، وبدون الحاجة إلى إعادة تشغيل.
+
+## فتح مدير العقد المخصصة
+
+انقر على علامة التبويب **العقد** (أيقونة الدائرة) في الشريط الجانبي الأيسر، بين **النماذج** و **قائمة الانتظار**.
+
+تنقسم الصفحة إلى لوحتين:
+
+- **اليسار:** قائمة بحزم العقد المثبتة، مع عدد العقد لكل حزمة، وشارات النوع، ومسار القرص.
+- **اليمين:** واجهة التثبيت، مع علامات تبويب لـ **رابط مستودع Git** و **فحص المجلد**، بالإضافة إلى سجل التثبيت في الأسفل.
+
+## تثبيت حزمة عقد
+
+
+1. في اللوحة اليمنى، اختر علامة التبويب **رابط مستودع Git**.
+2. الصق رابط Git للحزمة، مثال `https://github.com/user/my-node-pack.git`.
+3. انقر على **تثبيت**.
+
+
+ما يحدث أثناء التثبيت:
+
+- يتم استنساخ المستودع إلى دليل `nodes` الخاص بك.
+- يتم تحميل العقد في عملية InvokeAI الجارية فوراً — **لا حاجة لإعادة التشغيل**.
+- يتم استيراد أي ملفات سير عمل `.json` موجودة في المستودع إلى مكتبة سير العمل الخاصة بك ويتم وضع علامة عليها باسم `node-pack:` حتى تتمكن من تصفيتها.
+- يُظهر سجل التثبيت في أسفل اللوحة نتيجة كل خطوة.
+
+:::caution[الأمان]
+تنفذ العقد المخصصة كود Python عشوائي على جهازك. **قم بتثبيت حزم العقد فقط من المؤلفين الذين تثق بهم.** قد تضر الحزمة الضارة بنظامك أو تسرب بياناتك.
+:::
+
+### تبعيات Python
+
+**لا يقوم** مدير العقد المخصصة بتشغيل `pip install` تلقائياً لملف `requirements.txt` أو `pyproject.toml` للحزمة. قد يؤدي التثبيت التلقائي في بيئة InvokeAI الجارية إلى سحب إصدارات حزم غير متوافقة وتعطيل التطبيق.
+
+إذا كانت الحزمة تحتوي على تبعيات إضافية، سترى إشعار تحذير بعد التثبيت. قم بتثبيتها بنفسك — عادة `pip install -r requirements.txt` من داخل بيئة InvokeAI المفعلة، ولكن تحقق من ملف README الخاص بالحزمة أولاً. بعد التثبيت، انقر على **إعادة التحميل** حتى تدخل التبعيات الجديدة حيز التنفيذ.
+
+## إدارة الحزم المثبتة
+
+يحتوي كل إدخال في اللوحة اليسرى على إجراءات لإدارة الحزمة:
+
+- **إعادة التحميل** — يعيد فحص دليل `nodes`. استخدم هذا بعد إضافة حزمة يدوياً عبر `git clone`، أو بعد تثبيت تبعيات Python إضافية.
+- **إلغاء التثبيت** — يزيل الحزمة من القرص، ويلغي تسجيل عقدها من العملية الجارية، ويزيل أي سير عمل تم استيرادها من الحزمة. لا حاجة لإعادة التشغيل.
+
+## علامة تبويب فحص المجلد
+
+تظهر علامة تبويب **فحص المجلد** مسار دليل `nodes` الخاص بك. أي شيء يوضع هناك يدوياً (على سبيل المثال، عن طريق استنساخ حزمة عبر `git clone`) يتم اكتشافه تلقائياً عند بدء التشغيل. استخدم **إعادة التحميل** لاستلام الحزم المضافة في وقت التشغيل.
+
+## استكشاف الأخطاء وإصلاحها
+
+### فشل التثبيت
+
+- تأكد من صحة رابط Git وإمكانية الوصول إليه.
+- يجب أن يحتوي المستودع على ملف `__init__.py` في جذره.
+- اقرأ سجل التثبيت — فهو يظهر الخطأ الأساسي.
+
+### العقد لا تظهر بعد التثبيت
+
+- انقر على **إعادة التحميل**.
+- تحقق من أن ملف `__init__.py` الخاص بالحزمة يستورد فئات العقد.
+- تحقق من وحدة تحكم الخادم بحثاً عن أخطاء الاستيراد.
+
+### سير العمل يظهر أخطاء بعد إلغاء التثبيت
+
+سير العمل الذي أنشأه المستخدم والتي تشير إلى عقد من حزمة ملغاة التثبيت ستظهر أخطاء لأنواع العقد المفقودة. إما إعادة تثبيت الحزمة أو إزالة العقد المتأثرة من سير العمل.
+
+## تأليف حزمة عقد
+
+إذا كنت ترغب في نشر حزمتك الخاصة بحيث يمكن تثبيتها عبر الرابط، راجع دليل المطور [إنشاء حزمة عقد](/development/guides/creating-nodes/) لمعرفة تخطيط المستودع المطلوب، ومتطلبات `__init__.py`، واتفاقيات شحن سير العمل جنباً إلى جنب مع عقدك.
diff --git a/docs/src/content/docs/ar/features/Workflows/editor-interface.mdx b/docs/src/content/docs/ar/features/Workflows/editor-interface.mdx
new file mode 100644
index 00000000000..0207f7db76f
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Workflows/editor-interface.mdx
@@ -0,0 +1,141 @@
+---
+title: واجهة المحرر
+description: تعلم كيفية استخدام محرر سير العمل في InvokeAI.
+sidebar:
+ order: 2
+lastUpdated: 2026-02-20
+---
+
+import { Card, CardGrid, Steps, Tabs, TabItem } from '@astrojs/starlight/components';
+
+محرر سير العمل هو لوحة بيضاء فارغة تسمح باستخدام وظائف فردية وتحويلات الصور للتحكم في سير عمل توليد الصور. تستقبل العقد المدخلات على الجانب الأيسر، وتُخرج النتيجة على الجانب الأيمن.
+
+يتكون الرسم البياني للعقد من عدة عقد متصلة معاً لإنشاء سير عمل. يتم توصيل مدخلات ومخرجات العقد عن طريق سحب الموصلات من عقدة إلى أخرى. المدخلات والمخرجات مرمزة بالألوان لسهولة الاستخدام.
+
+:::tip[جديد في التوليد المنتشر؟]
+إذا لم تكن معتاداً على التوليد المنتشر، ألق نظرة على [نظرة عامة على التوليد المنتشر](../../concepts/diffusion). فهم كيفية عمل التوليد المنتشر سيمكنك من استخدام محرر سير العمل بسهولة أكبر وبناء سير عمل تناسب احتياجاتك.
+:::
+
+## الميزات
+
+
+ احفظ سير العمل في قاعدة بيانات Invoke، مما يتيح لك إنشاء وتعديل ومشاركة سير العمل حسب الحاجة. يتم توفير مجموعة منسقة من سير العمل الافتراضية للمساعدة في شرح استخدام العقد الهام.
+
+ 
+
+ تحتوي المكتبة على عرضين:
+
+ - **تصفح سير العمل** يعرض سير العمل الافتراضية المنسقة، قابلة للتصفية بمجموعة ثابتة من علامات الفئات.
+ - **سير العمل الخاصة بك** يعرض سير العمل التي قمت بحفظها. مرشح العلامات هنا **ديناميكي** — فهو يعرض كل علامة فريدة موجودة في سير العمل الخاصة بك، مع عدد لكل علامة.
+
+ أضف علامات مفصولة بفواصل إلى سير العمل (مثل `portrait, SDXL, upscaling`) عند حفظه. تظهر العلامات في أسفل كل بلاطة سير عمل في المكتبة وتصبح مرشحات قابلة للتحديد في الشريط الجانبي. انقر على علامة أو أكثر لتضييق القائمة؛ انقر على **سير العمل الخاصة بك** لمسح الفلتر وإظهار كل شيء مرة أخرى. يتم تحديث تعداد العلامات تلقائياً عند إنشاء أو تعديل أو حذف سير عمل.
+
+
+ أنشئ واجهة مستخدم مخصصة لسير العمل الخاص بك، مما يسهل التكرار على توليداتك. يتم حفظ عرض الواجهة الخطية مع سير العمل، مما يسمح لك بمشاركة سير العمل وتمكين الآخرين من استخدامها.
+
+
+ 1. انقر بزر الماوس الأيمن على أي **تسمية مدخل** في عقدة.
+ 2. اختر **"إضافة إلى العرض الخطي"**.
+ 3. سيظهر المدخل الآن في لوحة العرض الخطي الخاصة بك!
+
+
+ 
+
+
+ يمكن إعادة تسمية أي عقدة أو حقل إدخال في محرر سير العمل. إذا تمت إعادة تسمية حقل الإدخال الذي قمت بإعادة تسميته وأضيف إلى العرض الخطي، فسينعكس الاسم المتغير في كلا المكانين.
+
+
+ تحتوي العقد على خيار **"استخدام التخزين المؤقت"** في تذييلها. يتيح ذلك تحسينات في الأداء من خلال إعادة استخدام القيم المخزنة مؤقتاً سابقاً أثناء معالجة سير العمل.
+
+
+### إدارة العقد
+
+استخدم اختصارات لوحة المفاتيح السريعة هذه للتنقل وإدارة سير العمل الخاص بك بكفاءة:
+
+
+
+ Ctrl + C (أو Cmd + C)
+
+
+ Ctrl + V (أو Cmd + V)
+
+
+ Shift + النقر والسحب
+
+
+ Backspace / Delete
+
+
+
+## العقد والمفاهيم الهامة
+
+هناك العديد من مفاهيم تجميع العقد التي يمكن فحصها بتركيز ضيق. يمكن تجميع هذه التجميعات (وغيرها) معاً لتكوين إعدادات رسوم بيانية وظيفية، وهي مهمة لفهم كيفية عمل مجموعات العقد معاً كجزء من الكل.
+
+:::note
+لقطات الشاشة أدناه ليست أمثلة على رسوم بيانية كاملة للعقد، بل هي مقاطع توضح مفاهيم محددة.
+:::
+
+
+
+ ### إنشاء ضوضاء كامنة
+ موتر الضوضاء الأولي ضروري لعملية التوليد المنتشر الكامن. نتيجة لذلك، تتطلب عقدة إزالة الضوضاء مدخلاً من عقدة الضوضاء.
+
+ تتضمن عقدة **إنشاء ضوضاء كامنة** القياسية الآن محدد **نوع الضوضاء** للأشكال الكامنة الخاصة بالبنية المعمارية.
+ اتركه على **SD** لسير عمل التوليد المنتشر المستقرة الكلاسيكية ذات 4 قنوات، أو قم بتبديله إلى البنية المعمارية التي
+ تطابق أداة إزالة الضوضاء النهائية عند العمل مع نماذج مثل FLUX و FLUX.2 و SD3 و CogView4 و Z-Image أو Anima.
+
+ 
+
+ ### تكييف موجه النص
+ التكييف ضروري لعملية التوليد المنتشر الكامن، سواء كان فارغاً أم لا. نتيجة لذلك، تتطلب عقدة إزالة الضوضاء مدخلات تكييف إيجابية وسلبية. يعتمد التكييف على مشفر نص CLIP الذي توفره عقدة محمل النموذج.
+
+ 
+
+
+
+ ### الصورة إلى الكامنات و VAE
+ تأخذ عقدة **ImageToLatents** صورة بكسل و VAE وتُخرج كامنات. عقدة **LatentsToImage** تفعل العكس، حيث تأخذ كامنات و VAE وتُخرج صورة بكسل.
+
+ 
+
+ ### القياس
+ استخدم عقد **ImageScale** و **ScaleLatents** و **Upscale** لتكبير الصور و/أو الصور الكامنة. التكبير هو عملية تكبير الصورة وإضافة المزيد من التفاصيل.
+
+ تختلف الطريقة المختارة حسب السياق. ومع ذلك، كن على دراية بأن الكامنات هي بالفعل مزعجة ومضغوطة بدقتها الأصلية؛ قد يؤدي قياس الصورة إلى نتائج أكثر تفصيلاً.
+
+ 
+
+
+
+ ### ControlNet
+ تُخرج عقدة **ControlNet** تحكماً، يمكن تقديمه كمدخل لعقدة Denoise Latents. اعتماداً على نوع ControlNet المطلوب، تتطلب عقد ControlNet عادةً عقدة معالج صور، مثل Canny Processor أو Depth Processor، والتي تعد صورة الإدخال لاستخدامها مع ControlNet.
+
+ 
+
+ ### LoRA
+ تتيح لك عقدة **Lora Loader** تحميل LoRA وتمريره كمخرج. يوفر LoRA ضبطاً دقيقاً لأوزان UNet ومشفر النص التي تعزز مفردات الصورة والنص للنموذج الأساسي.
+
+ 
+
+
+
+ ### البذور المحددة والعشوائية
+ من الشائع الرغبة في استخدام نفس البذرة (للاستمرارية) والبذور العشوائية (للتنوع). لتحديد بذرة، ما عليك سوى إدخالها في حقل **'Seed'** على عقدة الضوضاء. بالمقابل، تولد عقدة **RandomInt** عدداً صحيحاً عشوائياً بين 'Low' و 'High'، ويمكن استخدامها كمدخل لنقطة حافة 'Seed' على عقدة ضوضاء لجعل البذرة عشوائية.
+
+ 
+
+ ### التكرار + صور متعددة كمدخل
+ التكرار مفهوم شائع في أي معالجة، ويعني تكرار عملية مع مدخل معين. في العقد، يمكنك استخدام عقدة **Iterate** للتكرار من خلال المجموعات التي يتم جمعها عادة بواسطة عقدة **Collect**.
+
+ لعقدة Iterate استخدامات محتملة عديدة، من معالجة مجموعة من الصور واحدة تلو الأخرى، إلى تغيير البذور عبر أجيال صور متعددة وأكثر. توضح لقطة الشاشة هذه كيفية جمع عدة صور واستخدامها في سير عمل توليد الصور.
+
+ 
+
+ ### التوليد الدفعي / المتعدد للصور
+ يتم التوليد الدفعي أو المتعدد للصور في محرر سير العمل باستخدام عقدة **RandomRange**. في هذه الحالة، يمثل حقل 'Size' عدد الصور المراد توليدها، مما يعني أن هذا المثال سيولد 4 صور.
+
+ نظراً لأن RandomRange ينتج مجموعة من الأعداد الصحيحة، نحتاج إلى إضافة عقدة Iterate للتكرار من خلال المجموعة. يمكن بعد ذلك تغذية هذه الضوضاء إلى عقدة Denoise Latents لتتكرار خلال عملية إزالة الضوضاء مع البذور المختلفة المقدمة.
+
+ 
+
+
diff --git a/docs/src/content/docs/ar/features/Workflows/face-tools.mdx b/docs/src/content/docs/ar/features/Workflows/face-tools.mdx
new file mode 100644
index 00000000000..f363f5019ae
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Workflows/face-tools.mdx
@@ -0,0 +1,94 @@
+---
+title: عقد أدوات الوجوه
+---
+
+تكتشف عقد أدوات الوجوه الوجوه باستخدام MediaPipe وتوفر أدوات لتحديد وإخفاء واستخراج الوجوه في سير العمل. العقد الحالية موجودة في فئة `segmentation` وتستخدم الإصدار `1.2.2`.
+
+## FaceIdentifier
+
+**FaceIdentifier** يُخرج نسخة من الصورة المدخلة مع أرقام تعريف الوجوه المكتشفة مطبوعة على كل وجه. استخدمه أولاً عندما تحتاج إلى استهداف وجه معين باستخدام FaceMask أو FaceOff.
+
+يتم ترقيم معرفات الوجوه من `0`. قد يتغير ترتيب الكشف إذا تغيرت الصورة، لذا قم بتشغيل FaceIdentifier مرة أخرى بعد تعديل الصورة.
+
+### المدخلات
+
+| المدخل | الوصف |
+| --- | --- |
+| الصورة | الصورة لاكتشاف الوجوه. |
+| الحد الأدنى للثقة | الحد الأدنى للثقة لاكتشاف الوجه. اخفض هذه القيمة إذا فشل الكشف. |
+| التقسيم | تجاوز اكتشاف الوجه على كامل الصورة واستخدم التقسيم. يُستخدم التقسيم تلقائياً أيضاً إذا لم يتم العثور على وجوه في الصورة الكاملة. |
+
+### المخرجات
+
+| المخرج | الوصف |
+| --- | --- |
+| الصورة | الصورة المدخلة مع أرقام تعريف الوجوه المرسومة على الوجوه المكتشفة. |
+| العرض | عرض الصورة الناتجة بالبكسل. |
+| الارتفاع | ارتفاع الصورة الناتجة بالبكسل. |
+
+## FaceMask
+
+**FaceMask** ينشئ قناعاً للوجوه المكتشفة على الصورة المدخلة.
+
+اترك **معرفات الوجوه** فارغاً لإخفاء جميع الوجوه المكتشفة، أو قدم قائمة مفصولة بفواصل مثل `0,2,7` لاستهداف وجوه محددة. استخدم FaceIdentifier للعثور على المعرفات.
+
+يمكن ضبط القناع مع إزاحات X و Y إذا كان الكشف أكبر أو أصغر قليلاً. فعّل **عكس القناع** للتأثير على كل شيء باستثناء الوجوه المكتشفة.
+
+### المدخلات
+
+| المدخل | الوصف |
+| --- | --- |
+| الصورة | الصورة لاكتشاف الوجوه. |
+| معرفات الوجوه | قائمة مفصولة بفواصل لمعرفات الوجوه المراد إخفاؤها. اترك فارغاً لإخفاء جميع الوجوه المكتشفة. |
+| الحد الأدنى للثقة | الحد الأدنى للثقة لاكتشاف الوجه. اخفض هذه القيمة إذا فشل الكشف. |
+| إزاحة X | إزاحة للمحور X لقناع الوجه. |
+| إزاحة Y | إزاحة للمحور Y لقناع الوجه. |
+| التقسيم | تجاوز اكتشاف الوجه على كامل الصورة واستخدم التقسيم. يُستخدم التقسيم تلقائياً أيضاً إذا لم يتم العثور على وجوه في الصورة الكاملة. |
+| عكس القناع | تبديل لعكس القناع. |
+
+### المخرجات
+
+| المخرج | الوصف |
+| --- | --- |
+| الصورة | الصورة الأصلية، محولة إلى RGBA. |
+| العرض | عرض الصورة الناتجة بالبكسل. |
+| الارتفاع | ارتفاع الصورة الناتجة بالبكسل. |
+| القناع | قناع الوجه المُنشأ. |
+
+## FaceOff
+
+**FaceOff** يستخرج وجهاً واحداً مكتشفاً إلى صورة محددة ويعيد قناعاً مطابقاً بالإضافة إلى إحداثيات اللصق. استخدم FaceIdentifier للعثور على معرف الوجه قبل استهداف وجه معين.
+
+تعمل الحشوة على توسيع المربع المحيط حول الوجه المكتشف. وهذا يعطي المعالجة اللاحقة سياقاً أكثر ويزيد حجم الصورة المحددة مع الحفاظ على مكان الوجه داخل الاقتصاص.
+
+### المدخلات
+
+| المدخل | الوصف |
+| --- | --- |
+| الصورة | الصورة لاكتشاف الوجه. |
+| معرف الوجه | معرف الوجه المراد معالجته، مرقم من `0`. لا يتم دعم وجوه متعددة. |
+| الحد الأدنى للثقة | الحد الأدنى للثقة لاكتشاف الوجه. اخفض هذه القيمة إذا فشل الكشف. |
+| إزاحة X | إزاحة المحور X للقناع. |
+| إزاحة Y | إزاحة المحور Y للقناع. |
+| الحشوة | حشوة من جميع الجوانب حول القناع بالبكسل. |
+| التقسيم | تجاوز اكتشاف الوجه على كامل الصورة واستخدم التقسيم. يُستخدم التقسيم تلقائياً أيضاً إذا لم يتم العثور على وجوه في الصورة الكاملة. |
+
+### المخرجات
+
+| المخرج | الوصف |
+| --- | --- |
+| الصورة | صورة الوجه المحددة. إذا لم يتم العثور على وجه، تمر الصورة الأصلية. |
+| العرض | عرض الصورة الناتجة بالبكسل. |
+| الارتفاع | ارتفاع الصورة الناتجة بالبكسل. |
+| القناع | قناع مطابق للصورة المحددة. |
+| X | إحداثي X للجانب الأيسر من المربع المحيط. |
+| Y | إحداثي Y للجانب العلوي من المربع المحيط. |
+
+## نصائح
+
+- استخدم نفس قيمة **الحد الأدنى للثقة** في FaceIdentifier وعقدة FaceMask أو FaceOff التي تستهلك المعرفات.
+- فعّل **التقسيم** إذا لم يتم اكتشاف جميع الوجوه المستهدفة. يمكن أن ينتج عن كشف الصورة الكاملة والكشف المجزأ نتائج مختلفة.
+- اخفض **الحد الأدنى للثقة** عندما يفشل الكشف، لكن انتبه للإيجابيات الكاذبة.
+- اضبط إزاحات X و Y إذا كان القناع كبيراً جداً أو صغيراً جداً أو منزاحاً.
+- أضف حشوة FaceOff عندما يحتاج الوجه المستخرج إلى مزيد من السياق المحيط.
+- قد يفشل اكتشاف الوجه في حالة وجود طلاء وجه كثيف، أو شعر يغطي الوجه، أو زوايا متطرفة، أو عوائق أخرى.
diff --git a/docs/src/content/docs/ar/features/Workflows/index.mdx b/docs/src/content/docs/ar/features/Workflows/index.mdx
new file mode 100644
index 00000000000..d3b616f3fba
--- /dev/null
+++ b/docs/src/content/docs/ar/features/Workflows/index.mdx
@@ -0,0 +1,31 @@
+---
+title: استخدام سير العمل
+sidebar:
+ order: 1
+---
+
+import { LinkCard, CardGrid } from '@astrojs/starlight/components';
+
+تتيح لك سير العمل ربط عدة **عقد** معاً لإنشاء عمليات توليد صور مخصصة وقابلة للتكرار. من خلال ربط مخرجات بعض العقد بمدخلات أخرى، يمكنك بناء وظائف معقدة مصممة خصيصاً لاحتياجاتك.
+
+## محرر العقد
+
+باستخدام العقد، يمكنك بسهولة توسيع قدرات توليد الصور في InvokeAI. جميع ميزات InvokeAI تُضاف من خلال العقد.
+
+يمكنك قراءة المزيد عن العقد وكيفية استخدام محرر العقد من خلال الاطلاع على الوثائق التفصيلية للعقد:
+
+
+
+## تحميل عقد جديدة
+
+لتحميل عقدة جديدة وتعزيز سير العمل لديك بميزات جديدة، تفضل بزيارة قائمة عقد المجتمع. هذه عقد تم إنشاؤها بواسطة المجتمع، ومن أجل المجتمع.
+
+
diff --git a/docs/src/content/docs/ar/features/custom-node-manager.mdx b/docs/src/content/docs/ar/features/custom-node-manager.mdx
new file mode 100644
index 00000000000..7cfdafc540c
--- /dev/null
+++ b/docs/src/content/docs/ar/features/custom-node-manager.mdx
@@ -0,0 +1,91 @@
+---
+title: مدير العقد المخصصة
+lastUpdated: 2026-05-23
+sidebar:
+ order: 4
+---
+
+import { Steps } from '@astrojs/starlight/components'
+
+يتيح لك مدير العقد المخصصة تثبيت وإدارة وإزالة حزم عقد المجتمع مباشرة من واجهة InvokeAI — لا حاجة لنسخ الملفات يدوياً.
+
+## الوصول إلى مدير العقد
+
+انقر على علامة التبويب **العقد** (أيقونة الدائرة) في الشريط الجانبي الأيسر، بين النماذج وقائمة الانتظار.
+
+## تثبيت حزمة عقد
+
+
+ 1. انتقل إلى علامة التبويب **العقد**
+ 2. في اللوحة اليمنى، اختر علامة التبويب **رابط مستودع Git**
+ 3. الصق رابط Git لحزمة العقد (مثال: `https://github.com/user/my-node-pack.git`)
+ 4. انقر على **تثبيت**
+
+
+سيقوم المثبت بما يلي:
+
+- استنساخ المستودع إلى دليل `nodes` الخاص بك
+- تحميل العقد فوراً — لا حاجة لإعادة التشغيل
+- استيراد أي ملفات سير عمل `.json` موجودة في المستودع إلى مكتبة سير العمل الخاصة بك (موسومة بـ `node-pack:` لسهولة التصفية)
+
+يظهر تقدم ونتائج التثبيت في **سجل التثبيت** في أسفل اللوحة.
+
+### تثبيت تبعيات Python
+
+**لا** يقوم المثبت تلقائياً بتشغيل `pip install` لـ `requirements.txt` أو `pyproject.toml`. قد يؤدي التثبيت التلقائي للتبعيات في بيئة InvokeAI الجارية إلى سحب إصدارات حزم غير متوافقة وتعطيل التطبيق.
+
+إذا كانت حزمة العقد تحتوي على `requirements.txt` أو `pyproject.toml`، سترى إشعار تحذير بعد التثبيت. قم بتثبيت التبعيات بنفسك باتباع التعليمات في توثيق حزمة العقد (عادة `pip install -r requirements.txt` من داخل بيئة InvokeAI المفعلة، ولكن تحقق من README الخاص بالحزمة أولاً). بعد التثبيت، انقر على زر **إعادة التحميل** حتى تدخل التبعيات الجديدة حيز التنفيذ.
+
+### تحذير أمني
+
+تنفذ العقد المخصصة كود Python عشوائي على نظامك. **قم بتثبيت حزم العقد فقط من المؤلفين الذين تثق بهم.** قد تضر العقد الضارة بنظامك أو تعرض بياناتك للخطر.
+
+## إدارة العقد المثبتة
+
+تظهر اللوحة اليسرى جميع حزم العقد المثبتة مع:
+
+- **اسم الحزمة**
+- **عدد العقد** المقدمة
+- **أنواع العقد الفردية** كشارات
+- **مسار الملف** على القرص
+
+### إعادة تحميل العقد
+
+انقر على زر **إعادة التحميل** لإعادة فحص دليل العقد. يلتقط هذا أي حزم عقد تمت إضافتها يدوياً إلى الدليل دون استخدام المثبت.
+
+### إلغاء تثبيت حزمة عقد
+
+انقر على زر **إلغاء التثبيت** على أي حزمة عقد. سيقوم هذا بما يلي:
+
+- إزالة دليل حزمة العقد
+- إلغاء تسجيل العقد من النظام فوراً
+- إزالة أي سير عمل تم استيرادها من الحزمة
+- تحديث محرر سير العمل بحيث لا تكون العقد متاحة بعد الآن
+
+لا حاجة لإعادة التشغيل.
+
+## علامة تبويب فحص المجلد
+
+تظهر علامة تبويب **فحص المجلد** موقع دليل العقد الخاص بك. حزم العقد الموضوعة هناك يدوياً (مثال: عبر `git clone`) يتم اكتشافها تلقائياً عند بدء التشغيل. استخدم زر **إعادة التحميل** لاكتشاف الحزم المضافة حديثاً دون إعادة تشغيل.
+
+## استكشاف الأخطاء وإصلاحها
+
+### فشل تثبيت حزمة العقد
+
+
+ 1. تحقق من صحة رابط Git وإمكانية الوصول إليه
+ 2. تأكد من أن المستودع يحتوي على ملف `__init__.py` في المستوى الأعلى
+ 3. راجع سجل التثبيت للحصول على تفاصيل الخطأ
+
+
+### العقد لا تظهر بعد التثبيت
+
+
+ 1. انقر على زر **إعادة التحميل**
+ 2. تحقق من أن ملف `__init__.py` لحزمة العقد يستورد فئات العقد الخاصة به
+ 3. تحقق من وحدة تحكم الخادم بحثاً عن رسائل الخطأ
+
+
+### سير العمل يظهر أخطاء بعد إلغاء التثبيت
+
+إذا كان لديك سير عمل أنشأها المستخدم تشير إلى عقد من حزمة ملغاة التثبيت، ستظهر تلك سير العمل أخطاء لأنواع العقد المفقودة. أعد تثبيت الحزمة أو أزل العقد المتأثرة من سير العمل.
diff --git a/docs/src/content/docs/ar/features/gallery.mdx b/docs/src/content/docs/ar/features/gallery.mdx
new file mode 100644
index 00000000000..4df7debd4e3
--- /dev/null
+++ b/docs/src/content/docs/ar/features/gallery.mdx
@@ -0,0 +1,139 @@
+---
+title: لوحة المعرض
+description: تعلم كيفية إدارة وتنظيم واستخدام صورك وأصولك المنشأة مع لوحة المعرض في InvokeAI.
+lastUpdated: 2026-02-19
+sidebar:
+ order: 1
+---
+
+import { Card, CardGrid, Steps } from '@astrojs/starlight/components';
+
+لوحة المعرض هي طريقة سريعة لمراجعة والبحث والاستفادة من الصور التي قمت بتوليدها وتحميلها. ينقسم المعرض إلى **لوحات**. لوحة *غير مصنفة* موجودة دائماً، لكن يمكنك إنشاء لوحاتك الخاصة لتنظيم أفضل.
+
+
+
+---
+
+## عرض اللوحة والإعدادات
+
+في أعلى لوحة المعرض، ستجد أزرار الكشف عن اللوحة والإعدادات.
+
+
+
+يظهر **زر الكشف** اسم اللوحة المحددة حالياً ويتيح لك تبديل رؤية الصور المصغرة للوحة.
+
+
+
+يفتح **زر الإعدادات** قائمة بخيارات التخصيص:
+
+
+
+- **حجم الصورة:** شريط تمرير يتيح لك التحكم في حجم معاينات الصور في المعرض.
+- **التبديل التلقائي إلى الصور الجديدة:** عند التمكين، سيتم تحميل الصور المنشأة حديثاً تلقائياً في لوحة الصور الحالية (في علامة تبويب نص إلى صورة) أو لوحة النتائج (في علامة تبويب صورة إلى صورة). يحدث هذا بشكل غير مرئي حتى لو كنت في علامة تبويب مختلفة أثناء التوليد.
+- **التعيين التلقائي للوحة عند النقر:** كلما تم توليد صورة أو حفظها، يتم وضعها في لوحة. اللوحة الوجهة مميزة بشارة `AUTO`.
+ - *عند التمكين:* اللوحة المحددة في لحظة النقر على **Invoke** تصبح الوجهة. هذا يسمح لك بوضع توليدات متعددة في قائمة الانتظار إلى لوحات مختلفة دون انتظار اكتمالها.
+ - *عند التعطيل:* تظهر قائمة منسدلة **لوحة الإضافة التلقائية**، مما يتيح لك تعيين لوحة محددة واحدة كوجهة دائمة لجميع الصور الجديدة.
+- **إظهار شارة حجم الصورة دائماً:** يبدّل ما إذا كانت الدقة (مثال 512×512) معروضة على كل صورة مصغرة للمعاينة.
+
+أسفل هذه الأزرار توجد منطقة إدخال نص **البحث في اللوحات**، مما يتيح لك العثور بسرعة على لوحات محددة بالاسم. بجانبها زر **إضافة لوحة (+)** لإنشاء لوحات جديدة.
+
+:::tip
+يمكنك إعادة تسمية أي لوحة ببساطة عن طريق النقر على اسمها تحت الصورة المصغرة وكتابة الاسم الجديد.
+:::
+
+---
+
+## إدارة اللوحات
+
+لكل لوحة قائمة سياق يمكن الوصول إليها عبر النقر بزر الماوس الأيمن (أو Ctrl+click).
+
+
+
+- **الإضافة التلقائية إلى هذه اللوحة:** إذا كان *التعيين التلقائي للوحة عند النقر* معطلاً في الإعدادات، استخدم هذا الخيار لتعيين اللوحة المحددة بسرعة كوجهة افتراضية للصور الجديدة.
+- **تنزيل اللوحة:** يحزم جميع الصور داخل اللوحة في ملف `.zip`. سيتم توفير رابط إشعار عندما يكون التنزيل جاهزاً.
+- **حذف اللوحة:** يزيل اللوحة وجميع محتوياتها بشكل دائم.
+
+:::danger
+حذف لوحة سيؤدي إلى **حذف جميع الصور** الموجودة داخلها بشكل دائم. تابع بحذر!
+:::
+
+### محتويات اللوحة
+
+كل لوحة منظمة في علامتي تبويب متميزتين:
+
+
+
+1. **الصور:** الصور التي تم إنشاؤها مباشرة داخل InvokeAI.
+2. **الأصول:** الصور الخارجية التي قمت بتحميلها لاستخدامها كـ [موجه صور](https://support.invoke.ai/support/solutions/articles/151000159340-using-the-image-prompt-adapter-ip-adapter-) أو داخل علامة تبويب صورة إلى صورة.
+
+---
+
+## اللوحات الافتراضية
+
+اللوحات الافتراضية هي مجموعات لوحات للقراءة فقط يقوم Invoke بحسابها فورياً من البيانات الوصفية لصورتك بدلاً من تخزينها في قاعدة البيانات. النوع الأول المتاح يجمع الصور **حسب التاريخ**، منشئاً لوحة فرعية واحدة لكل يوم قمت بتوليد الصور فيه.
+
+اللوحات الافتراضية **معطلة بشكل افتراضي**. لتمكينها:
+
+1. افتح **إعدادات اللوحة** (أيقونة الترس في أعلى المعرض).
+2. فعّل **اللوحات الافتراضية**.
+3. يظهر قسم قابل للطي **حسب التاريخ** في قائمة اللوحات، مع لوحة فرعية لكل يوم يحتوي على صور. كل لوحة فرعية تظهر التاريخ وعدد الصور/الأصول وصورة مصغرة للغلاف.
+
+اختيار لوحة فرعية حسب التاريخ يقوم بتصفية المعرض ليعرض فقط الصور من ذلك اليوم. حالة طي قسم حسب التاريخ تستمر عبر عمليات إعادة التحميل.
+
+### الحدود
+
+نظراً لأن اللوحات الافتراضية مشتقة وليست مخزنة:
+
+- هي **للقراءة فقط**: لا سحب وإفلات، لا قائمة سياق، لا وجهة إضافة تلقائية.
+- لا يمكنك إعادة تسميتها أو حذفها.
+- توليد صورة جديدة يحدث التعدادات فوراً، لكن الصورة لا تزال محفوظة في لوحة الإضافة التلقائية العادية — اللوحات الافتراضية هي *عرض*، ليست وجهة.
+- تعطيل تبديل **اللوحات الافتراضية** يخفي القسم ويعيد التحديد إلى *غير مصنفة* إذا كنت تشاهد لوحة فرعية افتراضية.
+
+---
+
+## التفاعل مع الصور
+
+كل صورة تم إنشاؤها بواسطة InvokeAI تخزن بياناتها الوصفية للتوليد (الموجه، البذرة، النماذج، إلخ) مباشرة داخل الملف. يمكنك قراءة هذه البيانات عن طريق تحديد الصورة والنقر على **زر المعلومات**  في أي لوحة نتائج.
+
+بالإضافة إلى ذلك، كل صورة لها قائمة سياق (نقر بزر الماوس الأيمن أو Ctrl+click) مع إجراءات سير عمل قوية:
+
+
+
+*الخيارات المميزة بعلامة نجمية (\*) تتطلب أن تحتوي الصورة على بيانات وصفية للتوليد.*
+
+
+
+ - **فتح في علامة تبويب جديدة:** يفتح الصورة في علامة تبويب متصفح منفصلة.
+ - **تنزيل الصورة:** يحفظ الصورة على جهازك المحلي.
+ - **تثبيت الصورة:** يثبت الصورة في أعلى المعرض. *(متاح أيضاً بالنقر على أيقونة النجمة عند التمرير).*
+
+
+ - **تحميل سير العمل*:** يقوم بتحميل إعدادات سير العمل المحفوظة في علامة تبويب سير العمل ويفتحها.
+ - **إعادة مزج الصورة*:** يقوم بتحميل جميع إعدادات التوليد (**باستثناء** البذرة) في لوحة التحكم.
+ - **استخدام الموجه*:** يقوم بتحميل موجهات النص فقط.
+ - **استخدام البذرة*:** يقوم بتحميل البذرة فقط.
+ - **استخدام الكل*:** يقوم بتحميل جميع إعدادات التوليد في لوحة التحكم.
+
+
+ - **إرسال إلى صورة إلى صورة:** ينقل الصورة إلى اللوحة اليسرى لعلامة تبويب صورة إلى صورة.
+ - **إرسال إلى اللوحة الموحدة:** **يستبدل** محتويات اللوحة الموحدة الحالية بهذه الصورة.
+
+
+ - **تغيير اللوحة:** يفتح موجهًا لنقل الصورة. *(يمكنك أيضاً سحب وإفلات الصور على الصور المصغرة للوحة).*
+ - **حذف الصورة:** يحذف الصورة نهائياً من InvokeAI.
+
+
+
+:::caution
+ اختيار **حذف الصورة** سيزيل الصورة بالكامل من تثبيت InvokeAI الخاص بك. لا يمكن التراجع عن هذا الإجراء.
+:::
+
+---
+
+## ملخص
+
+يغطي هذا الشرح واجهة المعرض واللوحات. للإرشاد حول التوجيه وسير عمل التوليد، يرجى الرجوع إلى [دليل التوجيه](/concepts/prompting-guide/) و [توليد صور الذكاء الاصطناعي](/concepts/image-generation/).
+
+## شكر وتقدير
+
+تحية كبيرة لفريق العمل الأساسي الذي يعمل على جعل واجهة الويب حقيقة واقعة، بما في ذلك [psychedelicious](https://github.com/psychedelicious) و [Kyle0654](https://github.com/Kyle0654) و [blessedcoolant](https://github.com/blessedcoolant). كان [hipsterusername](https://github.com/hipsterusername) المشجع غير الرسمي للفريق وأضاف تلميحات الأدوات/الوثائق.
diff --git a/docs/src/content/docs/ar/features/hotkeys.mdx b/docs/src/content/docs/ar/features/hotkeys.mdx
new file mode 100644
index 00000000000..acd20c1bd2d
--- /dev/null
+++ b/docs/src/content/docs/ar/features/hotkeys.mdx
@@ -0,0 +1,202 @@
+---
+title: الاختصارات
+description: تعلم كيفية استخدام وتخصيص الاختصارات في InvokeAI، وكيف يمكن للمطورين التفاعل مع نظام الاختصارات.
+lastUpdated: 2026-02-19
+sidebar:
+ order: 2
+---
+
+import { Tabs, TabItem, Steps, Card, CardGrid, Icon } from '@astrojs/starlight/components';
+
+يتيح لك InvokeAI تخصيص جميع اختصارات لوحة المفاتيح (الاختصارات السريعة) لتتناسب مع تفضيلات سير العمل لديك. يغطي هذا الدليل كيفية استخدام وتخصيص الاختصارات كمستخدم، بالإضافة إلى توفير توثيق فني للمطورين.
+
+## دليل المستخدم
+
+
+
+ شاهد جميع اختصارات لوحة المفاتيح المتاحة منظمة حسب الفئة في مكان واحد.
+
+
+ غيّر أي اختصار حسب تفضيلك، أو خصص مجموعات مفاتيح متعددة لنفس الإجراء.
+
+
+ التحقق المدمج يمنع المجموعات غير الصالحة.
+
+
+ يتم تخزين الاختصارات المخصصة بأمان واستعادتها عبر الجلسات.
+
+
+
+### فتح نافذة الاختصارات
+
+اضغط Shift + ? أو انقر على **أيقونة لوحة المفاتيح** في التطبيق لفتح نافذة الاختصارات.
+
+### إدارة الاختصارات
+
+
+
+ - تصفح جميع الاختصارات المتاحة منظمة حسب الفئة (التطبيق، اللوحة، المعرض، سير العمل، إلخ).
+ - ابحث عن اختصارات محددة باستخدام شريط البحث.
+ - شاهد مجموعة المفاتيح الحالية لكل إجراء.
+
+
+
+ 1. انقر على زر **القلم الرصاص** بجانب الاختصار الذي تريد تغييره، أو انقر على زر **العلامة الزائد** لإضافة اختصار جديد.
+ 2. أدخل مجموعة الاختصار الجديدة في المحرر.
+ - استخدم أزرار المعدّلات للإدراج السريع (Mod, Ctrl, Shift, Alt).
+ - تحقق من المعاينة المباشرة لترى كيف سيبدو اختصارك.
+ 3. انقر على **علامة الصح** أو اضغط Enter للحفظ.
+
+
+
+ - **إعادة تعيين اختصار واحد:** انقر على أيقونة السهم بعكس عقارب الساعة بجانب الاختصارات المخصصة.
+ - **إعادة تعيين جميع الاختصارات:** في وضع التحرير، انقر على زر **إعادة تعيين الكل إلى الافتراضي** في الأسفل.
+
+
+
+### مرجع تنسيق الاختصار
+
+عند تخصيص الاختصارات، استخدم التنسيقات التالية:
+
+- **المعدّلات الصالحة:** `mod` (Ctrl على Windows/Linux، Cmd على Mac)، `ctrl`، `shift`، `alt`
+- **المفاتيح الصالحة:** أحرف (`a-z`)، أرقام (`0-9`)، مفاتيح الوظائف (`f1-f12`)، مفاتيح خاصة (`enter`، `space`، `tab`، `backspace`، `delete`، `escape`)، مفاتيح الأسهم (`up`، `down`، `left`، `right`)
+- **بدائل متعددة:** افصل بفواصل (مثال: `mod+enter, ctrl+enter`)
+
+:::tip
+ **اختصارات صالحة:** `mod+s`، `ctrl+shift+p`، `f5, mod+r`
+ **اختصارات غير صالحة:** `mod+` (بدون مفتاح بعد المعدّل)، `shift+ctrl+` (ينتهي بمعدّل)
+:::
+
+---
+
+## دليل المطور
+
+يسمح نظام الاختصارات للمطورين بتعريف وإدارة والتحقق من صحة الاختصارات مركزياً في جميع أنحاء التطبيق. إنه مبني على `react-hotkeys-hook`.
+
+### البنية المعمارية
+
+تتكون ميزة الاختصارات القابلة للتخصيص من المكونات التالية:
+
+
+
+ **شريحة حالة الاختصارات (`hotkeysSlice.ts`)**
+ - تخزين تعيينات الاختصارات المخصصة في حالة Redux.
+ - استمرارها إلى IndexedDB باستخدام `redux-remember`.
+ - توفير إجراءات لتغيير وإعادة تعيين فردي أو إعادة تعيين جميع الاختصارات.
+
+
+ **خطاف `useHotkeyData` (`useHotkeyData.ts`)**
+ - تعريف جميع الاختصارات الافتراضية ودمجها مع الاختصارات المخصصة من المتجر.
+ - إرجاع الاختصارات الفعالة المراد استخدامها.
+ - توفير ترجمات مفاتيح خاصة بالمنصة.
+
+
+ - **`HotkeyEditor.tsx`**: محرر مضمن مع معاينة مباشرة وتحقق وإدخال معدّلات.
+ - **`HotkeysModal.tsx`**: واجهة النافذة المنبثقة التي تدعم أوضاع العرض/التحرير والبحث والفئات.
+
+
+
+### إضافة اختصارات جديدة
+
+لإضافة اختصار جديد إلى النظام، اتبع هذه الخطوات:
+
+
+1. **إضافة سلاسل الترجمة**
+ في `invokeai/frontend/web/public/locales/en.json`:
+ ```json
+ {
+ "hotkeys": {
+ "app": {
+ "myAction": {
+ "title": "إجراءي",
+ "desc": "وصف ما يفعله هذا الاختصار"
+ }
+ }
+ }
+ }
+ ```
+
+2. **تسجيل الاختصار**
+ في `invokeai/frontend/web/src/features/system/components/HotkeysModal/useHotkeyData.ts`:
+ ```typescript
+ // داخل دالة بناء الفئة المناسبة
+ addHotkey('app', 'myAction', ['mod+k']); // الربط الافتراضي
+ ```
+
+3. **استخدام الاختصار في المكونات**
+ ```tsx
+ import { useRegisteredHotkeys } from 'features/system/components/HotkeysModal/useHotkeyData';
+
+ const MyComponent = () => {
+ const handleAction = useCallback(() => {
+ // الإجراء الخاص بك هنا
+ }, []);
+
+ // يستخدم تلقائياً الاختصارات المخصصة إذا تم تكوينها
+ useRegisteredHotkeys({
+ id: 'myAction',
+ category: 'app', // 'app', 'canvas', 'viewer', 'gallery', 'workflows'
+ callback: handleAction,
+ options: { enabled: true, preventDefault: true },
+ dependencies: [handleAction]
+ });
+
+ // ...
+ };
+ ```
+
+
+### الأنماط الشائعة
+
+
+
+ تفعيل الاختصارات فقط عند استيفاء شروط معينة:
+ ```typescript
+ useRegisteredHotkeys({
+ id: 'save',
+ category: 'app',
+ callback: handleSave,
+ options: {
+ enabled: hasUnsavedChanges && !isLoading, // فقط عندما يكون صالحاً
+ preventDefault: true
+ },
+ dependencies: [hasUnsavedChanges, isLoading, handleSave]
+ });
+ ```
+
+
+ التأكد من أن الاختصارات نشطة فقط عند التركيز على منطقة معينة:
+ ```tsx
+ import { useFocusRegion } from 'common/hooks/focus';
+
+ const MyComponent = () => {
+ const focusRegionRef = useFocusRegion('myRegion');
+
+ // الاختصار يعمل فقط عندما تكون هذه المنطقة في التركيز
+ useRegisteredHotkeys({
+ id: 'myAction',
+ category: 'app',
+ callback: handleAction,
+ options: { enabled: true }
+ });
+
+ return ...
;
+ };
+ ```
+
+
+ توفير بدائل متعددة لنفس الإجراء:
+ ```typescript
+ // في useHotkeyData.ts
+ addHotkey('canvas', 'redo', ['mod+shift+z', 'mod+y']); // بديلان
+ ```
+
+
+
+:::caution[أفضل الممارسات]
+- **استخدم `mod` بدلاً من `ctrl`**: يرتبط تلقائياً بـ Cmd على Mac، و Ctrl في مكان آخر.
+- **قدم ترجمات وصفية**: ساعد المستخدمين على فهم ما يفعله كل اختصار.
+- **تجنب التعارضات**: تحقق من الاختصارات الموجودة قبل إضافة جديدة.
+- **تحقق من الحالة الممكنة**: فعّل الاختصارات فقط عندما يكون الإجراء متاحاً.
+- **استخدم التبعيات بشكل صحيح**: تأكد من استقرار callbacks مع `useCallback`.
+:::
diff --git a/docs/src/content/docs/ar/index.mdx b/docs/src/content/docs/ar/index.mdx
new file mode 100644
index 00000000000..2adb378faaa
--- /dev/null
+++ b/docs/src/content/docs/ar/index.mdx
@@ -0,0 +1,127 @@
+---
+title: توليد الصور بالذكاء الاصطناعي للمبدعين
+description: محرك إبداعي رائد مصمم لتمكين المحترفين والهواة على حد سواء.
+template: splash
+hero:
+ title: توليد الصور بالذكاء الاصطناعي
للمبدعين
+ tagline: Invoke هو محرك إبداعي مجاني ومفتوح المصدر لتوليد الصور بالذكاء الاصطناعي. صُمم من قبل مبدعين، وللمبدعين. مستضاف ذاتياً، قابل للتخصيص بالكامل، ومرخص تحت رخصة Apache 2.0.
+ actions:
+ - text: البدء
+ link: start-here/installation
+ icon: right-arrow
+ variant: primary
+ - text: عرض على GitHub
+ link: https://github.com/invoke-ai/InvokeAI
+ icon: github
+ variant: minimal
+---
+
+import { Image } from 'astro:assets'
+import { Card, CardGrid, LinkButton } from '@astrojs/starlight/components';
+import DownloadOptions from '@components/DownloadOptions.astro';
+
+import splashImage from './assets/invoke-webui-canvas.png';
+
+
+
+
+
+## المحرك الإبداعي
+
+يوفر Invoke مجموعة أدوات احترافية ومتكاملة لتوليد الصور بالذكاء الاصطناعي، مصممة مع وضع سير العمل الإنتاجية في الاعتبار.
+
+
+
+ اختبر **تحرير القماش القائم على الطبقات** الحقيقي. يتيح لك قماش Invoke القوي الرسم والتلوين والتصميم وتعديل إبداعاتك بدقة لا حدود لها. يمكن معالجة كل طبقة بشكل مستقل—مما يمنحك حرية تكوين مشاهد معقدة بسلاسة دون عناء.
+
+
+ افتح آفاقاً لا محدودة مع **سير العمل المتقدمة القائمة على العقد**. ابني خطوط أنابيب معقدة وقابلة للتكرار عبر واجهة رسومية بيانية بالكامل. اعرض معلمات واجهة مستخدم مخصصة لمشاركة القيم وتحديثها بسهولة دون الغوص في تفاصيل الرسم البياني.
+
+
+ ابق في طليعة التطور مع دعم جاهز لأحدث النماذج التأسيسية، بما في ذلك **Flux و SDXL و SD 1.5** والمزيد. إدارة نقاط التفتيش (checkpoints) و LoRAs و Textual Inversions و ControlNets مع مدير نماذج بديهي.
+
+
+ **محلي بالكامل ومستضاف ذاتياً**. يعمل Invoke على أجهزتك الخاصة. بياناتك، ومطالباتك، وإبداعاتك تنتمي إليك بالكامل. ودّع الخدمات السحابية المقيدة ومخاوف الخصوصية—حافظ على تحكم مطلق في فنك.
+
+
+
+---
+
+## مصمم للإنتاج
+
+صُمم Invoke للحفاظ على تدفقك الإبداعي متواصلاً. على عكس الأدوات الأخرى التي تبدو كتجارب هندسية، Invoke تطبيق احترافي مصقول.
+
+
+
+ واجهة جميلة ونظيفة تعطي الأولوية لعملك الفني. لا قوائم مزدحمة—فقط الأدوات التي تحتاجها حيث تتوقع وجودها.
+
+
+ تنفيذ واسع لـ ControlNet يتيح لك توجيه التوليد بخرائط العمق، والحواف، والأوضاع، والمزيد للتحكم الدقيق في التكوين.
+
+
+ تكرار سريع للمفاهيم مع التوليد الدفعي، والبدائل في المطالبات (prompt wildcards)، ورفع الدقة عالي الجودة، كل ذلك دون مغادرة التطبيق.
+
+
+ يتم تطويره بنشاط من قبل مجتمع مفتوح المصدر شغوف. انضم للحوار، أبلغ عن الأخطاء، أو اطلب ميزات مباشرة.
+
+
+
+---
+
+## انضم للنظام البيئي
+
+سواء كنت تبحث عن تثبيت التطبيق، أو الحصول على الدعم، أو تدريب نماذجك الخاصة، أو المساهمة في المشروع، فإن مجتمع Invoke يغطي كل ذلك.
+
+
+
+ مستعد للبدء؟ [مشغل Invoke](/start-here/installation/) هو أسرع طريقة للتشغيل على Windows و macOS و Linux. للإعدادات المتقدمة، جرب [Docker](/configuration/docker/) أو [التثبيت اليدوي لـ Python](/start-here/manual/).
+
+
+ احصل على Invoke
+
+
+
+
+ تريد تدريب نماذج على أسلوبك الخاص؟ يوفر Invoke Training واجهة مخصصة لـ **Textual Inversion** و **تدريب LoRA**.
+
+
+ استكشف Invoke Training
+
+
+
+
+ عالِق؟ اطلع على [الأسئلة الشائعة](/troubleshooting/faq/) الشاملة للحصول على إجابات سريعة. إذا كنت لا تزال بحاجة للمساعدة، فمجتمعنا نشط ومتعاون بشكل لا يصدق.
+
+ انضم إلى Discord
+
+
+
+ Invoke برنامج مفتوح المصدر أصبح ممكناً بفضل [أشخاص من جميع أنحاء العالم](/contributing/contributors/). نرحب بمساهمات الكود، والتوثيق، والتصميم بأي حجم! اقرأ [دليل المساهمة](/contributing/) للبدء.
+
+
+ اقرأ دليل المساهمة
+
+
+
+
+---
+
+## تحميل Invoke
+
+مستعد لإطلاق العنان لإبداعك؟ Invoke متاح لـ Windows و macOS و Linux. مستضاف ذاتياً، قابل للتخصيص بالكامل، ومرخص تحت رخصة Apache 2.0.
+
+
+
+---
+
+:::note[حول النسخة المستضافة]
+تم إيقاف منصة Invoke المستضافة حيث انضم الفريق المؤسس إلى Adobe. ومع ذلك، يستمر Invoke كمشروع مفتوح المصدر مزدهر تديره المجتمع.
+
+توفر النسخة مفتوحة المصدر نفس الميزات القوية التي ربما استخدمتها في الخدمة المستضافة، مع فائدة إضافية تتمثل في التحكم الكامل والخصوصية من خلال الاستضافة الذاتية.
+
+تم تسليم إدارة المشروع إلى Lincoln Stein (lstein) و Vic (Blessedcoolant)، اللذين كانا من القائمين الأساسيين على المشروع منذ بدايته ويستمران في دفع التطوير للأمام مع المجتمع.
+:::
\ No newline at end of file
diff --git a/docs/src/content/docs/ar/start-here/installation.mdx b/docs/src/content/docs/ar/start-here/installation.mdx
new file mode 100644
index 00000000000..6d43af33257
--- /dev/null
+++ b/docs/src/content/docs/ar/start-here/installation.mdx
@@ -0,0 +1,89 @@
+---
+title: تثبيت بسيط
+lastUpdated: 2026-02-18
+---
+
+import { LinkCard, Tabs, TabItem, Steps } from '@astrojs/starlight/components'
+import SystemRequirementsLink from '@components/SystemRequirmentsLink.astro'
+
+export const alternateLaunchers = [
+ {
+ title: 'Stability Matrix',
+ description: 'احصل على أحدث إصدار من Stability Matrix لمنصتك.',
+ href: 'https://github.com/LykosAI/StabilityMatrix'
+ },
+ {
+ title: 'LynxHub',
+ description: 'احصل على أحدث إصدار من LynxHub لمنصتك.',
+ href: 'https://github.com/KindaBrazy/LynxHub'
+ },
+]
+
+
+
+## مشغل Invoke
+
+مشغل Invoke هو المشغل الرسمي لتثبيت وتحديث وإدارة تثبيت Invoke الخاص بك.
+
+### تنزيل المشغل وإعداده
+
+يدير المشغل تثبيت Invoke. اتبع هذه التعليمات لتنزيل المشغل وإعداده.
+
+
+
+
+ 1. [تنزيل لـ Windows]
+ 2. شغِّل ملف `EXE` لتثبيت المشغل وبدء تشغيله.
+ 3. سيتم إنشاء اختصار على سطح المكتب؛ استخدمه لتشغيل المشغل مستقبلاً.
+ 4. يمكنك حذف ملف `EXE` الذي نزّلته.
+
+
+
+
+ 1. [تنزيل لـ MacOS]
+ 2. افتح ملف `DMG` واسحب التطبيق إلى مجلد `Applications`.
+ 3. شغِّل المشغل من `Applications`.
+ 4. يمكنك حذف ملف `DMG` الذي نزّلته.
+
+
+
+
+ 1. [تنزيل لـ Linux]
+ 2. قد تحتاج لتعديل خصائص ملف `AppImage` وجعله قابلاً للتنفيذ.
+ 3. اختيارياً: انقل الملف إلى موقع لا يتطلب صلاحيات مدير، وأضف اختصار سطح مكتب له.
+ 4. شغِّل المشغل بالنقر المزدوج على `AppImage` أو الاختصار الذي أنشأته.
+
+
+
+
+### تثبيت Invoke
+
+شغِّل المشغل الذي أعددته للتو إذا لم تكن قد فعلت ذلك بالفعل. انقر على **تثبيت** واتبع التعليمات لتثبيت (أو تحديث) Invoke.
+
+إذا كان لديك تثبيت Invoke موجود، يمكنك تحديده والسماح للمشغل بإدارة التثبيت. ستتمكن من تحديث التثبيت أو تشغيله.
+
+### التحديث
+
+يتحقق المشغل من وجود تحديثات لنفسه _و_ لـ Invoke.
+
+عند اكتشاف المشغل لتحديث متاح لنفسه، ستظهر نافذة منبثقة صغيرة. انقر عليها وسيقوم المشغل بتحديث نفسه تلقائياً.
+
+عند اكتشاف المشغل لتحديث لـ Invoke، ستظهر تنبيه أخضر صغير في المشغل. انقر عليه واتبع التعليمات لتحديث Invoke.
+
+## مشغلات بديلة
+
+:::caution
+التثبيتات من المشغلات البديلة لا تدار من قبل Invoke، لذا لا يمكننا ضمان أنها ستعمل بشكل صحيح. إذا كنت تريد تجربة أكثر استقراراً، نوصي باستخدام [مشغل Invoke الرسمي](#invoke-launcher).
+:::
+
+{alternateLaunchers.map(({title, description, href}) => (
+
+))}
+
+[تنزيل لـ Windows]: https://github.com/invoke-ai/launcher/releases/latest/download/Invoke.Community.Edition.Setup.latest.exe
+[تنزيل لـ MacOS]: https://github.com/invoke-ai/launcher/releases/latest/download/Invoke.Community.Edition-latest-arm64.dmg
+[تنزيل لـ Linux]: https://github.com/invoke-ai/launcher/releases/latest/download/Invoke.Community.Edition-latest.AppImage
\ No newline at end of file
diff --git a/docs/src/content/docs/ar/start-here/manual.mdx b/docs/src/content/docs/ar/start-here/manual.mdx
new file mode 100644
index 00000000000..73da9ebacf4
--- /dev/null
+++ b/docs/src/content/docs/ar/start-here/manual.mdx
@@ -0,0 +1,193 @@
+---
+title: التثبيت اليدوي
+lastUpdated: 2026-02-18
+---
+
+import { LinkCard, Tabs, TabItem, Steps, LinkButton } from '@astrojs/starlight/components'
+import SystemRequirementsLink from '@components/SystemRequirmentsLink.astro'
+
+
+
+## هل أنت في المكان الصحيح؟
+
+
+
+
+
+## دليل خطوة بخطوة
+
+سنستخدم [`uv`](https://github.com/astral-sh/uv) لتثبيت بايثون وإنشاء بيئة افتراضية، ثم تثبيت حزمة `invokeai`. `uv` هو بديل حديث وسريع جدًا لـ `pip`.
+
+تختلف الأوامر التالية حسب إصدار Invoke المُثبّت والنظام الذي يُثبّت عليه.
+
+
+
+ 1. ثبّت `uv` كما هو موصوف في [وثائقه](https://docs.astral.sh/uv/getting-started/installation/#standalone-installer). نقترح استخدام طريقة المثبّت المستقل.
+
+ شغّل `uv --version` لتأكيد أن `uv` مُثبّت ويعمل. بعد التثبيت، قد تحتاج إلى إعادة تشغيل الطرفية للوصول إلى `uv`.
+
+ 2. أنشئ دليلاً لتثبيتك، عادةً في مجلدك الرئيسي (مثلاً `~/invokeai` أو `$Home/invokeai`):
+
+
+
+ ```ps
+ mkdir $Home/invokeai
+ cd $Home/invokeai
+ ```
+
+
+ ```bash
+ mkdir ~/invokeai
+ cd ~/invokeai
+ ```
+
+
+
+ 3. أنشئ بيئة افتراضية في ذلك الدليل:
+
+ ```sh
+ uv venv --relocatable --prompt invoke --python 3.12 --python-preference only-managed .venv
+ ```
+
+ ينشئ هذا الأمر بيئة افتراضية محمولة في `.venv` كاملة مع بايثون 3.12 محمول. لا يهم إذا كان نظامك لا يحتوي على بايثون مُثبّت، أو لديه إصدار مختلف - سيتولى `uv` كل شيء.
+
+ 4. فعّل البيئة الافتراضية:
+
+
+
+ ```ps
+ .venv\Scripts\activate
+ ```
+
+
+ ```bash
+ source .venv/bin/activate
+ ```
+
+
+
+ 5. اختر إصدارًا لتثبيته.
+
+
+ عرض الإصدارات
+
+
+ 6. حدد معرف الحزمة لاستخدامه عند التثبيت. هذا لتحسين الأداء.
+
+ - إذا كان لديك بطاقة Nvidia 20xx أو أقدم، استخدم `invokeai[xformers]`.
+ - إذا كان لديك بطاقة Nvidia 30xx أو أحدث، أو ليس لديك بطاقة Nvidia، استخدم `invokeai`.
+
+ 7. حدد الواجهة الخلفية لـ torch لاستخدامها في التثبيت، إن وجدت. هذا ضروري للحصول على الإصدار الصحيح من torch المُثبّت. يتم ذلك باستخدام [دعم torch المدمج في UV.](https://docs.astral.sh/uv/guides/integration/pytorch/#automatic-backend-selection)
+
+ :::note[اختيار واجهة Torch الخلفية]
+ اختر واجهة torch الخلفية فقط عندما تنطبق على نظامك. في جميع الحالات الأخرى، لا تستخدم واجهة torch خلفية.
+ :::
+
+
+
+
+
+ استخدم:
+ ```sh
+ --torch-backend=cu128
+ ```
+
+
+ لا تستخدم واجهة torch خلفية.
+
+
+
+
+
+
+
+ استخدم:
+ ```sh
+ --torch-backend=cu128
+ ```
+
+
+ استخدم:
+ ```sh
+ --torch-backend=cpu
+ ```
+
+
+ استخدم:
+ ```sh
+ --torch-backend=rocm6.3
+ ```
+
+
+ لا تستخدم واجهة torch خلفية.
+
+
+
+
+
+ 8. ثبّت حزمة `invokeai`. استبدل معرف الحزمة والإصدار.
+
+
+
+ ```sh
+ uv pip install == --python 3.12 --python-preference only-managed --force-reinstall
+ ```
+
+
+ ```sh
+ uv pip install == --python 3.12 --python-preference only-managed --torch-backend= --force-reinstall
+ ```
+
+
+
+
+ 9. قم بإلغاء التنشيط وإعادة تنشيط البيئة الافتراضية حتى تصبح الأوامر الخاصة بـ invokeai متاحة في البيئة:
+
+
+
+ ```ps
+ deactivate
+ .venv\Scripts\activate
+ ```
+
+
+ ```bash
+ deactivate && source .venv/bin/activate
+ ```
+
+
+
+ 10. شغّل التطبيق، مع تحديد الدليل الذي أنشأته سابقًا كدليل جذر:
+
+
+
+ ```ps
+ invokeai-web --root ~/invokeai
+ ```
+
+
+ ```bash
+ invokeai-web --root $Home/invokeai
+ ```
+
+
+
+
+إذا كنت تُشغّل Invoke على خادم بدون واجهة رسومية، قد ترغب في تثبيت وتشغيل Invoke من سطر الأوامر.
+
+لا نخطط للحفاظ على نصوص برمجية للقيام بذلك مستقبلاً، بل نركز موارد التطوير لدينا على [المُشغّل](../installation) بواجهة رسومية.
+
+يمكنك إنشاء نصوصك البرمجية الخاصة لذلك بنسخ الأوامر القليلة في هذا الدليل. [وثائق واجهة `pip`](https://docs.astral.sh/uv/reference/cli/#uv-pip-install) الخاصة بـ `uv` قد تكون مفيدة.
diff --git a/docs/src/content/docs/ar/start-here/system-requirements.mdx b/docs/src/content/docs/ar/start-here/system-requirements.mdx
new file mode 100644
index 00000000000..b5373ece7bb
--- /dev/null
+++ b/docs/src/content/docs/ar/start-here/system-requirements.mdx
@@ -0,0 +1,139 @@
+---
+title: متطلبات الأجهزة
+sidebar:
+ order: 1
+lastUpdated: 2026-02-18
+---
+
+import { Tabs, TabItem, Steps } from '@astrojs/starlight/components'
+
+يعمل Invoke على ويندوز 10+ وماك 14+ ولينكس (أوبونتو 20.04+ مُختبرة جيدًا).
+
+## المتطلبات
+
+تتفاوت متطلبات الأجهزة بشكل كبير حسب الموديل وحجم الصورة المُخرجة.
+
+المتطلبات أدناه إرشادات تقريبية لأفضل أداء. بطاقات GPU ذات ذاكرة VRAM أقل تعمل عادةً، وإن كانت أبطأ قليلاً. اتبع [دليل VRAM المنخفض] لتحسين الأداء.
+
+- جميع حواسيب Mac المزودة بمعالجات Apple Silicon (M1، M2، إلخ) تعمل، لكن يُوصى بذاكرة 16 جيجابايت فأكثر.
+- بطاقات AMD GPU مدعومة على لينكس فقط. متطلبات VRAM مماثلة لبطاقات Nvidia GPU.
+
+### ويندوز/لينكس
+
+| عائلة الموديل | أفضل دقة | GPU (سلسلة) | VRAM (الحد الأدنى) | RAM (الحد الأدنى) | ملاحظات |
+|---|---:|---:|---|---:|---|
+| SD1.5 | 512x512 | Nvidia 10xx+ | 4GB | 8GB | |
+| SDXL | 1024x1024 | Nvidia 20xx+ | 8GB | 16GB | |
+| FLUX.1 | 1024x1024 | Nvidia 20xx+ | 10GB | 32GB | |
+| FLUX.2 Klein 4B | 1024x1024 | Nvidia 30xx+ | 12GB | 16GB | FP8 يعمل مع 8GB+؛ Diffusers + مشفر |
+| FLUX.2 Klein 9B | 1024x1024 | Nvidia 40xx | 24GB | 32GB | FP8 يعمل مع 12GB+؛ Diffusers + مشفر |
+| Z-Image Turbo | 1024x1024 | Nvidia 20xx+ | 8GB | 16GB | Q4_K 8GB؛ Q8/BF16 16GB+ |
+
+:::tip[`tmpfs` على لينكس]
+ إذا كان دليلك المؤقت مُثبّتًا كـ `tmpfs`، تأكد من وجود مساحة كافية.
+:::
+
+## بايثون
+
+:::tip[المُشغّل يُثبّت بايثون لك]
+ لست بحاجة لفعل ذلك إذا كنت تُثبّت باستخدام [مُشغّل Invoke](../installation).
+:::
+
+يتطلب Invoke بايثون `3.11` إلى `3.12`. إذا لم يكن لديك أحد هذه الإصدارات مُثبّتة، نقترح تثبيت `3.12`، حيث سيكون مدعومًا لفترة أطول.
+
+تحقق من تثبيت إصدار محدث من بايثون على نظامك بتشغيل `python3 --version` في الطرفية (لينكس، ماك) أو cmd/powershell (ويندوز).
+
+:::tip[تثبيت بايثون]{icon="seti:python"}
+
+
+
+ 1. ثبّت بايثون باستخدام [مثبّت رسمي].
+ 2. يتضمن المثبّت خيارًا لإضافة بايثون إلى PATH. تأكد من تفعيل هذا الخيار. إذا فاتك ذلك، أعد تشغيل المثبّت، واختر تعديل التثبيت الموجود، وحدد هذا المربع.
+ 3. قد تحتاج إلى تثبيت [Microsoft Visual C++ Redistributable].
+
+
+
+
+ 1. ثبّت بايثون باستخدام [مثبّت رسمي].
+ 2. إذا فشل تثبيت الموديلات بسبب خطأ في الشهادة، قد تحتاج إلى تشغيل هذا الأمر (مع تغيير إصدار بايثون ليتوافق مع ما لديك): `/Applications/Python\ 3.11/Install\ Certificates.command`
+ 3. إذا لم تكن قد فعلت ذلك مسبقًا، ستحتاج إلى تثبيت أدوات سطر أوامر XCode بتشغيل `xcode-select --install` في الطرفية.
+
+
+
+
+ 1. تختلف طريقة تثبيت بايثون حسب نظامك. نوصي [باستخدام `uv` لإدارة تثبيت بايثون].
+ 2. ستحتاج إلى تثبيت `libglib2.0-0` و`libgl1-mesa-glx` لكي يعمل OpenCV. على سبيل المثال، على نظام Debian: `sudo apt update && sudo apt install -y libglib2.0-0 libgl1-mesa-glx`
+
+
+
+:::
+
+## برامج التشغيل
+
+إذا كان لديك بطاقة Nvidia أو AMD GPU، قد تحتاج إلى تثبيت برامج التشغيل أو حزم الدعم الأخرى يدويًا لكي تعمل الأشياء بشكل جيد أو على الإطلاق.
+
+### Nvidia
+
+شغّل `nvidia-smi` في سطر أوامر نظامك للتحقق من تثبيت برامج التشغيل و CUDA. إذا فشل هذا الأمر، أو لم يُبلغ عن إصدارات، فستحتاج إلى تثبيت برامج التشغيل.
+
+انتقل إلى [تنزيلات CUDA Toolkit] واتبع التعليمات بعناية لنظامك لتثبيت كل شيء.
+
+تأكد من أن `nvidia-smi` يعرض إصدارات برنامج التشغيل و CUDA بعد التثبيت.
+
+#### لينكس - عبر Nvidia Container Runtime
+
+بديل لتثبيت CUDA محليًا هو استخدام [Nvidia Container Runtime] لتشغيل التطبيق في حاوية.
+
+#### ويندوز - مكتبات Nvidia cuDNN DLL
+
+مكتبة cuDNN قديمة قد تُعيق الأداء بشكل كبير على بطاقات السلسلة 30 وسلسلة 40. تحقق مع المجتمع على discord لمقارنة `it/s` إذا كنت تعتقد أنك قد تحتاج هذا الإصلاح.
+
+أولاً، حدد موقع وجهة ملفات DLL واعمل نسخة احتياطية سريعة:
+
+1. ابحث عن مجلد تثبيت InvokeAI، مثلاً `C:\Users\Username\InvokeAI\`.
+1. افتح مجلد `.venv`، مثلاً `C:\Users\Username\InvokeAI\.venv` (قد تحتاج إلى إظهار الملفات المخفية لرؤيته).
+1. انتقل أعمق إلى حزمة `torch`، مثلاً `C:\Users\Username\InvokeAI\.venv\Lib\site-packages\torch`.
+1. انسخ مجلد `lib` داخل `torch` واعمل منه نسخة احتياطية في مكان آخر.
+
+بعد ذلك، قم بتنزيل ونسخ ملفات cuDNN DLL المُحدّثة:
+
+1. انتقل إلى [وثائق Cuda].
+1. أنشئ حسابًا إذا لزم الأمر وسجّل الدخول.
+1. اختر أحدث إصدار من cuDNN يعمل مع بنية GPU الخاصة بك. استشر [مصفوفة دعم cuDNN] لتحديد الإصدار المناسب لبطاقة GPU الخاصة بك.
+1. نزّل أحدث إصدار واستخرج محتوياته.
+1. ابحث عن مجلد `bin`، مثلاً `cudnn-windows-x86_64-SOME_VERSION\bin`.
+1. انسخ والصق ملفات `.dll` في مجلد `lib` الذي حددته سابقًا. استبدل الملفات عندما يُطلب منك ذلك.
+
+إذا لم يُحسّن ذلك أداءك بعد إعادة تشغيل التطبيق، إما استعد نسختك الاحتياطية أو أعد تشغيل المثبّت لإعادة `torch` إلى حالته الأصلية.
+
+### AMD
+
+:::tip[لينكس فقط]{icon="linux"}
+ بطاقات AMD GPU مدعومة على لينكس فقط، بسبب أن ROCm (المكافئ من AMD لـ CUDA) مدعوم على لينكس فقط.
+:::
+
+:::caution[مطبات محتملة]
+ على الرغم من أن التطبيق يعمل على بطاقات AMD GPU، إلا أن هناك مطبات عرضية تتعلق بدعم torch غير المنتظم.
+:::
+
+شغّل `rocm-smi` في سطر أوامر نظامك للتحقق من تثبيت برامج التشغيل و ROCm. إذا فشل هذا الأمر، أو لم يُبلغ عن إصدارات، فستحتاج إلى تثبيتها.
+
+انتقل إلى [وثائق ROCm] واتبع التعليمات بعناية لنظامك لتثبيت كل شيء.
+
+تأكد من أن `rocm-smi` يعرض إصدارات برنامج التشغيل بعد التثبيت.
+
+#### لينكس - عبر حاوية Docker
+
+بديل لتثبيت ROCm محليًا هو استخدام [حاوية ROCm docker] لتشغيل التطبيق في حاوية.
+
+[دليل VRAM المنخفض]: ../../configuration/low-vram-mode
+[Nvidia Container Runtime]: https://developer.nvidia.com/container-runtime
+[مثبّت رسمي]: https://www.python.org/downloads/
+[استخدام `uv` لإدارة تثبيت بايثون]: https://docs.astral.sh/uv/concepts/python-versions/#installing-a-python-version
+[Microsoft Visual C++ Redistributable]: https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170
+[مُشغّل Invoke]: ../installation
+[تنزيلات CUDA Toolkit]: https://developer.nvidia.com/cuda-downloads
+[وثائق Cuda]: https://developer.nvidia.com/cudnn
+[مصفوفة دعم cuDNN]: https://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html
+[وثائق ROCm]: https://rocmdocs.amd.com
+[حاوية ROCm docker]: https://rocmdocs.amd.com/en/latest/Deep_learning/Deep_learning.html#docker-containers
diff --git a/docs/src/content/docs/ar/troubleshooting/faq.mdx b/docs/src/content/docs/ar/troubleshooting/faq.mdx
new file mode 100644
index 00000000000..c91cac6eb12
--- /dev/null
+++ b/docs/src/content/docs/ar/troubleshooting/faq.mdx
@@ -0,0 +1,117 @@
+---
+title: الأسئلة الشائعة
+lastUpdated: 2026-02-19
+---
+
+import { LinkCard } from '@astrojs/starlight/components';
+
+إذا لم تنجح خطوات استكشاف الأخطاء وإصلاحها في هذه الصفحة في تشغيلك، يُرجى إما [إنشاء مشكلة] أو الانضمام إلى [discord] للحصول على المساعدة.
+
+## كيفية التثبيت
+
+
+
+## تنزيل الموديلات واستخدام الموديلات الموجودة
+
+علامة التبويب "مدير الموديلات" في الواجهة توفر عدة طرق لتثبيت الموديلات، بما في ذلك استخدام الموديلات التي نزّلتها مسبقًا. ستظهر لك نافذة منبثقة توجهك إلى هناك عند أول تشغيل. لمزيد من المعلومات، راجع [وثائق تثبيت الموديلات].
+
+## موديلات مفقودة بعد التحديث من الإصدار v3
+
+إذا وجدت بعض الموديلات مفقودة بعد التحديث من الإصدار v3، فمن المحتمل أنها لم تكن مسجلة بشكل صحيح قبل التحديث ولم يتم التقاطها في الترحيل.
+
+يمكنك استخدام علامة التبويب `مسح المجلد` في واجهة مدير الموديلات لإصلاح ذلك. ستكون الموديلات إما في مجلد `autoimport` القديم غير المستخدم الآن، أو في مجلد `models` الخاص بك.
+
+- ابحث عن مسار مجلد `autoimport` القديم لتثبيتك وانسخه، ثم حدد مجلد التثبيت الرئيسي.
+- انتقل إلى مدير الموديلات وانقر على `مسح المجلد`.
+- الصق المسار وقم بالمسح.
+- هام: قم بإلغاء تحديد `التثبيت في المكان`.
+- انقر على `تثبيت الكل` لتثبيت جميع الموديلات التي تم العثور عليها، أو قم بتثبيت الموديلات التي تريدها فقط.
+
+بعد ذلك، ابحث عن مسار مجلد `models` لتثبيتك وانسخه (قد يكون هذا مسار مجلد الموديلات المخصصة لديك، أو مجلد `models` داخل مجلد التثبيت الرئيسي).
+
+اتبع نفس الخطوات لمسح واستيراد الموديلات المفقودة.
+
+## توليد بطيء
+
+- تحقق من [متطلبات النظام] للتأكد من أن نظامك قادر على توليد الصور.
+- اتبع [دليل وضع VRAM المنخفض] لتحسين الأداء.
+- تحقق من أن عمليات التوليد تتم على بطاقة GPU الخاصة بك (إذا كان لديك واحدة). سيسجل Invoke ما يُستخدم للتوليد عند بدء التشغيل. إذا لم تُستخدم بطاقة GPU الخاصة بك، أعد التثبيت وتأكد من تحديد خيار GPU المناسب.
+- إذا كنت على ويندوز مع بطاقة Nvidia GPU، قد تكون قد تجاوزت سعة VRAM لبطاقة GPU الخاصة بك وتسببت في تفعيل "التراجع الاحتياطي لذاكرة النظام" من Nvidia. يوجد دليل لإلغاء الاشتراك في هذا السلوك في [دليل وضع VRAM المنخفض].
+
+## خطأ Triton عند بدء التشغيل
+
+يمكن تجاهله بأمان. لا يستخدم Invoke Triton، ولكن إذا كنت على لينكس وترغب في تجاهل الخطأ، يمكنك تثبيت Triton.
+
+## عدم القدرة على النسخ في Firefox
+
+لا يسمح Firefox لـ Invoke بالوصول المباشر إلى الحافظة بشكل افتراضي. نتيجة لذلك، قد لا تتمكن من استخدام بعض وظائف النسخ. يمكنك إصلاح ذلك عن طريق تكوين Firefox للسماح بالوصول للكتابة إلى الحافظة:
+
+- انتقل إلى `about:config` وانقر على زر القبول
+- ابحث عن `dom.events.asyncClipboard.clipboardItem`
+- اضبطه على `true` بالنقر على زر التبديل
+- أعد تشغيل Firefox
+
+## إعادة إنتاج صورة وُجدت على الإنترنت
+
+معظم الصور النموذجية مع النصوص التوجيهية التي ستجدها على الإنترنت تم توليدها باستخدام برامج مختلفة، لذلك لا يمكنك توقع الحصول على نتائج متطابقة. من أجل إعادة إنتاج صورة، تحتاج إلى تكرار الإعدادات الدقيقة وخطوات المعالجة، بما في ذلك (على سبيل المثال لا الحصر) الموديل، والنصوص التوجيهية الإيجابية والسلبية، والبذرة، والمنقّي (sampler)، وحجم الصورة بالضبط، وأي خطوات للرفع الفائق (upscaling)، إلخ.
+
+## ملف إعدادات غير صالح
+
+يبدو أن كل شيء يُثبّت بنجاح، لكنك تحصل على `ValidationError` عند بدء تشغيل التطبيق.
+
+يحدث هذا بسبب إعداد غير صالح في ملف الإعدادات `invokeai.yaml`. يجب أن تخبرك رسالة الخطأ بما هو الخطأ.
+
+راجع [وثائق الإعدادات] لمزيد من التفاصيل حول الإعدادات وكيفية تحديدها.
+
+## أخطاء نفاد الذاكرة
+
+الموديلات كبيرة الحجم، وذاكرة VRAM باهظة الثمن، وقد تجد نفسك تواجه أخطاء نفاد الذاكرة عند توليد الصور. اتبع [دليل وضع VRAM المنخفض] لتكوين Invoke لمنع هذه الأخطاء.
+
+## تسرب الذاكرة (لينكس)
+
+إذا لاحظت تسربًا في الذاكرة، فقد يكون سببه تجزئة الذاكرة أثناء تحميل الموديلات و/أو نقلها من وحدة المعالجة المركزية إلى GPU.
+
+الحل البديل هو ضبط تخصيص الذاكرة باستخدام متغير بيئة:
+
+```bash
+# فرض تخصيص الكتل >1MB باستخدام `mmap` بحيث يتم تحريرها إلى النظام فورًا عند إخلائها.
+MALLOC_MMAP_THRESHOLD_=1048576
+```
+
+:::caution[المفاضلة بين السرعة والذاكرة]
+ قد يكون التوليد أبطأ بشكل عام عند تعيين متغير البيئة هذا.
+:::
+
+:::note[ربما يعتمد على تنفيذ `libc`]
+ من غير المعروف ما إذا كانت هذه المشكلة تحدث مع تطبيقات `libc` الأخرى مثل `musl`.
+
+ إذا واجهت هذه المشكلة وكان نظامك يستخدم تطبيقًا مختلفًا، يُرجى تجربة متغير البيئة هذا وإخبارنا إذا كان يصلح المشكلة.
+:::
+
+نقاش مفصل
+
+يعتمد بايثون (و PyTorch) على موزع الذاكرة من مكتبة C القياسية (`libc`). على لينكس، مع تطبيق مكتبة C القياسية من GNU (`glibc`)، لوحظ أن أنماط الوصول إلى الذاكرة لدينا تسبب تجزئة شديدة للذاكرة.
+
+يؤدي هذا التجزؤ إلى كميات كبيرة من الذاكرة التي تم تحريرها ولكن لا يمكن إرجاعها إلى نظام التشغيل. يبدو أن تحميل الموديلات من القرص ونقلها بين CPU/CUDA هما العمليات الأكثر مساهمة في التجزؤ.
+
+يمكن أن تؤدي مشكلة تجزؤ الذاكرة هذه إلى أعطال OOM أثناء التبديل المتكرر بين الموديلات، حتى إذا تم ضبط `ram` (الحد الأقصى لحجم ذاكرة التخزين المؤقت RAM) على قيمة معقولة (مثلاً عطل OOM مع `ram=16` على نظام بذاكرة 32GB).
+
+قد توجد هذه المشكلة أيضًا على أنظمة تشغيل أخرى وتطبيقات `libc` أخرى. ولكن، في وقت كتابة هذا، تم التحقيق فيها فقط على لينكس مع `glibc`.
+
+لفهم كيفية عمل موزع ذاكرة `glibc` بشكل أفضل، راجع هذه المراجع:
+
+- الأساسيات: [The GNU Allocator](https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.html)
+- التفاصيل: [Malloc Internals](https://sourceware.org/glibc/wiki/MallocInternals)
+
+لاحظ الاختلافات بين الذاكرة المخصصة كقطع في ساحة (arena) مقابل الذاكرة المخصصة باستخدام `mmap`. تحت التكوين الافتراضي لـ `glibc`، يتم تخصيص معظم موترات الموديلات كقطع في ساحة مما يجعلها عرضة لمشكلة التجزؤ.
+
+[وثائق تثبيت الموديلات]: ../../concepts/models
+[متطلبات النظام]: ../../start-here/system-requirements
+[دليل وضع VRAM المنخفض]: ../../configuration/low-vram-mode
+[إنشاء مشكلة]: https://github.com/invoke-ai/InvokeAI/issues
+[discord]: https://discord.gg/ZmtBAhwWhy
+[وثائق الإعدادات]: ../../configuration/invokeai-yaml
diff --git a/docs/src/content/i18n/ar.json b/docs/src/content/i18n/ar.json
new file mode 100644
index 00000000000..63e5064b26f
--- /dev/null
+++ b/docs/src/content/i18n/ar.json
@@ -0,0 +1,45 @@
+{
+ "skipLink.label": "تخطي إلى المحتوى",
+ "search.label": "بحث",
+ "search.ctrlKey": "Ctrl",
+ "search.cancelLabel": "إلغاء",
+ "search.devWarning": "البحث متاح فقط في إصدارات الإنتاج.\nحاول بناء الموقع ومعاينته محلياً لاختبار هذه الميزة.",
+ "themeSelect.accessibleLabel": "اختيار السمة",
+ "themeSelect.dark": "داكن",
+ "themeSelect.light": "فاتح",
+ "themeSelect.auto": "تلقائي",
+ "languageSelect.accessibleLabel": "اختيار اللغة",
+ "menuButton.accessibleLabel": "القائمة",
+ "sidebarNav.accessibleLabel": "الرئيسية",
+ "tableOfContents.onThisPage": "في هذه الصفحة",
+ "tableOfContents.overview": "نظرة عامة",
+ "i18n.untranslatedContent": "هذا المحتوى غير متوفر بلغتك بعد.",
+ "page.editLink": "تعديل الصفحة",
+ "page.lastUpdated": "آخر تحديث:",
+ "page.previousLink": "السابق",
+ "page.nextLink": "التالي",
+ "page.draft": "هذا المحتوى عبارة عن مسودة ولن يتم تضمينه في إصدارات الإنتاج.",
+ "404.text": "الصفحة غير موجودة. تحقق من الرابط أو جرب استخدام شريط البحث.",
+ "aside.note": "ملاحظة",
+ "aside.tip": "تلميح",
+ "aside.caution": "تنبيه",
+ "aside.danger": "خطر",
+ "fileTree.directory": "الدليل",
+ "builtWithStarlight.label": "مبني باستخدام Starlight",
+ "heading.anchorLabel": "قسم بعنوان \"{{title}}\"",
+
+ "expressiveCode.copyButtonCopied": "تم النسخ!",
+ "expressiveCode.copyButtonTooltip": "نسخ إلى الحافظة",
+ "expressiveCode.terminalWindowFallbackTitle": "نافذة الطرفية",
+
+ "pagefind.clear_search": "مسح",
+ "pagefind.load_more": "تحميل المزيد من النتائج",
+ "pagefind.search_label": "ابحث في هذا الموقع",
+ "pagefind.filters_label": "عوامل التصفية",
+ "pagefind.zero_results": "لا توجد نتائج لـ [SEARCH_TERM]",
+ "pagefind.many_results": "[COUNT] نتيجة لـ [SEARCH_TERM]",
+ "pagefind.one_result": "[COUNT] نتيجة لـ [SEARCH_TERM]",
+ "pagefind.alt_search": "لا توجد نتائج لـ [SEARCH_TERM]. عرض نتائج لـ [DIFFERENT_TERM] بدلاً من ذلك",
+ "pagefind.search_suggestion": "لا توجد نتائج لـ [SEARCH_TERM]. جرب أحد عمليات البحث التالية:",
+ "pagefind.searching": "جارٍ البحث عن [SEARCH_TERM]..."
+}