diff --git a/html-generators/generate.java b/html-generators/generate.java index ce0f3ee..5688d15 100644 --- a/html-generators/generate.java +++ b/html-generators/generate.java @@ -219,6 +219,7 @@ void buildLocale(String locale, Templates templates, SequencedMap(); extraTokens.putAll(strings); extraTokens.put("locale", locale); + extraTokens.put("htmlDir", locale.equals("ar") ? "rtl" : "ltr"); extraTokens.put("ogLocale", locale.replace("-", "_")); extraTokens.put("basePrefix", basePrefix); extraTokens.put("homeUrl", homeUrl); @@ -264,6 +265,7 @@ void buildLocale(String locale, Templates templates, SequencedMap - + diff --git a/templates/slug-template.html b/templates/slug-template.html index d79134c..494faf4 100644 --- a/templates/slug-template.html +++ b/templates/slug-template.html @@ -1,5 +1,5 @@ - + diff --git a/translations/content/ar/collections/collectors-teeing.yaml b/translations/content/ar/collections/collectors-teeing.yaml new file mode 100644 index 0000000..abebc9b --- /dev/null +++ b/translations/content/ar/collections/collectors-teeing.yaml @@ -0,0 +1,17 @@ +title: "Collectors.teeing()" +oldApproach: "تمريرتان على البيانات" +modernApproach: "teeing()" +summary: "احسب تجميعَين في تمريرة واحدة على Stream." +explanation: "يُرسل Collectors.teeing() كل عنصر إلى مُجمِّعَين فرعيَّين ثم يدمج النتيجتين. يتجنّب هذا تكرار تدفق البيانات مرتين أو استخدام متراكم قابل للتعديل." +whyModernWins: +- icon: "⚡" + title: "تمريرة واحدة" + desc: "تمر على Stream مرة واحدة بدلاً من مرتين." +- icon: "🧩" + title: "قابل للتركيب" + desc: "ادمج أي مُجمِّعَين باستخدام دالة دمج." +- icon: "🔒" + title: "نتيجة ثابتة" + desc: "ادمج مباشرةً في record أو كائن قيمة." +support: + description: "متاح على نطاق واسع منذ JDK 12 (مارس 2019)" diff --git a/translations/content/ar/collections/copying-collections-immutably.yaml b/translations/content/ar/collections/copying-collections-immutably.yaml new file mode 100644 index 0000000..a85704f --- /dev/null +++ b/translations/content/ar/collections/copying-collections-immutably.yaml @@ -0,0 +1,17 @@ +title: "نسخ المجموعات بصورة ثابتة" +oldApproach: "نسخ يدوي + تغليف" +modernApproach: "List.copyOf()" +summary: "أنشئ نسخة ثابتة من أي مجموعة في استدعاء واحد." +explanation: "تُنشئ List.copyOf() و Set.copyOf() و Map.copyOf() نسخاً ثابتة من المجموعات الموجودة. إذا كان المصدر مجموعةً ثابتةً بالفعل فلن تُنشأ نسخة." +whyModernWins: +- icon: "⚡" + title: "نسخ ذكي" + desc: "يتجاوز النسخ إذا كان المصدر ثابتاً بالفعل." +- icon: "📏" + title: "استدعاء واحد" + desc: "لا حاجة لإنشاء ArrayList يدوياً ثم تغليفه." +- icon: "🛡️" + title: "نسخة دفاعية" + desc: "التغييرات في المصدر لا تؤثر على النسخة." +support: + description: "متاح على نطاق واسع منذ JDK 10 (مارس 2018)" diff --git a/translations/content/ar/collections/immutable-list-creation.yaml b/translations/content/ar/collections/immutable-list-creation.yaml new file mode 100644 index 0000000..4687c4c --- /dev/null +++ b/translations/content/ar/collections/immutable-list-creation.yaml @@ -0,0 +1,17 @@ +title: "إنشاء قوائم ثابتة" +oldApproach: "تغليف مطوّل" +modernApproach: "List.of()" +summary: "أنشئ قوائم ثابتة في تعبير واحد نظيف." +explanation: "تُنشئ List.of() قائمةً ثابتةً حقيقيةً دون تغليف أو نسخ دفاعية. وهي لا تقبل القيم الفارغة وهي ثابتة هيكلياً. كانت الطريقة القديمة تتطلب ثلاثة استدعاءات متداخلة." +whyModernWins: +- icon: "📏" + title: "استدعاء واحد" + desc: "استبدل ثلاثة استدعاءات متداخلة بدالة مصنع واحدة." +- icon: "🔒" + title: "ثابتة حقاً" + desc: "ليست مجرد غلاف — القائمة نفسها ثابتة." +- icon: "🛡️" + title: "آمنة من القيم الفارغة" + desc: "ترفض عناصر null وقت الإنشاء وتفشل مبكراً." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/collections/immutable-map-creation.yaml b/translations/content/ar/collections/immutable-map-creation.yaml new file mode 100644 index 0000000..2ff801d --- /dev/null +++ b/translations/content/ar/collections/immutable-map-creation.yaml @@ -0,0 +1,17 @@ +title: "إنشاء خرائط ثابتة" +oldApproach: "نمط بناء الخريطة" +modernApproach: "Map.of()" +summary: "أنشئ خرائط ثابتة مضمّنةً دون مُنشئ." +explanation: "تقبل Map.of() أزواجاً من المفاتيح والقيم مضمّنةً وتُرجع خريطةً ثابتة. للحصول على أكثر من 10 إدخالات، استخدم Map.ofEntries() مع أزواج Map.entry()." +whyModernWins: +- icon: "📏" + title: "إنشاء مضمّن" + desc: "لا حاجة لخريطة مؤقتة قابلة للتعديل." +- icon: "🔒" + title: "نتيجة ثابتة" + desc: "لا يمكن تعديل الخريطة بعد إنشائها." +- icon: "🚫" + title: "لا مفاتيح/قيم فارغة" + desc: "تُرفض الإدخالات الفارغة فوراً." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/collections/immutable-set-creation.yaml b/translations/content/ar/collections/immutable-set-creation.yaml new file mode 100644 index 0000000..ca62f0e --- /dev/null +++ b/translations/content/ar/collections/immutable-set-creation.yaml @@ -0,0 +1,17 @@ +title: "إنشاء مجموعات ثابتة" +oldApproach: "تغليف مطوّل" +modernApproach: "Set.of()" +summary: "أنشئ مجموعات ثابتة باستدعاء مصنع واحد." +explanation: "تُنشئ Set.of() مجموعةً ثابتةً حقيقيةً ترفض القيم الفارغة والعناصر المكررة وقت الإنشاء. لا مزيد من تغليف المجموعات القابلة للتعديل." +whyModernWins: +- icon: "📏" + title: "موجز" + desc: "سطر واحد بدلاً من ثلاثة استدعاءات متداخلة." +- icon: "🚫" + title: "يكشف التكرار" + desc: "يُطلق استثناءً إذا مررت عناصر مكررة عن طريق الخطأ." +- icon: "🔒" + title: "ثابتة" + desc: "لا إضافة أو حذف ممكن بعد الإنشاء." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/collections/map-entry-factory.yaml b/translations/content/ar/collections/map-entry-factory.yaml new file mode 100644 index 0000000..6214ebe --- /dev/null +++ b/translations/content/ar/collections/map-entry-factory.yaml @@ -0,0 +1,17 @@ +title: "دالة مصنع Map.entry()" +oldApproach: "SimpleEntry" +modernApproach: "Map.entry()" +summary: "أنشئ إدخالات الخريطة بدالة مصنع نظيفة." +explanation: "تستبدل Map.entry() مُنشئ AbstractMap.SimpleEntry المطوّل. وهي تُرجع إدخالاً ثابتاً مما يجعلها مثاليةً مع Map.ofEntries() وعمليات Stream." +whyModernWins: +- icon: "📏" + title: "موجز" + desc: "سطر واحد بدلاً من ثلاثة بنيّة أوضح." +- icon: "🔒" + title: "ثابت" + desc: "لا يمكن تعديل الإدخال المُرجَع." +- icon: "🧩" + title: "قابل للتركيب" + desc: "يعمل بشكل مثالي مع Map.ofEntries() للخرائط الكبيرة." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/collections/reverse-list-iteration.yaml b/translations/content/ar/collections/reverse-list-iteration.yaml new file mode 100644 index 0000000..42fa598 --- /dev/null +++ b/translations/content/ar/collections/reverse-list-iteration.yaml @@ -0,0 +1,17 @@ +title: "التكرار العكسي على القوائم" +oldApproach: "ListIterator يدوي" +modernApproach: "reversed()" +summary: "كرّر على قائمة بترتيب عكسي باستخدام حلقة for-each نظيفة." +explanation: "تُرجع الدالة reversed() من SequencedCollection عرضاً عكسياً للقائمة. هذا العرض مدعوم بالقائمة الأصلية دون نسخ. تجعل صيغة حلقة for المحسّنة التكرار العكسي بنفس سهولة التكرار الأمامي." +whyModernWins: +- icon: "📖" + title: "بنية طبيعية" + desc: "حلقة for المحسّنة بدلاً من ListIterator المطوّل." +- icon: "⚡" + title: "لا نسخ" + desc: "reversed() تُرجع عرضاً — لا تكلفة أداء." +- icon: "🧩" + title: "واجهة برمجية موحّدة" + desc: "تعمل على List و Deque و SortedSet بشكل موحّد." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/collections/sequenced-collections.yaml b/translations/content/ar/collections/sequenced-collections.yaml new file mode 100644 index 0000000..db41154 --- /dev/null +++ b/translations/content/ar/collections/sequenced-collections.yaml @@ -0,0 +1,17 @@ +title: "المجموعات المتسلسلة" +oldApproach: "حساب الفهارس" +modernApproach: "getFirst/getLast" +summary: "الوصول إلى العناصر الأولى والأخيرة والعروض العكسية بدوال API نظيفة." +explanation: "تضيف SequencedCollection الدوالَ getFirst() و getLast() و reversed() و addFirst() و addLast() إلى List و Deque و SortedSet و LinkedHashSet. لا مزيد من حساب size-1 أو التكرار العكسي اليدوي." +whyModernWins: +- icon: "📖" + title: "موثّق ذاتياً" + desc: "getLast() أوضح من get(size()-1)." +- icon: "🔄" + title: "عرض عكسي" + desc: "reversed() تُعطي عرضاً — لا نسخ مطلوب." +- icon: "🧩" + title: "واجهة برمجية موحّدة" + desc: "تعمل بنفس الطريقة على List و Deque و SortedSet." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/collections/stream-toarray-typed.yaml b/translations/content/ar/collections/stream-toarray-typed.yaml new file mode 100644 index 0000000..73abc19 --- /dev/null +++ b/translations/content/ar/collections/stream-toarray-typed.yaml @@ -0,0 +1,17 @@ +title: "تحويل Stream إلى مصفوفة محدّدة النوع" +oldApproach: "نسخ المصفوفة يدوياً" +modernApproach: "toArray(generator)" +summary: "حوّل Stream إلى مصفوفة محدّدة النوع باستخدام مرجع دالة." +explanation: "تُنشئ الدالة toArray(IntFunction) مصفوفةً محدّدة النوع من Stream. يُخبر المولّد (String[]::new) التدفقَ بنوع المصفوفة المراد إنشاؤها." +whyModernWins: +- icon: "🎯" + title: "آمن من حيث النوع" + desc: "لا تحويل لـ Object[] — نوع المصفوفة صحيح." +- icon: "🔗" + title: "قابل للتسلسل" + desc: "يعمل في نهاية أي خط معالجة Stream." +- icon: "📏" + title: "موجز" + desc: "تعبير واحد يستبدل الحلقة اليدوية." +support: + description: "متاح على نطاق واسع منذ JDK 8 (مارس 2014)" diff --git a/translations/content/ar/collections/unmodifiable-collectors.yaml b/translations/content/ar/collections/unmodifiable-collectors.yaml new file mode 100644 index 0000000..66dfc8c --- /dev/null +++ b/translations/content/ar/collections/unmodifiable-collectors.yaml @@ -0,0 +1,17 @@ +title: "مُجمِّعات غير قابلة للتعديل" +oldApproach: "collectingAndThen" +modernApproach: "stream.toList()" +summary: "جمّع مباشرةً إلى قائمة غير قابلة للتعديل باستخدام stream.toList()." +explanation: "أضاف Java 10 الدوالَ toUnmodifiableList() و toUnmodifiableSet() و toUnmodifiableMap() لاستبدال غلاف collectingAndThen المطوّل. بالنسبة للقوائم تحديداً، توفر stream.toList() في Java 16 بديلاً أبسط — دون استدعاء collect() على الإطلاق. استخدم toUnmodifiableSet() و toUnmodifiableMap() لأنواع المجموعات الأخرى." +whyModernWins: +- icon: "📏" + title: "الأقصر على الإطلاق" + desc: "stream.toList() لا تحتاج استدعاء collect() أو استيراد Collectors." +- icon: "🔒" + title: "ثابتة" + desc: "لا يمكن تعديل النتيجة — لا طفرات عرضية." +- icon: "📖" + title: "مقروءة" + desc: "تُقرأ بشكل طبيعي كخطوة نهائية في أي خط Stream." +support: + description: "متاح على نطاق واسع منذ JDK 16 (مارس 2021)" diff --git a/translations/content/ar/concurrency/completablefuture-chaining.yaml b/translations/content/ar/concurrency/completablefuture-chaining.yaml new file mode 100644 index 0000000..179d666 --- /dev/null +++ b/translations/content/ar/concurrency/completablefuture-chaining.yaml @@ -0,0 +1,17 @@ +title: "تسلسل CompletableFuture" +oldApproach: "Future.get() المحجوب" +modernApproach: "CompletableFuture" +summary: "سلسل العمليات غير المتزامنة دون حجب باستخدام CompletableFuture." +explanation: "تُتيح CompletableFuture خطوط معالجة غير متزامنة غير محجوبة. سلسل العمليات بـ thenApply و thenCompose و thenAccept. عالج الأخطاء بـ exceptionally(). اجمع عدة مستقبلات بـ allOf/anyOf." +whyModernWins: +- icon: "🔗" + title: "قابل للتسلسل" + desc: "اجمع الخطوات غير المتزامنة في خط معالجة مقروء." +- icon: "🚫" + title: "غير محجوب" + desc: "لا يجلس خيط في انتظار النتائج بلا عمل." +- icon: "🛡️" + title: "معالجة الأخطاء" + desc: "exceptionally() و handle() لاسترداد الأخطاء بشكل نظيف." +support: + description: "متاح على نطاق واسع منذ JDK 8 (مارس 2014)" diff --git a/translations/content/ar/concurrency/concurrent-http-virtual.yaml b/translations/content/ar/concurrency/concurrent-http-virtual.yaml new file mode 100644 index 0000000..3a0c2ed --- /dev/null +++ b/translations/content/ar/concurrency/concurrent-http-virtual.yaml @@ -0,0 +1,17 @@ +title: "طلبات HTTP متزامنة مع الخيوط الافتراضية" +oldApproach: "مجمع خيوط + URLConnection" +modernApproach: "الخيوط الافتراضية + HttpClient" +summary: "اجلب عناوين URL كثيرة بالتوازي باستخدام الخيوط الافتراضية و HttpClient." +explanation: "تجعل الخيوط الافتراضية إنشاء خيط لكل طلب HTTP أمراً عملياً. مع HttpClient يستبدل ذلك أنماط ردود الاتصال غير المتزامنة المعقدة بكود حجب بسيط يتوسّع بشكل جيد." +whyModernWins: +- icon: "♾️" + title: "خيط لكل طلب" + desc: "لا حاجة لضبط حجم المجمع — خيط افتراضي لكل عنوان URL." +- icon: "📖" + title: "كود بسيط" + desc: "اكتب كوداً حجبياً مباشراً." +- icon: "⚡" + title: "إنتاجية عالية" + desc: "آلاف الطلبات المتزامنة بموارد ضئيلة." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/concurrency/executor-try-with-resources.yaml b/translations/content/ar/concurrency/executor-try-with-resources.yaml new file mode 100644 index 0000000..6349692 --- /dev/null +++ b/translations/content/ar/concurrency/executor-try-with-resources.yaml @@ -0,0 +1,17 @@ +title: "الإغلاق التلقائي لـ ExecutorService" +oldApproach: "إيقاف تشغيل يدوي" +modernApproach: "try-with-resources" +summary: "استخدم try-with-resources لإيقاف تشغيل المنفّذ تلقائياً." +explanation: "منذ Java 19، تُنفّذ ExecutorService واجهة AutoCloseable. تستدعي الدالة close() الدالةَ shutdown() وتنتظر اكتمال المهام. لا مزيد من أنماط try/finally اليدوية لإيقاف التشغيل." +whyModernWins: +- icon: "🧹" + title: "تنظيف تلقائي" + desc: "يحدث الإيقاف تلقائياً عند الخروج من الكتلة." +- icon: "🛡️" + title: "لا تسريبات" + desc: "يُوقَف المنفّذ دائماً حتى عند حدوث استثناءات." +- icon: "📖" + title: "نمط مألوف" + desc: "نفس try-with-resources المستخدم مع الملفات والاتصالات." +support: + description: "متاح على نطاق واسع منذ JDK 19 (سبتمبر 2022)" diff --git a/translations/content/ar/concurrency/lock-free-lazy-init.yaml b/translations/content/ar/concurrency/lock-free-lazy-init.yaml new file mode 100644 index 0000000..ca13e0c --- /dev/null +++ b/translations/content/ar/concurrency/lock-free-lazy-init.yaml @@ -0,0 +1,17 @@ +title: "التهيئة الكسولة بدون أقفال" +oldApproach: "synchronized + volatile" +modernApproach: "StableValue" +summary: "استبدل القفل المزدوج بـ StableValue للحصول على مفاردات كسولة." +explanation: "يُغلّف StableValue نمط التهيئة الكسولة مع أمان صحيح للخيوط. يمكن لـ JVM تحسين مسار القراءة بعد التهيئة مما قد يجعله أسرع من قراءات volatile." +whyModernWins: +- icon: "🧹" + title: "لا كليشيه" + desc: "لا volatile ولا synchronized ولا فحص مزدوج للقيمة الفارغة." +- icon: "⚡" + title: "قراءات أسرع" + desc: "يمكن لـ JVM طي القيمة بعد التهيئة." +- icon: "✅" + title: "صحيح بصورة مُبرهنة" + desc: "لا أخطاء ترتيب خفية — JVM يتولى الأمر." +support: + description: "معاينة في JDK 25 (JEP 502، StableValue). يتطلب --enable-preview." diff --git a/translations/content/ar/concurrency/process-api.yaml b/translations/content/ar/concurrency/process-api.yaml new file mode 100644 index 0000000..527fca0 --- /dev/null +++ b/translations/content/ar/concurrency/process-api.yaml @@ -0,0 +1,17 @@ +title: "واجهة برمجة العمليات الحديثة" +oldApproach: "Runtime.exec()" +modernApproach: "ProcessHandle" +summary: "افحص عمليات نظام التشغيل وأدِرها باستخدام ProcessHandle." +explanation: "يوفر ProcessHandle معرّفات العملية PID ومعلومات العملية (الأمر والوسائط ووقت البدء واستخدام المعالج) وعلاقات الوالد/الطفل وتدمير العمليات. لا مزيد من الأجزاء الداخلية غير الموثّقة لـ Process." +whyModernWins: +- icon: "🔍" + title: "معلومات كاملة" + desc: "الوصول إلى PID والأمر والوسائط ووقت البدء واستخدام المعالج." +- icon: "🌳" + title: "شجرة العمليات" + desc: "التنقل بين الوالد والأبناء والأحفاد." +- icon: "📊" + title: "المراقبة" + desc: "onExit() يُرجع CompletableFuture للمراقبة غير المتزامنة." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/concurrency/scoped-values.yaml b/translations/content/ar/concurrency/scoped-values.yaml new file mode 100644 index 0000000..d7dd237 --- /dev/null +++ b/translations/content/ar/concurrency/scoped-values.yaml @@ -0,0 +1,17 @@ +title: "القيم ذات النطاق" +oldApproach: "ThreadLocal" +modernApproach: "ScopedValue" +summary: "شارك البيانات عبر مكدسات الاستدعاء بأمان دون مخاطر ThreadLocal." +explanation: "يوفر ScopedValue سياقاً ثابتاً وقابلاً للوراثة ومحدود النطاق. بخلاف ThreadLocal، تُنظَّف القيم ذات النطاق تلقائياً وتعمل مع الخيوط الافتراضية ولا يمكن للمستدعين تعديلها." +whyModernWins: +- icon: "🔒" + title: "ثابتة" + desc: "يمكن للمستدعين القراءة لكن لا يستطيعون تعديل القيمة ذات النطاق." +- icon: "🧹" + title: "تنظيف تلقائي" + desc: "لا حاجة لـ remove() يدوي — القيمة محددة النطاق للكتلة." +- icon: "⚡" + title: "آمنة مع الخيوط الافتراضية" + desc: "تعمل بكفاءة مع ملايين الخيوط الافتراضية." +support: + description: "أُنهيت في JDK 25 LTS (JEP 506، سبتمبر 2025)." diff --git a/translations/content/ar/concurrency/stable-values.yaml b/translations/content/ar/concurrency/stable-values.yaml new file mode 100644 index 0000000..aedcc14 --- /dev/null +++ b/translations/content/ar/concurrency/stable-values.yaml @@ -0,0 +1,17 @@ +title: "القيم الثابتة" +oldApproach: "القفل المزدوج" +modernApproach: "StableValue" +summary: "تهيئة كسولة آمنة للخيوط دون volatile أو synchronized." +explanation: "يوفر StableValue قيمةً مُهيَّأةً كسولاً وثابتةً مع أمان مدمج للخيوط. لا قفل مزدوج ولا حقول volatile ولا كتل synchronized. يمكن لـ JVM حتى تحسين مسار القراءة بعد التهيئة." +whyModernWins: +- icon: "🧹" + title: "صفر كليشيه" + desc: "لا volatile ولا synchronized ولا فحوصات null." +- icon: "⚡" + title: "مُحسَّن من JVM" + desc: "يمكن لـ JVM طي القيمة بعد التهيئة." +- icon: "🛡️" + title: "مضمون مرة واحدة" + desc: "المورّد يعمل مرة واحدة بالضبط حتى في حال التنافس." +support: + description: "معاينة في JDK 25 (JEP 502). يتطلب --enable-preview." diff --git a/translations/content/ar/concurrency/structured-concurrency.yaml b/translations/content/ar/concurrency/structured-concurrency.yaml new file mode 100644 index 0000000..8062547 --- /dev/null +++ b/translations/content/ar/concurrency/structured-concurrency.yaml @@ -0,0 +1,17 @@ +title: "التزامن المنظّم" +oldApproach: "إدارة دورة حياة الخيوط يدوياً" +modernApproach: "StructuredTaskScope" +summary: "أدِر دورات حياة المهام المتزامنة كوحدة عمل واحدة." +explanation: "يعامل التزامن المنظّم مجموعةً من المهام المتزامنة كعملية واحدة. إذا فشلت أي مهمة فرعية أُلغيت الأخرى. يضمن النطاق عدم تسريب الخيوط ويوفر علاقات واضحة بين الوالد والطفل." +whyModernWins: +- icon: "🛡️" + title: "لا تسريب للخيوط" + desc: "تكتمل جميع المهام المتفرعة قبل إغلاق النطاق." +- icon: "⚡" + title: "فشل سريع" + desc: "ShutdownOnFailure يلغي المهام الشقيقة إذا فشلت إحداها." +- icon: "📐" + title: "بنية واضحة" + desc: "دورة حياة المهمة تتطابق مع النطاق المعجمي في الكود." +support: + description: "معاينة في JDK 25 (المعاينة الخامسة، JEP 505). يتطلب --enable-preview." diff --git a/translations/content/ar/concurrency/thread-sleep-duration.yaml b/translations/content/ar/concurrency/thread-sleep-duration.yaml new file mode 100644 index 0000000..480f661 --- /dev/null +++ b/translations/content/ar/concurrency/thread-sleep-duration.yaml @@ -0,0 +1,17 @@ +title: "Thread.sleep مع Duration" +oldApproach: "ميلي ثانية" +modernApproach: "Duration" +summary: "استخدم Duration للحصول على قيم زمنية موثّقة ذاتياً." +explanation: "تجعل Thread.sleep(Duration) وحدة الوقت صريحة. لا مزيد من التخمين هل 5000 تعني ميلي ثانية أم ميكرو ثانية. تعمل مع Duration.ofSeconds و ofMillis و ofMinutes وغيرها." +whyModernWins: +- icon: "📖" + title: "موثّقة ذاتياً" + desc: "Duration.ofSeconds(5) لا لبس فيه." +- icon: "🛡️" + title: "آمنة من حيث الوحدات" + desc: "لا خطأ بتمرير ميكرو ثانية بدلاً من ميلي ثانية." +- icon: "🧩" + title: "قابلة للتركيب" + desc: "عمليات Duration الحسابية: plus() و multipliedBy() وغيرها." +support: + description: "متاح على نطاق واسع منذ JDK 19 (سبتمبر 2022)" diff --git a/translations/content/ar/concurrency/virtual-threads.yaml b/translations/content/ar/concurrency/virtual-threads.yaml new file mode 100644 index 0000000..273e4db --- /dev/null +++ b/translations/content/ar/concurrency/virtual-threads.yaml @@ -0,0 +1,17 @@ +title: "الخيوط الافتراضية" +oldApproach: "خيوط المنصة" +modernApproach: "الخيوط الافتراضية" +summary: "أنشئ ملايين الخيوط الافتراضية الخفيفة بدلاً من الخيوط الثقيلة لنظام التشغيل." +explanation: "الخيوط الافتراضية هي خيوط خفيفة يديرها JVM لا نظام التشغيل. يمكنك إنشاء ملايين منها دون ضبط مجمعات الخيوط. وهي مثالية للمهام المكثّفة إدخالاً/إخراجاً مثل طلبات HTTP واستعلامات قواعد البيانات." +whyModernWins: +- icon: "⚡" + title: "خفيفة الوزن" + desc: "الخيوط الافتراضية تستخدم كيلوبايتات من الذاكرة بينما تستهلك خيوط المنصة ميغابايتات." +- icon: "♾️" + title: "قابلة للتوسع" + desc: "أنشئ ملايين الخيوط — لا حاجة لضبط حجم المجمع." +- icon: "🧹" + title: "نموذج بسيط" + desc: "اكتب كوداً حجبياً يتوسّع كالكود غير المتزامن." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/datetime/date-formatting.yaml b/translations/content/ar/datetime/date-formatting.yaml new file mode 100644 index 0000000..fda36ed --- /dev/null +++ b/translations/content/ar/datetime/date-formatting.yaml @@ -0,0 +1,17 @@ +title: "تنسيق التاريخ" +oldApproach: "SimpleDateFormat" +modernApproach: "DateTimeFormatter" +summary: "نسّق التواريخ باستخدام DateTimeFormatter الآمن للخيوط والثابت." +explanation: "DateTimeFormatter ثابت وآمن للخيوط بخلاف SimpleDateFormat. يمكن تخزينه كثابت ومشاركته. تتوفر مُنسِّقات مسبقة التعريف مثل ISO_LOCAL_DATE للتنسيقات الشائعة." +whyModernWins: +- icon: "🛡️" + title: "آمن للخيوط" + desc: "شارك المُنسِّقات عبر الخيوط دون مزامنة." +- icon: "📋" + title: "تنسيقات مدمجة" + desc: "ISO_LOCAL_DATE و ISO_INSTANT وغيرها للتنسيقات القياسية." +- icon: "🔒" + title: "ثابت" + desc: "خزّنه كثوابت static final بأمان." +support: + description: "متاح على نطاق واسع منذ JDK 8 (مارس 2014)" diff --git a/translations/content/ar/datetime/duration-and-period.yaml b/translations/content/ar/datetime/duration-and-period.yaml new file mode 100644 index 0000000..f3fadf0 --- /dev/null +++ b/translations/content/ar/datetime/duration-and-period.yaml @@ -0,0 +1,17 @@ +title: "Duration و Period" +oldApproach: "حساب الميلي ثانية" +modernApproach: "Duration / Period" +summary: "احسب فوارق الوقت بـ Duration و Period الآمنَين من حيث النوع." +explanation: "Duration للكميات الزمنية (ساعات ودقائق وثوان). Period للكميات المبنية على التاريخ (سنوات وأشهر وأيام). ChronoUnit.between() للفروق البسيطة. جميعها تتعامل مع الحالات الطرفية بشكل صحيح." +whyModernWins: +- icon: "🎯" + title: "آمن من حيث النوع" + desc: "Duration للوقت و Period للتواريخ — لا التباس." +- icon: "🛡️" + title: "حساب صحيح" + desc: "يتعامل مع انتقالات التوقيت الصيفي والسنوات الكبيسة والثواني الكبيسة." +- icon: "📖" + title: "مقروء" + desc: "ChronoUnit.DAYS.between() يُقرأ كاللغة الطبيعية." +support: + description: "متاح على نطاق واسع منذ JDK 8 (مارس 2014)" diff --git a/translations/content/ar/datetime/hex-format.yaml b/translations/content/ar/datetime/hex-format.yaml new file mode 100644 index 0000000..8f00eb3 --- /dev/null +++ b/translations/content/ar/datetime/hex-format.yaml @@ -0,0 +1,17 @@ +title: "HexFormat" +oldApproach: "تحويل ست عشري يدوي" +modernApproach: "HexFormat" +summary: "حوّل بين السلاسل الست عشرية ومصفوفات البايت باستخدام HexFormat." +explanation: "يوفر HexFormat ترميزاً/فك ترميزاً ثنائي الاتجاه للبايتات والأعداد الصحيحة والمصفوفات بالتنسيق الست عشري. يمكن تهيئة المُحدِّدات والبادئة واللاحقة وحالة الحروف. لا مزيد من التنسيق أو التحليل اليدوي." +whyModernWins: +- icon: "📐" + title: "ثنائي الاتجاه" + desc: "حوّل البايتات إلى سداسي عشري والعكس بواجهة برمجية واحدة." +- icon: "🔧" + title: "قابل للتهيئة" + desc: "مُحدِّدات وبادئة ولاحقة وحالة حروف علوية/سفلية." +- icon: "📦" + title: "دعم المصفوفات" + desc: "رمّز/فك ترميز مصفوفات البايتات الكاملة دفعةً واحدة." +support: + description: "متاح على نطاق واسع منذ JDK 17 LTS (سبتمبر 2021)" diff --git a/translations/content/ar/datetime/instant-precision.yaml b/translations/content/ar/datetime/instant-precision.yaml new file mode 100644 index 0000000..38707e3 --- /dev/null +++ b/translations/content/ar/datetime/instant-precision.yaml @@ -0,0 +1,17 @@ +title: "Instant بدقة النانو ثانية" +oldApproach: "ميلي ثانية" +modernApproach: "نانو ثانية" +summary: "احصل على طوابع زمنية بدقة الميكرو ثانية أو النانو ثانية." +explanation: "حسّن Java 9 دقة الساعة بحيث يلتقط Instant.now() دقة الميكرو ثانية على معظم المنصات (النانو ثانية على بعضها). تُعطي currentTimeMillis() القديمة ميلي ثانية فحسب." +whyModernWins: +- icon: "🎯" + title: "دقة أعلى" + desc: "طوابع زمنية بدقة الميكرو/النانو ثانية مقابل الميلي ثانية." +- icon: "📐" + title: "آمن من حيث النوع" + desc: "يحمل Instant دقته — لا أعداد طويلة غامضة." +- icon: "🌐" + title: "مبني على UTC" + desc: "Instant دائماً بـ UTC — لا التباس في المنطقة الزمنية." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/datetime/java-time-basics.yaml b/translations/content/ar/datetime/java-time-basics.yaml new file mode 100644 index 0000000..da4bdb7 --- /dev/null +++ b/translations/content/ar/datetime/java-time-basics.yaml @@ -0,0 +1,17 @@ +title: "أساسيات واجهة برمجة java.time" +oldApproach: "Date + Calendar" +modernApproach: "java.time.*" +summary: "استخدم أنواع التاريخ/الوقت الثابتة والواضحة بدلاً من Date و Calendar." +explanation: "تُوفّر java.time الأنواعَ LocalDate و LocalTime و LocalDateTime و Instant و ZonedDateTime — وكلها ثابتة وآمنة للخيوط. الأشهر تبدأ من 1. لا مزيد من الالتباس من Calendar.JANUARY = 0." +whyModernWins: +- icon: "🔒" + title: "ثابتة" + desc: "لا يمكن تعديل قيم التاريخ/الوقت بطريق الخطأ." +- icon: "📖" + title: "واجهة برمجية واضحة" + desc: "Month.JANUARY لا 0. DayOfWeek.MONDAY لا 2." +- icon: "🛡️" + title: "آمنة للخيوط" + desc: "لا حاجة للمزامنة — شارك بحرية عبر الخيوط." +support: + description: "متاح على نطاق واسع منذ JDK 8 (مارس 2014)" diff --git a/translations/content/ar/datetime/math-clamp.yaml b/translations/content/ar/datetime/math-clamp.yaml new file mode 100644 index 0000000..610e0a8 --- /dev/null +++ b/translations/content/ar/datetime/math-clamp.yaml @@ -0,0 +1,17 @@ +title: "Math.clamp()" +oldApproach: "min/max متداخلة" +modernApproach: "Math.clamp()" +summary: "قيّد قيمةً بين حدَّين باستدعاء واحد واضح." +explanation: "تُقيّد Math.clamp(value, min, max) قيمةً بالمجال [min, max]. أوضح من min/max المتداخلة ومتاحة لأنواع int و long و float و double." +whyModernWins: +- icon: "📖" + title: "موثّقة ذاتياً" + desc: "clamp(value, min, max) لا لبس فيه." +- icon: "🛡️" + title: "أقل عرضة للأخطاء" + desc: "لا مزيد من عكس ترتيب min/max عن طريق الخطأ." +- icon: "🎯" + title: "جميع الأنواع الرقمية" + desc: "تعمل مع int و long و float و double." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/enterprise/ejb-timer-vs-jakarta-scheduler.yaml b/translations/content/ar/enterprise/ejb-timer-vs-jakarta-scheduler.yaml new file mode 100644 index 0000000..a17e6b4 --- /dev/null +++ b/translations/content/ar/enterprise/ejb-timer-vs-jakarta-scheduler.yaml @@ -0,0 +1,17 @@ +title: "EJB Timer مقابل مُجدول Jakarta" +oldApproach: "EJB TimerService" +modernApproach: "ManagedScheduledExecutorService" +summary: "استبدل مؤقتات EJB الثقيلة بـ ManagedScheduledExecutorService من Jakarta Concurrency للجدولة الأبسط." +explanation: "تتطلب مؤقتات EJB حبّةً @Stateless أو @Singleton مع ردّ اتصال @Timeout وتعبيرات جدولة قائمة على XML أو التعليقات التوضيحية. توفر Jakarta Concurrency الـ ManagedScheduledExecutorService الذي يستخدم واجهة برمجة الجدولة المألوفة java.util.concurrent. والنتيجة كليشيهات أقل واختبار وحدات أسهل وعدم الاعتماد على حاوية EJB." +whyModernWins: +- icon: "🪶" + title: "كليشيه أقل" + desc: "لا ردّ اتصال @Timeout أو ScheduleExpression — استخدم واجهة برمجة ScheduledExecutorService القياسية." +- icon: "🧪" + title: "قابلية اختبار أفضل" + desc: "الدوال البسيطة ومحاكيات المنفّذ تجعل اختبار الوحدة مباشراً دون حاوية EJB." +- icon: "☁️" + title: "صديق للسحابة الأصلية" + desc: "تتكامل المنفّذات المُدارة مع دورة حياة الحاوية وتعمل في بيئات تشغيل خفيفة الوزن." +support: + description: "متاح منذ Jakarta EE 10 / Concurrency 3.0" diff --git a/translations/content/ar/enterprise/ejb-vs-cdi.yaml b/translations/content/ar/enterprise/ejb-vs-cdi.yaml new file mode 100644 index 0000000..90c993c --- /dev/null +++ b/translations/content/ar/enterprise/ejb-vs-cdi.yaml @@ -0,0 +1,17 @@ +title: "EJB مقابل CDI" +oldApproach: "EJB" +modernApproach: "حبّة CDI" +summary: "استبدل EJBs الثقيلة بحبّات CDI الخفيفة لحقن التبعيات والمعاملات." +explanation: "يوفر CDI (السياقات وحقن التبعيات) نفس حقن التبعيات وإدارة المعاملات كـ EJBs لكن كفئات Java عادية دون واجهات أو مصفوفات خاصة بالحاوية. تتحكم النطاقات مثل @ApplicationScoped و @RequestScoped في دورة الحياة، و@Transactional تستبدل دلالات معاملة EJB الإلزامية." +whyModernWins: +- icon: "🪶" + title: "خفيف الوزن" + desc: "حبّات CDI هي فئات Java عادية دون واجهات أو واصفات خاصة بـ EJB." +- icon: "💉" + title: "حقن موحّد" + desc: "@Inject يعمل لكل حبّة مُدارة وموارد JAX-RS ومكوّنات Jakarta EE." +- icon: "🧪" + title: "اختبار وحدة سهل" + desc: "الفئات العادية دون تكلفة وكيل EJB سهلة الإنشاء والمحاكاة." +support: + description: "متاح على نطاق واسع منذ Jakarta EE 8 / Java 11" diff --git a/translations/content/ar/enterprise/jdbc-resultset-vs-jpa-criteria.yaml b/translations/content/ar/enterprise/jdbc-resultset-vs-jpa-criteria.yaml new file mode 100644 index 0000000..adac615 --- /dev/null +++ b/translations/content/ar/enterprise/jdbc-resultset-vs-jpa-criteria.yaml @@ -0,0 +1,17 @@ +title: "تعيين JDBC ResultSet مقابل JPA Criteria API" +oldApproach: "JDBC ResultSet" +modernApproach: "JPA Criteria API" +summary: "استبدل تعيين JDBC ResultSet اليدوي بـ JPA Criteria API الآمن من حيث النوع للاستعلامات الديناميكية." +explanation: "يتطلب JDBC الخام بناء سلاسل SQL وضبط المعاملات بالمؤشر وتعيين كل عمود ResultSet يدوياً — وهي عملية عرضة للأخطاء وتفشل بصمت عند تغيير الأعمدة. تبني JPA Criteria API الاستعلامات برمجياً باستخدام نمط منشئ آمن من حيث النوع. تُتحقَّق أسماء الأعمدة مقابل نموذج الكيان والتعيين تلقائي والاستعلامات الديناميكية المعقدة تتركّب بشكل نظيف دون تسلسل سلاسل." +whyModernWins: +- icon: "🔒" + title: "استعلامات آمنة من حيث النوع" + desc: "يكشف مُنشئ Criteria أسماء الحقول وعدم تطابق الأنواع وقت الترجمة." +- icon: "🗺️" + title: "تعيين تلقائي" + desc: "يُعيّن JPA صفوف النتائج إلى كائنات الكيان — لا استخراج عمود بعمود يدوي." +- icon: "🧩" + title: "شروط قابلة للتركيب" + desc: "تتركّب جمل where الديناميكية بشكل نظيف بـ and() و or() وكائنات Predicate قابلة لإعادة الاستخدام." +support: + description: "متاح على نطاق واسع منذ Jakarta EE 8 / Java 11" diff --git a/translations/content/ar/enterprise/jdbc-vs-jooq.yaml b/translations/content/ar/enterprise/jdbc-vs-jooq.yaml new file mode 100644 index 0000000..2fa9343 --- /dev/null +++ b/translations/content/ar/enterprise/jdbc-vs-jooq.yaml @@ -0,0 +1,17 @@ +title: "JDBC مقابل jOOQ" +oldApproach: "JDBC الخام" +modernApproach: "jOOQ SQL DSL" +summary: "استبدل SQL المبني على سلاسل JDBC الخام بـ jOOQ DSL السائل الآمن من حيث النوع." +explanation: "يولّد jOOQ (الاستعلام الكائني التوجّه في Java) كود Java من مخطط قاعدة بياناتك محوّلاً أسماء الجداول والأعمدة إلى ثوابت Java آمنة من حيث النوع. DSL السائل يعكس بناء SQL ليكون الاستعلامات مقروءة وقابلة للتركيب. جميع المعاملات مرتبطة تلقائياً مما يُزيل خطر حقن SQL. بخلاف JPA/JPQL يحتضن jOOQ SQL بالكامل." +whyModernWins: +- icon: "🔒" + title: "أعمدة آمنة من حيث النوع" + desc: "أسماء الأعمدة ثوابت Java مُولَّدة — تصبح الأخطاء المطبعية وعدم تطابق الأنواع أخطاء مترجم بدلاً من فشل وقت التشغيل." +- icon: "📖" + title: "إتقان SQL" + desc: "jOOQ DSL يعكس بناء SQL عن كثب فتبقى JOINs المعقدة والاستعلامات الفرعية و CTEs مقروءة." +- icon: "🛡️" + title: "محمي من الحقن بتصميمه" + desc: "المعاملات دائماً مرتبطة بأمان — لا تسلسل سلاسل يعني لا خطر حقن SQL." +support: + description: "إصدار jOOQ مفتوح المصدر يدعم جميع قواعد البيانات مفتوحة المصدر الرئيسية؛ قواعد البيانات التجارية الأقدم تتطلب ترخيصاً مدفوعاً" diff --git a/translations/content/ar/enterprise/jdbc-vs-jpa.yaml b/translations/content/ar/enterprise/jdbc-vs-jpa.yaml new file mode 100644 index 0000000..a1d897f --- /dev/null +++ b/translations/content/ar/enterprise/jdbc-vs-jpa.yaml @@ -0,0 +1,17 @@ +title: "JDBC مقابل JPA" +oldApproach: "JDBC" +modernApproach: "JPA EntityManager" +summary: "استبدل كليشيهات JDBC المطوّلة بتعيين JPA الكائني-العلائقي و EntityManager." +explanation: "يُعيّن JPA (Jakarta Persistence API) كائنات Java إلى صفوف قاعدة البيانات مما يُزيل معالجة ResultSet اليدوية وتسلسل سلاسل SQL. يوفر EntityManager find() و persist() واستعلامات JPQL كي تعمل مع كائنات المجال بدلاً من SQL الخام بينما تدير الحاوية تجميع الاتصالات والمعاملات." +whyModernWins: +- icon: "🗺️" + title: "تعيين الكائنات" + desc: "الكيانات فئات Java عادية مزوّدة بتعليقات توضيحية — لا ترجمة ResultSet-إلى-كائن يدوية." +- icon: "🔒" + title: "استعلامات آمنة من حيث النوع" + desc: "JPQL يعمل على أنواع الكيانات وحقولها بدلاً من سلاسل الجدول والعمود الخام." +- icon: "⚡" + title: "تخزين مؤقت مدمج" + desc: "تخفّض ذاكرات التخزين المؤقت من المستوى الأول والثاني رحلات قاعدة البيانات تلقائياً." +support: + description: "متاح على نطاق واسع منذ Jakarta EE 8 / Java 11" diff --git a/translations/content/ar/enterprise/jndi-lookup-vs-cdi-injection.yaml b/translations/content/ar/enterprise/jndi-lookup-vs-cdi-injection.yaml new file mode 100644 index 0000000..a3f9b5d --- /dev/null +++ b/translations/content/ar/enterprise/jndi-lookup-vs-cdi-injection.yaml @@ -0,0 +1,17 @@ +title: "بحث JNDI مقابل حقن CDI" +oldApproach: "بحث JNDI" +modernApproach: "CDI @Inject" +summary: "استبدل عمليات بحث JNDI الهشّة القائمة على السلاسل بحقن CDI الآمن من حيث النوع للموارد المُدارة بالحاوية." +explanation: "يُجبرك نمط JNDI التقليدي على استخدام أسماء موارد قائمة على السلاسل ومعالجة NamingException وإدارة InitialContext. يسمح حقن CDI بـ @Inject (أو @Resource لموارد الحاوية) للحاوية بتوصيل التبعيات تلقائياً. تصبح الأخطاء المطبعية أخطاء وقت الترجمة والفئات أسهل في الاختبار لأن التبعيات يمكن حقنها مباشرةً." +whyModernWins: +- icon: "🔒" + title: "توصيل آمن من حيث النوع" + desc: "تُكتشف أخطاء الحقن وقت النشر لا وقت التشغيل عبر عمليات البحث النصية." +- icon: "🗑️" + title: "لا كليشيه" + desc: "يُزيل إنشاء InitialContext وسلاسل أسماء JNDI ومعالجة NamingException." +- icon: "🧪" + title: "قابل للاختبار" + desc: "التبعيات هي حقول محقونة يمكن استبدالها بسهولة بمحاكيات في اختبارات الوحدة." +support: + description: "متاح على نطاق واسع منذ Jakarta EE 8 / Java 11" diff --git a/translations/content/ar/enterprise/jpa-vs-jakarta-data.yaml b/translations/content/ar/enterprise/jpa-vs-jakarta-data.yaml new file mode 100644 index 0000000..8e3ea77 --- /dev/null +++ b/translations/content/ar/enterprise/jpa-vs-jakarta-data.yaml @@ -0,0 +1,17 @@ +title: "JPA مقابل Jakarta Data" +oldApproach: "JPA EntityManager" +modernApproach: "مستودع Jakarta Data" +summary: "صرّح بواجهة مستودع واترك Jakarta Data يولّد تنفيذ DAO تلقائياً." +explanation: "يحوّل Jakarta Data (Jakarta EE 11) الوصول إلى البيانات إلى تصريح واجهة بحتة. تُزيّن الواجهة بـ @Repository وتمتد من نوع مستودع مدمج مثل CrudRepository. يولّد وقت التشغيل التنفيذ — بما في ذلك الاستعلامات المشتقة من أسماء الدوال مثل findByName — فلا كليشيهات EntityManager ولا سلاسل JPQL ولا دوال save/find مكتوبة يدوياً." +whyModernWins: +- icon: "🪄" + title: "صفر كليشيه" + desc: "صرّح بالواجهة؛ الحاوية تولّد تنفيذ DAO الكامل وقت النشر." +- icon: "🔍" + title: "استعلامات مشتقة" + desc: "أسماء الدوال مثل findByNameAndStatus تُحلَّل تلقائياً — لا JPQL أو SQL مطلوب." +- icon: "🔌" + title: "قابل للنقل" + desc: "أي بيئة تشغيل متوافقة مع Jakarta EE 11 توفر تنفيذ المستودع دون تقييد بائع." +support: + description: "متاح منذ Jakarta EE 11 / Java 21 (2024)" diff --git a/translations/content/ar/enterprise/jsf-managed-bean-vs-cdi-named.yaml b/translations/content/ar/enterprise/jsf-managed-bean-vs-cdi-named.yaml new file mode 100644 index 0000000..8c16dec --- /dev/null +++ b/translations/content/ar/enterprise/jsf-managed-bean-vs-cdi-named.yaml @@ -0,0 +1,17 @@ +title: "JSF Managed Bean مقابل CDI Named Bean" +oldApproach: "@ManagedBean" +modernApproach: "@Named + CDI" +summary: "استبدل @ManagedBean المُهمَل في JSF بـ CDI @Named للحصول على نموذج حقن تبعيات موحّد." +explanation: "تم إهمال @ManagedBean و @ManagedProperty في Jakarta Faces 2.3 وإزالتهما في Jakarta EE 10. يستخدم البديل القائم على CDI @Named لكشف الحبّة لتعبيرات EL و @Inject لتوصيل التبعيات. يوحّد هذا نموذج الحبّة: صفحات JSF وموارد JAX-RS وEJBs تشترك في نفس حاوية CDI." +whyModernWins: +- icon: "🔗" + title: "نموذج موحّد" + desc: "حاوية CDI واحدة تدير جميع الحبّات — JSF والـ REST وطبقات الخدمة تشترك في نفس الحقن." +- icon: "🗑️" + title: "كليشيه أقل" + desc: "@Inject تستبدل @ManagedProperty ودالة الضبط المطلوبة." +- icon: "🔮" + title: "مُستقبلي" + desc: "تمت إزالة @ManagedBean في Jakarta EE 10؛ @Named هو البديل المدعوم." +support: + description: "CDI @Named متاح منذ Java EE 6؛ تمت إزالة @ManagedBean في Jakarta EE 10" diff --git a/translations/content/ar/enterprise/manual-transaction-vs-declarative.yaml b/translations/content/ar/enterprise/manual-transaction-vs-declarative.yaml new file mode 100644 index 0000000..0d0b8f8 --- /dev/null +++ b/translations/content/ar/enterprise/manual-transaction-vs-declarative.yaml @@ -0,0 +1,17 @@ +title: "معاملة JPA اليدوية مقابل @Transactional التصريحية" +oldApproach: "معاملة يدوية" +modernApproach: "@Transactional" +summary: "استبدل كتل begin/commit/rollback المطوّلة بتعليق توضيحي @Transactional واحد." +explanation: "تتطلب إدارة المعاملات اليدوية استدعاءات صريحة لـ begin() و commit() و rollback() مغلّفةً في كتل try-catch — كل دالة خدمة تكرر هذه الكليشيهات. يفوّض التعليق التوضيحي @Transactional إدارة دورة الحياة إلى الحاوية: تبدأ معاملةً قبل الدالة وتُودعها عند النجاح وتتراجع عنها عند RuntimeException تلقائياً." +whyModernWins: +- icon: "🗑️" + title: "لا كليشيه" + desc: "تعليق توضيحي واحد يستبدل كتل try-catch المتكررة لـ begin/commit/rollback." +- icon: "🛡️" + title: "تراجع أكثر أماناً" + desc: "الحاوية تضمن التراجع عن الاستثناءات غير المفحوصة — لا خطر نسيان كتلة catch." +- icon: "📐" + title: "تحكم تصريحي" + desc: "قواعد الانتشار والعزل والتراجع مُعبَّر عنها كسمات تعليق توضيحي." +support: + description: "متاح على نطاق واسع منذ Jakarta EE 8 / Java 11" diff --git a/translations/content/ar/enterprise/mdb-vs-reactive-messaging.yaml b/translations/content/ar/enterprise/mdb-vs-reactive-messaging.yaml new file mode 100644 index 0000000..91c4d47 --- /dev/null +++ b/translations/content/ar/enterprise/mdb-vs-reactive-messaging.yaml @@ -0,0 +1,17 @@ +title: "حبّة المراسلة المدفوعة مقابل المراسلة التفاعلية" +oldApproach: "Message-Driven Bean" +modernApproach: "Reactive Messaging" +summary: "استبدل حبّات JMS المدفوعة بالرسائل بـ MicroProfile Reactive Messaging لمعالجة أحداث أبسط." +explanation: "تتطلب حبّات Message-Driven تنفيذ MessageListener وتهيئة خصائص التنشيط وإلغاء تسلسل رسائل JMS يدوياً. تستخدم MicroProfile Reactive Messaging تعليقاً توضيحياً بسيطاً @Incoming على دالة تستقبل كائنات مكتوبة مباشرةً. تُخرَج تهيئة القناة مما يجعل الكود مستقلاً عن وسيط الرسائل وأسهل بكثير في الاختبار." +whyModernWins: +- icon: "🪶" + title: "كود أدنى" + desc: "دالة @Incoming واحدة تستبدل فئة MDB وواجهة MessageListener وتهيئة التنشيط." +- icon: "🔌" + title: "مستقل عن الوسيط" + desc: "بدّل موصلات Kafka أو AMQP أو JMS عبر التهيئة دون تغيير كود التطبيق." +- icon: "☁️" + title: "ملائم للسحابة الأصلية" + desc: "الضغط الخلفي للتدفقات التفاعلية وبيئة التشغيل الخفيفة يجعله مثالياً للنشر في حاويات." +support: + description: "متاح منذ MicroProfile 4.0 / SmallRye Reactive Messaging" diff --git a/translations/content/ar/enterprise/servlet-vs-jaxrs.yaml b/translations/content/ar/enterprise/servlet-vs-jaxrs.yaml new file mode 100644 index 0000000..ef30f63 --- /dev/null +++ b/translations/content/ar/enterprise/servlet-vs-jaxrs.yaml @@ -0,0 +1,17 @@ +title: "Servlet مقابل JAX-RS" +oldApproach: "HttpServlet" +modernApproach: "مورد JAX-RS" +summary: "استبدل كليشيهات HttpServlet المطوّلة بفئات موارد JAX-RS التصريحية." +explanation: "يتيح لك JAX-RS (Jakarta RESTful Web Services) كشف نقاط نهاية REST باستخدام تعليقات توضيحية بسيطة مثل @GET و @Path و @Produces. لا مزيد من التحليل اليدوي لمعاملات الطلب أو ضبط أنواع المحتوى في الاستجابة — يتعامل وقت التشغيل مع التسلسل والتوجيه تلقائياً." +whyModernWins: +- icon: "📐" + title: "توجيه تصريحي" + desc: "التعليقات التوضيحية تُعرِّف طريقة HTTP والمسار ونوع المحتوى بدلاً من إيزاع if/else." +- icon: "🔄" + title: "تسلسل تلقائي" + desc: "أرجع POJOs مباشرةً؛ يُسلسلها وقت التشغيل إلى JSON أو XML بناءً على @Produces." +- icon: "🧪" + title: "اختبار أسهل" + desc: "فئات الموارد كائنات Java عادية قابلة للاختبار دون حاوية servlet." +support: + description: "متاح على نطاق واسع منذ Jakarta EE 8 / Java 11" diff --git a/translations/content/ar/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml b/translations/content/ar/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml new file mode 100644 index 0000000..37da251 --- /dev/null +++ b/translations/content/ar/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml @@ -0,0 +1,17 @@ +title: "Singleton EJB مقابل CDI @ApplicationScoped" +oldApproach: "@Singleton EJB" +modernApproach: "@ApplicationScoped CDI" +summary: "استبدل Singleton EJBs بحبّات CDI @ApplicationScoped لإدارة الحالة المشتركة الأبسط." +explanation: "تجمع Singleton EJBs إدارة التزامن (@Lock و @ConcurrencyManagement) والتهيئة المبكرة (@Startup) في حاوية EJB. تُحقق حبّة CDI @ApplicationScoped نفس دورة حياة المثيل الواحد بطقوس أقل بكثير. عند الحاجة لضبط التزامن توفر أدوات java.util.concurrent تحكماً أدق من تعليقات قفل EJB." +whyModernWins: +- icon: "🪶" + title: "ضجيج تعليقات توضيحية أقل" + desc: "لا @ConcurrencyManagement أو @Lock أو @Startup — مجرد تعليق توضيحي @ApplicationScoped واحد." +- icon: "🔧" + title: "تزامن مرن" + desc: "استخدم أقفال java.util.concurrent أو volatile للأمان المطلوب بالضبط للخيوط." +- icon: "🧪" + title: "اختبار سهل" + desc: "يمكن إنشاء حبّات CDI العادية مباشرةً في الاختبارات دون حاوية EJB." +support: + description: "متاح على نطاق واسع منذ Jakarta EE 8 / Java 11" diff --git a/translations/content/ar/enterprise/soap-vs-jakarta-rest.yaml b/translations/content/ar/enterprise/soap-vs-jakarta-rest.yaml new file mode 100644 index 0000000..f450242 --- /dev/null +++ b/translations/content/ar/enterprise/soap-vs-jakarta-rest.yaml @@ -0,0 +1,17 @@ +title: "خدمات الويب SOAP مقابل Jakarta REST" +oldApproach: "JAX-WS / SOAP" +modernApproach: "Jakarta REST / JSON" +summary: "استبدل نقاط نهاية SOAP/WSDL الثقيلة بموارد Jakarta REST نظيفة تُرجع JSON." +explanation: "تعتمد خدمات الويب القائمة على SOAP على عقود WSDL وتسلسل XML وتعليقات JAX-WS التوضيحية التي تضيف تكلفة كبيرة. تستخدم Jakarta REST تعليقات توضيحية بديهية مثل @GET و @Path و @Produces لكشف واجهات برمجية RESTful بـ JSON. نموذج البرمجة أبسط والحمولات أصغر والنهج يتوافق مع كيفية تواصل الخدمات المصغّرة الحديثة." +whyModernWins: +- icon: "🪶" + title: "حمولات أخف" + desc: "JSON أكثر إيجازاً من مظاريف SOAP XML مما يقلل النطاق الترددي وتكلفة التحليل." +- icon: "📐" + title: "تعليقات توضيحية بسيطة" + desc: "@GET و @Path و @Produces تستبدل طقوس WSDL و @WebService و @WebMethod." +- icon: "🔌" + title: "جاهز للخدمات المصغّرة" + desc: "REST/JSON هو المعيار للتواصل بين الخدمات في البنى السحابية الأصلية." +support: + description: "متاح على نطاق واسع منذ Jakarta EE 8 / Java 11" diff --git a/translations/content/ar/enterprise/spring-api-versioning.yaml b/translations/content/ar/enterprise/spring-api-versioning.yaml new file mode 100644 index 0000000..1edaae1 --- /dev/null +++ b/translations/content/ar/enterprise/spring-api-versioning.yaml @@ -0,0 +1,17 @@ +title: "إصدارات API في Spring Framework 7" +oldApproach: "إصدارات مسار URL اليدوية" +modernApproach: "إصدارات API الأصلية" +summary: "استبدل المتحكمات المضاعفة بادئات الإصدارات بدعم إصدارات API الأصلي في Spring Framework 7." +explanation: "قبل Spring Framework 7، كانت إصدارات API تتطلب فئات متحكم منفصلة لكل إصدار (مثل /api/v1/products و /api/v2/products) مما يُكرّر تعيينات الطلبات ويُفرّق منطق الإصدارات عبر ملفات كثيرة. يقدّم Spring Framework 7 إصدارات أصلية عبر سمة version جديدة على @RequestMapping والتعليقات التوضيحية ذات الصلة بالإضافة إلى خطّاف configureApiVersioning في WebMvcConfigurer." +whyModernWins: +- icon: "🗂️" + title: "لا تكرار للمتحكمات" + desc: "جميع الإصدارات في فئة متحكم واحدة؛ فقط الدوال المعالِجة الفردية تحمل سمة إصدار." +- icon: "⚙️" + title: "استراتيجية إصدار مركزية" + desc: "بدّل من رأس HTTP إلى إصدار URL أو معامل استعلام في استدعاء configureApiVersioning واحد." +- icon: "📈" + title: "تطوّر تدريجي" + desc: "أضف إصداراً جديداً لدالة واحدة دون المساس بنقاط نهاية غير مرتبطة أو إنشاء ملفات متحكم جديدة." +support: + description: "متاح منذ Spring Framework 7.0 (يتطلب Java 17+)" diff --git a/translations/content/ar/enterprise/spring-null-safety-jspecify.yaml b/translations/content/ar/enterprise/spring-null-safety-jspecify.yaml new file mode 100644 index 0000000..943c369 --- /dev/null +++ b/translations/content/ar/enterprise/spring-null-safety-jspecify.yaml @@ -0,0 +1,17 @@ +title: "أمان null في Spring مع JSpecify" +oldApproach: "Spring @NonNull/@Nullable" +modernApproach: "JSpecify @NullMarked" +summary: "يعتمد Spring 7 تعليقات JSpecify مما يجعل non-null القيمة الافتراضية ويقلل الضجيج التعليقي." +explanation: "قدّم Spring 5 و6 تعليقات أمان null الخاصة به في حزمة org.springframework.lang. بينما كانت مفيدة كانت خاصة بالإطار وتتطلب تعليق كل عنصر non-null صراحةً. ينتقل Spring 7 إلى JSpecify وهو معيار عابر للنظام البيئي لأمان null. يُصرّح التعليق @NullMarked على مستوى الفئة أو الحزمة بأن جميع الأنواع غير المُعلَّقة non-null بشكل افتراضي. الأنواع الفارغة الفعلية فحسب هي التي تحتاج تعليق @Nullable مما يقلل التعليق بشكل كبير." +whyModernWins: +- icon: "✂️" + title: "non-null بشكل افتراضي" + desc: "@NullMarked يجعل جميع الأنواع غير المُعلَّقة non-null فلا تحتاج التعليق إلا الاستثناءات الفارغة." +- icon: "🌐" + title: "معيار النظام البيئي" + desc: "تعليقات JSpecify هي معيار عابر للأطر مُعترَف به من NullAway و Error Prone والـ IDEs." +- icon: "🔍" + title: "أدوات أغنى" + desc: "المحللات الثابتة الحديثة تفهم نموذج null في JSpecify وتُبلّغ عن الانتهاكات وقت الترجمة." +support: + description: "متاح منذ Spring Framework 7.0 (يتطلب Java 17+)" diff --git a/translations/content/ar/enterprise/spring-xml-config-vs-annotations.yaml b/translations/content/ar/enterprise/spring-xml-config-vs-annotations.yaml new file mode 100644 index 0000000..bd44442 --- /dev/null +++ b/translations/content/ar/enterprise/spring-xml-config-vs-annotations.yaml @@ -0,0 +1,17 @@ +title: "تهيئة Spring XML Bean مقابل النهج المدفوع بالتعليقات" +oldApproach: "تعريفات Bean بـ XML" +modernApproach: "حبّات مدفوعة بالتعليقات" +summary: "استبدل تعريفات bean XML المطوّلة في Spring بتهيئة مدفوعة بالتعليقات موجزة في Spring Boot." +explanation: "كانت تطبيقات Spring التقليدية توصّل الحبّات عبر ملفات تهيئة XML مُصرِّحةً بكل فئة وتبعياتها كعناصر مطوّلة. بينما كان دعم التعليقات موجوداً منذ Spring 2.5 ظلّ XML النهج السائد حتى قدّم Spring Boot التهيئة التلقائية. يكتشف Spring Boot الحبّات المُزيَّنة بـ @Component و @Service و @Repository و @Controller عبر مسح مسار الصنيفات ويُلبّي التبعيات عبر حقن المُنشئ تلقائياً." +whyModernWins: +- icon: "🚫" + title: "لا XML" + desc: "@SpringBootApplication يُشغّل مسح المكوّنات والتهيئة التلقائية مما يُزيل جميع ملفات توصيل XML." +- icon: "💉" + title: "حقن المُنشئ" + desc: "يحقن Spring التبعيات عبر المُنشئات تلقائياً مما يجعل الحبّات أسهل في الاختبار والاستدلال." +- icon: "⚡" + title: "تهيئة تلقائية" + desc: "يُهيّئ Spring Boot DataSource و JPA وبنية تحتية أخرى من مسار الصنيفات بدون كليشيه." +support: + description: "متاح على نطاق واسع منذ Spring Boot 1.0 (أبريل 2014)؛ Spring Boot 3 يتطلب Java 17+" diff --git a/translations/content/ar/errors/helpful-npe.yaml b/translations/content/ar/errors/helpful-npe.yaml new file mode 100644 index 0000000..de07b8b --- /dev/null +++ b/translations/content/ar/errors/helpful-npe.yaml @@ -0,0 +1,17 @@ +title: "استثناءات NullPointerException المفيدة" +oldApproach: "NPE مُشفَّرة" +modernApproach: "NPE مفصّلة" +summary: "يُخبرك JVM تلقائياً بأي متغير كانت قيمته فارغة بالضبط." +explanation: "تصف NPEs المفيدة أي تعبير كانت قيمته فارغة وأي عملية فشلت. هذا مُفعَّل بشكل افتراضي منذ Java 14 — لا تغيير في الكود مطلوب، فقط ترقية JDK." +whyModernWins: +- icon: "🔍" + title: "المتغير المحدد" + desc: "الرسالة تُسمّي المتغير الفارغ في السلسلة." +- icon: "⚡" + title: "تصحيح أسرع" + desc: "لا مزيد من التخمين أي من الاستدعاءات الخمسة المتسلسلة كانت فارغة." +- icon: "🆓" + title: "ترقية مجانية" + desc: "لا تغييرات في الكود — فقط شغّل على JDK 14+." +support: + description: "متاح على نطاق واسع منذ JDK 14 (مارس 2020)" diff --git a/translations/content/ar/errors/multi-catch.yaml b/translations/content/ar/errors/multi-catch.yaml new file mode 100644 index 0000000..d157901 --- /dev/null +++ b/translations/content/ar/errors/multi-catch.yaml @@ -0,0 +1,17 @@ +title: "معالجة استثناءات متعددة في كتلة catch واحدة" +oldApproach: "كتل catch منفصلة" +modernApproach: "Multi-catch" +summary: "اصطد أنواع استثناءات متعددة في كتلة catch واحدة." +explanation: "يعالج Multi-catch أنواع استثناءات متعددة بنفس الكود. متغير الاستثناء نهائي فعلياً لذا يمكن إعادة رميه دون تغليف." +whyModernWins: +- icon: "📏" + title: "لا تكرار" + desc: "نفس منطق المعالجة مكتوب مرة واحدة بدلاً من ثلاث." +- icon: "🔄" + title: "قابل لإعادة الرمي" + desc: "يمكن إعادة رمي الاستثناء المصطاد بنوعه الدقيق." +- icon: "📖" + title: "قابل للمسح" + desc: "جميع الأنواع المعالَجة مرئية في مكان واحد." +support: + description: "متاح على نطاق واسع منذ JDK 7 (يوليو 2011)" diff --git a/translations/content/ar/errors/null-in-switch.yaml b/translations/content/ar/errors/null-in-switch.yaml new file mode 100644 index 0000000..432b23c --- /dev/null +++ b/translations/content/ar/errors/null-in-switch.yaml @@ -0,0 +1,17 @@ +title: "حالة null في switch" +oldApproach: "حارس قبل switch" +modernApproach: "case null" +summary: "عالج null مباشرةً كحالة في switch — لا حاجة لحارس منفصل." +explanation: "يمكن لـ switch بمطابقة الأنماط مطابقة null كتسمية حالة. يُزيل هذا الحاجة للتحقق من null قبل switch ويجعل معالجة null صريحةً ومرئية." +whyModernWins: +- icon: "🎯" + title: "صريح" + desc: "معالجة null مرئية مباشرةً في switch." +- icon: "🛡️" + title: "لا NPE" + desc: "التبديل على قيمة null لن يُطلق NullPointerException." +- icon: "📐" + title: "متكامل" + desc: "جميع الحالات بما فيها null في تعبير switch واحد." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/errors/optional-chaining.yaml b/translations/content/ar/errors/optional-chaining.yaml new file mode 100644 index 0000000..337459c --- /dev/null +++ b/translations/content/ar/errors/optional-chaining.yaml @@ -0,0 +1,17 @@ +title: "تسلسل Optional" +oldApproach: "تحققات null متداخلة" +modernApproach: "خط أنابيب Optional" +summary: "استبدل تحققات null المتداخلة بخط أنابيب Optional." +explanation: "Optional.map() يتسلسل عبر القيم القابلة للإلغاء مع دوارة قصيرة عند أول null. orElse() يوفر القيمة الافتراضية. يُزيل هذا تحقق null هرمي الشكل." +whyModernWins: +- icon: "🔗" + title: "قابل للتسلسل" + desc: "كل خطوة .map() تتعامل مع null بشفافية." +- icon: "📖" + title: "تدفق خطي" + desc: "اقرأ من اليسار إلى اليمين بدلاً من كتل if المتداخلة." +- icon: "🛡️" + title: "محمي من NPE" + desc: "null مُعالَجة في كل خطوة — لا انهيار ممكن." +support: + description: "متاح منذ JDK 8+ (محسَّن في 9+)" diff --git a/translations/content/ar/errors/optional-orelsethrow.yaml b/translations/content/ar/errors/optional-orelsethrow.yaml new file mode 100644 index 0000000..2f4a9e0 --- /dev/null +++ b/translations/content/ar/errors/optional-orelsethrow.yaml @@ -0,0 +1,17 @@ +title: "Optional.orElseThrow() بدون مورّد" +oldApproach: "get() أو orElseThrow(supplier)" +modernApproach: "orElseThrow()" +summary: "استخدم Optional.orElseThrow() كبديل أوضح وكاشف للنية عن get()." +explanation: "يُعدّ Optional.get() على نطاق واسع من علامات التدهور لأنه يُخفي احتمالية الفشل. تُؤدي orElseThrow() بدون وسائط المضافة في Java 10 نفس العمل لكن مع نية صريحة: المطوّر يتوقع قيمةً ويريد استثناءً إذا كانت غائبة." +whyModernWins: +- icon: "📖" + title: "موثّقة ذاتياً" + desc: "orElseThrow() تُشير بوضوح إلى أن الغياب غير متوقع." +- icon: "🔒" + title: "تتجنّب get()" + desc: "أدوات التحليل الثابت تُعلّم get() بأنها خطرة؛ orElseThrow() هي الأسلوب الصحيح." +- icon: "⚡" + title: "كليشيه أقل" + desc: "لا حاجة لتمرير مورّد للاستثناء الافتراضي NoSuchElementException." +support: + description: "متاح منذ JDK 10 (مارس 2018)." diff --git a/translations/content/ar/errors/record-based-errors.yaml b/translations/content/ar/errors/record-based-errors.yaml new file mode 100644 index 0000000..bb01d4f --- /dev/null +++ b/translations/content/ar/errors/record-based-errors.yaml @@ -0,0 +1,17 @@ +title: "استجابات أخطاء قائمة على Records" +oldApproach: "Map أو فئة مطوّلة" +modernApproach: "Error Records" +summary: "استخدم Records للحصول على أنواع استجابة أخطاء موجزة وثابتة." +explanation: "Records مثالية لاستجابات الأخطاء — فهي ثابتة ولها equals/hashCode مدمجان للمقارنة و toString للتسجيل. المُنشئات المخصصة تُضيف التحقق أو القيم الافتراضية." +whyModernWins: +- icon: "📏" + title: "موجز" + desc: "عرّف أنواع الأخطاء في 3 أسطر بدلاً من 30." +- icon: "🔒" + title: "ثابت" + desc: "لا يمكن تعديل بيانات الخطأ عن طريق الخطأ بعد الإنشاء." +- icon: "📋" + title: "toString تلقائي" + desc: "مثالي للتسجيل — يُظهر جميع الحقول تلقائياً." +support: + description: "متاح على نطاق واسع منذ JDK 16 (مارس 2021)" diff --git a/translations/content/ar/errors/require-nonnull-else.yaml b/translations/content/ar/errors/require-nonnull-else.yaml new file mode 100644 index 0000000..d50d0f5 --- /dev/null +++ b/translations/content/ar/errors/require-nonnull-else.yaml @@ -0,0 +1,17 @@ +title: "Objects.requireNonNullElse()" +oldApproach: "تحقق ثلاثي من null" +modernApproach: "requireNonNullElse()" +summary: "احصل على قيمة غير فارغة مع قيمة افتراضية واضحة، لا حاجة للعامل الثلاثي." +explanation: "يُرجع requireNonNullElse الوسيطة الأولى إذا لم تكن فارغة وإلا الثانية. القيمة الافتراضية نفسها لا يمكن أن تكون فارغة — ترمي NPE إذا كلتاهما فارغتان مما يكشف الأخطاء مبكراً." +whyModernWins: +- icon: "📖" + title: "نية واضحة" + desc: "اسم الدالة يصف بالضبط ما تفعله." +- icon: "🛡️" + title: "قيمة افتراضية آمنة من null" + desc: "القيمة الافتراضية نفسها تُفحص أيضاً من null." +- icon: "📏" + title: "مقروء" + desc: "أفضل من العامل الثلاثي لمنطق null-أو-افتراضي البسيط." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/io/deserialization-filters.yaml b/translations/content/ar/io/deserialization-filters.yaml new file mode 100644 index 0000000..2243c25 --- /dev/null +++ b/translations/content/ar/io/deserialization-filters.yaml @@ -0,0 +1,17 @@ +title: "مرشّحات إلغاء التسلسل" +oldApproach: "قبول كل شيء" +modernApproach: "ObjectInputFilter" +summary: "قيّد الفئات التي يمكن إلغاء تسلسلها لمنع الهجمات." +explanation: "يتيح لك ObjectInputFilter إدراج الفئات في القائمة البيضاء أو السوداء وتحديد عمق مخطط الكائنات وأحجام المصفوفات وأعداد المراجع. يدافع هذا عن نقاط ضعف إلغاء التسلسل دون مكتبات خارجية." +whyModernWins: +- icon: "🛡️" + title: "الأمان" + desc: "منع إلغاء تسلسل الفئات غير المتوقعة أو الضارة." +- icon: "📐" + title: "دقيق" + desc: "التحكم في العمق وحجم المصفوفة والمراجع وأنماط الفئات." +- icon: "🏗️" + title: "على مستوى JVM" + desc: "ضبط مرشّح عام لجميع عمليات إلغاء التسلسل في JVM." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/io/file-memory-mapping.yaml b/translations/content/ar/io/file-memory-mapping.yaml new file mode 100644 index 0000000..9a51baf --- /dev/null +++ b/translations/content/ar/io/file-memory-mapping.yaml @@ -0,0 +1,17 @@ +title: "تعيين الملفات في الذاكرة" +oldApproach: "MappedByteBuffer" +modernApproach: "MemorySegment مع Arena" +summary: "عيّن ملفات أكبر من 2 جيجابايت مع تنظيف حتمي باستخدام MemorySegment." +explanation: "يقدّم Foreign Function & Memory API (JEP 454) MemorySegment للوصول الآمن والفعال للذاكرة. بخلاف MappedByteBuffer يدعم MemorySegment ملفات أكبر من 2 جيجابايت (Integer.MAX_VALUE) ويوفر تنظيفاً حتمياً عبر Arena وأداءً أفضل مع الأجهزة الحديثة." +whyModernWins: +- icon: "📏" + title: "لا حد للحجم" + desc: "عيّن ملفات أكبر من 2 جيجابايت دون حلول بديلة." +- icon: "🔒" + title: "تنظيف حتمي" + desc: "Arena تضمن تحرير الذاكرة عند الخروج من النطاق لا وقت GC." +- icon: "⚡" + title: "أداء أفضل" + desc: "متوافق مع نماذج الذاكرة والأجهزة الحديثة." +support: + description: "متاح منذ JDK 22 (مارس 2024)" diff --git a/translations/content/ar/io/files-mismatch.yaml b/translations/content/ar/io/files-mismatch.yaml new file mode 100644 index 0000000..6e49fa7 --- /dev/null +++ b/translations/content/ar/io/files-mismatch.yaml @@ -0,0 +1,17 @@ +title: "Files.mismatch()" +oldApproach: "مقارنة بايتات يدوية" +modernApproach: "Files.mismatch()" +summary: "قارن ملفين بكفاءة دون تحميلهما في الذاكرة." +explanation: "تُرجع Files.mismatch() موضع أول بايت مختلف أو -1 إذا كان الملفان متطابقَين. تقرأ بكسل وتتوقف عند أول اختلاف." +whyModernWins: +- icon: "⚡" + title: "كفوءة في الذاكرة" + desc: "لا تُحمّل الملفات كاملةً في مصفوفات بايت." +- icon: "🎯" + title: "تُحدّد الاختلاف" + desc: "تُرجع الموضع الدقيق لأول عدم تطابق." +- icon: "📏" + title: "استدعاء واحد" + desc: "لا منطق مقارنة مصفوفات بايت يدوي." +support: + description: "متاح على نطاق واسع منذ JDK 12 (مارس 2019)" diff --git a/translations/content/ar/io/http-client.yaml b/translations/content/ar/io/http-client.yaml new file mode 100644 index 0000000..e1cf623 --- /dev/null +++ b/translations/content/ar/io/http-client.yaml @@ -0,0 +1,17 @@ +title: "عميل HTTP حديث" +oldApproach: "HttpURLConnection" +modernApproach: "HttpClient" +summary: "استخدم HttpClient المدمج لطلبات HTTP نظيفة وحديثة." +explanation: "يدعم HttpClient بروتوكولَي HTTP/1.1 و HTTP/2 والطلبات غير المتزامنة وWebSocket والمنفّذات المخصصة وتجميع الاتصالات. لا مزيد من تحويل URLConnection أو قراءة InputStreams يدوياً." +whyModernWins: +- icon: "📐" + title: "واجهة برمجية للمنشئ" + desc: "منشئ سائل للطلبات والرؤوس والمهل الزمنية." +- icon: "🔄" + title: "دعم HTTP/2" + desc: "HTTP/2 مدمج مع تعدد الإرسال ودفع الخادم." +- icon: "⚡" + title: "جاهز لغير المتزامن" + desc: "sendAsync() يُرجع CompletableFuture." +support: + description: "متاح على نطاق واسع منذ JDK 11 (سبتمبر 2018)" diff --git a/translations/content/ar/io/inputstream-transferto.yaml b/translations/content/ar/io/inputstream-transferto.yaml new file mode 100644 index 0000000..81c172e --- /dev/null +++ b/translations/content/ar/io/inputstream-transferto.yaml @@ -0,0 +1,17 @@ +title: "InputStream.transferTo()" +oldApproach: "حلقة نسخ يدوية" +modernApproach: "transferTo()" +summary: "انسخ InputStream إلى OutputStream في استدعاء واحد." +explanation: "تقرأ transferTo() جميع البايتات من تدفق الإدخال وتكتبها إلى تدفق الإخراج. لا إدارة مخزن مؤقت ولا حلقة. تستخدم مخزناً مؤقتاً داخلياً محسَّناً." +whyModernWins: +- icon: "📏" + title: "سطر واحد" + desc: "استبدل حلقة قراءة/كتابة كاملة باستدعاء دالة واحد." +- icon: "⚡" + title: "مُحسَّن" + desc: "حجم المخزن المؤقت الداخلي مضبوط للأداء." +- icon: "🛡️" + title: "لا أخطاء" + desc: "لا أخطاء off-by-one في إدارة المخزن المؤقت." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/io/io-class-console-io.yaml b/translations/content/ar/io/io-class-console-io.yaml new file mode 100644 index 0000000..b693a48 --- /dev/null +++ b/translations/content/ar/io/io-class-console-io.yaml @@ -0,0 +1,17 @@ +title: "فئة IO لإدخال/إخراج الطرفية" +oldApproach: "System.out / Scanner" +modernApproach: "فئة IO" +summary: "توفر فئة IO الجديدة دوالاً بسيطةً وموجزةً للإدخال والإخراج عبر الطرفية." +explanation: "يقدّم Java 25 فئة IO (java.io.IO) كجزء من ميزة الفئات المُصرَّح عنها ضمنياً. توفر دوالاً ثابتةً مثل println() و print() و readln() و read() تستبدل المزيج المطوّل من System.out و Scanner. تتعامل IO.readln(prompt) مع الطلب والقراءة معاً في استدعاء واحد." +whyModernWins: +- icon: "✨" + title: "أبسط بكثير" + desc: "دالتان تستبدلان سبعة أسطر من إعداد Scanner والطلب والقراءة والتنظيف." +- icon: "🔒" + title: "لا تسريبات موارد" + desc: "لا Scanner للإغلاق — دوال IO تتعامل مع إدارة الموارد داخلياً." +- icon: "🎓" + title: "صديق للمبتدئين" + desc: "يمكن للمطوّرين الجدد إجراء I/O الطرفية دون تعلّم Scanner أو System.out أو عبارات الاستيراد." +support: + description: "معاينة في JDK 25 كجزء من الفئات المُصرَّح عنها ضمنياً (JEP 495)" diff --git a/translations/content/ar/io/path-of.yaml b/translations/content/ar/io/path-of.yaml new file mode 100644 index 0000000..d128cd4 --- /dev/null +++ b/translations/content/ar/io/path-of.yaml @@ -0,0 +1,17 @@ +title: "دالة مصنع Path.of()" +oldApproach: "Paths.get()" +modernApproach: "Path.of()" +summary: "استخدم Path.of() — دالة المصنع الحديثة على واجهة Path." +explanation: "Path.of() هي دالة مصنع مضافة مباشرةً إلى واجهة Path مستبدِلةً فئة الأدوات Paths المنفصلة. أسهل في الاكتشاف ومتّسقة مع List.of() و Map.of() وغيرها." +whyModernWins: +- icon: "📐" + title: "واجهة برمجية متّسقة" + desc: "يتّبع نمط مصنع .of() مثل List.of() و Set.of()." +- icon: "📖" + title: "قابلة للاكتشاف" + desc: "موجودة على نوع Path نفسه لا في فئة Paths منفصلة." +- icon: "🧹" + title: "فئة أقل" + desc: "لا حاجة لاستيراد فئة الأدوات Paths." +support: + description: "متاح على نطاق واسع منذ JDK 11 (سبتمبر 2018)" diff --git a/translations/content/ar/io/reading-files.yaml b/translations/content/ar/io/reading-files.yaml new file mode 100644 index 0000000..f85f566 --- /dev/null +++ b/translations/content/ar/io/reading-files.yaml @@ -0,0 +1,17 @@ +title: "قراءة الملفات" +oldApproach: "BufferedReader" +modernApproach: "Files.readString()" +summary: "اقرأ ملفاً كاملاً في سلسلة نصية بسطر واحد." +explanation: "تقرأ Files.readString() كامل محتوى الملف في سلسلة نصية. تتعامل مع الترميز (UTF-8 افتراضياً) وتنظيف الموارد. للملفات الكبيرة استخدم Files.lines() للبث الكسول." +whyModernWins: +- icon: "📏" + title: "سطر واحد" + desc: "استبدل 8 أسطر من كليشيه BufferedReader." +- icon: "🧹" + title: "تنظيف تلقائي" + desc: "مقبض الملف مُغلَق تلقائياً." +- icon: "🌐" + title: "UTF-8 افتراضياً" + desc: "ترميز صحيح بشكل افتراضي — لا التباس في مجموعة الأحرف." +support: + description: "متاح على نطاق واسع منذ JDK 11 (سبتمبر 2018)" diff --git a/translations/content/ar/io/try-with-resources-effectively-final.yaml b/translations/content/ar/io/try-with-resources-effectively-final.yaml new file mode 100644 index 0000000..c0fd628 --- /dev/null +++ b/translations/content/ar/io/try-with-resources-effectively-final.yaml @@ -0,0 +1,17 @@ +title: "تحسين try-with-resources" +oldApproach: "إعادة تصريح المتغير" +modernApproach: "فعلياً نهائي" +summary: "استخدم المتغيرات الفعلياً النهائية مباشرةً في try-with-resources." +explanation: "يتيح Java 9 استخدام المتغيرات الفعلياً النهائية مباشرةً في try-with-resources دون إعادة التصريح. هذا أنظف عند إنشاء المورد خارج كتلة try." +whyModernWins: +- icon: "🧹" + title: "لا إعادة تصريح" + desc: "استخدم اسم المتغير الموجود مباشرةً." +- icon: "📖" + title: "أقل التباساً" + desc: "لا اسم متغير منفصل داخل كتلة try." +- icon: "📏" + title: "موجز" + desc: "أسطر أقل بنفس أمان الموارد." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/io/writing-files.yaml b/translations/content/ar/io/writing-files.yaml new file mode 100644 index 0000000..d7467ce --- /dev/null +++ b/translations/content/ar/io/writing-files.yaml @@ -0,0 +1,17 @@ +title: "كتابة الملفات" +oldApproach: "FileWriter + BufferedWriter" +modernApproach: "Files.writeString()" +summary: "اكتب سلسلة نصية في ملف بسطر واحد." +explanation: "تكتب Files.writeString() المحتوى في ملف بترميز UTF-8 افتراضياً. يمكن تمرير خيارات للإلحاق والإنشاء وغيرها." +whyModernWins: +- icon: "📏" + title: "سطر واحد" + desc: "لا تغليف كاتب أو try-with-resources مطلوب." +- icon: "🛡️" + title: "إعدادات افتراضية آمنة" + desc: "ترميز UTF-8 وتنظيف مقبض الملف الصحيح." +- icon: "🔧" + title: "خيارات" + desc: "مرّر علامات OpenOption للإلحاق والإنشاء وغيرها." +support: + description: "متاح على نطاق واسع منذ JDK 11 (سبتمبر 2018)" diff --git a/translations/content/ar/language/compact-canonical-constructor.yaml b/translations/content/ar/language/compact-canonical-constructor.yaml new file mode 100644 index 0000000..533a0b5 --- /dev/null +++ b/translations/content/ar/language/compact-canonical-constructor.yaml @@ -0,0 +1,17 @@ +title: "مُنشئ قانوني مضغوط" +oldApproach: "تحقق صريح في المُنشئ" +modernApproach: "مُنشئ مضغوط" +summary: "تحقق من حقول Record ونظّمها دون تكرار قوائم المعاملات." +explanation: "يمكن لـ Records تصريح مُنشئ قانوني مضغوط يُهمل قائمة المعاملات وإسناد الحقول. يُسنِد المترجم المعاملات تلقائياً للحقول بعد تشغيل منطق التحقق. هذا مثالي لفحوصات الشروط المسبقة والنسخ الدفاعية والتطبيع." +whyModernWins: +- icon: "✂️" + title: "تكرار أقل" + desc: "لا حاجة لتكرار قائمة المعاملات أو إسناد كل حقل يدوياً." +- icon: "🛡️" + title: "تحقق" + desc: "مثالي للتحقق من null وتحقق النطاق والنسخ الدفاعية." +- icon: "📖" + title: "نية أوضح" + desc: "البنية المضغوطة تُبرز التحقق لا الكليشيه." +support: + description: "متاح على نطاق واسع منذ JDK 16 (مارس 2021)" diff --git a/translations/content/ar/language/compact-source-files.yaml b/translations/content/ar/language/compact-source-files.yaml new file mode 100644 index 0000000..c52bd29 --- /dev/null +++ b/translations/content/ar/language/compact-source-files.yaml @@ -0,0 +1,17 @@ +title: "ملفات المصدر المضغوطة" +oldApproach: "طقوس الفئة الرئيسية" +modernApproach: "void main()" +summary: "اكتب برنامجاً كاملاً دون تصريح الفئة أو public static void main." +explanation: "تُزيل ملفات المصدر المضغوطة طقوس تصريحات الفئات وتوقيع الدالة main للبرامج البسيطة. مع الاستيراد الضمني لـ java.io.IO، حتى println متاحة مباشرةً." +whyModernWins: +- icon: "🚀" + title: "صفر طقوس" + desc: "لا فئة ولا public static void main ولا String[] args." +- icon: "🎓" + title: "صديق للمبتدئين" + desc: "يمكن للمبرمجين الجدد كتابة كود مفيد من السطر الأول." +- icon: "📝" + title: "شبيه بالسكريبت" + desc: "مثالي للنماذج الأولية السريعة والسكريبتات والأمثلة." +support: + description: "أُنهي في JDK 25 LTS (JEP 512، سبتمبر 2025)." diff --git a/translations/content/ar/language/default-interface-methods.yaml b/translations/content/ar/language/default-interface-methods.yaml new file mode 100644 index 0000000..bf5389a --- /dev/null +++ b/translations/content/ar/language/default-interface-methods.yaml @@ -0,0 +1,17 @@ +title: "الدوال الافتراضية في الواجهات" +oldApproach: "فئات مجردة للسلوك المشترك" +modernApproach: "الدوال الافتراضية في الواجهات" +summary: "أضف تطبيقات للدوال مباشرةً في الواجهات مما يُتيح الوراثة المتعددة للسلوك." +explanation: "قبل Java 8، كانت مشاركة السلوك عبر فئات غير مترابطة تتطلب فئات مجردة مما يحدّك بالوراثة الفردية. تتيح الدوال الافتراضية للواجهات توفير تطبيقات للدوال لتتمكن الفئات من وراثة السلوك من واجهات متعددة. كان هذا أساسياً لتطوير Collections API دون كسر التطبيقات الموجودة." +whyModernWins: +- icon: "🔀" + title: "وراثة متعددة" + desc: "يمكن للفئات تطبيق واجهات كثيرة ذات دوال افتراضية بخلاف وراثة الفئة المجردة الفردية." +- icon: "📦" + title: "تطوّر الواجهة البرمجية" + desc: "أضف دوالاً جديدة للواجهات دون كسر التطبيقات الموجودة." +- icon: "🧩" + title: "سلوك قابل للتركيب" + desc: "امزج وطابق القدرات من واجهات متعددة بحرية." +support: + description: "متاح منذ JDK 8 (مارس 2014)." diff --git a/translations/content/ar/language/diamond-operator.yaml b/translations/content/ar/language/diamond-operator.yaml new file mode 100644 index 0000000..db63e8a --- /dev/null +++ b/translations/content/ar/language/diamond-operator.yaml @@ -0,0 +1,17 @@ +title: "عامل الماسة مع الفئات المجهولة" +oldApproach: "تكرار وسائط النوع" +modernApproach: "الماسة <>" +summary: "يعمل عامل الماسة الآن مع الفئات المجهولة أيضاً." +explanation: "قدّم Java 7 المعامل <> لكنه لم يعمل مع الفئات الداخلية المجهولة. أصلح Java 9 هذا فأصبح لا حاجة لتكرار وسائط النوع على الجانب الأيمن." +whyModernWins: +- icon: "📏" + title: "قواعد متّسقة" + desc: "الماسة تعمل في كل مكان — المُنشئات والفئات المجهولة على حدٍّ سواء." +- icon: "🧹" + title: "تكرار أقل" + desc: "وسائط النوع مُصرَّح بها مرة على اليسار، لا تُكرَّر أبداً." +- icon: "🔧" + title: "مبدأ عدم التكرار" + desc: "المترجم يعرف النوع بالفعل — لماذا تكتبه مرتين؟" +support: + description: "الماسة مع الفئات المجهولة منذ JDK 9 (سبتمبر 2017)." diff --git a/translations/content/ar/language/exhaustive-switch.yaml b/translations/content/ar/language/exhaustive-switch.yaml new file mode 100644 index 0000000..6b90547 --- /dev/null +++ b/translations/content/ar/language/exhaustive-switch.yaml @@ -0,0 +1,17 @@ +title: "switch شامل بدون default" +oldApproach: "default إلزامي" +modernApproach: "شمولية الأنواع المُغلقة" +summary: "يتحقق المترجم من تغطية جميع الأنواع الفرعية المُغلقة — لا حاجة لـ default." +explanation: "عند التبديل على نوع مُغلق يعرف المترجم جميع الأنواع الفرعية الممكنة ويتحقق من معالجة كل حالة. إذا أضفت نوعاً فرعياً جديداً يُبيّن المترجم كل switch لم يعد مكتملاً." +whyModernWins: +- icon: "✅" + title: "أمان وقت الترجمة" + desc: "أضف نوعاً فرعياً جديداً والمترجم يُظهر كل مكان يحتاج تحديثاً." +- icon: "🚫" + title: "لا كود ميت" + desc: "لا فرع default غير قابل للوصول يُخفي الأخطاء." +- icon: "📐" + title: "أنواع جبرية" + desc: "مُغلق + records + switch شامل = أنواع ADT صحيحة في Java." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/language/flexible-constructor-bodies.yaml b/translations/content/ar/language/flexible-constructor-bodies.yaml new file mode 100644 index 0000000..7c66a0f --- /dev/null +++ b/translations/content/ar/language/flexible-constructor-bodies.yaml @@ -0,0 +1,17 @@ +title: "أجسام مُنشئات مرنة" +oldApproach: "التحقق بعد super()" +modernApproach: "كود قبل super()" +summary: "تحقق من القيم واحسبها قبل استدعاء super() أو this()." +explanation: "يرفع Java 25 القيد الذي يشترط أن يكون super() أول عبارة. يمكنك الآن التحقق من الوسائط وحساب القيم المشتقة وإعداد الحالة قبل التفويض للمُنشئ الوالد." +whyModernWins: +- icon: "🛡️" + title: "فشل سريع" + desc: "تحقق من الوسائط قبل تشغيل مُنشئ الفئة الوالدة." +- icon: "🧮" + title: "احسب أولاً" + desc: "اشتق القيم وجهّز البيانات قبل استدعاء super()." +- icon: "🧹" + title: "لا حلول بديلة" + desc: "لا مزيد من الدوال الثابتة المساعدة أو أنماط المصنع للتحايل على القيد." +support: + description: "أُنهي في JDK 25 LTS (JEP 513، سبتمبر 2025)." diff --git a/translations/content/ar/language/guarded-patterns.yaml b/translations/content/ar/language/guarded-patterns.yaml new file mode 100644 index 0000000..4e41e27 --- /dev/null +++ b/translations/content/ar/language/guarded-patterns.yaml @@ -0,0 +1,17 @@ +title: "الأنماط المحروسة بـ when" +oldApproach: "if متداخل" +modernApproach: "جملة when" +summary: "أضف شروطاً لحالات الأنماط باستخدام حراس when." +explanation: "تتيح الأنماط المحروسة لك تنقية مطابقة النوع بشرط منطقي إضافي. يُبقي هذا جميع منطق التفريع في switch بدلاً من تداخل جمل if داخل الحالات." +whyModernWins: +- icon: "🎯" + title: "مطابقة دقيقة" + desc: "ادمج النوع + الشرط في تسمية حالة واحدة." +- icon: "📐" + title: "بنية مسطّحة" + desc: "لا if/else متداخلة داخل حالات switch." +- icon: "📖" + title: "نية مقروءة" + desc: "جملة when تُقرأ كاللغة الطبيعية." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/language/markdown-javadoc-comments.yaml b/translations/content/ar/language/markdown-javadoc-comments.yaml new file mode 100644 index 0000000..eabd1ac --- /dev/null +++ b/translations/content/ar/language/markdown-javadoc-comments.yaml @@ -0,0 +1,17 @@ +title: "Markdown في تعليقات Javadoc" +oldApproach: "Javadoc قائم على HTML" +modernApproach: "Javadoc بـ Markdown" +summary: "اكتب تعليقات Javadoc بـ Markdown بدلاً من HTML لقراءة أفضل." +explanation: "يقدّم Java 23 تعليقات Javadoc بنمط /// Markdown كبديل لصيغة /** */ HTML التقليدية. بناء Markdown أكثر طبيعيةً في الكتابة والقراءة مع دعم لكتل الكود والتأكيد والقوائم والروابط. يحوّل المترجم Markdown إلى HTML لمخرجات javadoc." +whyModernWins: +- icon: "📖" + title: "بنية طبيعية" + desc: "استخدم علامات اقتباس خلفية للكود المضمّن وقُدرات ``` للكتل بدلاً من وسوم HTML." +- icon: "✍️" + title: "أسهل في الكتابة" + desc: "لا حاجة لـ {@code} أو
 أو وسوم 

— اكتب Markdown فقط." +- icon: "👁" + title: "أفضل في المحررات" + desc: "Markdown يُعرَض بشكل جميل في IDEs الحديثة ومحررات النصوص." +support: + description: "متاح منذ JDK 23 (سبتمبر 2024)" diff --git a/translations/content/ar/language/module-import-declarations.yaml b/translations/content/ar/language/module-import-declarations.yaml new file mode 100644 index 0000000..0559438 --- /dev/null +++ b/translations/content/ar/language/module-import-declarations.yaml @@ -0,0 +1,17 @@ +title: "تصريحات استيراد الوحدات" +oldApproach: "استيرادات كثيرة" +modernApproach: "import module" +summary: "استورد جميع الحزم التي تُصدّرها وحدة في تصريح واحد." +explanation: "تتيح لك تصريحات استيراد الوحدات استيراد كل ما تُصدّره وحدة بسطر واحد. هذا مفيد بشكل خاص لـ java.base التي تغطي المجموعات والـ I/O والتدفقات والمزيد." +whyModernWins: +- icon: "🧹" + title: "سطر واحد" + desc: "استبدل جداراً من الاستيرادات باستيراد وحدة واحد." +- icon: "📦" + title: "واعٍ بالوحدات" + desc: "يستفيد من نظام الوحدات لاستيراد مجموعات حزم متماسكة." +- icon: "🚀" + title: "بدايات سريعة" + desc: "مثالي للسكريبتات والنماذج الأولية حيث تكون قوائم الاستيراد مُرهِقة." +support: + description: "أُنهي في JDK 25 LTS (JEP 511، سبتمبر 2025)." diff --git a/translations/content/ar/language/pattern-matching-instanceof.yaml b/translations/content/ar/language/pattern-matching-instanceof.yaml new file mode 100644 index 0000000..73c371b --- /dev/null +++ b/translations/content/ar/language/pattern-matching-instanceof.yaml @@ -0,0 +1,17 @@ +title: "مطابقة الأنماط لـ instanceof" +oldApproach: "instanceof + تحويل" +modernApproach: "متغير النمط" +summary: "ادمج فحص النوع والتحويل في خطوة واحدة بمطابقة الأنماط." +explanation: "تُزيل مطابقة الأنماط لـ instanceof التحويلَ المكرر بعد فحص النوع. المتغير محدود النطاق تلقائياً إلى أين يتطابق النمط مما يجعل الكود أكثر أماناً وأقصر." +whyModernWins: +- icon: "🔄" + title: "لا تحويل مكرر" + desc: "فحص النوع وربط المتغير يحدثان في تعبير واحد." +- icon: "📏" + title: "أسطر أقل" + desc: "سطر واحد بدلاً من اثنين — سطر التحويل يختفي كلياً." +- icon: "🛡️" + title: "أمان النطاق" + desc: "متغير النمط في النطاق فقط أين النوع مضمون." +support: + description: "متاح على نطاق واسع منذ JDK 16 (مارس 2021)" diff --git a/translations/content/ar/language/pattern-matching-switch.yaml b/translations/content/ar/language/pattern-matching-switch.yaml new file mode 100644 index 0000000..8cad14a --- /dev/null +++ b/translations/content/ar/language/pattern-matching-switch.yaml @@ -0,0 +1,17 @@ +title: "مطابقة الأنماط في switch" +oldApproach: "سلسلة if-else" +modernApproach: "أنماط الأنواع" +summary: "استبدل سلاسل instanceof إذا كانت if-else بأنماط نوع switch نظيفة." +explanation: "تتيح مطابقة الأنماط في switch مطابقة الأنواع مباشرةً ودمج فحص النوع والتحويل والربط في تسمية حالة واحدة موجزة. يتحقق المترجم من الشمولية." +whyModernWins: +- icon: "📐" + title: "إيزاع منظّم" + desc: "switch يجعل بنية التفريع صريحةً وقابلةً للمسح." +- icon: "🎯" + title: "صيغة التعبير" + desc: "يُرجع قيمةً مباشرةً — لا متغير قابل للتعديل مطلوب." +- icon: "🛡️" + title: "آمن" + desc: "المترجم يتحقق من شمولية جميع الأنواع الفرعية المُغلقة." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/language/primitive-types-in-patterns.yaml b/translations/content/ar/language/primitive-types-in-patterns.yaml new file mode 100644 index 0000000..1d55c5c --- /dev/null +++ b/translations/content/ar/language/primitive-types-in-patterns.yaml @@ -0,0 +1,17 @@ +title: "الأنواع الأولية في الأنماط" +oldApproach: "فحوصات النطاق اليدوية" +modernApproach: "أنماط الأنواع الأولية" +summary: "مطابقة الأنماط تعمل الآن مع الأنواع الأولية لا مع الكائنات فحسب." +explanation: "يُوسّع Java 25 مطابقة الأنماط للأنواع الأولية. يمكنك استخدام int و long و double وغيرها في أنماط switch مع حراس when مما يُزيل الحاجة للتغليف أو فحوصات النطاق اليدوية." +whyModernWins: +- icon: "📦" + title: "لا تغليف" + desc: "طابق الأنواع الأولية مباشرةً — لا حاجة لغلاف Integer." +- icon: "🎯" + title: "تناسق الأنماط" + desc: "نفس بنية النمط للكائنات والأنواع الأولية." +- icon: "⚡" + title: "أداء أفضل" + desc: "تجنّب تكلفة التغليف التلقائي في مطابقة الأنماط." +support: + description: "معاينة في JDK 25 (المعاينة الثالثة، JEP 507). يتطلب --enable-preview." diff --git a/translations/content/ar/language/private-interface-methods.yaml b/translations/content/ar/language/private-interface-methods.yaml new file mode 100644 index 0000000..ba2ffda --- /dev/null +++ b/translations/content/ar/language/private-interface-methods.yaml @@ -0,0 +1,17 @@ +title: "الدوال الخاصة في الواجهات" +oldApproach: "منطق مكرّر" +modernApproach: "الدوال الخاصة" +summary: "استخرج المنطق المشترك في الواجهات باستخدام الدوال الخاصة." +explanation: "يسمح Java 9 بالدوال الخاصة في الواجهات مما يُتيح لك مشاركة الكود بين الدوال الافتراضية دون كشف تفاصيل التطبيق للفئات المُنفِّذة." +whyModernWins: +- icon: "🧩" + title: "إعادة استخدام الكود" + desc: "شارك المنطق بين الدوال الافتراضية دون تكرار." +- icon: "🔐" + title: "التغليف" + desc: "تفاصيل التطبيق تظل مخفيةً عن الفئات المُنفِّذة." +- icon: "🧹" + title: "واجهات غير مكررة" + desc: "لا مزيد من النسخ واللصق بين الدوال الافتراضية." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/language/record-patterns.yaml b/translations/content/ar/language/record-patterns.yaml new file mode 100644 index 0000000..e2d5e43 --- /dev/null +++ b/translations/content/ar/language/record-patterns.yaml @@ -0,0 +1,17 @@ +title: "أنماط Record (التفكيك)" +oldApproach: "وصول يدوي" +modernApproach: "التفكيك" +summary: "فكّك Records مباشرةً في الأنماط — استخرج الحقول في خطوة واحدة." +explanation: "تتيح أنماط Record تحليل مكوّنات Record مباشرةً في instanceof و switch. الأنماط المتداخلة مدعومة أيضاً مما يُتيح المطابقة العميقة دون متغيرات وسيطة." +whyModernWins: +- icon: "🎯" + title: "استخراج مباشر" + desc: "الوصول لمكوّنات Record دون استدعاء دوال الوصول يدوياً." +- icon: "🪆" + title: "قابل للتداخل" + desc: "يمكن للأنماط التداخل — طابق Records الداخلية في تعبير واحد." +- icon: "📏" + title: "كود مضغوط" + desc: "خمسة أسطر تصبح اثنين — طقوس أقل ووضوح مماثل." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/language/records-for-data-classes.yaml b/translations/content/ar/language/records-for-data-classes.yaml new file mode 100644 index 0000000..70af2f0 --- /dev/null +++ b/translations/content/ar/language/records-for-data-classes.yaml @@ -0,0 +1,17 @@ +title: "Records لفئات البيانات" +oldApproach: "POJO مطوّل" +modernApproach: "record" +summary: "سطر واحد يستبدل أكثر من 30 سطراً من الكليشيهات لحاملات البيانات الثابتة." +explanation: "تولّد Records تلقائياً المُنشئ ودوال الوصول (x() و y()) و equals() و hashCode() و toString(). وهي ثابتة بتصميمها ومثالية لـ DTOs وكائنات القيم ومطابقة الأنماط." +whyModernWins: +- icon: "⚡" + title: "تعريف بسطر واحد" + desc: "سطر واحد يستبدل المُنشئ ودوال الجلب و equals و hashCode و toString." +- icon: "🔒" + title: "ثابتة بشكل افتراضي" + desc: "جميع الحقول نهائية — لا أخطاء setters." +- icon: "🧩" + title: "صديقة للأنماط" + desc: "Records تعمل مع أنماط التفكيك في switch و instanceof." +support: + description: "متاح على نطاق واسع منذ JDK 16 (مارس 2021)" diff --git a/translations/content/ar/language/sealed-classes.yaml b/translations/content/ar/language/sealed-classes.yaml new file mode 100644 index 0000000..dcb8343 --- /dev/null +++ b/translations/content/ar/language/sealed-classes.yaml @@ -0,0 +1,17 @@ +title: "الفئات المُغلقة للتسلسلات الهرمية للأنواع" +oldApproach: "تسلسل هرمي مفتوح" +modernApproach: "sealed permits" +summary: "قيّد الفئات التي يمكنها امتداد نوع — مما يُتيح switches شاملة." +explanation: "الفئات المُغلقة تُعرِّف مجموعةً مغلقةً من الأنواع الفرعية. المترجم يعرف جميع الحالات الممكنة مما يُتيح مطابقة أنماط شاملة دون فرع default. مع Records تُنمذج الأنواع الجبرية." +whyModernWins: +- icon: "🔐" + title: "تسلسل هرمي متحكَّم به" + desc: "فقط الأنواع الفرعية المسموحة يمكنها الامتداد — لا فئات فرعية مفاجئة." +- icon: "✅" + title: "مطابقة شاملة" + desc: "المترجم يتحقق من أن switch يغطي جميع الحالات، لا حاجة لـ default." +- icon: "📐" + title: "أنواع جبرية" + desc: "نمذجة أنواع المجموع بشكل طبيعي — مُغلق + records = ADTs في Java." +support: + description: "متاح على نطاق واسع منذ JDK 17 LTS (سبتمبر 2021)" diff --git a/translations/content/ar/language/static-members-in-inner-classes.yaml b/translations/content/ar/language/static-members-in-inner-classes.yaml new file mode 100644 index 0000000..b42e9c3 --- /dev/null +++ b/translations/content/ar/language/static-members-in-inner-classes.yaml @@ -0,0 +1,17 @@ +title: "الأعضاء الثابتة في الفئات الداخلية" +oldApproach: "يجب استخدام فئة متداخلة ثابتة" +modernApproach: "أعضاء ثابتة في الفئات الداخلية" +summary: "عرّف الأعضاء الثابتة في الفئات الداخلية دون الحاجة للفئات المتداخلة الثابتة." +explanation: "قبل Java 16، يمكن فقط للفئات المتداخلة الثابتة احتواء الأعضاء الثابتة. لم تستطع الفئات الداخلية (غير الثابتة) امتلاك ثوابت لأنها تتطلب مثيلاً مُحيطاً. يُرخّي Java 16 هذا القيد مسمحاً بالحقول والدوال والأنواع المتداخلة الثابتة في الفئات الداخلية." +whyModernWins: +- icon: "🔓" + title: "مرونة أكبر" + desc: "يمكن للفئات الداخلية الآن امتلاك أعضاء ثابتة عند الحاجة." +- icon: "🧩" + title: "حالة مشتركة" + desc: "تتبّع الحالة المشتركة عبر مثيلات الفئة الداخلية." +- icon: "📐" + title: "حرية التصميم" + desc: "لا حاجة لترقية إلى فئة متداخلة ثابتة لمجرد حقل ثابت واحد." +support: + description: "متاح على نطاق واسع منذ JDK 16 (مارس 2021)" diff --git a/translations/content/ar/language/static-methods-in-interfaces.yaml b/translations/content/ar/language/static-methods-in-interfaces.yaml new file mode 100644 index 0000000..5ef741f --- /dev/null +++ b/translations/content/ar/language/static-methods-in-interfaces.yaml @@ -0,0 +1,17 @@ +title: "الدوال الثابتة في الواجهات" +oldApproach: "فئات الأدوات" +modernApproach: "الدوال الثابتة في الواجهات" +summary: "أضف دوال أدوات ثابتة مباشرةً للواجهات بدلاً من فئات أدوات منفصلة." +explanation: "قبل Java 8، كانت دوال الأدوات المرتبطة بواجهة يجب أن تعيش في فئة منفصلة (مثل Collections لـ Collection). تتيح الدوال الثابتة في الواجهات إبقاء الأدوات ذات الصلة معاً. شائعة في الواجهات البرمجية الحديثة مثل Comparator.comparing() و Stream.of() و List.of()." +whyModernWins: +- icon: "📦" + title: "تنظيم أفضل" + desc: "أبقِ الأدوات ذات الصلة مع الواجهة لا في فئة منفصلة." +- icon: "🔍" + title: "قابلية الاكتشاف" + desc: "دوال المصنع والمساعدة موجودة أين تتوقعها." +- icon: "🧩" + title: "تماسك الواجهة البرمجية" + desc: "لا حاجة لفئات *Utils أو *Helper منفصلة." +support: + description: "متاح منذ JDK 8 (مارس 2014)" diff --git a/translations/content/ar/language/switch-expressions.yaml b/translations/content/ar/language/switch-expressions.yaml new file mode 100644 index 0000000..091a37a --- /dev/null +++ b/translations/content/ar/language/switch-expressions.yaml @@ -0,0 +1,17 @@ +title: "تعبيرات switch" +oldApproach: "جملة switch" +modernApproach: "تعبير switch" +summary: "switch كتعبير يُرجع قيمةً — لا break ولا تسقيط." +explanation: "تُرجع تعبيرات switch قيمةً مباشرةً وتستخدم بنية السهم لمنع أخطاء التسقيط ويتحقق المترجم من الشمولية. يستبدل هذا الصيغة الجملية عرضة الأخطاء." +whyModernWins: +- icon: "🎯" + title: "يُرجع قيمة" + desc: "أسنِد نتيجة switch مباشرةً — لا متغير مؤقت مطلوب." +- icon: "🛡️" + title: "لا تسقيط" + desc: "بنية السهم تُزيل أخطاء التسقيط العرضية من break المفقود." +- icon: "✅" + title: "فحص الشمولية" + desc: "المترجم يضمن تغطية جميع الحالات." +support: + description: "متاح على نطاق واسع منذ JDK 14 (مارس 2020)" diff --git a/translations/content/ar/language/text-blocks-for-multiline-strings.yaml b/translations/content/ar/language/text-blocks-for-multiline-strings.yaml new file mode 100644 index 0000000..afadfda --- /dev/null +++ b/translations/content/ar/language/text-blocks-for-multiline-strings.yaml @@ -0,0 +1,17 @@ +title: "كتل النص للسلاسل متعددة الأسطر" +oldApproach: "تسلسل السلاسل" +modernApproach: "كتل النص" +summary: "اكتب سلاسل متعددة الأسطر بشكل طبيعي باستخدام كتل النص ثلاثية الاقتباس." +explanation: "تتيح لك كتل النص كتابة سلاسل متعددة الأسطر كما تظهر تماماً. لا مزيد من إفلات علامات الاقتباس أو إضافة \n. يُزيل المترجم المسافات البادئة العرضية تلقائياً." +whyModernWins: +- icon: "📖" + title: "مقروء كما هو" + desc: "JSON وSQL وHTML تبدو كـ JSON وSQL وHTML حقيقية في المصدر." +- icon: "🚫" + title: "لا جحيم الإفلات" + desc: "علامات الاقتباس المضمّنة لا تحتاج إفلات بالشرطة المائلة." +- icon: "📐" + title: "مسافات بادئة ذكية" + desc: "المسافات البادئة تُقلَّص تلقائياً بناءً على موضع المُحدِّد الختامي." +support: + description: "متاح على نطاق واسع منذ JDK 15 (سبتمبر 2020)" diff --git a/translations/content/ar/language/type-inference-with-var.yaml b/translations/content/ar/language/type-inference-with-var.yaml new file mode 100644 index 0000000..161f5eb --- /dev/null +++ b/translations/content/ar/language/type-inference-with-var.yaml @@ -0,0 +1,17 @@ +title: "استنتاج النوع باستخدام var" +oldApproach: "أنواع صريحة" +modernApproach: "الكلمة المفتاحية var" +summary: "استخدم var لاستنتاج نوع المتغيرات المحلية — ضجيج أقل بنفس الأمان." +explanation: "منذ Java 10، يستنتج المترجم أنواع المتغيرات المحلية من الجانب الأيمن. يقلّل هذا الضجيج البصري دون التضحية بأمان الأنواع. استخدم var عندما يكون النوع واضحاً من السياق." +whyModernWins: +- icon: "⚡" + title: "كليشيه أقل" + desc: "لا حاجة لتكرار الأنواع العامة المعقدة على كلا جانبي التعيين." +- icon: "👁" + title: "قابلية قراءة أفضل" + desc: "ركّز على أسماء المتغيرات والقيم لا على تصريحات الأنواع." +- icon: "🔒" + title: "آمن من حيث الأنواع" + desc: "يستنتج المترجم النوع الدقيق ويطبّقه وقت الترجمة." +support: + description: "متاح على نطاق واسع منذ JDK 10 (مارس 2018)" diff --git a/translations/content/ar/language/unnamed-variables.yaml b/translations/content/ar/language/unnamed-variables.yaml new file mode 100644 index 0000000..08e4fa8 --- /dev/null +++ b/translations/content/ar/language/unnamed-variables.yaml @@ -0,0 +1,17 @@ +title: "المتغيرات غير المُسمّاة بـ _" +oldApproach: "متغير غير مستخدَم" +modernApproach: "عنصر نائب _" +summary: "استخدم _ للإشارة إلى عدم الاستخدام المتعمّد لمتغير." +explanation: "المتغيرات غير المُسمّاة تُبلّغ القرّاء والأدوات بأن قيمةً تُهمَل عمداً. لا مزيد من أسماء 'ignored' أو 'unused' ولا تحذيرات IDE." +whyModernWins: +- icon: "📢" + title: "نية واضحة" + desc: "_ يقول صراحةً 'هذه القيمة غير مطلوبة هنا'." +- icon: "🔇" + title: "لا تحذيرات" + desc: "لن تُعلّم IDEs والـ linters المتغيرات غير المستخدَمة عمداً." +- icon: "🧹" + title: "تعبيرات lambda أنظف" + desc: "تعبيرات lambda متعددة المعاملات أنظف عند الحاجة لبعض المعاملات فقط." +support: + description: "أُنهيت في JDK 22 (JEP 456، مارس 2024)." diff --git a/translations/content/ar/security/key-derivation-functions.yaml b/translations/content/ar/security/key-derivation-functions.yaml new file mode 100644 index 0000000..b7f9f8c --- /dev/null +++ b/translations/content/ar/security/key-derivation-functions.yaml @@ -0,0 +1,17 @@ +title: "دوال اشتقاق المفاتيح" +oldApproach: "PBKDF2 يدوي" +modernApproach: "KDF API" +summary: "اشتق مفاتيح التشفير باستخدام KDF API القياسية." +explanation: "توفر KDF API واجهةً قياسيةً لدوال اشتقاق المفاتيح بما فيها HKDF. تستبدل النمط المحرج SecretKeyFactory + PBEKeySpec بواجهة برمجية منشئ نظيفة." +whyModernWins: +- icon: "📐" + title: "واجهة برمجية نظيفة" + desc: "نمط المنشئ بدلاً من مُنشئات KeySpec المحرجة." +- icon: "🔧" + title: "دعم HKDF" + desc: "خوارزمية HKDF الحديثة إلى جانب PBKDF2." +- icon: "🛡️" + title: "قياسية" + desc: "واجهة برمجية موحّدة لجميع خوارزميات اشتقاق المفاتيح." +support: + description: "أُنهيت في JDK 25 LTS (JEP 510، سبتمبر 2025)." diff --git a/translations/content/ar/security/pem-encoding.yaml b/translations/content/ar/security/pem-encoding.yaml new file mode 100644 index 0000000..5aa67e1 --- /dev/null +++ b/translations/content/ar/security/pem-encoding.yaml @@ -0,0 +1,17 @@ +title: "ترميز/فك ترميز PEM" +oldApproach: "Base64 يدوي + رؤوس" +modernApproach: "PEM API" +summary: "رمّز وفك ترميز الكائنات التشفيرية بصيغة PEM أصلياً." +explanation: "توفر PEM API ترميزاً/فك ترميزاً قياسياً للشهادات والمفاتيح والكائنات التشفيرية الأخرى بصيغة PEM. لا مزيد من تغليف Base64 اليدوي مع رؤوس BEGIN/END." +whyModernWins: +- icon: "🧹" + title: "لا Base64 يدوي" + desc: "رؤوس PEM والتفاف الأسطر و Base64 تُعالَج تلقائياً." +- icon: "🔄" + title: "ثنائي الاتجاه" + desc: "رمّز إلى PEM وفك ترميز من PEM بواجهة برمجية واحدة." +- icon: "🛡️" + title: "تنسيق قياسي" + desc: "يُنتج مخرجات PEM متوافقة مع RFC 7468." +support: + description: "معاينة في JDK 25 (JEP 470). يتطلب --enable-preview." diff --git a/translations/content/ar/security/random-generator.yaml b/translations/content/ar/security/random-generator.yaml new file mode 100644 index 0000000..419afae --- /dev/null +++ b/translations/content/ar/security/random-generator.yaml @@ -0,0 +1,17 @@ +title: "واجهة RandomGenerator" +oldApproach: "new Random() / ThreadLocalRandom" +modernApproach: "مصنع RandomGenerator" +summary: "استخدم واجهة RandomGenerator لاختيار خوارزميات أرقام عشوائية بالاسم دون الارتباط بفئة محددة." +explanation: "قدّم JDK 17 الـ RandomGenerator كواجهة مشتركة لجميع تطبيقات RNG. بدلاً من ترميز new Random() أو ThreadLocalRandom يمكنك اختيار الخوارزميات بالاسم عبر مصنع مما يُسهّل التبديل بين الخوارزميات المحسَّنة لحالات استخدام مختلفة." +whyModernWins: +- icon: "🔧" + title: "مستقل عن الخوارزمية" + desc: "اختر أفضل خوارزمية RNG بالاسم دون تغيير بنية الكود." +- icon: "⚡" + title: "خوارزميات أفضل" + desc: "الوصول إلى مولّدات LXM الحديثة ذات الخصائص الإحصائية المتفوقة." +- icon: "🔗" + title: "واجهة برمجية موحّدة" + desc: "واجهة واحدة تغطي Random و ThreadLocalRandom و SplittableRandom والمزيد." +support: + description: "متاح منذ JDK 17 (سبتمبر 2021، JEP 356)." diff --git a/translations/content/ar/security/strong-random.yaml b/translations/content/ar/security/strong-random.yaml new file mode 100644 index 0000000..6cdb6b2 --- /dev/null +++ b/translations/content/ar/security/strong-random.yaml @@ -0,0 +1,17 @@ +title: "توليد أعداد عشوائية قوية" +oldApproach: "new SecureRandom()" +modernApproach: "getInstanceStrong()" +summary: "احصل على أقوى تطبيق SecureRandom للمنصة." +explanation: "تُرجع getInstanceStrong() تطبيق SecureRandom المُهيَّأ باعتباره الأقوى على المنصة. يتحكم في هذا خاصية أمان securerandom.strongAlgorithms." +whyModernWins: +- icon: "🛡️" + title: "الأقوى المتاح" + desc: "تختار تلقائياً أفضل خوارزمية للمنصة." +- icon: "📖" + title: "نية صريحة" + desc: "تُعبّر بوضوح عن الحاجة لعشوائية قوية." +- icon: "��" + title: "قابل للتهيئة" + desc: "يمكن للمسؤولين تغيير الخوارزمية القوية عبر خصائص الأمان." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/security/tls-default.yaml b/translations/content/ar/security/tls-default.yaml new file mode 100644 index 0000000..ea65896 --- /dev/null +++ b/translations/content/ar/security/tls-default.yaml @@ -0,0 +1,17 @@ +title: "TLS 1.3 بشكل افتراضي" +oldApproach: "تهيئة TLS يدوية" +modernApproach: "TLS 1.3 الافتراضي" +summary: "TLS 1.3 مُفعَّل بشكل افتراضي — لا حاجة لتهيئة بروتوكول صريحة." +explanation: "أضاف Java 11 دعم TLS 1.3 وجعله البروتوكول المُفضَّل. يستخدمه HttpClient تلقائياً. لا مزيد من تحديد إصدارات البروتوكول يدوياً للاتصالات الآمنة." +whyModernWins: +- icon: "🛡️" + title: "أكثر أماناً" + desc: "TLS 1.3 يزيل مجموعات التشفير وأنماط المصافحة المهجورة." +- icon: "⚡" + title: "مصافحة أسرع" + desc: "TLS 1.3 يكتمل في رحلة واحدة مقابل اثنتين." +- icon: "🆓" + title: "صفر تهيئة" + desc: "آمن بشكل افتراضي — لا اختيار بروتوكول صريح مطلوب." +support: + description: "متاح على نطاق واسع منذ JDK 11 (سبتمبر 2018)" diff --git a/translations/content/ar/streams/collectors-flatmapping.yaml b/translations/content/ar/streams/collectors-flatmapping.yaml new file mode 100644 index 0000000..7ba2adc --- /dev/null +++ b/translations/content/ar/streams/collectors-flatmapping.yaml @@ -0,0 +1,17 @@ +title: "Collectors.flatMapping()" +oldApproach: "flatMap متداخل" +modernApproach: "flatMapping()" +summary: "استخدم flatMapping() للتسطيح داخل مُجمِّع grouping." +explanation: "يُطبّق Collectors.flatMapping() تعييناً من-واحد-إلى-كثير كمُجمِّع فرعي. وهو مكافئ المُجمِّع لـ Stream.flatMap() — مفيد داخل groupingBy أو partitioningBy." +whyModernWins: +- icon: "🧩" + title: "قابل للتركيب" + desc: "يعمل كمُجمِّع فرعي داخل groupingBy." +- icon: "📐" + title: "تمريرة واحدة" + desc: "سطّح وجمّع في تمريرة Stream واحدة." +- icon: "🔗" + title: "قابل للتداخل" + desc: "ادمجه مع مُجمِّعات فرعية أخرى." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/streams/optional-ifpresentorelse.yaml b/translations/content/ar/streams/optional-ifpresentorelse.yaml new file mode 100644 index 0000000..595536f --- /dev/null +++ b/translations/content/ar/streams/optional-ifpresentorelse.yaml @@ -0,0 +1,17 @@ +title: "Optional.ifPresentOrElse()" +oldApproach: "if/else على Optional" +modernApproach: "ifPresentOrElse()" +summary: "تعامل مع الحالة الموجودة والفارغة لـ Optional في استدعاء واحد." +explanation: "تأخذ ifPresentOrElse() Consumer للحالة الموجودة و Runnable للحالة الفارغة. تتجنّب النمط المضاد isPresent/get." +whyModernWins: +- icon: "📏" + title: "تعبير واحد" + desc: "كلا الحالتين تُعالَجان في استدعاء دالة واحد." +- icon: "🚫" + title: "لا get()" + desc: "يُزيل النمط الخطر isPresent() + get()." +- icon: "🔗" + title: "سائل" + desc: "يتسلسل بشكل طبيعي بعد findUser() أو أي دالة تُرجع Optional." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/streams/optional-or.yaml b/translations/content/ar/streams/optional-or.yaml new file mode 100644 index 0000000..500d997 --- /dev/null +++ b/translations/content/ar/streams/optional-or.yaml @@ -0,0 +1,17 @@ +title: "احتياط Optional.or()" +oldApproach: "احتياط متداخل" +modernApproach: "سلسلة .or()" +summary: "سلسل احتياطات Optional دون تحققات متداخلة." +explanation: "يُرجع Optional.or() الـ Optional الأصلي إذا كان يحتوي قيمةً وإلا يُقيّم المورّد للحصول على Optional بديل. المورّدون كسولون — لا يُستدعَون إلا عند الحاجة." +whyModernWins: +- icon: "🔗" + title: "قابل للتسلسل" + desc: "كدّس الاحتياطات في خط أنابيب مقروء." +- icon: "⚡" + title: "تقييم كسول" + desc: "مورّدو الاحتياط لا يُنفَّذون إلا عند الحاجة." +- icon: "📖" + title: "تصريحي" + desc: "يُقرأ كـ 'جرّب الأساسي أو الثانوي أو الافتراضي'." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/streams/predicate-not.yaml b/translations/content/ar/streams/predicate-not.yaml new file mode 100644 index 0000000..a49eb37 --- /dev/null +++ b/translations/content/ar/streams/predicate-not.yaml @@ -0,0 +1,17 @@ +title: "Predicate.not()" +oldApproach: "نفي lambda" +modernApproach: "Predicate.not()" +summary: "استخدم Predicate.not() لنفي مراجع الدوال بشكل نظيف بدلاً من تغليفات lambda." +explanation: "قبل Java 11، كان نفي مرجع دالة يتطلب تغليفه في lambda. يتيح Predicate.not() نفي أي Predicate مباشرةً مع الإبقاء على الكود مقروءاً ومتّسقاً مع أسلوب مرجع الدالة." +whyModernWins: +- icon: "👁" + title: "نفي أنظف" + desc: "لا حاجة لتغليف مراجع الدوال في lambdas لمجرد نفيها." +- icon: "🔗" + title: "قابل للتركيب" + desc: "يعمل مع أي Predicate مما يُتيح سلاسل Predicate نظيفة." +- icon: "📖" + title: "يُقرأ بشكل طبيعي" + desc: "Predicate.not(String::isBlank) يُقرأ كاللغة الإنجليزية." +support: + description: "متاح منذ JDK 11 (سبتمبر 2018)." diff --git a/translations/content/ar/streams/stream-gatherers.yaml b/translations/content/ar/streams/stream-gatherers.yaml new file mode 100644 index 0000000..cc49e6d --- /dev/null +++ b/translations/content/ar/streams/stream-gatherers.yaml @@ -0,0 +1,17 @@ +title: "تجميعات Stream" +oldApproach: "Collector مخصص" +modernApproach: "gather()" +summary: "استخدم Gatherers للعمليات الوسيطة المخصصة في Stream." +explanation: "Gatherers عمليات Stream وسيطة جديدة يمكنها التعبير عن تحويلات معقدة مثل النوافذ المنزلقة والمجموعات ذات الحجم الثابت وعمليات المسح التي كانت مستحيلةً بعمليات Stream القياسية." +whyModernWins: +- icon: "🧩" + title: "قابل للتركيب" + desc: "تتركّب Gatherers مع عمليات Stream الأخرى." +- icon: "📦" + title: "عمليات مدمجة" + desc: "windowFixed و windowSliding و fold و scan جاهزة للاستخدام." +- icon: "🔧" + title: "قابل للتوسيع" + desc: "اكتب Gatherers مخصصة لأي تحويل وسيط." +support: + description: "أُنهيت في JDK 24 (JEP 485، مارس 2025)." diff --git a/translations/content/ar/streams/stream-iterate-predicate.yaml b/translations/content/ar/streams/stream-iterate-predicate.yaml new file mode 100644 index 0000000..24ab45d --- /dev/null +++ b/translations/content/ar/streams/stream-iterate-predicate.yaml @@ -0,0 +1,17 @@ +title: "Stream.iterate() مع Predicate" +oldApproach: "iterate + limit" +modernApproach: "iterate(seed, pred, op)" +summary: "استخدم Predicate لإيقاف التكرار — مثل حلقة for في صيغة Stream." +explanation: "تعمل Stream.iterate(seed, hasNext, next) ثلاثية الوسائط كحلقة for: seed هو البداية و hasNext يُحدّد متى تتوقف و next تُنتج القيمة التالية." +whyModernWins: +- icon: "🎯" + title: "إنهاء طبيعي" + desc: "توقف بناءً على شرط لا بحد تعسفي." +- icon: "📐" + title: "مكافئ حلقة for" + desc: "نفس دلالات for(seed; hasNext; next)." +- icon: "🛡️" + title: "لا خطر Stream لا نهائي" + desc: "Predicate يضمن الإنهاء." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/streams/stream-mapmulti.yaml b/translations/content/ar/streams/stream-mapmulti.yaml new file mode 100644 index 0000000..af74c00 --- /dev/null +++ b/translations/content/ar/streams/stream-mapmulti.yaml @@ -0,0 +1,17 @@ +title: "Stream.mapMulti()" +oldApproach: "flatMap + List" +modernApproach: "mapMulti()" +summary: "أصدر صفراً أو أكثر من العناصر لكل إدخال دون إنشاء Streams وسيطة." +explanation: "mapMulti() بديل إمراطي لـ flatMap يتجنّب إنشاء كائنات Stream وسيطة لكل عنصر. أكثر كفاءةً عندما ينتج التعيين عدداً صغيراً من العناصر." +whyModernWins: +- icon: "⚡" + title: "تخصيص أقل" + desc: "لا Stream وسيطة تُنشأ لكل عنصر." +- icon: "🎯" + title: "أسلوب إمراطي" + desc: "استخدم الحلقات والشروط مباشرةً." +- icon: "📐" + title: "مرن" + desc: "أصدر صفراً أو واحداً أو عناصر كثيرة بتحكم كامل." +support: + description: "متاح على نطاق واسع منذ JDK 16 (مارس 2021)" diff --git a/translations/content/ar/streams/stream-of-nullable.yaml b/translations/content/ar/streams/stream-of-nullable.yaml new file mode 100644 index 0000000..5d7f7b4 --- /dev/null +++ b/translations/content/ar/streams/stream-of-nullable.yaml @@ -0,0 +1,17 @@ +title: "Stream.ofNullable()" +oldApproach: "فحص null" +modernApproach: "ofNullable()" +summary: "أنشئ Stream بصفر أو عنصر واحد من قيمة قابلة للإلغاء." +explanation: "تُرجع Stream.ofNullable() Stream بعنصر واحد إذا كانت القيمة غير فارغة أو Stream فارغ إذا كانت null. يُزيل نمط الفحص الثلاثي للقيمة الفارغة." +whyModernWins: +- icon: "📏" + title: "موجز" + desc: "استدعاء واحد يستبدل الشرط الثلاثي." +- icon: "🔗" + title: "مناسب لـ flatMap" + desc: "مثالي داخل flatMap لتخطّي القيم الفارغة." +- icon: "🛡️" + title: "آمن من null" + desc: "لا خطر NPE — null يصبح Stream فارغاً." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/streams/stream-takewhile-dropwhile.yaml b/translations/content/ar/streams/stream-takewhile-dropwhile.yaml new file mode 100644 index 0000000..db06a7b --- /dev/null +++ b/translations/content/ar/streams/stream-takewhile-dropwhile.yaml @@ -0,0 +1,17 @@ +title: "Stream takeWhile / dropWhile" +oldApproach: "حلقة يدوية" +modernApproach: "takeWhile/dropWhile" +summary: "خذ أو أسقط عناصر من Stream بناءً على Predicate." +explanation: "تُرجع takeWhile() العناصر طالما Predicate صحيح وتتوقف عند أول خطأ. تتخطّى dropWhile() العناصر طالما صحيح وتُرجع البقية. كلتاهما تعملان بشكل أفضل على Streams المرتّبة." +whyModernWins: +- icon: "🎯" + title: "دارة قصيرة" + desc: "تتوقف المعالجة فور فشل Predicate." +- icon: "🔗" + title: "مناسب لخطوط الأنابيب" + desc: "يتسلسل مع عمليات Stream الأخرى بشكل طبيعي." +- icon: "📖" + title: "تصريحي" + desc: "takeWhile يُقرأ كاللغة الطبيعية: 'خذ طالما أقل من 100'." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/streams/stream-tolist.yaml b/translations/content/ar/streams/stream-tolist.yaml new file mode 100644 index 0000000..39bf97e --- /dev/null +++ b/translations/content/ar/streams/stream-tolist.yaml @@ -0,0 +1,17 @@ +title: "Stream.toList()" +oldApproach: "Collectors.toList()" +modernApproach: ".toList()" +summary: "يستبدل toList() النهائي collect(Collectors.toList()) المطوّل." +explanation: "تُرجع Stream.toList() قائمةً غير قابلة للتعديل. وهي مكافئة لـ .collect(Collectors.toUnmodifiableList()) لكن أقصر بكثير. ملاحظة: النتيجة غير قابلة للتعديل بخلاف Collectors.toList()." +whyModernWins: +- icon: "📏" + title: "7 أحرف مقابل 24" + desc: ".toList() تستبدل .collect(Collectors.toList())." +- icon: "🔒" + title: "ثابتة" + desc: "قائمة النتيجة لا يمكن تعديلها." +- icon: "📖" + title: "سائلة" + desc: "تُقرأ بشكل طبيعي في نهاية خط الأنابيب." +support: + description: "متاح على نطاق واسع منذ JDK 16 (مارس 2021)" diff --git a/translations/content/ar/streams/virtual-thread-executor.yaml b/translations/content/ar/streams/virtual-thread-executor.yaml new file mode 100644 index 0000000..700bb81 --- /dev/null +++ b/translations/content/ar/streams/virtual-thread-executor.yaml @@ -0,0 +1,17 @@ +title: "منفّذ الخيوط الافتراضية" +oldApproach: "مجمع خيوط ثابت" +modernApproach: "منفّذ الخيوط الافتراضية" +summary: "استخدم منفّذات الخيوط الافتراضية للتزامن الخفيف غير المحدود." +explanation: "ينشئ منفّذ الخيوط الافتراضية خيطاً افتراضياً جديداً لكل مهمة. لا حاجة لضبط حجم المجمع — الخيوط الافتراضية رخيصة بما يكفي لإنشاء الملايين منها." +whyModernWins: +- icon: "♾️" + title: "لا حجم" + desc: "لا حجم مجمع لضبطه — أنشئ خيوطاً بقدر الحاجة." +- icon: "⚡" + title: "خفيف الوزن" + desc: "الخيوط الافتراضية تستخدم كيلوبايتات لا ميغابايتات." +- icon: "🧹" + title: "قابل للإغلاق التلقائي" + desc: "try-with-resources يتعامل مع الإيقاف تلقائياً." +support: + description: "متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)" diff --git a/translations/content/ar/strings/string-chars-stream.yaml b/translations/content/ar/strings/string-chars-stream.yaml new file mode 100644 index 0000000..750d9e2 --- /dev/null +++ b/translations/content/ar/strings/string-chars-stream.yaml @@ -0,0 +1,17 @@ +title: "أحرف السلسلة كـ Stream" +oldApproach: "حلقة يدوية" +modernApproach: "تدفق chars()" +summary: "عالج أحرف السلاسل كخط أنابيب Stream." +explanation: "تُرجع String.chars() تدفق IntStream من قيم الأحرف مما يُتيح المعالجة الوظيفية. لدعم Unicode تتعامل codePoints() مع الأحرف التكميلية بشكل صحيح." +whyModernWins: +- icon: "🔗" + title: "قابل للتسلسل" + desc: "استخدم filter و map و collect على تدفقات الأحرف." +- icon: "📐" + title: "تصريحي" + desc: "صِف ما تريد فعله لا كيفية التكرار." +- icon: "🌐" + title: "جاهز لـ Unicode" + desc: "codePoints() يتعامل بشكل صحيح مع الرموز التعبيرية والأحرف التكميلية." +support: + description: "متاح منذ JDK 8+ (محسَّن في 9+)" diff --git a/translations/content/ar/strings/string-formatted.yaml b/translations/content/ar/strings/string-formatted.yaml new file mode 100644 index 0000000..b8900af --- /dev/null +++ b/translations/content/ar/strings/string-formatted.yaml @@ -0,0 +1,17 @@ +title: "String.formatted()" +oldApproach: "String.format()" +modernApproach: "formatted()" +summary: "استدعِ formatted() على سلسلة القالب نفسها." +explanation: "String.formatted() دالة مثيل مكافئة لـ String.format() لكن تُستدعى على سلسلة التنسيق. تُقرأ بشكل أكثر طبيعيةً في التدفق من اليسار إلى اليمين." +whyModernWins: +- icon: "📖" + title: "يُقرأ بشكل طبيعي" + desc: "قالب.formatted(وسائط) يتدفق أفضل من String.format(قالب، وسائط)." +- icon: "🔗" + title: "قابل للتسلسل" + desc: "يمكن تسلسله مع دوال السلسلة الأخرى." +- icon: "📏" + title: "أقل تعقيداً" + desc: "يُسقط استدعاء String.format() الثابت الزائد." +support: + description: "متاح على نطاق واسع منذ JDK 15 (سبتمبر 2020)" diff --git a/translations/content/ar/strings/string-indent-transform.yaml b/translations/content/ar/strings/string-indent-transform.yaml new file mode 100644 index 0000000..83eda45 --- /dev/null +++ b/translations/content/ar/strings/string-indent-transform.yaml @@ -0,0 +1,17 @@ +title: "String.indent() و transform()" +oldApproach: "مسافات بادئة يدوية" +modernApproach: "indent() / transform()" +summary: "أضف مسافات بادئة للنص وسلسل تحويلات السلاسل بشكل سائل." +explanation: "تضيف indent(n) مسافات n لكل سطر. تُطبّق transform(fn) أي دالة وتُرجع النتيجة مما يُتيح تسلسل عمليات السلاسل بشكل سائل." +whyModernWins: +- icon: "📏" + title: "مدمجة" + desc: "المسافات البادئة عملية شائعة — الآن في استدعاء واحد." +- icon: "🔗" + title: "قابل للتسلسل" + desc: "transform() يُتيح خطوط أنابيب سائلة على السلاسل." +- icon: "🧹" + title: "كود نظيف" + desc: "لا تقطيع أسطر يدوي ولا حلقات StringBuilder." +support: + description: "متاح على نطاق واسع منذ JDK 12 (مارس 2019)" diff --git a/translations/content/ar/strings/string-isblank.yaml b/translations/content/ar/strings/string-isblank.yaml new file mode 100644 index 0000000..a636ad5 --- /dev/null +++ b/translations/content/ar/strings/string-isblank.yaml @@ -0,0 +1,17 @@ +title: "String.isBlank()" +oldApproach: "trim().isEmpty()" +modernApproach: "isBlank()" +summary: "تحقق من السلاسل الفارغة باستدعاء دالة واحدة." +explanation: "تُرجع isBlank() القيمة true إذا كانت السلسلة فارغةً أو تحتوي مسافات بيضاء فقط بما فيها مسافات Unicode التي تُفوِّتها trim()." +whyModernWins: +- icon: "📖" + title: "موثّقة ذاتياً" + desc: "isBlank() تقول بالضبط ما تتحقق منه." +- icon: "🌐" + title: "واعية بـ Unicode" + desc: "تتعامل مع جميع مسافات Unicode لا ASCII فقط." +- icon: "⚡" + title: "لا تخصيص" + desc: "لا سلسلة وسيطة مُقلَّصة تُنشأ." +support: + description: "متاح على نطاق واسع منذ JDK 11 (سبتمبر 2018)" diff --git a/translations/content/ar/strings/string-lines.yaml b/translations/content/ar/strings/string-lines.yaml new file mode 100644 index 0000000..0d199e6 --- /dev/null +++ b/translations/content/ar/strings/string-lines.yaml @@ -0,0 +1,17 @@ +title: "String.lines() لتقسيم الأسطر" +oldApproach: "split(\"\\\\n\")" +modernApproach: "lines()" +summary: "استخدم String.lines() لتقسيم النص إلى Stream من الأسطر دون تكلفة regex." +explanation: "تُرجع String.lines() تدفق Stream من الأسطر مُقسَّمة بـ \\n أو \\r أو \\r\\n. أكثر كسلاً وكفاءةً من split() وتتجنّب تجميع regex وتتكامل بشكل طبيعي مع Stream API." +whyModernWins: +- icon: "⚡" + title: "بث كسول" + desc: "الأسطر تُنتَج عند الطلب لا دفعةً واحدة كـ split()." +- icon: "🔧" + title: "نهايات أسطر عالمية" + desc: "تتعامل مع \\n و \\r و \\r\\n تلقائياً دون regex." +- icon: "🔗" + title: "تكامل Stream" + desc: "تُرجع Stream للاستخدام المباشر مع filter و map و collect." +support: + description: "متاح منذ JDK 11 (سبتمبر 2018)." diff --git a/translations/content/ar/strings/string-repeat.yaml b/translations/content/ar/strings/string-repeat.yaml new file mode 100644 index 0000000..fb33eb4 --- /dev/null +++ b/translations/content/ar/strings/string-repeat.yaml @@ -0,0 +1,17 @@ +title: "String.repeat()" +oldApproach: "حلقة StringBuilder" +modernApproach: "repeat()" +summary: "كرّر سلسلةً n مرة دون حلقة." +explanation: "تُرجع String.repeat(int) السلسلة مُدمَجةً مع نفسها n مرات. تتعامل مع الحالات الطرفية: repeat(0) تُرجع سلسلةً فارغة و repeat(1) تُرجع السلسلة نفسها." +whyModernWins: +- icon: "📏" + title: "سطر واحد" + desc: "استبدل 5 أسطر من كود StringBuilder باستدعاء واحد." +- icon: "⚡" + title: "مُحسَّنة" + desc: "التطبيق الداخلي مُحسَّن للتكرارات الكبيرة." +- icon: "📖" + title: "نية واضحة" + desc: "repeat(3) ينقل الغرض فوراً." +support: + description: "متاح على نطاق واسع منذ JDK 11 (سبتمبر 2018)" diff --git a/translations/content/ar/strings/string-strip.yaml b/translations/content/ar/strings/string-strip.yaml new file mode 100644 index 0000000..4511c3a --- /dev/null +++ b/translations/content/ar/strings/string-strip.yaml @@ -0,0 +1,17 @@ +title: "String.strip() مقابل trim()" +oldApproach: "trim()" +modernApproach: "strip()" +summary: "استخدم التجريد الواعي بـ Unicode بـ strip() و stripLeading() و stripTrailing()." +explanation: "تُزيل trim() فقط الأحرف ≤ U+0020 (أحرف التحكم ASCII والمسافة). تستخدم strip() الدالة Character.isWhitespace() التي تتعامل مع مسافات Unicode مثل المسافة غير الفاصلة والمسافة الأيديوغرافية وغيرها." +whyModernWins: +- icon: "🌐" + title: "صحيحة من حيث Unicode" + desc: "تتعامل مع جميع أحرف المسافة البيضاء من كل كتابة." +- icon: "🎯" + title: "اتجاهية" + desc: "stripLeading() و stripTrailing() للتجريد من جهة واحدة." +- icon: "🛡️" + title: "أقل أخطاءً" + desc: "لا مسافات بيضاء مفاجئة في النصوص الدولية." +support: + description: "متاح على نطاق واسع منذ JDK 11 (سبتمبر 2018)" diff --git a/translations/content/ar/tooling/aot-class-preloading.yaml b/translations/content/ar/tooling/aot-class-preloading.yaml new file mode 100644 index 0000000..dbc162b --- /dev/null +++ b/translations/content/ar/tooling/aot-class-preloading.yaml @@ -0,0 +1,17 @@ +title: "التحميل المسبق للفئات بـ AOT" +oldApproach: "بدء بارد في كل مرة" +modernApproach: "ذاكرة تخزين AOT" +summary: "خزّن تحميل الفئات والترجمة مؤقتاً للبدء الفوري." +explanation: "يُخزّن التحميل المسبق للفئات بـ AOT الفئات المحمَّلة والمرتبطة من تشغيل تدريبي مؤقتاً. في عمليات البدء اللاحقة تُحمَّل الفئات من الذاكرة المؤقتة متجاوزةً التحقق والربط. مع ترجمة AOT يُقلّص هذا وقت البدء بشكل كبير." +whyModernWins: +- icon: "⚡" + title: "بدء أسرع" + desc: "تخطّ تحميل الفئات والتحقق والربط." +- icon: "📦" + title: "حالة مخزّنة" + desc: "التشغيل التدريبي يلتقط الحالة المثلى للفئات." +- icon: "🔧" + title: "لا تغييرات في الكود" + desc: "يعمل مع التطبيقات الموجودة — فقط أضف علامات JVM." +support: + description: "متاح كميزة قياسية في JDK 25 LTS (JEPs 514/515، سبتمبر 2025)." diff --git a/translations/content/ar/tooling/built-in-http-server.yaml b/translations/content/ar/tooling/built-in-http-server.yaml new file mode 100644 index 0000000..a3f6883 --- /dev/null +++ b/translations/content/ar/tooling/built-in-http-server.yaml @@ -0,0 +1,17 @@ +title: "خادم HTTP مدمج" +oldApproach: "خادم/إطار خارجي" +modernApproach: "أداة jwebserver CLI" +summary: "يتضمّن Java 18 خادم HTTP ملفات بسيطاً مدمجاً للنماذج الأولية وتقديم الملفات." +explanation: "أضاف JDK 18 خادم ملفات HTTP بسيطاً صفري التبعيات يمكن الوصول إليه عبر أداة سطر الأوامر jwebserver أو SimpleFileServer API. يُقدّم الملفات الثابتة من مجلد محدد دون أي تهيئة. أداة CLI مثالية للنماذج الأولية السريعة والاختبار ومشاركة الملفات." +whyModernWins: +- icon: "🚀" + title: "إعداد صفري" + desc: "شغّل jwebserver في أي مجلد — لا تثبيت ولا تهيئة ولا تبعيات." +- icon: "📦" + title: "مدمج في JDK" + desc: "يُشحَن مع كل تثبيت JDK 18+، متاح دائماً على أي جهاز به Java." +- icon: "🧪" + title: "رائع للنماذج الأولية" + desc: "قدّم الملفات الثابتة فوراً لاختبار HTML أو APIs أو تطوير الواجهة الأمامية." +support: + description: "متاح منذ JDK 18 (مارس 2022)" diff --git a/translations/content/ar/tooling/compact-object-headers.yaml b/translations/content/ar/tooling/compact-object-headers.yaml new file mode 100644 index 0000000..fbe4146 --- /dev/null +++ b/translations/content/ar/tooling/compact-object-headers.yaml @@ -0,0 +1,17 @@ +title: "رؤوس الكائنات المضغوطة" +oldApproach: "رؤوس 128 بت" +modernApproach: "رؤوس 64 بت" +summary: "قلّص حجم رأس الكائن إلى النصف لكثافة ذاكرة وكفاءة ذاكرة تخزين مؤقت أفضل." +explanation: "تُقلّص رؤوس الكائنات المضغوطة الحمل الزائد لكل كائن من 128 بتاً إلى 64 بتاً على منصات 64 بت. هذا يوفّر الذاكرة ويُحسّن استخدام ذاكرة التخزين المؤقت خاصةً للتطبيقات ذات الكائنات الصغيرة الكثيرة." +whyModernWins: +- icon: "📦" + title: "رؤوس أصغر بـ 50%" + desc: "8 بايت بدلاً من 16 لكل كائن." +- icon: "⚡" + title: "استخدام أفضل لذاكرة التخزين المؤقت" + desc: "المزيد من الكائنات تتسع في أسطر ذاكرة التخزين المؤقت للمعالج." +- icon: "📊" + title: "كثافة أعلى" + desc: "تسع المزيد من الكائنات في نفس حجم الكومة." +support: + description: "أُنهيت في JDK 25 LTS (JEP 519، سبتمبر 2025)." diff --git a/translations/content/ar/tooling/jfr-profiling.yaml b/translations/content/ar/tooling/jfr-profiling.yaml new file mode 100644 index 0000000..762611b --- /dev/null +++ b/translations/content/ar/tooling/jfr-profiling.yaml @@ -0,0 +1,17 @@ +title: "JFR للتنميط" +oldApproach: "مُنمِّط خارجي" +modernApproach: "Java Flight Recorder" +summary: "نمّط أي تطبيق Java بـ Flight Recorder المدمج — لا أدوات خارجية." +explanation: "Java Flight Recorder (JFR) أداة تنميط منخفضة الحمل مدمجة في JVM. تلتقط أحداثاً لـ CPU والذاكرة وGC وI/O والخيوط والأحداث المخصصة بتأثير أداء ضئيل (~1%)." +whyModernWins: +- icon: "🆓" + title: "مدمج" + desc: "لا مُنمِّط خارجي للتثبيت أو الترخيص." +- icon: "⚡" + title: "حمل منخفض" + desc: "~1% تأثير أداء — آمن للإنتاج." +- icon: "📊" + title: "أحداث غنية" + desc: "CPU والذاكرة وGC والخيوط وI/O والأقفال والأحداث المخصصة." +support: + description: "متاح على نطاق واسع منذ JDK 9/11 (مفتوح المصدر في 11)" diff --git a/translations/content/ar/tooling/jshell-prototyping.yaml b/translations/content/ar/tooling/jshell-prototyping.yaml new file mode 100644 index 0000000..69c3051 --- /dev/null +++ b/translations/content/ar/tooling/jshell-prototyping.yaml @@ -0,0 +1,17 @@ +title: "JShell للنماذج الأولية" +oldApproach: "إنشاء ملف + ترجمة + تشغيل" +modernApproach: "REPL لـ jshell" +summary: "جرّب تعبيرات Java بشكل تفاعلي دون إنشاء ملفات." +explanation: "JShell حلقة Read-Eval-Print لـ Java. اختبر التعبيرات وجرّب الواجهات البرمجية وصمّم النماذج الأولية دون إنشاء ملفات أو ترجمة أو كتابة دالة main. إكمال بالتبويب ووثائق مضمّنة متاحة." +whyModernWins: +- icon: "⚡" + title: "ردود فعل فورية" + desc: "اكتب تعبيراً واستقبل النتيجة فوراً." +- icon: "📝" + title: "لا ملفات مطلوبة" + desc: "لا ملفات .java ولا خطوة ترجمة." +- icon: "🔍" + title: "استكشاف الواجهة البرمجية" + desc: "إكمال التبويب يساعد في اكتشاف الدوال والمعاملات." +support: + description: "متاح على نطاق واسع منذ JDK 9 (سبتمبر 2017)" diff --git a/translations/content/ar/tooling/junit6-with-jspecify.yaml b/translations/content/ar/tooling/junit6-with-jspecify.yaml new file mode 100644 index 0000000..94c9a53 --- /dev/null +++ b/translations/content/ar/tooling/junit6-with-jspecify.yaml @@ -0,0 +1,17 @@ +title: "JUnit 6 مع أمان null في JSpecify" +oldApproach: "واجهة برمجية غير مُعلَّقة" +modernApproach: "واجهة برمجية مُعلَّقة بـ @NullMarked" +summary: "يعتمد JUnit 6 تعليقات JSpecify @NullMarked مما يجعل عقود null صريحةً عبر واجهة التأكيدات." +explanation: "شُحِن JUnit 5 دون تعليقات قابلية الإلغاء القياسية تاركاً المطوّرين يخمّنون هل معاملات التأكيدات أو القيم المُرجَعة يمكن أن تكون null. يعتمد JUnit 6 JSpecify عبر وحدته بأكملها: التعليق @NullMarked يجعل جميع الأنواع غير المُعلَّقة non-null بشكل افتراضي، و@Nullable يُعلّم الاستثناءات. تُعلّق فئة Assertions صراحةً معاملات مثل assertNull(@Nullable Object actual) وfail(@Nullable String message)." +whyModernWins: +- icon: "📜" + title: "عقود صريحة" + desc: "@NullMarked على وحدة JUnit 6 يوثّق دلالات null مباشرةً في الواجهة البرمجية — لا قراءة مصدر مطلوبة." +- icon: "🛡️" + title: "أمان وقت الترجمة" + desc: "IDEs والمحللات تُحذّر عند تمرير null حيث يُتوقع non-null مما يكشف الأخطاء قبل تشغيل الاختبارات." +- icon: "🌐" + title: "معيار النظام البيئي" + desc: "JSpecify تعتمده Spring و Guava وغيرهم — دلالات null متّسقة عبر مكدسك بالكامل." +support: + description: "متاح منذ JUnit 6.0 (أكتوبر 2025، يتطلب Java 17+)" diff --git a/translations/content/ar/tooling/multi-file-source.yaml b/translations/content/ar/tooling/multi-file-source.yaml new file mode 100644 index 0000000..85649f7 --- /dev/null +++ b/translations/content/ar/tooling/multi-file-source.yaml @@ -0,0 +1,17 @@ +title: "مُشغّل مصدر متعدد الملفات" +oldApproach: "ترجمة الكل أولاً" +modernApproach: "مُشغّل المصدر" +summary: "شغّل برامج متعددة الملفات دون خطوة ترجمة صريحة." +explanation: "يمكن لـ Java 22+ ترجمة ملفات المصدر المُشار إليها تلقائياً عند الإطلاق من ملف .java. هذا يجعل برامج متعددة الملفات الصغيرة بنفس سهولة تشغيل السكريبتات دون الحاجة لـ Maven أو Gradle." +whyModernWins: +- icon: "🚀" + title: "إعداد صفري" + desc: "لا أداة بناء مطلوبة للبرامج متعددة الملفات الصغيرة." +- icon: "🔗" + title: "حلّ تلقائي" + desc: "الفئات المُشار إليها تُوجَد وتُرجَم تلقائياً." +- icon: "📝" + title: "شبيه بالسكريبت" + desc: "شغّل برامج متعددة الملفات كسكريبتات." +support: + description: "متاح منذ JDK 22 (مارس 2024)" diff --git a/translations/content/ar/tooling/single-file-execution.yaml b/translations/content/ar/tooling/single-file-execution.yaml new file mode 100644 index 0000000..5628a72 --- /dev/null +++ b/translations/content/ar/tooling/single-file-execution.yaml @@ -0,0 +1,17 @@ +title: "تنفيذ ملف واحد" +oldApproach: "ترجمة خطوتين" +modernApproach: "إطلاق مباشر" +summary: "شغّل برامج Java أحادية الملف مباشرةً دون javac." +explanation: "يمكن لمُشغّل Java ترجمة ملف مصدر واحد وتشغيله في أمر واحد. مع دعم shebang على Unix يمكن أن تعمل ملفات Java كسكريبتات. لا خطوة ترجمة منفصلة مطلوبة." +whyModernWins: +- icon: "⚡" + title: "أمر واحد" + desc: "java File.java تُرجم وتشغّل في خطوة واحدة." +- icon: "📝" + title: "شبيه بالسكريبت" + desc: "أضف سطر shebang لجعل ملفات .java سكريبتات قابلة للتنفيذ." +- icon: "🎓" + title: "صديق للتعلّم" + desc: "يشغّل القادمون الجدد الكود فوراً دون تعلّم أدوات البناء." +support: + description: "متاح على نطاق واسع منذ JDK 11 (سبتمبر 2018)" diff --git a/translations/strings/ar.yaml b/translations/strings/ar.yaml new file mode 100644 index 0000000..0e3893f --- /dev/null +++ b/translations/strings/ar.yaml @@ -0,0 +1,80 @@ +site: + tagline: "تطوّرت Java. يمكن لكودك ذلك أيضاً." + tagline_line1: "تطوّرت Java." + tagline_line2: "يمكن لكودك ذلك أيضاً." + description: "مجموعة من مقاطع كود Java الحديثة. كل نمط قديم بجانب بديله الحديث والنظيف — جنباً إلى جنب." + heroSnippetCount: "✦ {{snippetCount}} نمطاً حديثاً · Java 8 ← Java 25" + heroOld: قديم + heroModern: حديث + allComparisons: جميع المقارنات + snippetsBadge: "{{snippetCount}} مقتطفاً" +nav: + allPatterns: "→ جميع الأنماط" + toggleTheme: تبديل المظهر + viewOnGitHub: عرض على GitHub + selectLanguage: اختر اللغة +breadcrumb: + home: الرئيسية +sections: + codeComparison: مقارنة الكود + whyModernWins: لماذا يتفوق الأسلوب الحديث + oldApproach: الأسلوب القديم + modernApproach: الأسلوب الحديث + sinceJdk: "منذ JDK" + difficulty: الصعوبة + jdkSupport: دعم JDK + howItWorks: كيف يعمل + relatedDocs: توثيق ذو صلة + relatedPatterns: أنماط ذات صلة +filters: + show: "عرض:" + all: الكل +difficulty: + beginner: مبتدئ + intermediate: متوسط + advanced: متقدم +search: + placeholder: "البحث في المقتطفات…" + noResults: لم يتم العثور على نتائج. + esc: ESC + searchTrigger: "بحث…" + navigate: تنقل + open: فتح + close: إغلاق +cards: + old: قديم + modern: حديث + hoverHint: "مرر للرؤية الحديث ←" + hoverHintRelated: "مرر للرؤية الحديث ←" + touchHint: "👆 انقر أو اسحب ←" +copy: + copy: نسخ + copied: "تم النسخ!" +share: + label: مشاركة +view: + expandAll: توسيع الكل + collapseAll: طي الكل +stats: + modernPatterns: الأنماط الحديثة + jdkVersions: إصدارات JDK المشمولة + categories: الفئات + linesOfPython: أسطر Python المطلوبة +footer: + tagline: "تطوّرت Java. يمكن لكودك ذلك أيضاً." + madeWith: "صُنع بـ ❤️ بواسطة" + and: و + inspiredBy: مستوحى من + viewOnGitHub: عرض على GitHub +copilot: + headline: "حدّث قاعدة كود Java الخاصة بك مع GitHub Copilot." + description: "دع Copilot يساعدك في ترحيل الأنماط القديمة إلى Java الحديثة — تلقائياً." + appModernization: "تحديث التطبيقات ←" + javaGuide: "دليل Java ←" +support: + available: متاح + preview: معاينة + experimental: تجريبي +untranslated: + notice: "هذه الصفحة لم تُترجم بعد إلى {{localeName}}." + viewInEnglish: عرض بالإنجليزية