diff --git a/translations/content/ar/collections/copying-collections-immutably.yaml b/translations/content/ar/collections/copying-collections-immutably.yaml
index a85704f..78391c7 100644
--- a/translations/content/ar/collections/copying-collections-immutably.yaml
+++ b/translations/content/ar/collections/copying-collections-immutably.yaml
@@ -11,7 +11,7 @@ whyModernWins:
title: "استدعاء واحد"
desc: "لا حاجة لإنشاء ArrayList يدوياً ثم تغليفه."
- icon: "🛡️"
- title: "نسخة دفاعية"
- desc: "التغييرات في المصدر لا تؤثر على النسخة."
+ title: "أي مجموعة"
+ desc: "يقبل أي Collection كمدخل، دون الحاجة إلى تحويل ArrayList وسيط."
support:
description: "متاح على نطاق واسع منذ JDK 10 (مارس 2018)"
diff --git a/translations/content/ar/collections/stream-toarray-typed.yaml b/translations/content/ar/collections/stream-toarray-typed.yaml
index 73abc19..6bf32c8 100644
--- a/translations/content/ar/collections/stream-toarray-typed.yaml
+++ b/translations/content/ar/collections/stream-toarray-typed.yaml
@@ -1,5 +1,5 @@
title: "تحويل Stream إلى مصفوفة محدّدة النوع"
-oldApproach: "نسخ المصفوفة يدوياً"
+oldApproach: "تصفية يدوية + نسخ"
modernApproach: "toArray(generator)"
summary: "حوّل Stream إلى مصفوفة محدّدة النوع باستخدام مرجع دالة."
explanation: "تُنشئ الدالة toArray(IntFunction) مصفوفةً محدّدة النوع من Stream. يُخبر المولّد (String[]::new) التدفقَ بنوع المصفوفة المراد إنشاؤها."
diff --git a/translations/content/ar/language/call-c-from-java.yaml b/translations/content/ar/language/call-c-from-java.yaml
new file mode 100644
index 0000000..39f9fc5
--- /dev/null
+++ b/translations/content/ar/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: "استدعاء كود C من Java"
+oldApproach: "JNI (واجهة Java الأصيلة)"
+modernApproach: "FFM (واجهة برمجة الدوال الخارجية والذاكرة)"
+summary: "تتيح FFM لـ Java استدعاء مكتبات C مباشرةً، دون الحاجة إلى كليشيهات JNI أو معرفة Java على جانب C."
+explanation: "تمتلك Java نهجين لاستدعاء كود C/C++ الأصيل: JNI التقليدي وواجهة FFM الحديثة. مع JNI، تُعلن عن الدالة بوصفها native، ثم تُشغّل javac -h لتوليد ملف ترويسة C، وتُنفّذ الدالة باستخدام JNI C API المعقّدة (JNIEnv وjstring وما إلى ذلك). تُزيل FFM المُقدَّمة كواجهة برمجة قياسية في Java 22 كل ذلك: كود C يبقى C عادياً — دون الحاجة لاتفاقيات JNI. هذا يُسهّل استدعاء مكتبات C/C++ الموجودة دون تعديل. يستخدم الجانب Java كائن Arena لإدارة الذاكرة خارج الكومة بأمان، وMethodHandle للاستدعاء النازل، مما يضمن المرونة والأمان."
+whyModernWins:
+- icon: "👁"
+ title: "كود C يبقى C نقياً"
+ desc: "لا تحتاج دالة C إلى تعليقات JNI أو كليشيهات JNIEnv — يمكن استدعاء أي مكتبة C موجودة مباشرةً."
+- icon: "⚡"
+ title: "أكثر مرونة"
+ desc: "استدعِ معظم مكتبات C/C++ الموجودة مباشرةً دون كتابة كود محوّل أو توليد ملفات ترويسة."
+- icon: "🛠️"
+ title: "سير عمل أسهل"
+ desc: "لا حاجة للتوقف وتشغيل javac -h وتنفيذ الواجهة المُعرَّفة في ملف .h المُوَلَّد."
+support:
+ description: "تم توحيده في JDK 22 (مارس 2024)؛ كان في مرحلة الحضانة منذ JDK 14"
diff --git a/translations/content/bn/collections/collectors-teeing.yaml b/translations/content/bn/collections/collectors-teeing.yaml
new file mode 100644
index 0000000..349821e
--- /dev/null
+++ b/translations/content/bn/collections/collectors-teeing.yaml
@@ -0,0 +1,18 @@
+---
+title: Collectors.teeing()
+oldApproach: দুটি ধাপে
+modernApproach: teeing()
+summary: একবার স্ট্রিম ট্রাভার্স করেই দুটি আলাদা এগ্রিগেশন (সমষ্টি) বের করুন।
+explanation: Collectors.teeing() স্ট্রিমের প্রতিটি উপাদানকে দুটি আলাদা ডাউনস্ট্রিম কালেক্টরে পাঠায় এবং তাদের ফলাফলগুলোকে মার্জ বা একত্রিত করে। এর ফলে একই ডেটা দুইবার স্ট্রিম করতে হয় না এবং মিউটেবল (পরিবর্তনশীল) অ্যাকুমুলেটর ব্যবহারের প্রয়োজন পড়ে না।
+whyModernWins:
+- icon: "⚡"
+ title: সিঙ্গেল পাস
+ desc: দুইবারের বদলে স্ট্রিমটি মাত্র একবারই প্রসেস করা যায়।
+- icon: "🧩"
+ title: কম্পোজেবল
+ desc: যেকোনো দুটি কালেক্টরকে একটি মার্জার ফাংশন দিয়ে সহজেই যুক্ত করা যায়।
+- icon: "🔒"
+ title: ইমিউটেবল ফলাফল
+ desc: সরাসরি কোনো রেকর্ড (record) বা ভ্যালু অবজেক্টে মার্জ করা যায়।
+support:
+ description: JDK 12 (মার্চ 2019) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/collections/copying-collections-immutably.yaml b/translations/content/bn/collections/copying-collections-immutably.yaml
new file mode 100644
index 0000000..9598cc9
--- /dev/null
+++ b/translations/content/bn/collections/copying-collections-immutably.yaml
@@ -0,0 +1,18 @@
+---
+title: কালেকশনকে ইমিউটেবল (অপরিবর্তনীয়) ভাবে কপি করা
+oldApproach: ম্যানুয়াল কপি + র্যাপ
+modernApproach: List.copyOf()
+summary: যেকোনো কালেকশনের একটি ইমিউটেবল কপি এক কল (call)-এই তৈরি করুন।
+explanation: List.copyOf(), Set.copyOf(), এবং Map.copyOf() বিদ্যমান কালেকশনগুলোর ইমিউটেবল স্ন্যাপশট তৈরি করে। যদি সোর্স কালেকশনটি ইতিমধ্যেই ইমিউটেবল হয়, তবে কোনো নতুন কপি তৈরি করা হয় না।
+whyModernWins:
+- icon: "⚡"
+ title: স্মার্ট কপি
+ desc: সোর্স কালেকশনটি ইমিউটেবল হলে, নতুন করে কপি করার প্রয়োজন হয় না।
+- icon: "📏"
+ title: এক কলে কাজ শেষ
+ desc: ম্যানুয়াল ArrayList তৈরি বা র্যাপ করার দরকার নেই।
+- icon: "🛡️"
+ title: যেকোনো Collection
+ desc: যেকোনো Collection ইনপুট হিসেবে গ্রহণ করে—মধ্যবর্তী ArrayList রূপান্তরের দরকার নেই।
+support:
+ description: JDK 10 (মার্চ 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/collections/immutable-list-creation.yaml b/translations/content/bn/collections/immutable-list-creation.yaml
new file mode 100644
index 0000000..c2750e0
--- /dev/null
+++ b/translations/content/bn/collections/immutable-list-creation.yaml
@@ -0,0 +1,18 @@
+---
+title: ইমিউটেবল (Immutable) লিস্ট তৈরি
+oldApproach: ভার্বোস র্যাপিং
+modernApproach: List.of()
+summary: একটি পরিষ্কার এক্সপ্রেশন ব্যবহার করে ইমিউটেবল লিস্ট তৈরি করুন।
+explanation: List.of() একটি সত্যিকারের ইমিউটেবল লিস্ট তৈরি করে - এখানে কোনো র্যাপিং বা ডিফেন্সিভ কপির প্রয়োজন হয় না। এটি null-হোস্টাইল (অর্থাৎ null এলিমেন্ট গ্রহণ করে না) এবং কাঠামোগতভাবেও ইমিউটেবল। পুরোনো পদ্ধতিতে তিনটি নেস্টেড কল ব্যবহার করতে হতো।
+whyModernWins:
+- icon: "📏"
+ title: এক কলেই
+ desc: তিনটি নেস্টেড কলকে একটি মাত্র ফ্যাক্টরি মেথড দিয়ে প্রতিস্থাপন করা যায়।
+- icon: "🔒"
+ title: সত্যিকারের ইমিউটেবল
+ desc: এটি কেবল একটি র্যাপার নয় – লিস্টটি নিজেই ইমিউটেবল।
+- icon: "🛡️"
+ title: null-সেফ
+ desc: তৈরির সময়ই null এলিমেন্ট থাকলে তা প্রত্যাখ্যান করে, ফলে দ্রুত ত্রুটি ধরা পড়ে (failing fast)।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/collections/immutable-map-creation.yaml b/translations/content/bn/collections/immutable-map-creation.yaml
new file mode 100644
index 0000000..7ddf5fe
--- /dev/null
+++ b/translations/content/bn/collections/immutable-map-creation.yaml
@@ -0,0 +1,18 @@
+---
+title: ইমিউটেবল (Immutable) ম্যাপ তৈরি
+oldApproach: ম্যাপ বিল্ডার প্যাটার্ন
+modernApproach: Map.of()
+summary: কোনো বিল্ডার ছাড়াই ইনলাইন (inline) ম্যাপ তৈরি করুন যা ইমিউটেবল।
+explanation: Map.of() সরাসরি কী-ভ্যালু পেয়ার (key-value pairs) গ্রহণ করে একটি ইমিউটেবল ম্যাপ তৈরি করে। যদি 10টির বেশি এন্ট্রি থাকে, তাহলে Map.entry() পেয়ার সহ Map.ofEntries() ব্যবহার করা উচিত।
+whyModernWins:
+- icon: "📏"
+ title: ইনলাইন তৈরি
+ desc: কোনো টেম্পোরারি মিউটেবল ম্যাপের প্রয়োজন নেই।
+- icon: "🔒"
+ title: ইমিউটেবল ফলাফল
+ desc: ম্যাপ তৈরির পর আর পরিবর্তন করা যাবে না।
+- icon: "🚫"
+ title: null কী/ভ্যালু নেই
+ desc: null এন্ট্রি সঙ্গে সঙ্গেই প্রত্যাখ্যান করা হয়।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/collections/immutable-set-creation.yaml b/translations/content/bn/collections/immutable-set-creation.yaml
new file mode 100644
index 0000000..c447cc6
--- /dev/null
+++ b/translations/content/bn/collections/immutable-set-creation.yaml
@@ -0,0 +1,18 @@
+---
+title: ইমিউটেবল (Immutable) সেট তৈরি
+oldApproach: ভার্বোস র্যাপিং
+modernApproach: Set.of()
+summary: একটি সিঙ্গেল ফ্যাক্টরি কল (factory call) ব্যবহার করে ইমিউটেবল সেট তৈরি করুন।
+explanation: Set.of() একটি সত্যিকারের ইমিউটেবল সেট তৈরি করে, যা সেট তৈরির সময়ই null এবং ডুপ্লিকেট এলিমেন্ট (duplicate elements) গ্রহণ করে না। মিউটেবল সেটকে আর র্যাপ করার প্রয়োজন নেই।
+whyModernWins:
+- icon: "📏"
+ title: সুসংক্ষিপ্ত
+ desc: তিনটি নেস্টেড কলের পরিবর্তে একটি মাত্র লাইন ব্যবহার করুন।
+- icon: "🚫"
+ title: ডুপ্লিকেট সনাক্ত করে
+ desc: ভুলবশত ডুপ্লিকেট এলিমেন্ট দিলে এরর (error) দেবে।
+- icon: "🔒"
+ title: ইমিউটেবল
+ desc: সেট তৈরির পর আর যোগ বা অপসারণ (add/remove) করা সম্ভব নয়।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/collections/map-entry-factory.yaml b/translations/content/bn/collections/map-entry-factory.yaml
new file mode 100644
index 0000000..24a4627
--- /dev/null
+++ b/translations/content/bn/collections/map-entry-factory.yaml
@@ -0,0 +1,18 @@
+---
+title: Map.entry() ফ্যাক্টরি
+oldApproach: SimpleEntry
+modernApproach: Map.entry()
+summary: একটি পরিষ্কার ফ্যাক্টরি মেথড ব্যবহার করে ম্যাপ এন্ট্রি (map entries) তৈরি করুন।
+explanation: Map.entry() মেথডটি verbose AbstractMap.SimpleEntry কনস্ট্রাক্টরের (constructor) বিকল্প হিসাবে কাজ করে। এটি একটি ইমিউটেবল (immutable) এন্ট্রি রিটার্ন করে, যা Map.ofEntries() এবং স্ট্রিম অপারেশনগুলির জন্য খুবই উপযোগী।
+whyModernWins:
+- icon: "📏"
+ title: সুসংক্ষিপ্ত
+ desc: তিনটি লাইনের পরিবর্তে একটি মাত্র লাইন, যা এর উদ্দেশ্যকে আরও পরিষ্কার করে।
+- icon: "🔒"
+ title: ইমিউটেবল
+ desc: তৈরি করা এন্ট্রিটি পরিবর্তন করা যাবে না।
+- icon: "🧩"
+ title: কম্পোজেবল
+ desc: বড় ম্যাপ তৈরির জন্য Map.ofEntries() এর সাথে এটি দারুণভাবে কাজ করে।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/collections/reverse-list-iteration.yaml b/translations/content/bn/collections/reverse-list-iteration.yaml
new file mode 100644
index 0000000..797df01
--- /dev/null
+++ b/translations/content/bn/collections/reverse-list-iteration.yaml
@@ -0,0 +1,18 @@
+---
+title: লিস্টের আইটারেশন উল্টো দিক থেকে (Reverse List Iteration)
+oldApproach: ম্যানুয়াল ListIterator
+modernApproach: reversed()
+summary: একটি পরিষ্কার for-each লুপ ব্যবহার করে লিস্টের উপাদানগুলোকে উল্টো দিক থেকে আইটারেট করুন।
+explanation: SequencedCollection-এর reversed() মেথডটি লিস্টের একটি রিভার্স-অর্ডারড ভিউ (reverse-ordered view) প্রদান করে। এই ভিউটি মূল লিস্টের ওপর ভিত্তি করে তৈরি হয়, তাই কোনো কপি করা হয় না। উন্নত for লুপ সিনট্যাক্স (enhanced for loop syntax) ব্যবহার করে রিভার্স আইটারেশনকে ফরোয়ার্ড আইটারেশনের মতোই পঠনযোগ্য করে তোলে।
+whyModernWins:
+- icon: "📖"
+ title: স্বাভাবিক সিনট্যাক্স
+ desc: verbose ListIterator-এর পরিবর্তে সহজবোধ্য for-each লুপ ব্যবহার করা হয়।
+- icon: "⚡"
+ title: কোনো কপি হয় না
+ desc: reversed() একটি ভিউ রিটার্ন করে, তাই পারফরম্যান্সের ওপর কোনো অতিরিক্ত চাপ (overhead) পড়ে না।
+- icon: "🧩"
+ title: সামঞ্জস্যপূর্ণ API
+ desc: List, Deque, এবং SortedSet-এর মতো কালেকশনগুলোতে একইভাবে কাজ করে।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/collections/sequenced-collections.yaml b/translations/content/bn/collections/sequenced-collections.yaml
new file mode 100644
index 0000000..3d81774
--- /dev/null
+++ b/translations/content/bn/collections/sequenced-collections.yaml
@@ -0,0 +1,18 @@
+---
+title: সিকোয়েন্সড কালেকশন (Sequenced Collections)
+oldApproach: ইনডেক্স অ্যারিথমেটিক (Index Arithmetic)
+modernApproach: getFirst()/getLast()
+summary: পরিষ্কার API মেথড ব্যবহার করে লিস্টের প্রথম/শেষ এলিমেন্ট অ্যাক্সেস করা এবং রিভার্সড ভিউ (reversed view) তৈরি করা।
+explanation: SequencedCollection, List, Deque, SortedSet, এবং LinkedHashSet-এ getFirst(), getLast(), reversed(), addFirst(), addLast() মেথডগুলো যোগ করে। এর ফলে আর size-1 অ্যারিথমেটিক বা ম্যানুয়াল রিভার্স আইটারেশনের প্রয়োজন হয় না।
+whyModernWins:
+- icon: "📖"
+ title: স্ব-ডকুমেন্টিং
+ desc: getLast() মেথডটি get(size()-1) এর চেয়ে অনেক বেশি স্পষ্ট এবং পঠনযোগ্য।
+- icon: "🔄"
+ title: রিভার্সড ভিউ
+ desc: reversed() মেথড একটি ভিউ (view) রিটার্ন করে, তাই কোনো কপি করার প্রয়োজন হয় না।
+- icon: "🧩"
+ title: ইউনিফর্ম API
+ desc: List, Deque, এবং SortedSet-এর মতো কালেকশনগুলোতে একইভাবে কাজ করে।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/collections/stream-toarray-typed.yaml b/translations/content/bn/collections/stream-toarray-typed.yaml
new file mode 100644
index 0000000..c55d5b0
--- /dev/null
+++ b/translations/content/bn/collections/stream-toarray-typed.yaml
@@ -0,0 +1,18 @@
+---
+title: টাইপড স্ট্রিমকে অ্যারেতে রূপান্তর (Typed Stream toArray)
+oldApproach: ম্যানুয়াল ফিল্টার + কপি
+modernApproach: toArray(generator)
+summary: একটি মেথড রেফারেন্স (method reference) ব্যবহার করে স্ট্রিমকে টাইপড অ্যারেতে রূপান্তর করুন।
+explanation: toArray(IntFunction) মেথডটি একটি স্ট্রিম থেকে সঠিক টাইপের অ্যারে তৈরি করে। এখানে জেনারেটর (যেমন String[]::new) স্ট্রিমকে বলে দেয় কোন ধরনের অ্যারে তৈরি করতে হবে।
+whyModernWins:
+- icon: "🎯"
+ title: টাইপ-সেফ (Type-safe)
+ desc: কোনো Object[] কাস্ট করার প্রয়োজন হয় না – অ্যারের টাইপ সঠিক থাকে।
+- icon: "🔗"
+ title: চেইনেবল (Chainable)
+ desc: যেকোনো স্ট্রিম পাইপলাইনের শেষে এটি ব্যবহার করা যায়।
+- icon: "📏"
+ title: সুসংক্ষিপ্ত
+ desc: একটি এক্সপ্রেশন ব্যবহার করেই ম্যানুয়াল লুপের কাজ সম্পন্ন হয়।
+support:
+ description: JDK 8 (মার্চ 2014) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/collections/unmodifiable-collectors.yaml b/translations/content/bn/collections/unmodifiable-collectors.yaml
new file mode 100644
index 0000000..f30d614
--- /dev/null
+++ b/translations/content/bn/collections/unmodifiable-collectors.yaml
@@ -0,0 +1,18 @@
+---
+title: আনমডিফাইয়েবল কালেক্টর (Unmodifiable Collectors)
+oldApproach: collectingAndThen
+modernApproach: stream.toList()
+summary: stream.toList() ব্যবহার করে সরাসরি একটি আনমডিফাইয়েবল লিস্টে (unmodifiable list) ডেটা সংগ্রহ করুন।
+explanation: জাভা 10-এ toUnmodifiableList(), toUnmodifiableSet(), এবং toUnmodifiableMap() মেথডগুলো যোগ করা হয়েছিল, যা verbose collectingAndThen র্যাপারকে প্রতিস্থাপন করে। বিশেষ করে লিস্টের জন্য, জাভা 16-এর stream.toList() আরও সরল একটি বিকল্প প্রদান করে – এখানে collect() মেথড কল করারও প্রয়োজন নেই। অন্যান্য কালেকশন টাইপের জন্য toUnmodifiableSet() এবং toUnmodifiableMap() ব্যবহার করা উচিত।
+whyModernWins:
+- icon: "📏"
+ title: সবচেয়ে সংক্ষিপ্ত
+ desc: stream.toList()-এর জন্য collect() বা Collectors ইম্পোর্ট করার কোনো প্রয়োজনই নেই।
+- icon: "🔒"
+ title: ইমিউটেবল (Immutable)
+ desc: ফলাফলে কোনো পরিবর্তন আনা সম্ভব নয় – আকস্মিক মিউটেশনের (accidental mutations) ঝুঁকি নেই।
+- icon: "📖"
+ title: পঠনযোগ্য
+ desc: যেকোনো স্ট্রিম পাইপলাইনের টার্মিনাল ধাপ (terminal step) হিসেবে এটি স্বাভাবিকভাবেই পঠনযোগ্য।
+support:
+ description: JDK 16 (মার্চ 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/completablefuture-chaining.yaml b/translations/content/bn/concurrency/completablefuture-chaining.yaml
new file mode 100644
index 0000000..3c4d867
--- /dev/null
+++ b/translations/content/bn/concurrency/completablefuture-chaining.yaml
@@ -0,0 +1,18 @@
+---
+title: CompletableFuture চেইনিং (Chaining)
+oldApproach: ব্লকিং Future.get()
+modernApproach: CompletableFuture
+summary: CompletableFuture ব্যবহার করে কোনো ব্লক না করে অ্যাসিঙ্ক্রোনাস অপারেশনগুলিকে চেইন করুন।
+explanation: CompletableFuture নন-ব্লকিং অ্যাসিঙ্ক (async) পাইপলাইন তৈরি করতে সাহায্য করে। আপনি thenApply, thenCompose, thenAccept মেথডগুলো ব্যবহার করে অপারেশনগুলোকে চেইন করতে পারবেন। exceptionally() মেথড দিয়ে এরর (error) হ্যান্ডেল করা যায় এবং allOf/anyOf মেথড দিয়ে একাধিক ফিউচারকে একত্রিত করা যায়।
+whyModernWins:
+- icon: "🔗"
+ title: চেইনেবল (Chainable)
+ desc: অ্যাসিঙ্ক স্টেপগুলিকে একটি পঠনযোগ্য পাইপলাইনে সাজানো যায়।
+- icon: "🚫"
+ title: নন-ব্লকিং (Non-blocking)
+ desc: কোনো থ্রেড ফলাফলের জন্য অলসভাবে অপেক্ষা করে না।
+- icon: "🛡️"
+ title: এরর হ্যান্ডলিং (Error Handling)
+ desc: exceptionally() এবং handle() মেথডগুলো পরিষ্কারভাবে এরর রিকভারি (error recovery) করার সুবিধা দেয়।
+support:
+ description: JDK 8 (মার্চ 2014) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/concurrent-http-virtual.yaml b/translations/content/bn/concurrency/concurrent-http-virtual.yaml
new file mode 100644
index 0000000..f8cee75
--- /dev/null
+++ b/translations/content/bn/concurrency/concurrent-http-virtual.yaml
@@ -0,0 +1,18 @@
+---
+title: ভার্চুয়াল থ্রেড ব্যবহার করে কনকারেন্ট HTTP রিকোয়েস্ট
+oldApproach: থ্রেড পুল + URL কানেকশন (URLConnection)
+modernApproach: ভার্চুয়াল থ্রেড + HttpClient
+summary: ভার্চুয়াল থ্রেড এবং HttpClient ব্যবহার করে একসাথে একাধিক ইউআরএল (URL) থেকে ডেটা ফেচ (fetch) করুন।
+explanation: ভার্চুয়াল থ্রেড প্রতিটি HTTP রিকোয়েস্টের জন্য একটি করে থ্রেড তৈরি করাকে বাস্তবসম্মত করে তোলে। HttpClient-এর সাথে এর সমন্বয়ে, এটি জটিল অ্যাসিঙ্ক কলব্যাক প্যাটার্নগুলোকে সহজ ব্লকিং কোড দিয়ে প্রতিস্থাপন করে, যা সহজেই স্কেল করা যায়।
+whyModernWins:
+- icon: "♾️"
+ title: প্রতি রিকোয়েস্টের জন্য থ্রেড
+ desc: কোনো থ্রেড পুল সাইজিংয়ের প্রয়োজন নেই – প্রতিটি ইউআরএল-এর জন্য একটি ভার্চুয়াল থ্রেড।
+- icon: "📖"
+ title: সহজ কোড
+ desc: সরাসরি ব্লকিং কোড লিখুন।
+- icon: "⚡"
+ title: হাই থ্রুপুট (High Throughput)
+ desc: ন্যূনতম রিসোর্স ব্যবহার করে হাজার হাজার কনকারেন্ট রিকোয়েস্ট (concurrent requests) হ্যান্ডেল করা যায়।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/executor-try-with-resources.yaml b/translations/content/bn/concurrency/executor-try-with-resources.yaml
new file mode 100644
index 0000000..6cc9a1d
--- /dev/null
+++ b/translations/content/bn/concurrency/executor-try-with-resources.yaml
@@ -0,0 +1,18 @@
+---
+title: ExecutorService অটো-ক্লোজ (Auto-Close)
+oldApproach: ম্যানুয়াল শাটডাউন
+modernApproach: ট্রাই-উইথ-রিসোর্স (try-with-resources)
+summary: অটোমেটিক এক্সিকিউটর শাটডাউনের জন্য ট্রাই-উইথ-রিসোর্স ব্যবহার করুন।
+explanation: জাভা 19 থেকে, ExecutorService AutoCloseable ইন্টারফেস ইমপ্লিমেন্ট করে। close() মেথডটি shutdown() মেথড কল করে এবং টাস্কগুলো শেষ হওয়ার জন্য অপেক্ষা করে। এর ফলে ম্যানুয়াল try/finally শাটডাউন প্যাটার্নের আর প্রয়োজন নেই।
+whyModernWins:
+- icon: "🧹"
+ title: অটো ক্লিনআপ (Auto Cleanup)
+ desc: ব্লক থেকে বের হওয়ার সাথে সাথেই শাটডাউন স্বয়ংক্রিয়ভাবে সম্পন্ন হয়।
+- icon: "🛡️"
+ title: কোনো রিসোর্স লিক নেই
+ desc: ব্যতিক্রম (exceptions) ঘটলেও এক্সিকিউটর সবসময় শাটডাউন হয়।
+- icon: "📖"
+ title: পরিচিত প্যাটার্ন
+ desc: ফাইল, কানেকশন ইত্যাদির জন্য ব্যবহৃত ট্রাই-উইথ-রিসোর্স প্যাটার্নের মতোই।
+support:
+ description: JDK 19 (সেপ্টেম্বর 2022) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/lock-free-lazy-init.yaml b/translations/content/bn/concurrency/lock-free-lazy-init.yaml
new file mode 100644
index 0000000..58428f6
--- /dev/null
+++ b/translations/content/bn/concurrency/lock-free-lazy-init.yaml
@@ -0,0 +1,18 @@
+---
+title: লক-ফ্রি লেজি ইনিশিয়ালাইজেশন (Lock-free Lazy Initialization)
+oldApproach: synchronized + volatile
+modernApproach: StableValue
+summary: লেজি ইনিশিয়ালাইজেশনের ক্ষেত্রে ডাবল-চেকড লকিং (double-checked locking) এর পরিবর্তে StableValue ব্যবহার করুন।
+explanation: StableValue সঠিক থ্রেড সেফটি (thread safety) নিশ্চিত করে লেজি ইনিশিয়ালাইজেশন প্যাটার্নকে এনক্যাপসুলেট (encapsulates) করে। JVM ইনিশিয়ালাইজেশনের পর রিড পাথকে (read path) অপ্টিমাইজ করতে পারে, যা ভলাটাইল রিডের (volatile reads) চেয়ে দ্রুততর হতে পারে।
+whyModernWins:
+- icon: "🧹"
+ title: বয়লারপ্লেট (boilerplate) নেই
+ desc: এখানে volatile, synchronized, বা ডাবল-নাল-চেক করার প্রয়োজন নেই।
+- icon: "⚡"
+ title: দ্রুততর রিড (Faster Reads)
+ desc: ইনিশিয়ালাইজেশনের পর JVM কনস্ট্যান্ট-ফোল্ড করতে পারে।
+- icon: "✅"
+ title: প্রমাণিতভাবে সঠিক (Provably Correct)
+ desc: এখানে কোনো সূক্ষ্ম অর্ডারিং বাগ থাকে না – JVM নিজেই এটি হ্যান্ডেল করে।
+support:
+ description: JDK 25 (JEP 502, StableValue) এ প্রিভিউ। --enable-preview প্রয়োজন।
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/process-api.yaml b/translations/content/bn/concurrency/process-api.yaml
new file mode 100644
index 0000000..e8a1291
--- /dev/null
+++ b/translations/content/bn/concurrency/process-api.yaml
@@ -0,0 +1,18 @@
+---
+title: মডার্ন প্রসেস API (Modern Process API)
+oldApproach: Runtime.exec()
+modernApproach: ProcessHandle
+summary: ProcessHandle ব্যবহার করে অপারেটিং সিস্টেমের (OS) প্রসেসগুলো পরিদর্শন (inspect) এবং ম্যানেজ করুন।
+explanation: ProcessHandle মেথড PID, প্রসেসের তথ্য (কমান্ড, আর্গুমেন্টস, স্টার্ট টাইম, CPU ইউসেজ), প্যারেন্ট/চাইল্ড সম্পর্ক এবং প্রসেস ডিস্ট্রাকশন (destruction) সম্পর্কে বিস্তারিত তথ্য প্রদান করে। এর ফলে আর Undocumented Process ইন্টারনালস ব্যবহার করার প্রয়োজন হয় না।
+whyModernWins:
+- icon: "🔍"
+ title: সম্পূর্ণ তথ্য
+ desc: PID, কমান্ড, আর্গুমেন্টস, স্টার্ট টাইম, CPU ইউসেজ অ্যাক্সেস করুন।
+- icon: "🌳"
+ title: প্রসেস ট্রি (Process Tree)
+ desc: প্যারেন্ট, চাইল্ড এবং ডিসেন্ডেন্ট প্রসেসগুলোর মধ্যে নেভিগেট (navigate) করুন।
+- icon: "📊"
+ title: মনিটরিং
+ desc: onExit() মেথড অ্যাসিঙ্ক (async) মনিটরিংয়ের জন্য একটি CompletableFuture রিটার্ন করে।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/scoped-values.yaml b/translations/content/bn/concurrency/scoped-values.yaml
new file mode 100644
index 0000000..7fb829d
--- /dev/null
+++ b/translations/content/bn/concurrency/scoped-values.yaml
@@ -0,0 +1,18 @@
+---
+title: স্কোপড ভ্যালু (Scoped Values)
+oldApproach: ThreadLocal
+modernApproach: ScopedValue
+summary: ThreadLocal-এর অসুবিধাগুলো এড়িয়ে কল স্ট্যাক (call stacks) জুড়ে নিরাপদে ডেটা শেয়ার করুন।
+explanation: ScopedValue ইমিউটেবল, উত্তরাধিকারযোগ্য (inheritable) এবং স্কোপ-সীমিত (scope-limited) কনটেক্সট প্রদান করে। ThreadLocal-এর বিপরীতে, স্কোপড ভ্যালুগুলো স্বয়ংক্রিয়ভাবে ক্লিনআপ হয়, ভার্চুয়াল থ্রেডগুলির সাথে কাজ করে এবং অন্য কোনো মেথড (callees) দ্বারা পরিবর্তন করা যায় না।
+whyModernWins:
+- icon: "🔒"
+ title: ইমিউটেবল (Immutable)
+ desc: অন্য মেথডগুলো স্কোপড ভ্যালু পড়তে পারলেও তা পরিবর্তন করতে পারে না।
+- icon: "🧹"
+ title: অটো ক্লিনআপ (Auto Cleanup)
+ desc: ম্যানুয়াল remove() মেথডের প্রয়োজন নেই – ভ্যালুটি ব্লকের স্কোপ অনুযায়ী স্বয়ংক্রিয়ভাবে পরিচালিত হয়।
+- icon: "⚡"
+ title: ভার্চুয়াল-থ্রেড সেফ (Virtual-thread Safe)
+ desc: লক্ষ লক্ষ ভার্চুয়াল থ্রেডের সাথে এটি দক্ষতার সাথে কাজ করে।
+support:
+ description: JDK 25 LTS (JEP 506, সেপ্টেম্বর 2025) এ চূড়ান্ত হয়েছে।
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/stable-values.yaml b/translations/content/bn/concurrency/stable-values.yaml
new file mode 100644
index 0000000..f018a71
--- /dev/null
+++ b/translations/content/bn/concurrency/stable-values.yaml
@@ -0,0 +1,18 @@
+---
+title: স্টেবল ভ্যালু (Stable Values)
+oldApproach: ডাবল-চেকড লকিং (Double-Checked Locking)
+modernApproach: StableValue
+summary: volatile বা synchronized ব্যবহার না করেই থ্রেড-সেফ লেজি ইনিশিয়ালাইজেশন (thread-safe lazy initialization) বাস্তবায়ন করুন।
+explanation: StableValue বিল্ট-ইন থ্রেড সেফটি সহ একটি লেজি ইনিশিয়ালাইজড, ইমিউটেবল ভ্যালু প্রদান করে। এখানে ডাবল-চেকড লকিং, volatile ফিল্ড বা synchronized ব্লকের প্রয়োজন নেই। এমনকি JVM ইনিশিয়ালাইজেশনের পর রিড পাথকে (read path) অপ্টিমাইজও করতে পারে।
+whyModernWins:
+- icon: "🧹"
+ title: জিরো বয়লারপ্লেট (Zero Boilerplate)
+ desc: কোনো volatile, synchronized, বা null চেক করার প্রয়োজন নেই।
+- icon: "⚡"
+ title: JVM-অপ্টিমাইজড
+ desc: ইনিশিয়ালাইজেশনের পর JVM ভ্যালুটিকে কনস্ট্যান্ট-ফোল্ড করতে পারে।
+- icon: "🛡️"
+ title: একবার নিশ্চিত (Guaranteed Once)
+ desc: সাপ্লায়ার (supplier) কেবল একবারই রান করে, এমনকি কনটেনশনের (contention) মধ্যেও।
+support:
+ description: JDK 25 (JEP 502) এ প্রিভিউ। --enable-preview প্রয়োজন।
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/structured-concurrency.yaml b/translations/content/bn/concurrency/structured-concurrency.yaml
new file mode 100644
index 0000000..1020f2d
--- /dev/null
+++ b/translations/content/bn/concurrency/structured-concurrency.yaml
@@ -0,0 +1,18 @@
+---
+title: স্ট্রাকচার্ড কনকারেন্সি (Structured Concurrency)
+oldApproach: ম্যানুয়াল থ্রেড লাইফসাইকেল
+modernApproach: StructuredTaskScope
+summary: কনকারেন্ট টাস্কগুলির (concurrent tasks) লাইফটাইমকে কাজের একটি একক ইউনিট (single unit of work) হিসেবে ম্যানেজ করুন।
+explanation: স্ট্রাকচার্ড কনকারেন্সি একদল কনকারেন্ট টাস্ককে একটি অপারেশন হিসেবে বিবেচনা করে। যদি কোনো সাবটাস্ক (subtask) ব্যর্থ হয়, তবে অন্যগুলো বাতিল (cancelled) হয়ে যায়। স্কোপ নিশ্চিত করে যে থ্রেড লিক (thread leaks) হবে না এবং সুস্পষ্ট প্যারেন্ট-চাইল্ড রিলেশনশিপ প্রদান করে।
+whyModernWins:
+- icon: "🛡️"
+ title: কোনো থ্রেড লিক নেই
+ desc: স্কোপ বন্ধ হওয়ার আগে সব ফর্কড টাস্ক (forked tasks) সম্পন্ন হয়।
+- icon: "⚡"
+ title: দ্রুত ব্যর্থতা
+ desc: ShutdownOnFailure মেথড কোনো একটি টাস্ক ব্যর্থ হলে বাকি sibling টাস্কগুলো বাতিল করে দেয়।
+- icon: "📐"
+ title: পরিষ্কার কাঠামো
+ desc: টাস্ক লাইফটাইম কোডের লেক্সিকাল স্কোপের (lexical scope) সাথে মিলে যায়।
+support:
+ description: JDK 25-এ পূর্বরূপ (পঞ্চম প্রিভিউ, JEP 505)। --enable-preview প্রয়োজন।
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/thread-sleep-duration.yaml b/translations/content/bn/concurrency/thread-sleep-duration.yaml
new file mode 100644
index 0000000..5024f54
--- /dev/null
+++ b/translations/content/bn/concurrency/thread-sleep-duration.yaml
@@ -0,0 +1,18 @@
+---
+title: Duration সহ Thread.sleep
+oldApproach: মিলিসেকেন্ড
+modernApproach: Duration
+summary: স্ব-ডকুমেন্টিং (self-documenting) টাইম ভ্যালুর জন্য Duration ব্যবহার করুন।
+explanation: Thread.sleep(Duration) মেথডটি টাইমের ইউনিটকে সুস্পষ্ট করে তোলে। এর ফলে 5000 বলতে মিলিসেকেন্ড নাকি মাইক্রোসেকেন্ড বোঝানো হয়েছে, তা নিয়ে কোনো অনুমান করার প্রয়োজন হয় না। এটি Duration.ofSeconds, ofMillis, ofMinutes ইত্যাদির সাথে কাজ করে।
+whyModernWins:
+- icon: "📖"
+ title: স্ব-ডকুমেন্টিং (Self-documenting)
+ desc: Duration.ofSeconds(5) মেথডটি দ্ব্যর্থহীন (unambiguous)।
+- icon: "🛡️"
+ title: ইউনিট-সেফ (Unit-safe)
+ desc: ভুলবশত মাইক্রোসেকেন্ডকে মিলিসেকেন্ড হিসেবে পাস করার ঝুঁকি থাকে না।
+- icon: "🧩"
+ title: কম্পোজেবল (Composable)
+ desc: Duration ম্যাথ ব্যবহার করা যায়, যেমন plus(), multipliedBy() ইত্যাদি।
+support:
+ description: JDK 19 (সেপ্টেম্বর 2022) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/concurrency/virtual-threads.yaml b/translations/content/bn/concurrency/virtual-threads.yaml
new file mode 100644
index 0000000..07bcbd6
--- /dev/null
+++ b/translations/content/bn/concurrency/virtual-threads.yaml
@@ -0,0 +1,18 @@
+---
+title: ভার্চুয়াল থ্রেড
+oldApproach: প্ল্যাটফর্ম থ্রেড
+modernApproach: ভার্চুয়াল থ্রেড
+summary: ভারী ওএস (OS) থ্রেডের বদলে তৈরি করুন লক্ষ লক্ষ লাইটওয়েট ভার্চুয়াল থ্রেড।
+explanation: ভার্চুয়াল থ্রেডগুলো মূলত JVM দ্বারা পরিচালিত লাইটওয়েট থ্রেড, অপারেটিং সিস্টেমের নয়। থ্রেড পুল টিউনিংয়ের ঝামেলা ছাড়াই আপনি এগুলো লক্ষ লক্ষ তৈরি করতে পারবেন। এইচটিটিপি (HTTP) কল এবং ডেটাবেস কোয়েরির মতো I/O-বাউন্ড কাজের জন্য এগুলো একদম আদর্শ।
+whyModernWins:
+- icon: "⚡"
+ title: লাইটওয়েট
+ desc: ভার্চুয়াল থ্রেড মাত্র কয়েক কিলোবাইট (KB) মেমরি নেয়, যেখানে প্ল্যাটফর্ম থ্রেড নেয় মেগাবাইট (MB)।
+- icon: "♾️"
+ title: স্কেলেবল
+ desc: লক্ষ লক্ষ থ্রেড তৈরি করুন — কোনো পুল সাইজিংয়ের প্রয়োজন নেই।
+- icon: "🧹"
+ title: সিম্পল মডেল
+ desc: সাধারণ ব্লকিং কোড লিখুন, যা অ্যাসিঙ্ক্রোনাস কোডের মতোই স্কেলেবল।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/datetime/date-formatting.yaml b/translations/content/bn/datetime/date-formatting.yaml
new file mode 100644
index 0000000..ac25195
--- /dev/null
+++ b/translations/content/bn/datetime/date-formatting.yaml
@@ -0,0 +1,18 @@
+---
+title: ডেট ফরমেটিং (Date Formatting)
+oldApproach: SimpleDateFormat
+modernApproach: DateTimeFormatter
+summary: থ্রেড-সেফ (thread-safe) এবং ইমিউটেবল (immutable) DateTimeFormatter ব্যবহার করে ডেট ফরম্যাট করুন।
+explanation: DateTimeFormatter মেথডটি ইমিউটেবল এবং থ্রেড-সেফ, যা SimpleDateFormat থেকে আলাদা। এটি একটি কনস্ট্যান্ট (constant) হিসাবে সংরক্ষণ করা যায় এবং থ্রেড জুড়ে শেয়ার করা যায়। ISO_LOCAL_DATE এর মতো প্রিডিফাইন্ড ফরমেটার (predefined formatters) সাধারণ ফরম্যাটের জন্য ব্যবহার করা যায়।
+whyModernWins:
+- icon: "🛡️"
+ title: থ্রেড-সেফ (Thread-safe)
+ desc: সিঙ্ক্রোনাইজেশন (synchronization) ছাড়াই থ্রেড জুড়ে ফরমেটার ব্যবহার করা যায়।
+- icon: "📋"
+ title: বিল্ট-ইন ফরম্যাট (Built-in Formats)
+ desc: স্ট্যান্ডার্ড ফরম্যাটের জন্য ISO_LOCAL_DATE, ISO_INSTANT ইত্যাদি ব্যবহার করুন।
+- icon: "🔒"
+ title: ইমিউটেবল (Immutable)
+ desc: স্ট্যাটিক ফাইনাল কনস্ট্যান্ট (static final constants) হিসাবে নিরাপদে সংরক্ষণ করুন।
+support:
+ description: JDK 8 (মার্চ 2014) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/datetime/duration-and-period.yaml b/translations/content/bn/datetime/duration-and-period.yaml
new file mode 100644
index 0000000..7d32a3f
--- /dev/null
+++ b/translations/content/bn/datetime/duration-and-period.yaml
@@ -0,0 +1,18 @@
+---
+title: Duration এবং Period
+oldApproach: মিলিসেকেন্ড ম্যাথ (Millisecond Math)
+modernApproach: Duration / Period
+summary: টাইপ-সেফ Duration এবং Period ব্যবহার করে সময়ের পার্থক্য হিসাব করুন।
+explanation: Duration মেথডটি সময়-ভিত্তিক পরিমাণ (যেমন ঘন্টা, মিনিট, সেকেন্ড) এর জন্য ব্যবহৃত হয়। অন্যদিকে, Period মেথডটি তারিখ-ভিত্তিক পরিমাণ (যেমন বছর, মাস, দিন) এর জন্য ব্যবহৃত হয়। ChronoUnit.between() মেথড দিয়ে সহজভাবে পার্থক্য নির্ণয় করা যায়। এই সকল মেথড এজি কেসগুলো সঠিকভাবে হ্যান্ডেল করে।
+whyModernWins:
+- icon: "🎯"
+ title: টাইপ-সেফ (Type-safe)
+ desc: সময়ের জন্য Duration এবং তারিখের জন্য Period ব্যবহার করা হয় – কোনো বিভ্রান্তি থাকে না।
+- icon: "🛡️"
+ title: সঠিক গণনা (Correct Math)
+ desc: DST ট্রানজিশন, লিপ ইয়ার (leap years) এবং লিপ সেকেন্ড (leap seconds) সঠিকভাবে হ্যান্ডেল করে।
+- icon: "📖"
+ title: পঠনযোগ্য
+ desc: ChronoUnit.DAYS.between() মেথডটি ইংরেজি বাক্যের মতোই সহজবোধ্য।
+support:
+ description: JDK 8 (মার্চ 2014) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/datetime/hex-format.yaml b/translations/content/bn/datetime/hex-format.yaml
new file mode 100644
index 0000000..967d9c3
--- /dev/null
+++ b/translations/content/bn/datetime/hex-format.yaml
@@ -0,0 +1,18 @@
+---
+title: HexFormat
+oldApproach: ম্যানুয়াল হেক্স কনভার্সন
+modernApproach: HexFormat
+summary: HexFormat ব্যবহার করে হেক্স স্ট্রিং (hex strings) এবং বাইট অ্যারে (byte arrays) এর মধ্যে কনভার্ট করুন।
+explanation: HexFormat বাইট, ইনটিজার এবং অ্যারের জন্য দ্বি-মুখী (bidirectional) হেক্স এনকোডিং/ডিকোডিং সুবিধা প্রদান করে। এটিতে ডিলিমিটার, প্রিফিক্স, সাফিক্স এবং কেস কনফিগার করা যায়। এর ফলে ম্যানুয়াল ফরমেটিং বা পার্সিংয়ের আর প্রয়োজন নেই।
+whyModernWins:
+- icon: "📐"
+ title: দ্বি-মুখী (Bidirectional)
+ desc: একটি API ব্যবহার করে বাইট→হেক্স এবং হেক্স→বাইট-এ রূপান্তর করুন।
+- icon: "🔧"
+ title: কনফিগারযোগ্য (Configurable)
+ desc: ডিলিমিটার, প্রিফিক্স, সাফিক্স, আপার/লোয়ার কেস সেট করা যায়।
+- icon: "📦"
+ title: অ্যারে সাপোর্ট (Array Support)
+ desc: সম্পূর্ণ বাইট অ্যারে একসাথে এনকোড/ডিকোড করা যায়।
+support:
+ description: JDK 17 LTS (সেপ্টেম্বর 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/datetime/instant-precision.yaml b/translations/content/bn/datetime/instant-precision.yaml
new file mode 100644
index 0000000..0b909ee
--- /dev/null
+++ b/translations/content/bn/datetime/instant-precision.yaml
@@ -0,0 +1,18 @@
+---
+title: ন্যানোসেকেন্ড প্রিসিশন সহ ইনস্ট্যান্ট (Instant with Nanosecond Precision)
+oldApproach: মিলিসেকেন্ড
+modernApproach: ন্যানোসেকেন্ড
+summary: মাইক্রোসেকেন্ড বা ন্যানোসেকেন্ড প্রিসিশন সহ টাইমস্ট্যাম্প (timestamps) পান।
+explanation: জাভা 9-এ ক্লক রেজোলিউশন উন্নত করা হয়েছে, যার ফলে Instant.now() মেথডটি বেশিরভাগ প্ল্যাটফর্মে মাইক্রোসেকেন্ড প্রিসিশন (কিছু ক্ষেত্রে ন্যানোসেকেন্ড) ক্যাপচার করে। পুরোনো currentTimeMillis() মেথডটি কেবল মিলিসেকেন্ড প্রিসিশন দিত।
+whyModernWins:
+- icon: "🎯"
+ title: উচ্চ প্রিসিশন (Higher Precision)
+ desc: মিলিসেকেন্ডের পরিবর্তে মাইক্রোসেকেন্ড/ন্যানোসেকেন্ড টাইমস্ট্যাম্প।
+- icon: "📐"
+ title: টাইপ-সেফ (Type-safe)
+ desc: ইনস্ট্যান্ট তার প্রিসিশন নিজেই বহন করে – এখানে কোনো অস্পষ্ট লং ভ্যালু থাকে না।
+- icon: "🌐"
+ title: UTC-ভিত্তিক
+ desc: ইনস্ট্যান্ট সর্বদা UTC তে থাকে – কোনো টাইমজোন বিভ্রান্তি নেই।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/datetime/java-time-basics.yaml b/translations/content/bn/datetime/java-time-basics.yaml
new file mode 100644
index 0000000..7988e30
--- /dev/null
+++ b/translations/content/bn/datetime/java-time-basics.yaml
@@ -0,0 +1,18 @@
+---
+title: java.time API বেসিক
+oldApproach: Date + Calendar
+modernApproach: java.time.*
+summary: Date এবং Calendar-এর পরিবর্তে ইমিউটেবল (immutable) এবং সুস্পষ্ট ডেট/টাইম টাইপ ব্যবহার করুন।
+explanation: java.time API-তে LocalDate, LocalTime, LocalDateTime, Instant, ZonedDateTime এর মতো ক্লাস রয়েছে, যা সবই ইমিউটেবল এবং থ্রেড-সেফ। মাসগুলো 1-ইনডেক্সড। এর ফলে Calendar.JANUARY = 0 এর মতো বিভ্রান্তি আর থাকে না।
+whyModernWins:
+- icon: "🔒"
+ title: ইমিউটেবল (Immutable)
+ desc: ডেট/টাইম ভ্যালুগুলো ভুলবশত পরিবর্তন করা যায় না।
+- icon: "📖"
+ title: পরিষ্কার API
+ desc: Month.JANUARY ব্যবহার করুন, 0 নয়। DayOfWeek.MONDAY ব্যবহার করুন, 2 নয়।
+- icon: "🛡️"
+ title: থ্রেড-সেফ (Thread-safe)
+ desc: সিঙ্ক্রোনাইজেশনের প্রয়োজন নেই – থ্রেড জুড়ে অবাধে শেয়ার করা যায়।
+support:
+ description: JDK 8 (মার্চ 2014) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/datetime/math-clamp.yaml b/translations/content/bn/datetime/math-clamp.yaml
new file mode 100644
index 0000000..632e6ff
--- /dev/null
+++ b/translations/content/bn/datetime/math-clamp.yaml
@@ -0,0 +1,18 @@
+---
+title: Math.clamp()
+oldApproach: নেস্টেড min/max
+modernApproach: Math.clamp()
+summary: একটি মাত্র পরিষ্কার কল (call) ব্যবহার করে একটি ভ্যালুকে নির্দিষ্ট বাউন্ডের (bounds) মধ্যে রাখুন (clamp)।
+explanation: Math.clamp(value, min, max) মেথডটি একটি ভ্যালুকে [min, max] রেঞ্জের মধ্যে সীমাবদ্ধ রাখে। এটি নেস্টেড Math.min/Math.max ব্যবহারের চেয়ে অনেক বেশি সুস্পষ্ট এবং int, long, float, এবং double টাইপের জন্য উপলব্ধ।
+whyModernWins:
+- icon: "📖"
+ title: স্ব-ডকুমেন্টিং (Self-documenting)
+ desc: clamp(value, min, max) মেথডটি দ্ব্যর্থহীন (unambiguous)।
+- icon: "🛡️"
+ title: কম ত্রুটি-প্রবণ (Less Error-prone)
+ desc: ভুলবশত min/max-এর অর্ডার অদলবদল (swapping) করার ঝুঁকি থাকে না।
+- icon: "🎯"
+ title: সব নিউমেরিক টাইপ (All Numeric Types)
+ desc: int, long, float, এবং double সহ সব নিউমেরিক টাইপের সাথে কাজ করে।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/ejb-timer-vs-jakarta-scheduler.yaml b/translations/content/bn/enterprise/ejb-timer-vs-jakarta-scheduler.yaml
new file mode 100644
index 0000000..22e920e
--- /dev/null
+++ b/translations/content/bn/enterprise/ejb-timer-vs-jakarta-scheduler.yaml
@@ -0,0 +1,18 @@
+---
+title: EJB টাইমার বনাম জাকার্তা শিডিউলার (Jakarta Scheduler)
+oldApproach: EJB TimerService
+modernApproach: ManagedScheduledExecutorService
+summary: সহজ শিডিউলিংয়ের জন্য হেভিওয়েট EJB টাইমারের পরিবর্তে জাকার্তা কনকারেন্সির (Jakarta Concurrency) ManagedScheduledExecutorExecutorService ব্যবহার করুন।
+explanation: EJB টাইমারগুলির জন্য @Stateless বা @Singleton বিন (bean), @Timeout কলব্যাক এবং XML বা অ্যানোটেশন-ভিত্তিক শিডিউল এক্সপ্রেশন প্রয়োজন। জাকার্তা কনকারেন্সি ManagedScheduledExecutorService প্রদান করে, যা পরিচিত java.util.concurrent শিডিউলিং API ব্যবহার করে। এর ফলে বয়লারপ্লেট কমে আসে, ইউনিট টেস্টিং সহজ হয় এবং EJB কন্টেইনারের উপর নির্ভরতা থাকে না।
+whyModernWins:
+- icon: "🪶"
+ title: বয়লারপ্লেট হ্রাস
+ desc: @Timeout কলব্যাক বা ScheduleExpression-এর প্রয়োজন নেই – স্ট্যান্ডার্ড ScheduledExecutorService API ব্যবহার করুন।
+- icon: "🧪"
+ title: উন্নত টেস্টএবিলিটি (Testability)
+ desc: প্লেইন মেথড এবং এক্সিকিউটর মকস (mocks) EJB কন্টেইনার ছাড়াই ইউনিট টেস্টিংকে সহজ করে তোলে।
+- icon: "☁️"
+ title: ক্লাউড-নেটিভ ফ্রেন্ডলি
+ desc: Managed Executors কন্টেইনার লাইফসাইকেলের সাথে ইন্টিগ্রেট করে এবং লাইটওয়েট রানটাইমে কাজ করে।
+support:
+ description: জাকার্তা EE 10 / Concurrency 3.0 থেকে উপলব্ধ৷
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/ejb-vs-cdi.yaml b/translations/content/bn/enterprise/ejb-vs-cdi.yaml
new file mode 100644
index 0000000..449eaba
--- /dev/null
+++ b/translations/content/bn/enterprise/ejb-vs-cdi.yaml
@@ -0,0 +1,18 @@
+---
+title: EJB বনাম CDI
+oldApproach: EJB
+modernApproach: CDI Bean
+summary: ডিপেন্ডেন্সি ইনজেকশন (dependency injection) এবং ট্রানজাকশনের (transactions) জন্য হেভিওয়েট EJBs-এর পরিবর্তে লাইটওয়েট CDI বিন ব্যবহার করুন।
+explanation: CDI (Contexts and Dependency Injection) EJBs-এর মতোই ডিপেন্ডেন্সি ইনজেকশন এবং ট্রানজাকশন ম্যানেজমেন্ট প্রদান করে, তবে এটি প্লেইন জাভা ক্লাসের (plain Java classes) মতো, যেখানে কোনো কন্টেইনার-নির্দিষ্ট ইন্টারফেস বা সুপারক্লাসের প্রয়োজন নেই। @ApplicationScoped এবং @RequestScoped এর মতো স্কোপগুলো লাইফসাইকেল কন্ট্রোল করে এবং @Transactional বাধ্যতামূলক EJB ট্রানজাকশন সেমান্টিক্সকে প্রতিস্থাপন করে।
+whyModernWins:
+- icon: "🪶"
+ title: লাইটওয়েট
+ desc: CDI বিনস হলো প্লেইন জাভা ক্লাস, যেখানে EJB-নির্দিষ্ট কোনো ইন্টারফেস বা ডিস্ক্রিপটরের প্রয়োজন হয় না।
+- icon: "💉"
+ title: ইউনিফাইড ইনজেকশন
+ desc: @Inject প্রতিটি ম্যানেজড বিন, JAX-RS রিসোর্স এবং জাকার্তা EE কম্পোনেন্টের জন্য একইভাবে কাজ করে।
+- icon: "🧪"
+ title: সহজ ইউনিট টেস্টিং
+ desc: EJB প্রক্সি ওভারহেড ছাড়াই প্লেইন ক্লাসগুলো ইনস্ট্যানশিয়েট (instantiate) এবং মক (mock) করা সহজ।
+support:
+ description: জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/jdbc-resultset-vs-jpa-criteria.yaml b/translations/content/bn/enterprise/jdbc-resultset-vs-jpa-criteria.yaml
new file mode 100644
index 0000000..a1aae52
--- /dev/null
+++ b/translations/content/bn/enterprise/jdbc-resultset-vs-jpa-criteria.yaml
@@ -0,0 +1,18 @@
+---
+title: JDBC ResultSet ম্যাপিং বনাম JPA Criteria API
+oldApproach: JDBC ResultSet
+modernApproach: JPA Criteria API
+summary: ডাইনামিক কোয়েরির (dynamic queries) জন্য JPA-এর টাইপ-সেফ Criteria API ব্যবহার করে ম্যানুয়াল JDBC ResultSet ম্যাপিং প্রতিস্থাপন করুন।
+explanation: Raw JDBC ব্যবহার করলে SQL স্ট্রিং তৈরি করা, ইনডেক্স অনুযায়ী প্যারামিটার সেট করা এবং প্রতিটি ResultSet কলামকে ম্যানুয়ালি ম্যাপ করার প্রয়োজন হয়। এটি একটি ভুল-প্রবণ প্রক্রিয়া এবং কলাম পরিবর্তিত হলে কোনো এরর না দেখিয়েই কোড ভেঙে যেতে পারে। JPA Criteria API একটি টাইপ-সেফ বিল্ডার প্যাটার্ন ব্যবহার করে প্রোগ্রামাটিকভাবে কোয়েরি তৈরি করে। এখানে কলামের নামগুলো এনটিটি মডেলের (entity model) সাথে ভ্যালিডেট করা হয়, ফলাফল ম্যাপিং স্বয়ংক্রিয়ভাবে ঘটে এবং জটিল ডাইনামিক কোয়েরিগুলো স্ট্রিং কনক্যাটেনেশন (string concatenation) ছাড়াই পরিষ্কারভাবে তৈরি করা যায়।
+whyModernWins:
+- icon: "🔒"
+ title: টাইপ-সেফ কোয়েরি (Type-safe Queries)
+ desc: Criteria বিল্ডারটি কম্পাইল টাইমে ফিল্ডের নাম এবং টাইপের অমিল (type mismatches) ধরতে পারে।
+- icon: "🗺️"
+ title: স্বয়ংক্রিয় ম্যাপিং (Automatic Mapping)
+ desc: JPA ResultSet থেকে এনটিটি অবজেক্টে (entity objects) ফলাফল ম্যাপিং স্বয়ংক্রিয়ভাবে করে – ম্যানুয়ালি কলাম-বাই-কলাম ডেটা এক্সট্রাক্ট করার প্রয়োজন হয় না।
+- icon: "🧩"
+ title: কম্পোজেবল প্রেডিকেট (Composable Predicates)
+ desc: ডাইনামিক where-clause গুলো and(), or(), এবং রিইউজেবল Predicate অবজেক্ট ব্যবহার করে পরিষ্কারভাবে তৈরি করা যায়।
+support:
+ description: জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/jdbc-vs-jooq.yaml b/translations/content/bn/enterprise/jdbc-vs-jooq.yaml
new file mode 100644
index 0000000..3c69afe
--- /dev/null
+++ b/translations/content/bn/enterprise/jdbc-vs-jooq.yaml
@@ -0,0 +1,18 @@
+---
+title: JDBC বনাম jOOQ
+oldApproach: Raw JDBC
+modernApproach: jOOQ SQL DSL
+summary: jOOQ-এর টাইপ-সেফ, ফ্লুয়েন্ট SQL DSL ব্যবহার করে Raw JDBC স্ট্রিং-ভিত্তিক SQL প্রতিস্থাপন করুন।
+explanation: jOOQ (Java Object Oriented Querying) আপনার ডেটাবেস স্কিমা থেকে জাভা কোড জেনারেট করে, টেবিল এবং কলামের নামগুলোকে টাইপ-সেফ জাভা কনস্ট্যান্টে রূপান্তরিত করে। এর ফ্লুয়েন্ট DSL SQL সিনট্যাক্সকে প্রতিফলিত করে, ফলে কোয়েরিগুলো পঠনযোগ্য এবং কম্পোজেবল (composable) থাকে। সমস্ত প্যারামিটার স্বয়ংক্রিয়ভাবে বাইন্ড (bind) হয়, যা SQL ইনজেকশনের ঝুঁকি দূর করে। JPA/JPQL-এর বিপরীতে, jOOQ সম্পূর্ণরূপে SQL-কে সমর্থন করে – উইন্ডো ফাংশন, CTEs, RETURNING ক্লজ এবং ভেন্ডর-নির্দিষ্ট এক্সটেনশনগুলো এখানে ফার্স্ট-ক্লাস ফিচার।
+whyModernWins:
+- icon: "🔒"
+ title: টাইপ-সেফ কলাম
+ desc: কলামের নামগুলো জেনারেট করা জাভা কনস্ট্যান্ট হয় – টাইপো এবং টাইপের অমিল রানটাইম ফেইলুরের পরিবর্তে কম্পাইলার এরর হিসাবে ধরা পড়ে।
+- icon: "📖"
+ title: SQL ফ্লুয়েন্সি
+ desc: jOOQ DSL SQL সিনট্যাক্সকে ঘনিষ্ঠভাবে প্রতিফলিত করে, তাই জটিল JOINs, সাবকোয়েরি (subqueries) এবং CTEs সহজেই পঠনযোগ্য থাকে।
+- icon: "🛡️"
+ title: ডিজাইন দ্বারা ইনজেকশন-মুক্ত
+ desc: প্যারামিটারগুলি সর্বদা নিরাপদে বাইন্ড থাকে – স্ট্রিং কনক্যাটেনেশন (string concatenation) না থাকায় SQL ইনজেকশনের কোনো ঝুঁকি থাকে না।
+support:
+ description: jOOQ ওপেন-সোর্স সংস্করণ সমস্ত প্রধান ওপেন-সোর্স ডেটাবেস সমর্থন করে; পুরানো বাণিজ্যিক ডাটাবেস একটি প্রদত্ত লাইসেন্স প্রয়োজন
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/jdbc-vs-jpa.yaml b/translations/content/bn/enterprise/jdbc-vs-jpa.yaml
new file mode 100644
index 0000000..7c9e380
--- /dev/null
+++ b/translations/content/bn/enterprise/jdbc-vs-jpa.yaml
@@ -0,0 +1,18 @@
+---
+title: JDBC বনাম JPA
+oldApproach: JDBC
+modernApproach: JPA EntityManager
+summary: JPA-এর অবজেক্ট-রিলেশনাল ম্যাপিং এবং EntityManager ব্যবহার করে ভার্বোস JDBC বয়লারপ্লেট প্রতিস্থাপন করুন।
+explanation: JPA (Jakarta Persistence API) জাভা অবজেক্টকে ডেটাবেস রো-এর (database rows) সাথে ম্যাপ করে, যা ম্যানুয়াল ResultSet প্রসেসিং এবং SQL স্ট্রিং কনক্যাটেনেশনকে দূর করে। EntityManager find(), persist(), এবং JPQL কোয়েরি প্রদান করে, যাতে আপনি Raw SQL-এর পরিবর্তে ডোমেইন অবজেক্ট (domain objects) নিয়ে কাজ করতে পারেন, যখন কন্টেইনার কানেকশন পুলিং এবং ট্রানজাকশন ম্যানেজ করে।
+whyModernWins:
+- icon: "🗺️"
+ title: অবজেক্ট ম্যাপিং
+ desc: এনটিটিগুলো প্লেইন অ্যানোটেড ক্লাস – ম্যানুয়াল ResultSet-কে অবজেক্টে রূপান্তর করার প্রয়োজন নেই।
+- icon: "🔒"
+ title: টাইপ-সেফ কোয়েরি (Type-safe Queries)
+ desc: JPQL Raw টেবিল এবং কলাম স্ট্রিংয়ের পরিবর্তে এনটিটি টাইপ এবং ফিল্ডের উপর কাজ করে।
+- icon: "⚡"
+ title: বিল্ট-ইন ক্যাশিং (Built-in Caching)
+ desc: ফার্স্ট- এবং সেকেন্ড-লেভেল ক্যাশেগুলো স্বয়ংক্রিয়ভাবে ডেটাবেসের রাউন্ড-ট্রিপ (round-trips) কমিয়ে দেয়।
+support:
+ description: জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/jndi-lookup-vs-cdi-injection.yaml b/translations/content/bn/enterprise/jndi-lookup-vs-cdi-injection.yaml
new file mode 100644
index 0000000..a97b547
--- /dev/null
+++ b/translations/content/bn/enterprise/jndi-lookup-vs-cdi-injection.yaml
@@ -0,0 +1,18 @@
+---
+title: JNDI Lookup বনাম CDI Injection
+oldApproach: JNDI Lookup
+modernApproach: CDI @Inject
+summary: কন্টেইনার-ম্যানেজড রিসোর্সগুলোর জন্য ফ্র্যাজাইল (fragile) JNDI স্ট্রিং লুকআপের পরিবর্তে টাইপ-সেফ CDI ইনজেকশন ব্যবহার করুন।
+explanation: প্রচলিত JNDI প্যাটার্ন আপনাকে স্ট্রিং-ভিত্তিক রিসোর্স নাম ব্যবহার করতে, NamingException হ্যান্ডেল করতে এবং InitialContext ম্যানেজ করতে বাধ্য করে। @Inject (বা কন্টেইনার রিসোর্সগুলির জন্য @Resource) সহ CDI ইনজেকশন কন্টেইনারকে স্বয়ংক্রিয়ভাবে ডিপেন্ডেন্সি (dependencies) ওয়্যার করতে সাহায্য করে। টাইপো (typos) কম্পাইল-টাইম এররে পরিণত হয় এবং ক্লাসগুলো সহজে টেস্ট করা যায় কারণ ডিপেন্ডেন্সিগুলো সরাসরি ইনজেক্ট করা সম্ভব।
+whyModernWins:
+- icon: "🔒"
+ title: টাইপ-সেফ ওয়্যারিং (Type-safe Wiring)
+ desc: ইনজেকশন এররগুলো ডিপ্লয়মেন্টের সময় ধরা পড়ে, স্ট্রিং লুকআপের মাধ্যমে রানটাইমে নয়।
+- icon: "🗑️"
+ title: বয়লারপ্লেট (Boilerplate) নেই
+ desc: InitialContext তৈরি, JNDI নাম স্ট্রিং এবং NamingException হ্যান্ডলিংয়ের প্রয়োজন দূর করে।
+- icon: "🧪"
+ title: টেস্টেবল (Testable)
+ desc: ডিপেন্ডেন্সিগুলো ইনজেক্টেড ফিল্ড, যা ইউনিট টেস্টে মক (mocks) দিয়ে সহজে প্রতিস্থাপন করা যায়।
+support:
+ description: জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/jpa-vs-jakarta-data.yaml b/translations/content/bn/enterprise/jpa-vs-jakarta-data.yaml
new file mode 100644
index 0000000..f96cd91
--- /dev/null
+++ b/translations/content/bn/enterprise/jpa-vs-jakarta-data.yaml
@@ -0,0 +1,18 @@
+---
+title: JPA বনাম জাকার্তা ডেটা (Jakarta Data)
+oldApproach: JPA EntityManager
+modernApproach: জাকার্তা ডেটা রিপোজিটরি (Jakarta Data Repository)
+summary: একটি রিপোজিটরি ইন্টারফেস ডিক্লেয়ার করুন এবং জাকার্তা ডেটাকে স্বয়ংক্রিয়ভাবে DAO ইমপ্লিমেন্টেশন তৈরি করতে দিন।
+explanation: জাকার্তা ডেটা (Jakarta EE 11) ডেটা অ্যাক্সেসকে একটি পিওর ইন্টারফেস ডিক্লারেশনে পরিণত করে। আপনি @Repository অ্যানোটেশন দিয়ে একটি ইন্টারফেস তৈরি করেন এবং CrudRepository-এর মতো বিল্ট-ইন রিপোজিটরি টাইপ এক্সটেন্ড করেন। রানটাইম স্বয়ংক্রিয়ভাবে ইমপ্লিমেন্টেশন জেনারেট করে – FindByName-এর মতো মেথডের নাম থেকে ডেরাইভড কোয়েরি (derived queries) সহ – ফলে কোনো EntityManager বয়লারপ্লেট, JPQL স্ট্রিং বা হাতে লেখা সেভ/ফাইন্ড মেথডের প্রয়োজন হয় না।
+whyModernWins:
+- icon: "🪄"
+ title: জিরো বয়লারপ্লেট (Zero Boilerplate)
+ desc: ইন্টারফেস ডিক্লেয়ার করুন; কন্টেইনার ডিপ্লয়ের সময় সম্পূর্ণ DAO ইমপ্লিমেন্টেশন জেনারেট করে।
+- icon: "🔍"
+ title: ডেরাইভড কোয়েরি (Derived Queries)
+ desc: FindByNameAndStatus-এর মতো মেথডের নামগুলো স্বয়ংক্রিয়ভাবে পার্স করা হয় – কোনো JPQL বা SQL এর প্রয়োজন নেই।
+- icon: "🔌"
+ title: পোর্টেবল (Portable)
+ desc: যেকোনো জাকার্তা EE 11 কমপ্লায়েন্ট রানটাইম কোনো ভেন্ডর লক-ইন ছাড়াই রিপোজিটরি ইমপ্লিমেন্টেশন প্রদান করে।
+support:
+ description: জাকার্তা EE 11 / Java 21 (2024) থেকে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/jsf-managed-bean-vs-cdi-named.yaml b/translations/content/bn/enterprise/jsf-managed-bean-vs-cdi-named.yaml
new file mode 100644
index 0000000..8f13ea3
--- /dev/null
+++ b/translations/content/bn/enterprise/jsf-managed-bean-vs-cdi-named.yaml
@@ -0,0 +1,18 @@
+---
+title: JSF Managed Bean বনাম CDI Named Bean
+oldApproach: "@ManagedBean"
+modernApproach: "@Named + CDI"
+summary: একটি ইউনিফাইড ডিপেন্ডেন্সি ইনজেকশন (dependency injection) মডেলের জন্য ডেপ্রিকেটেড (deprecated) JSF @ManagedBean-এর পরিবর্তে CDI @Named ব্যবহার করুন।
+explanation: JSF-এর @ManagedBean এবং @ManagedProperty Jakarta Faces 2.3-এ ডেপ্রিকেটেড করা হয়েছিল এবং Jakarta EE 10 থেকে সরিয়ে দেওয়া হয়েছে। CDI-ভিত্তিক প্রতিস্থাপনটি @Named ব্যবহার করে বিনকে EL এক্সপ্রেশনে এক্সপোজ করে এবং @Inject ডিপেন্ডেন্সি ওয়্যারিংয়ের (wiring) জন্য কাজ করে। এটি বিন মডেলকে একীভূত করে – 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 এ সরানো হয়েছে
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/manual-transaction-vs-declarative.yaml b/translations/content/bn/enterprise/manual-transaction-vs-declarative.yaml
new file mode 100644
index 0000000..22a60c4
--- /dev/null
+++ b/translations/content/bn/enterprise/manual-transaction-vs-declarative.yaml
@@ -0,0 +1,18 @@
+---
+title: ম্যানুয়াল JPA ট্রানজাকশন বনাম ডিক্লারেটিভ @Transactional
+oldApproach: ম্যানুয়াল ট্রানজাকশন
+modernApproach: "@Transactional"
+summary: একটি সিঙ্গেল @Transactional অ্যানোটেশন ব্যবহার করে ভার্বোস begin/commit/rollback ব্লকগুলো প্রতিস্থাপন করুন।
+explanation: ম্যানুয়াল ট্রানজাকশন ম্যানেজমেন্টের (transaction management) জন্য begin(), commit(), এবং rollback() কলগুলোকে ট্রাই-ক্যাচ ব্লক (try-catch blocks)-এর মধ্যে এক্সপ্লিসিটভাবে (explicitly) ব্যবহার করতে হয় – প্রতিটি সার্ভিস মেথডে এই বয়লারপ্লেট (boilerplate) কোড রিপিট করতে হয়। @Transactional অ্যানোটেশন লাইফসাইকেল ম্যানেজমেন্টকে কন্টেইনারের কাছে ডেলিগেট করে। এটি মেথডের আগে একটি ট্রানজাকশন শুরু করে, সফল হলে কমিট করে এবং RuntimeException ঘটলে স্বয়ংক্রিয়ভাবে রোলব্যাক (roll back) করে।
+whyModernWins:
+- icon: "🗑️"
+ title: বয়লারপ্লেট নেই
+ desc: একটি অ্যানোটেশন রিপিটেটিভ begin/commit/rollback ট্রাই-ক্যাচ ব্লকগুলোকে প্রতিস্থাপন করে।
+- icon: "🛡️"
+ title: নিরাপদ রোলব্যাক (Safer Rollback)
+ desc: কন্টেইনার আনচেকড এক্সেপশন (unchecked exceptions) ঘটলে রোলব্যাক নিশ্চিত করে – ক্যাচ ব্লক ভুলে যাওয়ার কোনো ঝুঁকি থাকে না।
+- icon: "📐"
+ title: ডিক্লারেটিভ কন্ট্রোল (Declarative Control)
+ desc: প্রোপাগেশন (propagation), আইসোলেশন (isolation) এবং রোলব্যাক নিয়মগুলো অ্যানোটেশন অ্যাট্রিবিউট (annotation attributes) হিসাবে প্রকাশ করা হয়।
+support:
+ description: জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/mdb-vs-reactive-messaging.yaml b/translations/content/bn/enterprise/mdb-vs-reactive-messaging.yaml
new file mode 100644
index 0000000..b738254
--- /dev/null
+++ b/translations/content/bn/enterprise/mdb-vs-reactive-messaging.yaml
@@ -0,0 +1,18 @@
+---
+title: Message-Driven Bean বনাম রিঅ্যাক্টিভ মেসেজিং (Reactive Messaging)
+oldApproach: Message-Driven Bean
+modernApproach: রিঅ্যাক্টিভ মেসেজিং (Reactive Messaging)
+summary: সহজ ইভেন্ট প্রসেসিংয়ের জন্য JMS Message-Driven Beans-এর পরিবর্তে MicroProfile Reactive Messaging ব্যবহার করুন।
+explanation: Message-Driven Beans-এর জন্য MessageListener ইমপ্লিমেন্ট করা, অ্যাক্টিভেশন প্রপার্টি কনফিগার করা এবং JMS মেসেজ ম্যানুয়ালি ডিসিরিয়ালাইজ (deserialize) করার প্রয়োজন হয়। MicroProfile Reactive Messaging একটি মেথডে একটি সহজ @Incoming অ্যানোটেশন ব্যবহার করে, যা সরাসরি টাইপড অবজেক্ট গ্রহণ করে। চ্যানেল কনফিগারেশন এক্সটার্নালাইজড হওয়ায় কোড ব্রোকার-অ্যাগনস্টিক (broker-agnostic) হয় এবং এটি পরীক্ষা করা অনেক সহজ।
+whyModernWins:
+- icon: "🪶"
+ title: ন্যূনতম কোড
+ desc: একটি সিঙ্গেল @Incoming মেথড MDB ক্লাস, MessageListener ইন্টারফেস এবং অ্যাক্টিভেশন কনফিগকে প্রতিস্থাপন করে।
+- icon: "🔌"
+ title: ব্রোকার-অ্যাগনস্টিক (Broker-agnostic)
+ desc: অ্যাপ্লিকেশন কোড পরিবর্তন না করেই কনফিগারেশনের মাধ্যমে Kafka, AMQP, বা JMS কানেক্টর অদলবদল করা যায়।
+- icon: "☁️"
+ title: ক্লাউড-নেটিভ ফিট
+ desc: রিঅ্যাক্টিভ স্ট্রিম ব্যাকপ্রেশার এবং লাইটওয়েট রানটাইম এটিকে কন্টেইনারাইজড ডিপ্লয়মেন্টের জন্য আদর্শ করে তোলে।
+support:
+ description: মাইক্রোপ্রোফাইল 4.0 / SmallRye রিঅ্যাক্টিভ মেসেজিং থেকে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/servlet-vs-jaxrs.yaml b/translations/content/bn/enterprise/servlet-vs-jaxrs.yaml
new file mode 100644
index 0000000..178420c
--- /dev/null
+++ b/translations/content/bn/enterprise/servlet-vs-jaxrs.yaml
@@ -0,0 +1,18 @@
+---
+title: Servlet বনাম JAX-RS
+oldApproach: HttpServlet
+modernApproach: JAX-RS Resource
+summary: ভার্বোস HttpServlet বয়লারপ্লেটের পরিবর্তে ডিক্লারেটিভ JAX-RS রিসোর্স ক্লাস ব্যবহার করুন।
+explanation: JAX-RS (Jakarta RESTful Web Services) আপনাকে @GET, @Path, এবং @Produces-এর মতো সহজ অ্যানোটেশন ব্যবহার করে REST এন্ডপয়েন্ট এক্সপোজ করতে দেয়। রিকোয়েস্ট প্যারামিটার ম্যানুয়ালি পার্স (parse) করা বা রেসপন্সে কন্টেন্ট টাইপ সেট করার আর প্রয়োজন নেই – রানটাইম স্বয়ংক্রিয়ভাবে মার্শালিং (marshalling) এবং রাউটিং (routing) হ্যান্ডেল করে।
+whyModernWins:
+- icon: "📐"
+ title: ডিক্লারেটিভ রাউটিং (Declarative Routing)
+ desc: অ্যানোটেশনগুলো HTTP মেথড, পাথ এবং কন্টেন্ট টাইপ সংজ্ঞায়িত করে, ইম্পারেটিভ (imperative) if/else ডিসপ্যাচের পরিবর্তে।
+- icon: "🔄"
+ title: স্বয়ংক্রিয় মার্শালিং (Automatic Marshalling)
+ desc: POJOs সরাসরি রিটার্ন করুন; @Produces-এর উপর ভিত্তি করে রানটাইম সেগুলোকে স্বয়ংক্রিয়ভাবে JSON বা XML-এ সিরিয়ালাইজ করে।
+- icon: "🧪"
+ title: সহজে টেস্টিং (Easier Testing)
+ desc: রিসোর্স ক্লাসগুলো প্লেইন জাভা অবজেক্ট, যা সার্ভলেট কন্টেইনার ছাড়াই টেস্টিং করা যায়।
+support:
+ description: জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml b/translations/content/bn/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml
new file mode 100644
index 0000000..d5f44b0
--- /dev/null
+++ b/translations/content/bn/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml
@@ -0,0 +1,18 @@
+---
+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 লক অ্যানোটেশনগুলোর চেয়ে আরও সূক্ষ্ম-দানা নিয়ন্ত্রণ (finer-grained control) প্রদান করে।
+whyModernWins:
+- icon: "🪶"
+ title: কম অ্যানোটেশন নয়েজ (Annotation Noise)
+ desc: কোনো @ConcurrencyManagement, @Lock, বা @Startup অ্যানোটেশনের প্রয়োজন নেই – কেবল একটি @ApplicationScoped অ্যানোটেশন।
+- icon: "🔧"
+ title: নমনীয় কনকারেন্সি (Flexible Concurrency)
+ desc: আপনার প্রয়োজনীয় থ্রেড-সেফটির (thread-safety) জন্য java.util.concurrent লক বা volatile ব্যবহার করুন।
+- icon: "🧪"
+ title: সহজ টেস্টিং
+ desc: প্লেইন CDI বিনসগুলো EJB কন্টেইনার ছাড়াই টেস্টে সরাসরি ইনস্ট্যান্ট (instantiate) করা যায়।
+support:
+ description: জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/soap-vs-jakarta-rest.yaml b/translations/content/bn/enterprise/soap-vs-jakarta-rest.yaml
new file mode 100644
index 0000000..b2baf4a
--- /dev/null
+++ b/translations/content/bn/enterprise/soap-vs-jakarta-rest.yaml
@@ -0,0 +1,18 @@
+---
+title: SOAP ওয়েব সার্ভিস বনাম জাকার্তা REST
+oldApproach: JAX-WS / SOAP
+modernApproach: জাকার্তা REST / JSON
+summary: হেভিওয়েট SOAP/WSDL এন্ডপয়েন্টকে (endpoints) পরিষ্কার জাকার্তা REST রিসোর্স এবং JSON দিয়ে প্রতিস্থাপন করুন।
+explanation: SOAP-ভিত্তিক ওয়েব সার্ভিসগুলো WSDL কনট্র্যাক্ট (contracts), XML মার্শালিং (marshalling), এবং JAX-WS অ্যানোটেশনগুলোর উপর নির্ভর করে, যা উল্লেখযোগ্য ওভারহেড তৈরি করে। জাকার্তা REST (আগে JAX-RS) @GET, @Path, এবং @Produces-এর মতো স্বজ্ঞাত (intuitive) অ্যানোটেশন ব্যবহার করে RESTful JSON API এক্সপোজ করে। প্রোগ্রামিং মডেলটি সহজ, পেলোড (payloads) ছোট, এবং এই অ্যাপ্রোচটি আধুনিক মাইক্রোসার্ভিসগুলোর যোগাযোগের পদ্ধতির সাথে সঙ্গতিপূর্ণ।
+whyModernWins:
+- icon: "🪶"
+ title: হালকা পেলোড
+ desc: JSON, SOAP XML এনভেলাপের (envelopes) চেয়ে বেশি কম্প্যাক্ট, যা ব্যান্ডউইথ (bandwidth) এবং পার্সিং ওভারহেড কমায়।
+- icon: "📐"
+ title: সহজ অ্যানোটেশন
+ desc: @GET, @Path, এবং @Produces WSDL, @WebService, এবং @WebMethod-এর আনুষ্ঠানিকতাকে প্রতিস্থাপন করে।
+- icon: "🔌"
+ title: মাইক্রোসার্ভিস-রেডি
+ desc: ক্লাউড-নেটিভ আর্কিটেকচারে সার্ভিস-টু-সার্ভিস কমিউনিকেশনের জন্য REST/JSON হলো স্ট্যান্ডার্ড।
+support:
+ description: জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/spring-api-versioning.yaml b/translations/content/bn/enterprise/spring-api-versioning.yaml
new file mode 100644
index 0000000..0c5c80f
--- /dev/null
+++ b/translations/content/bn/enterprise/spring-api-versioning.yaml
@@ -0,0 +1,18 @@
+---
+title: Spring Framework 7 API ভার্সনিং (Versioning)
+oldApproach: ম্যানুয়াল ইউআরএল পাথ ভার্সনিং
+modernApproach: নেটিভ API ভার্সনিং
+summary: Spring Framework 7-এর নেটিভ API ভার্সনিং সাপোর্ট ব্যবহার করে ডুপ্লিকেটেড ভার্সন-প্রিফিক্সড কন্ট্রোলার (version-prefixed controllers) প্রতিস্থাপন করুন।
+explanation: Spring Framework 7 এর আগে, API ভার্সনিংয়ের জন্য প্রতি ভার্সনের জন্য আলাদা কন্ট্রোলার ক্লাস (যেমন /api/v1/products, /api/v2/products) প্রয়োজন হতো, যা রিকোয়েস্ট ম্যাপিংকে ডুপ্লিকেট করত এবং ভার্সনিং লজিককে বিভিন্ন ফাইলে ছড়িয়ে দিত। Spring Framework 7, @RequestMapping এবং সম্পর্কিত অ্যানোটেশনগুলোতে একটি নতুন ভার্সন অ্যাট্রিবিউট যোগ করে নেটিভ ভার্সনিং প্রবর্তন করেছে, সাথে WebMvcConfigurer-এ একটি configureApiVersioning হুকও রয়েছে। ভার্সনটি রিকোয়েস্ট হেডার, একটি ইউআরএল পাথ সেগমেন্ট, বা একটি কোয়েরি প্যারামিটার থেকে সমাধান করা যায় – সবই এক জায়গা থেকে নিয়ন্ত্রিত।
+whyModernWins:
+- icon: "🗂️"
+ title: কন্ট্রোলার ডুপ্লিকেশন নেই
+ desc: সব ভার্সন একটি কন্ট্রোলার ক্লাসেই থাকে; শুধুমাত্র ইন্ডিভিজুয়াল হ্যান্ডলার মেথডগুলো একটি ভার্সন অ্যাট্রিবিউট বহন করে।
+- icon: "⚙️"
+ title: সেন্ট্রালাইজড ভার্সন স্ট্র্যাটেজি
+ desc: একটি সিঙ্গেল configureApiVersioning কল ব্যবহার করে হেডার থেকে ইউআরএল বা কোয়েরি-প্যারাম ভার্সনিংয়ে স্যুইচ করুন।
+- icon: "📈"
+ title: ইনক্রিমেন্টাল ইভোলিউশন
+ desc: সম্পর্কহীন এন্ডপয়েন্ট স্পর্শ না করে বা নতুন কন্ট্রোলার ফাইল তৈরি না করে একটি মেথডে একটি নতুন ভার্সন যোগ করুন।
+support:
+ description: Spring Framework 7.0 থেকে উপলব্ধ (Java 17+ প্রয়োজন)
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/spring-null-safety-jspecify.yaml b/translations/content/bn/enterprise/spring-null-safety-jspecify.yaml
new file mode 100644
index 0000000..8a4bcc7
--- /dev/null
+++ b/translations/content/bn/enterprise/spring-null-safety-jspecify.yaml
@@ -0,0 +1,18 @@
+---
+title: JSpecify সহ Spring Null Safety
+oldApproach: Spring @NonNull/@Nullable
+modernApproach: JSpecify @NullMarked
+summary: Spring 7 JSpecify অ্যানোটেশন গ্রহণ করেছে, যা নন-নালকে ডিফল্ট করে এবং অ্যানোটেশনের সংখ্যা কমিয়ে আসে।
+explanation: Spring 5 এবং 6 `org.springframework.lang` প্যাকেজে তাদের নিজস্ব Null Safety অ্যানোটেশন চালু করেছিল। যদিও সেগুলো উপকারী ছিল, কিন্তু ফ্রেমওয়ার্ক-নির্দিষ্ট ছিল এবং প্রতিটি নন-নাল এলিমেন্টকে স্পষ্টভাবে অ্যানোটেট (annotate) করার প্রয়োজন হতো। Spring 7 JSpecify-তে মাইগ্রেট করেছে, যা Null Safety-এর জন্য একটি ক্রস-ইকোসিস্টেম স্ট্যান্ডার্ড। `@NullMarked` অ্যানোটেশন ক্লাস বা প্যাকেজ লেভেলে ঘোষণা করে যে, ডিফল্টরূপে সমস্ত আনঅ্যানোটেটেড টাইপ নন-নাল। শুধুমাত্র প্রকৃত নালএবল টাইপগুলির জন্য `@Nullable` অ্যানোটেশন প্রয়োজন, যা কোডের ভার্বোসিটি (verbosity) উল্লেখযোগ্যভাবে হ্রাস করে। JSpecify অ্যানোটেশনগুলি NullAway, Error Prone এবং IntelliJ IDEA-এর মতো প্রধান স্ট্যাটিক অ্যানালাইসিস টুল দ্বারা স্বীকৃত, যা Spring-নির্দিষ্ট অ্যানোটেশনগুলোর চেয়ে আরও সমৃদ্ধ টুলিং সাপোর্ট নিয়ে আসে।
+whyModernWins:
+- icon: "✂️"
+ title: ডিফল্টরূপে নন-নাল
+ desc: @NullMarked সমস্ত আনঅ্যানোটেটেড টাইপকে নন-নাল করে তোলে, তাই শুধুমাত্র নালএবল (nullable) ব্যতিক্রমগুলির জন্য অ্যানোটেশন প্রয়োজন।
+- icon: "🌐"
+ title: ইকোসিস্টেম স্ট্যান্ডার্ড
+ desc: JSpecify অ্যানোটেশনগুলো NullAway, Error Prone এবং IDEs দ্বারা স্বীকৃত একটি ক্রস-ফ্রেমওয়ার্ক স্ট্যান্ডার্ড।
+- icon: "🔍"
+ title: সমৃদ্ধ টুলিং
+ desc: আধুনিক স্ট্যাটিক অ্যানালাইজারগুলো JSpecify-এর নাল মডেল বোঝে এবং কম্পাইল টাইমে ভায়োলেশনের (violations) রিপোর্ট করে।
+support:
+ description: Spring Framework 7.0 থেকে উপলব্ধ (Java 17+ প্রয়োজন)
\ No newline at end of file
diff --git a/translations/content/bn/enterprise/spring-xml-config-vs-annotations.yaml b/translations/content/bn/enterprise/spring-xml-config-vs-annotations.yaml
new file mode 100644
index 0000000..d3513ad
--- /dev/null
+++ b/translations/content/bn/enterprise/spring-xml-config-vs-annotations.yaml
@@ -0,0 +1,18 @@
+---
+title: Spring XML বিন কনফিগ বনাম অ্যানোটেশন-ড্রাইভেন (Annotation-Driven)
+oldApproach: XML বিন ডেফিনিশন
+modernApproach: অ্যানোটেশন-ড্রাইভেন বিনস (Annotation-Driven Beans)
+summary: Spring Boot-এ ভার্বোস Spring XML বিন ডেফিনিশনের পরিবর্তে সংক্ষিপ্ত অ্যানোটেশন-ড্রাইভেন কনফিগারেশন ব্যবহার করুন।
+explanation: ঐতিহ্যবাহী Spring অ্যাপ্লিকেশনগুলোতে XML কনফিগারেশন ফাইলগুলির মাধ্যমে বিন যুক্ত করা হতো, যেখানে প্রতিটি ক্লাস এবং এর ডিপেন্ডেন্সিগুলোকে ভার্বোস
এলিমেন্ট হিসেবে ডিক্লেয়ার করা হতো। Spring 2.5 থেকে অ্যানোটেশন সাপোর্ট থাকলেও, Spring Boot অটো-কনফিগারেশন প্রবর্তন না করা পর্যন্ত XML-ই প্রধান অ্যাপ্রোচ ছিল। Spring Boot @Component, @Service, @Repository, এবং @Controller অ্যানোটেশনযুক্ত বিনগুলোকে ক্লাসপথ স্ক্যানিংয়ের মাধ্যমে শনাক্ত করে, কনস্ট্রাক্টর ইনজেকশনের মাধ্যমে স্বয়ংক্রিয়ভাবে ডিপেন্ডেন্সি পূরণ করে এবং ক্লাসপথ থেকে DataSource-এর মতো ইনফ্রাস্ট্রাকচার কনফিগার করে – এর ফলে সমস্ত XML ওয়্যারিং ফাইলের প্রয়োজন হয় না।
+whyModernWins:
+- icon: "🚫"
+ title: XML নেই
+ desc: @SpringBootApplication কম্পোনেন্ট স্ক্যানিং এবং অটো-কনফিগারেশন ট্রিগার করে, যার ফলে সমস্ত XML ওয়্যারিং ফাইলের প্রয়োজন দূর হয়।
+- icon: "💉"
+ title: কনস্ট্রাক্টর ইনজেকশন
+ desc: Spring স্বয়ংক্রিয়ভাবে কনস্ট্রাক্টরের মাধ্যমে ডিপেন্ডেন্সি ইনজেক্ট করে, যা বিনগুলোকে সহজে টেস্ট এবং বোঝা যায়।
+- icon: "⚡"
+ title: অটো-কনফিগারেশন (Auto-configuration)
+ desc: Spring Boot জিরো বয়লারপ্লেট সহ ক্লাসপথ থেকে DataSource, JPA, এবং অন্যান্য ইনফ্রাস্ট্রাকচার কনফিগার করে।
+support:
+ description: Spring Boot 1.0 (এপ্রিল 2014) থেকে ব্যাপকভাবে উপলব্ধ; Spring Boot 3 এর জন্য Java 17+ প্রয়োজন
\ No newline at end of file
diff --git a/translations/content/bn/errors/helpful-npe.yaml b/translations/content/bn/errors/helpful-npe.yaml
new file mode 100644
index 0000000..1d407ae
--- /dev/null
+++ b/translations/content/bn/errors/helpful-npe.yaml
@@ -0,0 +1,18 @@
+---
+title: হেল্পফুল NullPointerExceptions
+oldApproach: ক্রিপ্টিক NPE
+modernApproach: ডিটেইলড NPE
+summary: JVM স্বয়ংক্রিয়ভাবে আপনাকে দেখিয়ে দেবে কোন ভ্যারিয়েবলটি null ছিল।
+explanation: হেল্পফুল NPEs মেথডটি কোন এক্সপ্রেশনটি null ছিল এবং কোন অপারেশন ব্যর্থ হয়েছে, তা বর্ণনা করে। Java 14 থেকে এটি ডিফল্টভাবে এনাবল থাকে – এর জন্য কোনো কোড পরিবর্তনের প্রয়োজন নেই, শুধু JDK আপগ্রেড করলেই হবে।
+whyModernWins:
+- icon: "🔍"
+ title: সঠিক ভ্যারিয়েবল
+ desc: এরর মেসেজে চেইনে থাকা null ভ্যারিয়েবলটির নাম উল্লেখ থাকে।
+- icon: "⚡"
+ title: দ্রুত ডিবাগিং (Debugging)
+ desc: ৫টি চেইনড কলের মধ্যে কোনটি null ছিল তা নিয়ে আর অনুমান করতে হবে না।
+- icon: "🆓"
+ title: ফ্রি আপগ্রেড
+ desc: কোনো কোড পরিবর্তন ছাড়াই JDK 14+ এ রান করুন।
+support:
+ description: JDK 14 (মার্চ 2020) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/errors/multi-catch.yaml b/translations/content/bn/errors/multi-catch.yaml
new file mode 100644
index 0000000..2993636
--- /dev/null
+++ b/translations/content/bn/errors/multi-catch.yaml
@@ -0,0 +1,18 @@
+---
+title: মাল্টি-ক্যাচ এক্সেপশন হ্যান্ডলিং (Multi-catch Exception Handling)
+oldApproach: আলাদা ক্যাচ ব্লক
+modernApproach: মাল্টি-ক্যাচ
+summary: একটি সিঙ্গেল ক্যাচ ব্লকে একাধিক এক্সেপশন টাইপ (exception types) হ্যান্ডেল করুন।
+explanation: মাল্টি-ক্যাচ (Multi-catch) একই কোড ব্যবহার করে একাধিক এক্সেপশন টাইপ হ্যান্ডেল করতে পারে। এখানে এক্সেপশন ভ্যারিয়েবলটি এফেক্টিভলি ফাইনাল (effectively final) থাকে, তাই আপনি কোনো র্যাপিং ছাড়াই এটি রিথ্রো (rethrow) করতে পারবেন।
+whyModernWins:
+- icon: "📏"
+ title: DRY (Don't Repeat Yourself)
+ desc: একই হ্যান্ডলিং লজিক তিনবারের পরিবর্তে একবার লেখা হয়।
+- icon: "🔄"
+ title: রিথ্রোয়েবল (Rethrowable)
+ desc: ক্যাচ করা এক্সেপশনটিকে তার সঠিক টাইপ সহ পুনরায় থ্রো করা যায়।
+- icon: "📖"
+ title: স্ক্যানেবল (Scannable)
+ desc: সব হ্যান্ডেল করা টাইপ এক জায়গায় স্পষ্টভাবে দেখা যায়।
+support:
+ description: JDK 7 (জুলাই 2011) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/errors/null-in-switch.yaml b/translations/content/bn/errors/null-in-switch.yaml
new file mode 100644
index 0000000..6df1293
--- /dev/null
+++ b/translations/content/bn/errors/null-in-switch.yaml
@@ -0,0 +1,18 @@
+---
+title: সুইচ-এ null কেইস (Null case in switch)
+oldApproach: সুইচ-এর আগে গার্ড (Guard Before Switch)
+modernApproach: case null
+summary: সরাসরি একটি সুইচ কেইস হিসেবে null হ্যান্ডেল করুন – আলাদা গার্ডের প্রয়োজন নেই।
+explanation: প্যাটার্ন ম্যাচিং সুইচ (Pattern matching switch) একটি কেইস লেবেল (case label) হিসেবে null-কে ম্যাচ করতে পারে। এটি সুইচের আগে null চেক করার প্রয়োজনীয়তা দূর করে এবং null হ্যান্ডলিংকে সুস্পষ্ট ও ভিজিবল করে তোলে।
+whyModernWins:
+- icon: "🎯"
+ title: সুস্পষ্ট
+ desc: null হ্যান্ডলিং সরাসরি সুইচের মধ্যেই দৃশ্যমান।
+- icon: "🛡️"
+ title: কোনো NPE নেই
+ desc: একটি null ভ্যালুর উপর সুইচ করলে NullPointerException থ্রো (throw) হবে না।
+- icon: "📐"
+ title: অল-ইন-ওয়ান (All-in-one)
+ desc: null সহ সমস্ত কেইস একটি সিঙ্গেল সুইচ এক্সপ্রেশনে থাকে।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/errors/optional-chaining.yaml b/translations/content/bn/errors/optional-chaining.yaml
new file mode 100644
index 0000000..40fc791
--- /dev/null
+++ b/translations/content/bn/errors/optional-chaining.yaml
@@ -0,0 +1,18 @@
+---
+title: অপশনাল চেইনিং (Optional Chaining)
+oldApproach: নেস্টেড Null চেক
+modernApproach: অপশনাল পাইপলাইন (Optional Pipeline)
+summary: নেস্টেড null চেকগুলোকে একটি অপশনাল পাইপলাইন দিয়ে প্রতিস্থাপন করুন।
+explanation: Optional.map() মেথডটি null ভ্যালুগুলোর মধ্যে চেইন তৈরি করে এবং প্রথম null এ পৌঁছালে শর্ট-সার্কিট (short-circuiting) করে। orElse() মেথডটি ডিফল্ট ভ্যালু প্রদান করে। এটি পিরামিড-অব-ডুম (pyramid-of-doom) null চেকিং দূর করে।
+whyModernWins:
+- icon: "🔗"
+ title: চেইনেবল (Chainable)
+ desc: প্রতিটি .map() স্টেপ null ভ্যালুকে স্বচ্ছভাবে হ্যান্ডেল করে।
+- icon: "📖"
+ title: লিনিয়ার ফ্লো (Linear Flow)
+ desc: নেস্টেড if-ব্লকের পরিবর্তে বাম থেকে ডানে (left-to-right) পঠনযোগ্য ফ্লো।
+- icon: "🛡️"
+ title: NPE-প্রুফ
+ desc: প্রতিটি ধাপে null হ্যান্ডেল করা হয় – কোনো ক্র্যাশ হওয়া সম্ভব নয়।
+support:
+ description: JDK 8+ থেকে উপলব্ধ (9+ এ উন্নত)
\ No newline at end of file
diff --git a/translations/content/bn/errors/optional-orelsethrow.yaml b/translations/content/bn/errors/optional-orelsethrow.yaml
new file mode 100644
index 0000000..ab2bc91
--- /dev/null
+++ b/translations/content/bn/errors/optional-orelsethrow.yaml
@@ -0,0 +1,18 @@
+---
+title: সরবরাহকারী ছাড়া Optional.orElseThrow()
+oldApproach: get() অথবা orElseThrow(supplier)
+modernApproach: orElseThrow()
+summary: get()-এর একটি সুস্পষ্ট, উদ্দেশ্য-প্রকাশক বিকল্প হিসাবে Optional.orElseThrow() ব্যবহার করুন।
+explanation: Optional.get() কে সাধারণত "কোড স্মেল" (code smell) হিসাবে বিবেচনা করা হয় কারণ এটি ফেইলুরের সম্ভাবনা লুকিয়ে রাখে। Java 10-এ যুক্ত হওয়া no-arg orElseThrow() মেথডটি ঠিক একই কাজ করে, তবে এটি ডেভেলপারদের উদ্দেশ্যকে স্পষ্টভাবে প্রকাশ করে যে, তারা একটি ভ্যালু আশা করছে এবং যদি তা না থাকে তবে একটি এক্সেপশন চাই।
+whyModernWins:
+- icon: "📖"
+ title: স্ব-ডকুমেন্টিং (Self-documenting)
+ desc: orElseThrow() স্পষ্টভাবে নির্দেশ করে যে, ভ্যালুর অনুপস্থিতি অপ্রত্যাশিত।
+- icon: "🔒"
+ title: get() এড়িয়ে যায়
+ desc: স্ট্যাটিক অ্যানালাইসিস টুলস get() মেথডকে ঝুঁকিপূর্ণ হিসাবে চিহ্নিত করে; orElseThrow() একটি ইডিওম্যাটিক (idiomatic) সমাধান।
+- icon: "⚡"
+ title: কম বয়লারপ্লেট (Less Boilerplate)
+ desc: ডিফল্ট NoSuchElementException-এর জন্য সাপ্লায়ার পাস করার প্রয়োজন নেই।
+support:
+ description: JDK 10 (মার্চ 2018) থেকে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/errors/record-based-errors.yaml b/translations/content/bn/errors/record-based-errors.yaml
new file mode 100644
index 0000000..a6b42f8
--- /dev/null
+++ b/translations/content/bn/errors/record-based-errors.yaml
@@ -0,0 +1,18 @@
+---
+title: রেকর্ড-ভিত্তিক এরর রেসপন্স (Record-based Error Responses)
+oldApproach: ম্যাপ (Map) বা ভার্বোস ক্লাস
+modernApproach: এরর রেকর্ডস (Error Records)
+summary: সংক্ষিপ্ত, ইমিউটেবল এরর রেসপন্স টাইপের জন্য রেকর্ড ব্যবহার করুন।
+explanation: রেকর্ডগুলো এরর রেসপন্সের জন্য একদম পারফেক্ট – এগুলো ইমিউটেবল, তুলনা করার জন্য বিল্ট-ইন equals/hashCode থাকে এবং লগিংয়ের জন্য toString মেথড থাকে। কাস্টম কনস্ট্রাক্টরগুলো (custom constructors) ভ্যালিডেশন বা ডিফল্ট যোগ করতে পারে।
+whyModernWins:
+- icon: "📏"
+ title: সুসংক্ষিপ্ত
+ desc: ৩০ লাইনের পরিবর্তে ৩ লাইনেই এরর টাইপ ডিফাইন করুন।
+- icon: "🔒"
+ title: ইমিউটেবল (Immutable)
+ desc: এরর ডেটা তৈরির পর ভুলবশত পরিবর্তন করা যাবে না।
+- icon: "📋"
+ title: অটো toString
+ desc: লগিংয়ের জন্য উপযুক্ত – স্বয়ংক্রিয়ভাবে সব ফিল্ড দেখায়।
+support:
+ description: JDK 16 (মার্চ 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/errors/require-nonnull-else.yaml b/translations/content/bn/errors/require-nonnull-else.yaml
new file mode 100644
index 0000000..d8b4ca5
--- /dev/null
+++ b/translations/content/bn/errors/require-nonnull-else.yaml
@@ -0,0 +1,18 @@
+---
+title: Objects.requireNonNullElse()
+oldApproach: টারনারি Null চেক
+modernApproach: requireNonNullElse()
+summary: একটি পরিষ্কার ডিফল্ট ভ্যালু সহ একটি নন-নাল ভ্যালু (non-null value) পান, কোনো টারনারি (ternary) এর প্রয়োজন নেই।
+explanation: requireNonNullElse মেথডটি প্রথম আর্গুমেন্টটি নন-নাল হলে সেটি রিটার্ন করে, অন্যথায় দ্বিতীয় আর্গুমেন্টটি রিটার্ন করে। ডিফল্ট ভ্যালুটি নিজেই null হতে পারে না – যদি উভয়ই null হয়, তাহলে এটি NPE থ্রো করে, যা শুরুর দিকেই বাগ ধরতে সাহায্য করে।
+whyModernWins:
+- icon: "📖"
+ title: পরিষ্কার উদ্দেশ্য
+ desc: মেথডের নামটি এটি কী কাজ করে তা স্পষ্টভাবে বর্ণনা করে।
+- icon: "🛡️"
+ title: Null-সেফ ডিফল্ট
+ desc: ডিফল্ট ভ্যালুটিও null এর জন্য চেক করা হয়।
+- icon: "📏"
+ title: পঠনযোগ্য
+ desc: সহজ null-or-default লজিকের জন্য টারনারির চেয়ে এটি অনেক ভালো।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/io/deserialization-filters.yaml b/translations/content/bn/io/deserialization-filters.yaml
new file mode 100644
index 0000000..9c2d5fb
--- /dev/null
+++ b/translations/content/bn/io/deserialization-filters.yaml
@@ -0,0 +1,18 @@
+---
+title: ডিসিরিয়ালাইজেশন ফিল্টার (Deserialization Filters)
+oldApproach: সবকিছু মেনে নিন
+modernApproach: ObjectInputFilter
+summary: আক্রমণ প্রতিরোধের জন্য কোন ক্লাসগুলোকে ডিসিরিয়ালাইজ করা যাবে তা সীমাবদ্ধ করুন।
+explanation: ObjectInputFilter আপনাকে ক্লাসগুলোকে অ্যালাওলিস্ট/ডেনাইলিস্ট (allowlist/denylist) করতে, অবজেক্ট গ্রাফের গভীরতা, অ্যারের সাইজ এবং রেফারেন্স কাউন্ট লিমিট করতে দেয়। এটি কোনো এক্সটার্নাল লাইব্রেরি ছাড়াই ডিসিরিয়ালাইজেশন দুর্বলতার বিরুদ্ধে সুরক্ষা দেয়।
+whyModernWins:
+- icon: "🛡️"
+ title: নিরাপত্তা
+ desc: অপ্রত্যাশিত/ক্ষতিকর ক্লাসগুলির ডিসিরিয়ালাইজেশন প্রতিরোধ করে।
+- icon: "📐"
+ title: ফাইন-গ্রেইনড (Fine-grained)
+ desc: ডেপথ, অ্যারে সাইজ, রেফারেন্স এবং ক্লাস প্যাটার্ন কন্ট্রোল করুন।
+- icon: "🏗️"
+ title: JVM-ওয়াইড (JVM-wide)
+ desc: JVM-এর সমস্ত ডিসিরিয়ালাইজেশনের জন্য একটি গ্লোবাল ফিল্টার সেট করুন।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/io/file-memory-mapping.yaml b/translations/content/bn/io/file-memory-mapping.yaml
new file mode 100644
index 0000000..b5876ad
--- /dev/null
+++ b/translations/content/bn/io/file-memory-mapping.yaml
@@ -0,0 +1,18 @@
+---
+title: ফাইল মেমরি ম্যাপিং (File Memory Mapping)
+oldApproach: MappedByteBuffer
+modernApproach: Arena সহ MemorySegment
+summary: MemorySegment ব্যবহার করে 2GB এর চেয়ে বড় ফাইলগুলোকে ডিটারমিনিস্টিক ক্লিনআপ (deterministic cleanup) সহ ম্যাপ করুন।
+explanation: The Foreign Function & Memory API (JEP 454) নিরাপদ এবং দক্ষ মেমরি অ্যাক্সেসের জন্য MemorySegment প্রবর্তন করেছে। MappedByteBuffer-এর বিপরীতে, MemorySegment 2GB (Integer.MAX_VALUE) এর চেয়ে বড় ফাইলগুলোকে সাপোর্ট করে, Arena-এর মাধ্যমে ডিটারমিনিস্টিক ক্লিনআপ (deterministic cleanup) প্রদান করে এবং আধুনিক হার্ডওয়্যারের সাথে আরও ভালো পারফরম্যান্স দেয়।
+whyModernWins:
+- icon: "📏"
+ title: কোনো সাইজ লিমিট নেই
+ desc: কোনো ওয়ার্কআউট ছাড়াই 2GB এর চেয়ে বড় ফাইল ম্যাপ করা যায়।
+- icon: "🔒"
+ title: ডিটারমিনিস্টিক ক্লিনআপ
+ desc: Arena নিশ্চিত করে যে মেমরি স্কোপ এক্সিট (scope exit) করার সময় ফ্রি হয়, GC টাইমে নয়।
+- icon: "⚡"
+ title: উন্নত পারফরম্যান্স
+ desc: আধুনিক মেমরি মডেল এবং হার্ডওয়্যারের সাথে সামঞ্জস্যপূর্ণ।
+support:
+ description: JDK 22 (মার্চ 2024) থেকে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/io/files-mismatch.yaml b/translations/content/bn/io/files-mismatch.yaml
new file mode 100644
index 0000000..fe17c69
--- /dev/null
+++ b/translations/content/bn/io/files-mismatch.yaml
@@ -0,0 +1,18 @@
+---
+title: Files.mismatch()
+oldApproach: ম্যানুয়াল বাইট কম্পেয়ার
+modernApproach: Files.mismatch()
+summary: দুটি ফাইলকে মেমরিতে লোড না করেই দক্ষতার সাথে তুলনা করুন।
+explanation: Files.mismatch() মেথডটি প্রথম ভিন্ন বাইটের পজিশন রিটার্ন করে, অথবা ফাইলগুলো অভিন্ন হলে -1 রিটার্ন করে। এটি লেজি রিড (lazy read) করে এবং প্রথম পার্থক্যে শর্ট-সার্কিট (short-circuits) করে।
+whyModernWins:
+- icon: "⚡"
+ title: মেমরি-এফিশিয়েন্ট (Memory-efficient)
+ desc: এটি সম্পূর্ণ ফাইলকে বাইট অ্যারেতে লোড করে না।
+- icon: "🎯"
+ title: পার্থক্য চিহ্নিত করে
+ desc: প্রথম অমিলের সঠিক বাইট পজিশন রিটার্ন করে।
+- icon: "📏"
+ title: এক কল
+ desc: কোনো ম্যানুয়াল বাইট অ্যারে কম্পেয়ার লজিকের প্রয়োজন নেই।
+support:
+ description: JDK 12 (মার্চ 2019) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/io/http-client.yaml b/translations/content/bn/io/http-client.yaml
new file mode 100644
index 0000000..543af7f
--- /dev/null
+++ b/translations/content/bn/io/http-client.yaml
@@ -0,0 +1,18 @@
+---
+title: মডার্ন HTTP ক্লায়েন্ট (Modern HTTP client)
+oldApproach: HttpURLConnection
+modernApproach: HttpClient
+summary: পরিষ্কার, আধুনিক HTTP রিকোয়েস্টের (requests) জন্য বিল্ট-ইন HttpClient ব্যবহার করুন।
+explanation: HttpClient HTTP/1.1 এবং HTTP/2, অ্যাসিঙ্ক রিকোয়েস্ট, WebSocket, কাস্টম এক্সিকিউটর এবং কানেকশন পুলিং (connection pooling) সাপোর্ট করে। এর ফলে URLConnection কাস্ট করা বা InputStream ম্যানুয়ালি রিড করার আর প্রয়োজন নেই।
+whyModernWins:
+- icon: "📐"
+ title: বিল্ডার API (Builder API)
+ desc: রিকোয়েস্ট, হেডার এবং টাইমআউটের জন্য ফ্লুয়েন্ট বিল্ডার।
+- icon: "🔄"
+ title: HTTP/2 সাপোর্ট
+ desc: মাল্টিপ্লেক্সিং (multiplexing) এবং সার্ভার পুশ সহ বিল্ট-ইন HTTP/2।
+- icon: "⚡"
+ title: অ্যাসিঙ্ক রেডি (Async Ready)
+ desc: sendAsync() মেথডটি CompletableFuture রিটার্ন করে।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/io/inputstream-transferto.yaml b/translations/content/bn/io/inputstream-transferto.yaml
new file mode 100644
index 0000000..c9ddacb
--- /dev/null
+++ b/translations/content/bn/io/inputstream-transferto.yaml
@@ -0,0 +1,18 @@
+---
+title: InputStream.transferTo()
+oldApproach: ম্যানুয়াল কপি লুপ
+modernApproach: transferTo()
+summary: এক কল (call)-এই একটি InputStream থেকে OutputStream-এ ডেটা কপি করুন।
+explanation: transferTo() মেথডটি ইনপুট স্ট্রিম থেকে সমস্ত বাইট রিড করে এবং সেগুলোকে আউটপুট স্ট্রিমে রাইট করে। এখানে কোনো বাফার ম্যানেজমেন্ট বা লুপের প্রয়োজন নেই। এটি একটি অপ্টিমাইজড ইন্টারনাল বাফার (optimized internal buffer) ব্যবহার করে।
+whyModernWins:
+- icon: "📏"
+ title: এক লাইন
+ desc: একটি মেথড কল দিয়ে সম্পূর্ণ রিড/রাইট লুপ প্রতিস্থাপন করুন।
+- icon: "⚡"
+ title: অপ্টিমাইজড (Optimized)
+ desc: ইন্টারনাল বাফারের সাইজ পারফরম্যান্সের জন্য টিউন (tuned) করা হয়।
+- icon: "🛡️"
+ title: কোনো বাগ নেই
+ desc: বাফার ম্যানেজমেন্টে অফ-বাই-ওয়ান (off-by-one) এরর হওয়ার ঝুঁকি থাকে না।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/io/io-class-console-io.yaml b/translations/content/bn/io/io-class-console-io.yaml
new file mode 100644
index 0000000..cf70ba0
--- /dev/null
+++ b/translations/content/bn/io/io-class-console-io.yaml
@@ -0,0 +1,18 @@
+---
+title: কনসোল I/O-এর জন্য IO ক্লাস
+oldApproach: System.out / Scanner
+modernApproach: IO ক্লাস
+summary: নতুন IO ক্লাস কনসোল ইনপুট এবং আউটপুটের জন্য সহজ, সংক্ষিপ্ত মেথড সরবরাহ করে।
+explanation: Java 25 implicitly declared classes ফিচারের অংশ হিসেবে IO ক্লাস (java.io.IO) চালু করেছে। এটি println(), print(), readln(), এবং read()-এর মতো স্ট্যাটিক মেথড প্রদান করে, যা System.out এবং Scanner-এর ভার্বোস কম্বিনেশনকে প্রতিস্থাপন করে। IO.readln(prompt) একটি সিঙ্গেল কল-এই প্রম্পটিং (prompting) এবং রিডিং (reading) উভয়ই হ্যান্ডেল করে। ক্লাসটি স্বয়ংক্রিয়ভাবে কমপ্যাক্ট সোর্স ফাইলগুলোতে উপলব্ধ থাকে এবং ইম্পোর্ট (import) করার মাধ্যমে ট্র্যাডিশনাল ক্লাসগুলোতে ব্যবহার করা যায়।
+whyModernWins:
+- icon: "✨"
+ title: নাটকীয়ভাবে সহজ
+ desc: দুটি মেথড Scanner সেটআপ, প্রম্পটিং, রিডিং এবং ক্লিনআপের সাতটি লাইন প্রতিস্থাপন করে।
+- icon: "🔒"
+ title: কোনো রিসোর্স লিক নেই
+ desc: ক্লোজ করার জন্য কোনো Scanner নেই – IO মেথডগুলো ইন্টারনালি রিসোর্স ম্যানেজমেন্ট হ্যান্ডেল করে।
+- icon: "🎓"
+ title: নতুনদের জন্য সহজ
+ desc: নতুন ডেভেলপাররা Scanner, System.out, বা ইম্পোর্ট স্টেটমেন্ট শেখা ছাড়াই কনসোল I/O করতে পারে।
+support:
+ description: implicitly declared classes (JEP 495) এর অংশ হিসাবে JDK 25-এ প্রিভিউ
\ No newline at end of file
diff --git a/translations/content/bn/io/path-of.yaml b/translations/content/bn/io/path-of.yaml
new file mode 100644
index 0000000..9592176
--- /dev/null
+++ b/translations/content/bn/io/path-of.yaml
@@ -0,0 +1,18 @@
+---
+title: Path.of() ফ্যাক্টরি
+oldApproach: Paths.get()
+modernApproach: Path.of()
+summary: Path ইন্টারফেসে থাকা আধুনিক ফ্যাক্টরি মেথড Path.of() ব্যবহার করুন।
+explanation: Path.of() হলো একটি ফ্যাক্টরি মেথড যা সরাসরি Path ইন্টারফেসে যোগ করা হয়েছে, যা আলাদা Paths ইউটিলিটি ক্লাসকে প্রতিস্থাপন করে। এটি List.of(), Map.of() ইত্যাদির মতো বেশি ডিসকভারেবল (discoverable) এবং কনসিস্টেন্ট (consistent)।
+whyModernWins:
+- icon: "📐"
+ title: সামঞ্জস্যপূর্ণ API
+ desc: List.of(), Set.of() এর মতো .of() ফ্যাক্টরি প্যাটার্ন অনুসরণ করে।
+- icon: "📖"
+ title: ডিসকভারেবল (Discoverable)
+ desc: এটি Path টাইপের মধ্যেই পাওয়া যায়, আলাদা Paths ক্লাসে নয়।
+- icon: "🧹"
+ title: একটি ক্লাস কম
+ desc: Paths ইউটিলিটি ক্লাস ইম্পোর্ট করার প্রয়োজন নেই।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/io/reading-files.yaml b/translations/content/bn/io/reading-files.yaml
new file mode 100644
index 0000000..7cb4619
--- /dev/null
+++ b/translations/content/bn/io/reading-files.yaml
@@ -0,0 +1,18 @@
+---
+title: ফাইল রিডিং (Reading Files)
+oldApproach: BufferedReader
+modernApproach: Files.readString()
+summary: একটি সিঙ্গেল লাইন ব্যবহার করে একটি সম্পূর্ণ ফাইলকে স্ট্রিং (String)-এ রিড করুন।
+explanation: Files.readString() মেথডটি একটি ফাইলের সম্পূর্ণ কন্টেন্টকে একটি স্ট্রিং-এ রিড করে। এটি এনকোডিং (ডিফল্টরূপে UTF-8) এবং রিসোর্স ক্লিনআপ হ্যান্ডেল করে। বড় ফাইলগুলোর ক্ষেত্রে, লেজি স্ট্রিমিংয়ের জন্য Files.lines() ব্যবহার করুন।
+whyModernWins:
+- icon: "📏"
+ title: এক লাইন
+ desc: BufferedReader বয়লারপ্লেটের ৮টি লাইন প্রতিস্থাপন করে।
+- icon: "🧹"
+ title: অটো ক্লিনআপ (Auto Cleanup)
+ desc: ফাইল হ্যান্ডেল স্বয়ংক্রিয়ভাবে ক্লোজড হয়।
+- icon: "🌐"
+ title: UTF-8 ডিফল্ট
+ desc: ডিফল্টরূপে সঠিক এনকোডিং – কোনো ক্যারেক্টার সেট (charset) বিভ্রান্তি থাকে না।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/io/try-with-resources-effectively-final.yaml b/translations/content/bn/io/try-with-resources-effectively-final.yaml
new file mode 100644
index 0000000..2904699
--- /dev/null
+++ b/translations/content/bn/io/try-with-resources-effectively-final.yaml
@@ -0,0 +1,18 @@
+---
+title: ট্রাই-উইথ-রিসোর্স ইমপ্রুভমেন্ট (Try-with-resources Improvement)
+oldApproach: ভ্যারিয়েবল পুনরায় ডিক্লেয়ার
+modernApproach: এফেক্টিভলি ফাইনাল (Effectively Final)
+summary: ট্রাই-উইথ-রিসোর্সেস (try-with-resources) ব্যবহার করে বিদ্যমান এফেক্টিভলি-ফাইনাল ভ্যারিয়েবলগুলোকে সরাসরি ব্যবহার করুন।
+explanation: Java 9 এফেক্টিভলি-ফাইনাল ভ্যারিয়েবলগুলোকে পুনরায় ডিক্লেয়ার (re-declaration) ছাড়াই সরাসরি ট্রাই-উইথ-রিসোর্সেস-এ ব্যবহার করার অনুমতি দেয়। রিসোর্সটি ট্রাই ব্লকের বাইরে তৈরি করা হলে এটি আরও পরিষ্কার হয়।
+whyModernWins:
+- icon: "🧹"
+ title: কোনো ভ্যারিয়েবল পুনরায় ডিক্লেয়ারের প্রয়োজন নেই
+ desc: বিদ্যমান ভ্যারিয়েবলের নাম সরাসরি ব্যবহার করুন।
+- icon: "📖"
+ title: কম বিভ্রান্তি
+ desc: ট্রাই ব্লকের ভিতরে কোনো আলাদা ভ্যারিয়েবল নাম ব্যবহার করতে হয় না।
+- icon: "📏"
+ title: সুসংক্ষিপ্ত
+ desc: কম লাইন কোড, একই রিসোর্স সেফটি (resource safety)।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/io/writing-files.yaml b/translations/content/bn/io/writing-files.yaml
new file mode 100644
index 0000000..1671606
--- /dev/null
+++ b/translations/content/bn/io/writing-files.yaml
@@ -0,0 +1,18 @@
+---
+title: ফাইল রাইটিং (Writing Files)
+oldApproach: FileWriter + BufferedWriter
+modernApproach: Files.writeString()
+summary: একটি সিঙ্গেল লাইন ব্যবহার করে একটি স্ট্রিং (String) ফাইল এ রাইট করুন।
+explanation: Files.writeString() মেথডটি ডিফল্টরূপে UTF-8 এনকোডিং সহ একটি ফাইলে কন্টেন্ট রাইট করে। অপশনগুলো অ্যাপেন্ড (appending), তৈরি করা (creating) ইত্যাদির জন্য পাস করা যেতে পারে।
+whyModernWins:
+- icon: "📏"
+ title: এক লাইন
+ desc: এখানে রাইটার র্যাপিং (writer wrapping) বা ট্রাই-উইথ-রিসোর্সেসের (try-with-resources) প্রয়োজন নেই।
+- icon: "🛡️"
+ title: সেফ ডিফল্টস
+ desc: UTF-8 এনকোডিং, সঠিক ফাইল হ্যান্ডেল ক্লিনআপ।
+- icon: "🔧"
+ title: অপশনস
+ desc: অ্যাপেন্ড (append), ক্রিয়েট (create) ইত্যাদির জন্য OpenOption ফ্ল্যাগ পাস করুন।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/call-c-from-java.yaml b/translations/content/bn/language/call-c-from-java.yaml
new file mode 100644
index 0000000..182ea1b
--- /dev/null
+++ b/translations/content/bn/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: Java থেকে C কোড কল করা
+oldApproach: JNI (Java Native Interface)
+modernApproach: FFM (Foreign Function & Memory API)
+summary: FFM জাভাকে JNI বয়লারপ্লেট বা C-সাইডে Java জ্ঞান ছাড়াই সরাসরি C লাইব্রেরি কল করতে দেয়।
+explanation: "Java-তে নেটিভ C/C++ কোড কল করার দুটি পদ্ধতি রয়েছে: ঐতিহ্যগত JNI এবং আধুনিক FFM API। JNI-এর সাথে, আপনি একটি মেথড native হিসেবে ঘোষণা করেন, C হেডার ফাইল তৈরি করতে javac -h চালান, তারপর কষ্টকর JNI C API (JNIEnv, jstring ইত্যাদি) ব্যবহার করে ফাংশন ইমপ্লিমেন্ট করেন। Java 22-এ স্ট্যান্ডার্ড API হিসেবে প্রবর্তিত FFM এই সব বাদ দেয়: C কোড শুধু সাধারণ C — কোনো JNI কনভেনশন প্রয়োজন নেই। এটি পরিবর্তন ছাড়াই বিদ্যমান C/C++ লাইব্রেরি কল করা অনেক সহজ করে তোলে। Java সাইড নিরাপদ অফ-হিপ মেমরি ম্যানেজমেন্টের জন্য Arena এবং ডাউনকলের জন্য MethodHandle ব্যবহার করে, যা নমনীয়তা এবং নিরাপত্তা উভয়ই নিশ্চিত করে।"
+whyModernWins:
+- icon: "👁"
+ title: C কোড সাদামাটা C-ই থাকে
+ desc: C ফাংশনে কোনো JNI অ্যানোটেশন বা JNIEnv বয়লারপ্লেট প্রয়োজন নেই — যেকোনো বিদ্যমান C লাইব্রেরি যেমন আছে তেমনি কল করা যায়।
+- icon: "⚡"
+ title: আরও নমনীয়
+ desc: অ্যাডাপ্টার কোড লেখা বা হেডার ফাইল তৈরি না করেই বেশিরভাগ বিদ্যমান C/C++ লাইব্রেরি সরাসরি কল করুন।
+- icon: "🛠️"
+ title: সহজতর ওয়ার্কফ্লো
+ desc: "থামার, javac -h চালানোর এবং জেনারেটেড .h ফাইলে সংজ্ঞায়িত ইন্টারফেস ইমপ্লিমেন্ট করার প্রয়োজন নেই।"
+support:
+ description: JDK 22-এ মানসম্পন্ন (মার্চ 2024); পূর্বে JDK 14 থেকে ইনকিউবেটিং
diff --git a/translations/content/bn/language/compact-canonical-constructor.yaml b/translations/content/bn/language/compact-canonical-constructor.yaml
new file mode 100644
index 0000000..c27434d
--- /dev/null
+++ b/translations/content/bn/language/compact-canonical-constructor.yaml
@@ -0,0 +1,18 @@
+---
+title: কমপ্যাক্ট ক্যানোনিকাল কনস্ট্রাক্টর (Compact Canonical Constructor)
+oldApproach: এক্সপ্লিসিট কনস্ট্রাক্টর ভ্যালিডেশন
+modernApproach: কমপ্যাক্ট কনস্ট্রাক্টর
+summary: প্যারামিটার লিস্ট রিপিট না করেই রেকর্ড ফিল্ডগুলোকে ভ্যালিডেট (validate) এবং নরমালাইজ (normalize) করুন।
+explanation: রেকর্ডগুলো একটি কমপ্যাক্ট ক্যানোনিকাল কনস্ট্রাক্টর ডিক্লেয়ার (declare) করতে পারে, যা প্যারামিটার লিস্ট এবং ফিল্ড অ্যাসাইনমেন্ট বাদ দেয়। আপনার ভ্যালিডেশন লজিক রান করার পর কম্পাইলার স্বয়ংক্রিয়ভাবে ফিল্ডগুলোতে প্যারামিটার অ্যাসাইন করে। এটি প্রিকন্ডিশন চেক, ডিফেন্সিভ কপি এবং নরমালাইজেশনের জন্য আদর্শ।
+whyModernWins:
+- icon: "✂️"
+ title: কম রিপিটেশন (Less Repetition)
+ desc: প্যারামিটার লিস্ট রিপিট করা বা ম্যানুয়ালি প্রতিটি ফিল্ড অ্যাসাইন করার প্রয়োজন নেই।
+- icon: "🛡️"
+ title: ভ্যালিডেশন
+ desc: null চেক, রেঞ্জ ভ্যালিডেশন এবং ডিফেন্সিভ কপির জন্য পারফেক্ট।
+- icon: "📖"
+ title: সুস্পষ্ট উদ্দেশ্য
+ desc: কমপ্যাক্ট সিনট্যাক্স বয়লারপ্লেটের (boilerplate) পরিবর্তে ভ্যালিডেশনের উপর জোর দেয়।
+support:
+ description: JDK 16 (মার্চ 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/compact-source-files.yaml b/translations/content/bn/language/compact-source-files.yaml
new file mode 100644
index 0000000..f331f80
--- /dev/null
+++ b/translations/content/bn/language/compact-source-files.yaml
@@ -0,0 +1,18 @@
+---
+title: কমপ্যাক্ট সোর্স ফাইল (Compact Source Files)
+oldApproach: মেইন ক্লাস সেরিমনি
+modernApproach: void main()
+summary: ক্লাস ডিক্লারেশন বা পাবলিক স্ট্যাটিক ভয়েড মেইন (public static void main) ছাড়াই একটি সম্পূর্ণ প্রোগ্রাম লিখুন।
+explanation: কমপ্যাক্ট সোর্স ফাইলগুলো সহজ প্রোগ্রামিংয়ের জন্য ক্লাস ডিক্লারেশন এবং মেইন মেথড সিগনেচারের আনুষ্ঠানিকতা দূর করে। java.io.IO এর ইম্প্লিসিট (implicit) ইম্পোর্টের সাথে মিলিত হয়ে, এমনকি println সরাসরি ব্যবহার করা যায়।
+whyModernWins:
+- icon: "🚀"
+ title: জিরো সেরিমনি (Zero Ceremony)
+ desc: কোনো ক্লাস, পাবলিক স্ট্যাটিক ভয়েড মেইন, বা String[] args-এর প্রয়োজন নেই।
+- icon: "🎓"
+ title: নতুনদের জন্য সহজ
+ desc: নতুন প্রোগ্রামাররা প্রথম লাইন থেকেই কার্যকরী কোড লিখতে পারে।
+- icon: "📝"
+ title: স্ক্রিপ্ট-এর মতো
+ desc: দ্রুত প্রোটোটাইপ, স্ক্রিপ্ট এবং উদাহরণের জন্য পারফেক্ট।
+support:
+ description: JDK 25 LTS (JEP 512, সেপ্টেম্বর 2025) এ চূড়ান্ত হয়েছে।
\ No newline at end of file
diff --git a/translations/content/bn/language/default-interface-methods.yaml b/translations/content/bn/language/default-interface-methods.yaml
new file mode 100644
index 0000000..41158b0
--- /dev/null
+++ b/translations/content/bn/language/default-interface-methods.yaml
@@ -0,0 +1,18 @@
+---
+title: ডিফল্ট ইন্টারফেস মেথড (Default Interface Methods)
+oldApproach: শেয়ারড বিহেভিওরের জন্য অ্যাবস্ট্র্যাক্ট ক্লাস (Abstract classes for shared behavior)
+modernApproach: ইন্টারফেসে ডিফল্ট মেথড (Default methods on interfaces)
+summary: ইন্টারফেসে সরাসরি মেথড ইমপ্লিমেন্টেশন যোগ করুন, যা বিহেভিওরের একাধিক ইনহেরিটেন্স (multiple inheritance) সক্ষম করে।
+explanation: জাভা 8 এর আগে, সম্পর্কহীন ক্লাসগুলোর মধ্যে বিহেভিওর শেয়ার করার জন্য অ্যাবস্ট্র্যাক্ট ক্লাসের প্রয়োজন হতো, যা আপনাকে সিঙ্গেল ইনহেরিটেন্সে সীমাবদ্ধ রাখত। ডিফল্ট মেথডগুলো ইন্টারফেসকে মেথড ইমপ্লিমেন্টেশন (method implementations) প্রদান করতে দেয়, ফলে ক্লাসগুলো একাধিক ইন্টারফেস থেকে বিহেভিওর ইনহেরিট করতে পারে। এটি বিদ্যমান ইমপ্লিমেন্টেশনগুলোকে ব্রেক না করেই কালেকশন API (যেমন List.forEach, Map.getOrDefault) ইভল্ভ করার জন্য অপরিহার্য ছিল।
+whyModernWins:
+- icon: "🔀"
+ title: মাল্টিপল ইনহেরিটেন্স (Multiple Inheritance)
+ desc: ক্লাসগুলো ডিফল্ট মেথড সহ একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, সিঙ্গেল অ্যাবস্ট্র্যাক্ট ক্লাস ইনহেরিটেন্সের বিপরীতে।
+- icon: "📦"
+ title: API ইভোলিউশন
+ desc: বিদ্যমান ইমপ্লিমেন্টেশনগুলোকে ব্রেক না করেই ইন্টারফেসগুলোতে নতুন মেথড যোগ করা যায়।
+- icon: "🧩"
+ title: কম্পোজেবল বিহেভিওর (Composable Behavior)
+ desc: একাধিক ইন্টারফেস থেকে ক্যাপাবিলিটিগুলো অবাধে মিক্স এবং ম্যাচ করা যায়।
+support:
+ description: JDK 8 (মার্চ 2014) থেকে উপলব্ধ।
\ No newline at end of file
diff --git a/translations/content/bn/language/diamond-operator.yaml b/translations/content/bn/language/diamond-operator.yaml
new file mode 100644
index 0000000..4680a21
--- /dev/null
+++ b/translations/content/bn/language/diamond-operator.yaml
@@ -0,0 +1,18 @@
+---
+title: অ্যানোনিমাস ক্লাস সহ ডায়মন্ড অপারেটর (Diamond with Anonymous Classes)
+oldApproach: টাইপ Args পুনরাবৃত্তি
+modernApproach: Diamond <>
+summary: ডায়মন্ড অপারেটর এখন অ্যানোনিমাস ক্লাসগুলোর (anonymous classes) সাথেও কাজ করে।
+explanation: Java 7-এ Diamond অপারেটর চালু করা হলেও এটি অ্যানোনিমাস ইনার ক্লাসগুলোর (anonymous inner classes) সাথে কাজ করত না। Java 9 এটি ঠিক করেছে, তাই আপনাকে আর রাইট-হ্যান্ড সাইডে টাইপ আর্গুমেন্টস (type arguments) রিপিট করার প্রয়োজন নেই।
+whyModernWins:
+- icon: "📏"
+ title: সামঞ্জস্যপূর্ণ নিয়ম (Consistent Rules)
+ desc: Diamond অপারেটর সব জায়গায় কাজ করে – কনস্ট্রাক্টর এবং অ্যানোনিমাস ক্লাসগুলোতে একইভাবে।
+- icon: "🧹"
+ title: কম রিডানডেন্সি (Less Redundancy)
+ desc: টাইপ আর্গুমেন্টস বাম দিকে একবার ডিক্লেয়ার করা হয়, আর পুনরাবৃত্তি করার প্রয়োজন নেই।
+- icon: "🔧"
+ title: DRY প্রিন্সিপাল (DRY Principle)
+ desc: কম্পাইলার ইতিমধ্যেই টাইপ জানে – তাহলে এটি দুইবার লেখার প্রয়োজন কী?
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে অ্যানোনিমাস ক্লাস সহ ডায়মন্ড অপারেটর।
\ No newline at end of file
diff --git a/translations/content/bn/language/exhaustive-switch.yaml b/translations/content/bn/language/exhaustive-switch.yaml
new file mode 100644
index 0000000..6d90209
--- /dev/null
+++ b/translations/content/bn/language/exhaustive-switch.yaml
@@ -0,0 +1,21 @@
+---
+title: ডিফল্ট ছাড়াই সম্পূর্ণ সুইচ
+oldApproach: বাধ্যতামূলক ডিফল্ট
+modernApproach: সিল করা নিঃশেষিততা
+summary: কম্পাইলার যাচাই করে যে সমস্ত সিল করা সাবটাইপ কভার করা হয়েছে — কোন ডিফল্টের
+ প্রয়োজন নেই।
+explanation: একটি সিল করা টাইপের উপর স্যুইচ করার সময়, কম্পাইলার সমস্ত সম্ভাব্য সাবটাইপগুলি
+ জানে এবং প্রতিটি কেস পরিচালনা করা হয়েছে তা যাচাই করে। আপনি যদি একটি নতুন সাব-টাইপ
+ যোগ করেন, কম্পাইলার এখন অসম্পূর্ণ প্রতিটি সুইচকে ফ্ল্যাগ করে।
+whyModernWins:
+- icon: "✅"
+ title: কম্পাইল-সময় নিরাপত্তা
+ desc: একটি নতুন সাবটাইপ যোগ করুন এবং কম্পাইলার আপডেট করার জন্য প্রতিটি জায়গা দেখায়।
+- icon: "\U0001F6AB"
+ title: কোন ডেড কোড নেই
+ desc: বাগ মাস্ক করে এমন কোনো ডিফল্ট শাখা নেই।
+- icon: "\U0001F4D0"
+ title: বীজগণিতের প্রকার
+ desc: জাভাতে সিল করা + রেকর্ড + সম্পূর্ণ সুইচ = সঠিক ADTs।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
diff --git a/translations/content/bn/language/flexible-constructor-bodies.yaml b/translations/content/bn/language/flexible-constructor-bodies.yaml
new file mode 100644
index 0000000..4a71333
--- /dev/null
+++ b/translations/content/bn/language/flexible-constructor-bodies.yaml
@@ -0,0 +1,18 @@
+---
+title: ফ্লেক্সিবল কনস্ট্রাক্টর বডিস (Flexible Constructor Bodies)
+oldApproach: super() এর পরে ভ্যালিডেট (Validate After super())
+modernApproach: super() এর আগে কোড (Code Before super())
+summary: super() বা this() মেথড কল করার আগে ভ্যালু ভ্যালিডেট (validate) এবং কম্পিউট (compute) করুন।
+explanation: Java 25 এই সীমাবদ্ধতা তুলে নিয়েছে যে super() অবশ্যই প্রথম স্টেটমেন্ট হতে হবে। এখন আপনি প্যারেন্ট কনস্ট্রাক্টরের কাছে ডেলিগেট করার আগে আর্গুমেন্ট ভ্যালিডেট করতে, ডিরাইভড ভ্যালু (derived values) কম্পিউট করতে এবং স্টেট সেটআপ করতে পারবেন।
+whyModernWins:
+- icon: "🛡️"
+ title: দ্রুত ব্যর্থ (Fail Fast)
+ desc: সুপারক্লাস কনস্ট্রাক্টর রান করার আগে আর্গুমেন্ট ভ্যালিডেট করুন।
+- icon: "🧮"
+ title: প্রথমে কম্পিউট (Compute First)
+ desc: super() মেথড কল করার আগে ভ্যালু ডিরাইভ এবং ডেটা প্রস্তুত করুন।
+- icon: "🧹"
+ title: কোনো ওয়ার্কআউট নেই
+ desc: এই সীমাবদ্ধতা এড়াতে আর কোনো স্ট্যাটিক হেল্পার মেথড বা ফ্যাক্টরি প্যাটার্নের প্রয়োজন নেই।
+support:
+ description: JDK 25 LTS (JEP 513, সেপ্টেম্বর 2025) এ চূড়ান্ত হয়েছে।
\ No newline at end of file
diff --git a/translations/content/bn/language/guarded-patterns.yaml b/translations/content/bn/language/guarded-patterns.yaml
new file mode 100644
index 0000000..2a64046
--- /dev/null
+++ b/translations/content/bn/language/guarded-patterns.yaml
@@ -0,0 +1,18 @@
+---
+title: যখন গার্ড ব্যবহার করে প্যাটার্ন (Guarded Patterns with when)
+oldApproach: নেস্টেড if
+modernApproach: when ক্লজ (when Clause)
+summary: when গার্ড ব্যবহার করে প্যাটার্ন কেইসগুলোতে কন্ডিশন যোগ করুন।
+explanation: গার্ডেড প্যাটার্ন (Guarded Patterns) আপনাকে একটি অতিরিক্ত বুলিয়ান কন্ডিশন (boolean condition) সহ একটি টাইপ ম্যাচকে রিফাইন করতে সাহায্য করে। এটি ব্রাঞ্চিং লজিককে কেইসের ভিতরে if স্টেটমেন্ট নেস্ট না করে সুইচের (switch) মধ্যেই রাখে।
+whyModernWins:
+- icon: "🎯"
+ title: সুনির্দিষ্ট ম্যাচিং (Precise Matching)
+ desc: একটি সিঙ্গেল কেইস লেবেলে টাইপ এবং কন্ডিশন একত্রিত করুন।
+- icon: "📐"
+ title: ফ্ল্যাট স্ট্রাকচার (Flat Structure)
+ desc: সুইচ কেইসের ভিতরে কোনো নেস্টেড if/else থাকে না।
+- icon: "📖"
+ title: পঠনযোগ্য উদ্দেশ্য (Readable Intent)
+ desc: when ক্লজটি স্বাভাবিক ভাষার মতো পঠনযোগ্য।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/markdown-javadoc-comments.yaml b/translations/content/bn/language/markdown-javadoc-comments.yaml
new file mode 100644
index 0000000..20dbc37
--- /dev/null
+++ b/translations/content/bn/language/markdown-javadoc-comments.yaml
@@ -0,0 +1,18 @@
+---
+title: Javadoc কমেন্টে মার্কডাউন (Markdown in Javadoc comments)
+oldApproach: HTML-ভিত্তিক Javadoc
+modernApproach: মার্কডাউন Javadoc
+summary: উন্নত পঠনযোগ্যতার (readability) জন্য HTML এর পরিবর্তে মার্কডাউনে (Markdown) Javadoc কমেন্ট লিখুন।
+explanation: Java 23 ঐতিহ্যবাহী /** */ HTML-ভিত্তিক ফরম্যাটের বিকল্প হিসেবে /// মার্কডাউন-স্টাইল Javadoc কমেন্ট চালু করেছে। মার্কডাউন সিনট্যাক্স কোড ব্লক, এমফাসিস, লিস্ট এবং লিংক সাপোর্টের সাথে লিখতে ও পড়তে আরও সহজ। কম্পাইলার Javadoc আউটপুটের জন্য মার্কডাউনকে HTML-এ রূপান্তর করে।
+whyModernWins:
+- icon: "📖"
+ title: প্রাকৃতিক সিনট্যাক্স
+ desc: HTML ট্যাগের পরিবর্তে ইনলাইন কোডের জন্য ব্যাকটিকস এবং ব্লকের জন্য ``` ব্যবহার করুন।
+- icon: "✍️"
+ title: লিখতে সহজ
+ desc: {@code}, , ট্যাগের প্রয়োজন নেই – শুধু মার্কডাউন লিখুন।
+- icon: "👁"
+ title: এডিটরে দেখতে ভালো
+ desc: মার্কডাউন আধুনিক IDEs (Integrated Development Environments) এবং টেক্সট এডিটরগুলোতে সুন্দরভাবে রেন্ডার করে।
+support:
+ description: JDK 23 (সেপ্টেম্বর 2024) থেকে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/module-import-declarations.yaml b/translations/content/bn/language/module-import-declarations.yaml
new file mode 100644
index 0000000..f2966c8
--- /dev/null
+++ b/translations/content/bn/language/module-import-declarations.yaml
@@ -0,0 +1,18 @@
+---
+title: মডিউল ইম্পোর্ট ডিক্লারেশন (Module Import Declarations)
+oldApproach: অনেক ইম্পোর্ট
+modernApproach: import module
+summary: একটি সিঙ্গেল ডিক্লারেশন ব্যবহার করে একটি মডিউলের সমস্ত এক্সপোর্ট করা প্যাকেজ ইম্পোর্ট করুন।
+explanation: মডিউল ইম্পোর্ট ডিক্লারেশন (Module import declarations) আপনাকে একটি মডিউল যা এক্সপোর্ট করে, তার সবকিছু এক লাইনে ইম্পোর্ট করতে দেয়। এটি java.base এর জন্য বিশেষভাবে উপযোগী, যা কালেকশন, I/O, স্ট্রিম এবং আরও অনেক কিছু কভার করে।
+whyModernWins:
+- icon: "🧹"
+ title: এক লাইন
+ desc: অনেকগুলো ইম্পোর্ট স্টেটমেন্টকে একটি সিঙ্গেল মডিউল ইম্পোর্ট দিয়ে প্রতিস্থাপন করুন।
+- icon: "📦"
+ title: মডিউল-অ্যাওয়ার (Module-aware)
+ desc: প্যাকেজের সুসংগত সেট ইম্পোর্ট করতে মডিউল সিস্টেমকে কাজে লাগায়।
+- icon: "🚀"
+ title: দ্রুত শুরু
+ desc: স্ক্রিপ্ট এবং প্রোটোটাইপের জন্য পারফেক্ট, যেখানে ইম্পোর্ট লিস্ট তৈরি করা tedious।
+support:
+ description: JDK 25 LTS (JEP 511, সেপ্টেম্বর 2025) এ চূড়ান্ত হয়েছে।
\ No newline at end of file
diff --git a/translations/content/bn/language/pattern-matching-instanceof.yaml b/translations/content/bn/language/pattern-matching-instanceof.yaml
new file mode 100644
index 0000000..db52e61
--- /dev/null
+++ b/translations/content/bn/language/pattern-matching-instanceof.yaml
@@ -0,0 +1,18 @@
+---
+title: instanceof-এর জন্য প্যাটার্ন ম্যাচিং (Pattern matching for instanceof)
+oldApproach: instanceof + Cast
+modernApproach: প্যাটার্ন ভ্যারিয়েবল (Pattern Variable)
+summary: প্যাটার্ন ম্যাচিং ব্যবহার করে টাইপ চেক (type check) এবং কাস্ট (cast) কে এক স্টেপে একত্রিত করুন।
+explanation: instanceof-এর জন্য প্যাটার্ন ম্যাচিং টাইপ চেকের পরে অপ্রয়োজনীয় কাস্টকে দূর করে। প্যাটার্ন ভ্যারিয়েবল স্বয়ংক্রিয়ভাবে স্কোপড (scoped) হয় যেখানে প্যাটার্নটি ম্যাচ করে, যা কোডকে আরও নিরাপদ এবং সংক্ষিপ্ত করে তোলে।
+whyModernWins:
+- icon: "🔄"
+ title: কোনো অপ্রয়োজনীয় কাস্ট নেই
+ desc: টাইপ চেক এবং ভ্যারিয়েবল বাইন্ডিং একটি সিঙ্গেল এক্সপ্রেশনেই সম্পন্ন হয়।
+- icon: "📏"
+ title: কম লাইন
+ desc: দুটির পরিবর্তে একটি লাইন – কাস্ট লাইনটি সম্পূর্ণরূপে বিলুপ্ত হয়ে যায়।
+- icon: "🛡️"
+ title: স্কোপ সেফটি (Scope Safety)
+ desc: প্যাটার্ন ভ্যারিয়েবল শুধুমাত্র সেই স্কোপে থাকে যেখানে টাইপটি নিশ্চিত (guaranteed) হয়।
+support:
+ description: JDK 16 (মার্চ 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/pattern-matching-switch.yaml b/translations/content/bn/language/pattern-matching-switch.yaml
new file mode 100644
index 0000000..d49845f
--- /dev/null
+++ b/translations/content/bn/language/pattern-matching-switch.yaml
@@ -0,0 +1,18 @@
+---
+title: সুইচ-এ প্যাটার্ন ম্যাচিং (Pattern matching in switch)
+oldApproach: if-else চেইন
+modernApproach: টাইপ প্যাটার্নস (Type Patterns)
+summary: পরিষ্কার সুইচ টাইপ প্যাটার্ন ব্যবহার করে if-else instanceof চেইনগুলোকে প্রতিস্থাপন করুন।
+explanation: সুইচ-এ প্যাটার্ন ম্যাচিং আপনাকে সরাসরি টাইপের সাথে ম্যাচ করতে দেয়, টাইপ টেস্ট, কাস্ট এবং বাইন্ডিংকে একটি সুসংক্ষিপ্ত কেইস লেবেলে একত্রিত করে। কম্পাইলার কমপ্লিটনেস চেক করে।
+whyModernWins:
+- icon: "📐"
+ title: স্ট্রাকচার্ড ডিসপ্যাচ (Structured Dispatch)
+ desc: সুইচ ব্রাঞ্চিং স্ট্রাকচারকে সুস্পষ্ট এবং স্ক্যানেবল করে তোলে।
+- icon: "🎯"
+ title: এক্সপ্রেশন ফর্ম (Expression Form)
+ desc: সরাসরি একটি ভ্যালু রিটার্ন করে – কোনো মিউটেবল ভ্যারিয়েবলের প্রয়োজন নেই।
+- icon: "✅"
+ title: এক্সহস্টিভনেস (Exhaustiveness)
+ desc: কম্পাইলার নিশ্চিত করে যে সব টাইপ হ্যান্ডেল করা হয়েছে।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/primitive-types-in-patterns.yaml b/translations/content/bn/language/primitive-types-in-patterns.yaml
new file mode 100644
index 0000000..57a0fea
--- /dev/null
+++ b/translations/content/bn/language/primitive-types-in-patterns.yaml
@@ -0,0 +1,18 @@
+---
+title: প্যাটার্নে প্রিমিটিভ টাইপস (Primitive Types in Patterns)
+oldApproach: ম্যানুয়াল রেঞ্জ চেকস (Manual Range Checks)
+modernApproach: প্রিমিটিভ প্যাটার্নস (Primitive Patterns)
+summary: প্যাটার্ন ম্যাচিং এখন শুধু অবজেক্ট নয়, প্রিমিটিভ টাইপগুলোর (primitive types) সাথেও কাজ করে।
+explanation: Java 25 প্যাটার্ন ম্যাচিংকে প্রিমিটিভ টাইপগুলোতে প্রসারিত করেছে। আপনি int, long, double ইত্যাদির মতো প্রিমিটিভ টাইপগুলো when গার্ড (when guards) সহ সুইচ প্যাটার্নে (switch patterns) ব্যবহার করতে পারবেন, যা বক্সিং বা ম্যানুয়াল রেঞ্জ চেকের (manual range checks) প্রয়োজনীয়তা দূর করে।
+whyModernWins:
+- icon: "📦"
+ title: কোনো বক্সিং (Boxing) নেই
+ desc: প্রিমিটিভ টাইপগুলোকে সরাসরি ম্যাচ করুন – কোনো Integer র্যাপারের (wrapper) প্রয়োজন নেই।
+- icon: "🎯"
+ title: প্যাটার্ন কনসিস্টেন্সি (Pattern Consistency)
+ desc: অবজেক্ট এবং প্রিমিটিভ টাইপগুলোর জন্য একই প্যাটার্ন সিনট্যাক্স।
+- icon: "⚡"
+ title: উন্নত পারফরম্যান্স
+ desc: প্যাটার্ন ম্যাচিংয়ে অটোবক্সিংয়ের (autoboxing) অতিরিক্ত লোড এড়িয়ে যান।
+support:
+ description: JDK 25-এ প্রিভিউ (তৃতীয় প্রিভিউ, JEP 507)। --enable-preview প্রয়োজন।
\ No newline at end of file
diff --git a/translations/content/bn/language/private-interface-methods.yaml b/translations/content/bn/language/private-interface-methods.yaml
new file mode 100644
index 0000000..b89d071
--- /dev/null
+++ b/translations/content/bn/language/private-interface-methods.yaml
@@ -0,0 +1,18 @@
+---
+title: প্রাইভেট ইন্টারফেস মেথড (Private Interface Methods)
+oldApproach: ডুপ্লিকেটেড লজিক
+modernApproach: প্রাইভেট মেথডস (Private Methods)
+summary: প্রাইভেট মেথড ব্যবহার করে ইন্টারফেসে শেয়ারড লজিক (shared logic) এক্সট্র্যাক্ট করুন।
+explanation: Java 9 ইন্টারফেসে প্রাইভেট মেথড ব্যবহারের অনুমতি দেয়, যা আপনাকে ইমপ্লিমেন্টিং ক্লাসগুলোর (implementing classes) কাছে ইমপ্লিমেন্টেশন ডিটেইলস এক্সপোজ না করেই ডিফল্ট মেথডগুলোর মধ্যে কোড শেয়ার করতে সক্ষম করে।
+whyModernWins:
+- icon: "🧩"
+ title: কোড রিইউজ (Code Reuse)
+ desc: ডুপ্লিকেশন ছাড়াই ডিফল্ট মেথডগুলোর মধ্যে লজিক শেয়ার করুন।
+- icon: "🔐"
+ title: এনক্যাপসুলেশন (Encapsulation)
+ desc: ইমপ্লিমেন্টেশন ডিটেইলস ইমপ্লিমেন্টিং ক্লাসগুলো থেকে লুকানো থাকে।
+- icon: "🧹"
+ title: DRY ইন্টারফেস
+ desc: ডিফল্ট মেথডগুলোর মধ্যে আর কপি-পেস্টের প্রয়োজন নেই।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/record-patterns.yaml b/translations/content/bn/language/record-patterns.yaml
new file mode 100644
index 0000000..68dc0db
--- /dev/null
+++ b/translations/content/bn/language/record-patterns.yaml
@@ -0,0 +1,18 @@
+---
+title: রেকর্ড প্যাটার্ন (Destructuring)
+oldApproach: ম্যানুয়াল অ্যাক্সেস
+modernApproach: ডিস্ট্রাকচারিং (Destructuring)
+summary: প্যাটার্নগুলোতে সরাসরি রেকর্ডগুলো ডিস্ট্রাকচার করুন – এক স্টেপেই ফিল্ড এক্সট্র্যাক্ট করুন।
+explanation: রেকর্ড প্যাটার্ন (Record patterns) আপনাকে instanceof এবং switch স্টেটমেন্টে একটি রেকর্ডের কম্পোনেন্টগুলো সরাসরি ডিকম্পোজ (decompose) করতে দেয়। নেস্টেড প্যাটার্নও সাপোর্টেড, যা ইন্টারমিডিয়েট ভ্যারিয়েবল ছাড়াই ডিপ ম্যাচিং (deep matching) সক্ষম করে।
+whyModernWins:
+- icon: "🎯"
+ title: সরাসরি এক্সট্রাকশন (Direct Extraction)
+ desc: ম্যানুয়ালি অ্যাক্সেসর (accessors) কল না করেই রেকর্ড কম্পোনেন্টগুলো অ্যাক্সেস করুন।
+- icon: "🪆"
+ title: নেস্টেবল (Nestable)
+ desc: প্যাটার্নগুলো নেস্ট করা যায় – একটি সিঙ্গেল এক্সপ্রেশনে ইনার রেকর্ডগুলো ম্যাচ করা যায়।
+- icon: "📏"
+ title: কমপ্যাক্ট কোড
+ desc: পাঁচ লাইনের কোড দুই লাইনে পরিণত হয় – কম আনুষ্ঠানিকতা, একই স্বচ্ছতা।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/records-for-data-classes.yaml b/translations/content/bn/language/records-for-data-classes.yaml
new file mode 100644
index 0000000..1f6ce09
--- /dev/null
+++ b/translations/content/bn/language/records-for-data-classes.yaml
@@ -0,0 +1,18 @@
+---
+title: ডেটা ক্লাসের জন্য রেকর্ড (Records for data classes)
+oldApproach: ভার্বোস POJO
+modernApproach: রেকর্ড
+summary: একটি সিঙ্গেল লাইন ইমিউটেবল ডেটা ক্যারিয়ারের (immutable data carriers) জন্য 30+ লাইনের বয়লারপ্লেটকে প্রতিস্থাপন করে।
+explanation: রেকর্ডগুলো স্বয়ংক্রিয়ভাবে কনস্ট্রাক্টর, অ্যাক্সেসর (x(), y()), equals(), hashCode(), এবং toString() জেনারেট করে। এগুলো ডিজাইনগতভাবে ইমিউটেবল এবং DTOs, ভ্যালু অবজেক্ট (value objects) এবং প্যাটার্ন ম্যাচিংয়ের জন্য আদর্শ।
+whyModernWins:
+- icon: "⚡"
+ title: এক-লাইন ডেফিনিশন (One-line Definition)
+ desc: একটি সিঙ্গেল লাইন কনস্ট্রাক্টর, গেটার্স (getters), equals, hashCode, toString -কে প্রতিস্থাপন করে।
+- icon: "🔒"
+ title: ডিফল্টরূপে ইমিউটেবল (Immutable by default)
+ desc: সব ফিল্ড ফাইনাল (final) – কোনো সেটার ফুটগান (setter footguns) নেই।
+- icon: "🧩"
+ title: প্যাটার্ন-ফ্রেন্ডলি (Pattern-friendly)
+ desc: রেকর্ডগুলো সুইচ (switch) এবং instanceof-এ ডিস্ট্রাকচারিং প্যাটার্নগুলোর (destructuring patterns) সাথে কাজ করে।
+support:
+ description: JDK 16 (মার্চ 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/sealed-classes.yaml b/translations/content/bn/language/sealed-classes.yaml
new file mode 100644
index 0000000..1d9508b
--- /dev/null
+++ b/translations/content/bn/language/sealed-classes.yaml
@@ -0,0 +1,18 @@
+---
+title: টাইপ হায়ারার্কির (Type Hierarchies) জন্য সিলড ক্লাস (Sealed Classes)
+oldApproach: ওপেন হায়ারার্কি (Open Hierarchy)
+modernApproach: sealed permits
+summary: কোন ক্লাসগুলো একটি টাইপকে এক্সটেন্ড করতে পারবে তা সীমাবদ্ধ করুন – যা এক্সহস্টিভ সুইচকে (exhaustive switches) সক্ষম করে।
+explanation: সিলড ক্লাসগুলো সাবটাইপগুলোর (subtypes) একটি ক্লোজড সেট ডিফাইন করে। কম্পাইলার সমস্ত সম্ভাব্য কেইসগুলো জানে, যা ডিফল্ট ব্রাঞ্চ ছাড়াই এক্সহস্টিভ প্যাটার্ন ম্যাচিংকে সক্ষম করে। রেকর্ডগুলোর সাথে মিলিত হয়ে, এগুলো অ্যালজেব্রাইক ডেটা টাইপ (algebraic data types) মডেল করে।
+whyModernWins:
+- icon: "🔐"
+ title: নিয়ন্ত্রিত হায়ারার্কি (Controlled Hierarchy)
+ desc: শুধুমাত্র পারমিটেড (permitted) সাবটাইপগুলো এক্সটেন্ড করতে পারে – কোনো অপ্রত্যাশিত সাবক্লাস (surprise subclasses) নেই।
+- icon: "✅"
+ title: এক্সহস্টিভ ম্যাচিং (Exhaustive Matching)
+ desc: কম্পাইলার সুইচ কভারের সমস্ত কেইস ভ্যারিফাই (verify) করে, ডিফল্টের প্রয়োজন নেই।
+- icon: "📐"
+ title: অ্যালজেব্রাইক ডেটা টাইপস (Algebraic Data Types)
+ desc: সাম টাইপসকে (sum types) স্বাভাবিকভাবে মডেল করুন – sealed + records = জাভাতে ADTs।
+support:
+ description: JDK 17 LTS (সেপ্টেম্বর 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/static-members-in-inner-classes.yaml b/translations/content/bn/language/static-members-in-inner-classes.yaml
new file mode 100644
index 0000000..1d54546
--- /dev/null
+++ b/translations/content/bn/language/static-members-in-inner-classes.yaml
@@ -0,0 +1,18 @@
+---
+title: ইনার ক্লাসগুলোতে স্ট্যাটিক মেম্বার (Static members in inner classes)
+oldApproach: স্ট্যাটিক নেস্টেড ক্লাস ব্যবহার করতে হবে
+modernApproach: ইনার ক্লাসগুলোতে স্ট্যাটিক মেম্বার
+summary: স্ট্যাটিক নেস্টেড ক্লাসের প্রয়োজন ছাড়াই ইনার ক্লাসগুলোতে স্ট্যাটিক মেম্বার ডিফাইন করুন।
+explanation: Java 16 এর আগে, শুধুমাত্র স্ট্যাটিক নেস্টেড ক্লাসগুলোই স্ট্যাটিক মেম্বার ধারণ করতে পারত। ইনার (নন-স্ট্যাটিক) ক্লাসগুলোতে স্ট্যাটিক মেম্বার থাকতে পারত না কারণ সেগুলোর জন্য একটি এনক্লোজিং ইনস্ট্যান্সের প্রয়োজন হতো। Java 16 এই সীমাবদ্ধতা শিথিল করেছে, যা ইনার ক্লাসগুলোতে স্ট্যাটিক ফিল্ড, মেথড এবং এমনকি নেস্টেড টাইপগুলোর অনুমতি দেয়।
+whyModernWins:
+- icon: "🔓"
+ title: আরও ফ্লেক্সিবিলিটি
+ desc: ইনার ক্লাসগুলোতে এখন প্রয়োজনে স্ট্যাটিক মেম্বার থাকতে পারে।
+- icon: "🧩"
+ title: শেয়ারড স্টেট (Shared State)
+ desc: একটি ইনার ক্লাসের ইনস্ট্যান্স জুড়ে শেয়ারড স্টেট ট্র্যাক করুন।
+- icon: "📐"
+ title: ডিজাইন ফ্রিডম (Design Freedom)
+ desc: শুধু একটি স্ট্যাটিক ফিল্ডের জন্য স্ট্যাটিক নেস্টেড ক্লাসে প্রমোট করার প্রয়োজন নেই।
+support:
+ description: JDK 16 (মার্চ 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/static-methods-in-interfaces.yaml b/translations/content/bn/language/static-methods-in-interfaces.yaml
new file mode 100644
index 0000000..204453f
--- /dev/null
+++ b/translations/content/bn/language/static-methods-in-interfaces.yaml
@@ -0,0 +1,18 @@
+---
+title: ইন্টারফেসে স্ট্যাটিক মেথড (Static methods in interfaces)
+oldApproach: ইউটিলিটি ক্লাস
+modernApproach: ইন্টারফেস স্ট্যাটিক মেথডস (Interface static methods)
+summary: পৃথক ইউটিলিটি ক্লাসের পরিবর্তে সরাসরি ইন্টারফেসে স্ট্যাটিক ইউটিলিটি মেথড যোগ করুন।
+explanation: Java 8 এর আগে, একটি ইন্টারফেসের সাথে সম্পর্কিত ইউটিলিটি মেথডগুলোকে একটি আলাদা ক্লাসে রাখতে হতো (যেমন Collections for Collection)। ইন্টারফেসগুলোতে স্ট্যাটিক মেথড আপনাকে সম্পর্কিত ইউটিলিটিগুলো একসাথে রাখতে দেয়। এটি Comparator.comparing(), Stream.of(), এবং List.of()-এর মতো আধুনিক API-গুলোতে খুবই কমন।
+whyModernWins:
+- icon: "📦"
+ title: উন্নত অর্গানাইজেশন
+ desc: ইন্টারফেসের সাথে সম্পর্কিত ইউটিলিটিগুলোকে একটি আলাদা ক্লাসে না রেখে একসাথেই রাখুন।
+- icon: "🔍"
+ title: ডিসকভারেবিলিটি (Discoverability)
+ desc: ফ্যাক্টরি এবং হেল্পার মেথডগুলোকে যেখানে আশা করা হয়, সেখানেই খুঁজে পাওয়া যায়।
+- icon: "🧩"
+ title: API কোহেশন (API Cohesion)
+ desc: আলাদা *Utils বা *Helper ক্লাসের প্রয়োজন নেই।
+support:
+ description: JDK 8 (মার্চ 2014) থেকে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/switch-expressions.yaml b/translations/content/bn/language/switch-expressions.yaml
new file mode 100644
index 0000000..4f780af
--- /dev/null
+++ b/translations/content/bn/language/switch-expressions.yaml
@@ -0,0 +1,18 @@
+---
+title: সুইচ এক্সপ্রেশন (Switch Expressions)
+oldApproach: সুইচ স্টেটমেন্ট (Switch Statement)
+modernApproach: সুইচ এক্সপ্রেশন
+summary: একটি এক্সপ্রেশন হিসেবে সুইচ ব্যবহার করুন যা একটি ভ্যালু রিটার্ন করে – কোনো break বা fall-through ছাড়াই।
+explanation: সুইচ এক্সপ্রেশন সরাসরি একটি ভ্যালু রিটার্ন করে, fall-through বাগ প্রতিরোধ করার জন্য অ্যারো সিনট্যাক্স (arrow syntax) ব্যবহার করে, এবং কম্পাইলার এক্সহস্টিভনেস (exhaustiveness) ভেরিফাই করে। এটি এরর-প্রোন (error-prone) স্টেটমেন্ট ফর্মকে প্রতিস্থাপন করে।
+whyModernWins:
+- icon: "🎯"
+ title: একটি ভ্যালু রিটার্ন করে
+ desc: সুইচের ফলাফল সরাসরি অ্যাসাইন করুন – কোনো টেম্পোরারি ভ্যারিয়েবলের প্রয়োজন নেই।
+- icon: "🛡️"
+ title: কোনো ফল-থ্রু (fall-through) নেই
+ desc: অ্যারো সিনট্যাক্স ব্রেক (break) না থাকার কারণে সৃষ্ট অ্যাক্সিডেন্টাল ফল-থ্রু বাগগুলোকে দূর করে।
+- icon: "✅"
+ title: এক্সহস্টিভনেস চেক (Exhaustiveness Check)
+ desc: কম্পাইলার নিশ্চিত করে যে সব কেইস কভার করা হয়েছে।
+support:
+ description: JDK 14 (মার্চ 2020) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/text-blocks-for-multiline-strings.yaml b/translations/content/bn/language/text-blocks-for-multiline-strings.yaml
new file mode 100644
index 0000000..7799135
--- /dev/null
+++ b/translations/content/bn/language/text-blocks-for-multiline-strings.yaml
@@ -0,0 +1,18 @@
+---
+title: মাল্টিলাইন স্ট্রিংয়ের জন্য টেক্সট ব্লক (Text blocks for multiline strings)
+oldApproach: স্ট্রিং কনক্যাটেনেশন (String Concatenation)
+modernApproach: টেক্সট ব্লকস (Text Blocks)
+summary: ট্রিপল-কোট টেক্সট ব্লক ব্যবহার করে মাল্টিলাইন স্ট্রিংগুলো স্বাভাবিকভাবে লিখুন।
+explanation: টেক্সট ব্লকগুলো আপনাকে মাল্টিলাইন স্ট্রিংগুলো ঠিক যেভাবে দেখায় সেভাবেই লিখতে দেয়। কোট এস্কেপিং (escaping quotes) বা \n যোগ করার আর প্রয়োজন নেই। কম্পাইলার স্বয়ংক্রিয়ভাবে ইনসিডেন্টাল ইন্ডেন্টেশন (incidental indentation) সরিয়ে দেয়।
+whyModernWins:
+- icon: "📖"
+ title: যেমন আছে পঠনযোগ্য (Readable as-is)
+ desc: JSON, SQL, এবং HTML আপনার সোর্স কোডে বাস্তব JSON, SQL, এবং HTML-এর মতোই দেখায়।
+- icon: "🚫"
+ title: কোনো এস্কেপ হেল (No Escape Hell) নেই
+ desc: এমবেডেড কোটগুলোতে ব্যাকস্ল্যাশ এস্কেপিংয়ের (backslash escaping) প্রয়োজন হয় না।
+- icon: "📐"
+ title: স্মার্ট ইন্ডেন্টেশন (Smart Indentation)
+ desc: ক্লোজিং ডিলিমিটার পজিশনের (closing delimiter position) উপর ভিত্তি করে লিডিং হোয়াইটস্পেস (leading whitespace) স্বয়ংক্রিয়ভাবে ছাঁটা হয়।
+support:
+ description: JDK 15 (সেপ্টেম্বর 2020) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/type-inference-with-var.yaml b/translations/content/bn/language/type-inference-with-var.yaml
new file mode 100644
index 0000000..3a369f7
--- /dev/null
+++ b/translations/content/bn/language/type-inference-with-var.yaml
@@ -0,0 +1,18 @@
+---
+title: var ব্যবহার করে টাইপ ইনফারেন্স (Type inference with var)
+oldApproach: এক্সপ্লিসিট টাইপস (Explicit Types)
+modernApproach: var কীওয়ার্ড
+summary: লোকাল ভ্যারিয়েবলের টাইপ ইনফারেন্সের (type inference) জন্য var ব্যবহার করুন – কম জটিলতা, একই সেফটি।
+explanation: Java 10 থেকে কম্পাইলার রাইট-হ্যান্ড সাইড থেকে লোকাল ভ্যারিয়েবলগুলোর টাইপ ইনফার (infer) করে। এর ফলে টাইপ সেফটি না কমিয়ে ভিজ্যুয়াল নয়েজ (visual noise) কমে। যখন টাইপ প্রসঙ্গ থেকে স্পষ্ট হয়, তখন var ব্যবহার করুন।
+whyModernWins:
+- icon: "⚡"
+ title: কম বয়লারপ্লেট
+ desc: অ্যাসাইনমেন্টের উভয় দিকে জটিল জেনেরিক টাইপ রিপিট করার প্রয়োজন নেই।
+- icon: "👁"
+ title: উন্নত পঠনযোগ্যতা
+ desc: টাইপ ডিক্লারেশনের পরিবর্তে ভ্যারিয়েবল নাম এবং ভ্যালুগুলোর উপর ফোকাস করুন।
+- icon: "🔒"
+ title: টাইপ-সেফ (Type-safe)
+ desc: কম্পাইলার কম্পাইল টাইমে সঠিক টাইপ ইনফার (infer) এবং এনফোর্স (enforce) করে।
+support:
+ description: JDK 10 (মার্চ 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/language/unnamed-variables.yaml b/translations/content/bn/language/unnamed-variables.yaml
new file mode 100644
index 0000000..8e6bbbd
--- /dev/null
+++ b/translations/content/bn/language/unnamed-variables.yaml
@@ -0,0 +1,18 @@
+---
+title: _ (আন্ডারস্কোর) ব্যবহার করে আননেমড ভ্যারিয়েবল (Unnamed variables with _)
+oldApproach: অব্যবহৃত ভ্যারিয়েবল (Unused Variable)
+modernApproach: _ প্লেসহোল্ডার (Placeholder)
+summary: যখন একটি ভ্যারিয়েবল ইচ্ছাকৃতভাবে ব্যবহার করা হয় না, তখন উদ্দেশ্য বোঝাতে _ ব্যবহার করুন।
+explanation: আননেমড ভ্যারিয়েবল (Unnamed variables) পাঠক এবং টুলগুলোকে বোঝায় যে, একটি ভ্যালুকে ইচ্ছাকৃতভাবে ইগনোর করা হয়েছে। এর ফলে আর 'ignored' বা 'unused' নামকরণের কনভেনশন (conventions) বা IDE ওয়ার্নিংয়ের (warnings) প্রয়োজন হয় না।
+whyModernWins:
+- icon: "📢"
+ title: সুস্পষ্ট উদ্দেশ্য
+ desc: _ স্পষ্টভাবে নির্দেশ করে 'এই ভ্যালুটি এখানে প্রয়োজন নেই'।
+- icon: "🔇"
+ title: কোনো ওয়ার্নিং নেই
+ desc: IDEs এবং লিন্টাররা (linters) ইচ্ছাকৃতভাবে অব্যবহৃত ভ্যারিয়েবলগুলোকে ফ্ল্যাগ করবে না।
+- icon: "🧹"
+ title: ক্লিনার ল্যাম্বডাস (Cleaner Lambdas)
+ desc: যখন শুধুমাত্র কিছু প্যারামিটার প্রয়োজন হয়, তখন মাল্টি-প্যারাম ল্যাম্বডাগুলো (multi-param lambdas) আরও পরিষ্কার হয়।
+support:
+ description: JDK 22 (JEP 456, মার্চ 2024) এ চূড়ান্ত হয়েছে।
\ No newline at end of file
diff --git a/translations/content/bn/security/key-derivation-functions.yaml b/translations/content/bn/security/key-derivation-functions.yaml
new file mode 100644
index 0000000..d23493e
--- /dev/null
+++ b/translations/content/bn/security/key-derivation-functions.yaml
@@ -0,0 +1,18 @@
+---
+title: কী ডেরিভেশন ফাংশন (Key Derivation Functions)
+oldApproach: ম্যানুয়াল PBKDF2
+modernApproach: KDF API
+summary: স্ট্যান্ডার্ড KDF API ব্যবহার করে ক্রিপ্টোগ্রাফিক কী (cryptographic keys) ডিরাইভ করুন।
+explanation: KDF API, HKDF সহ কী ডেরিভেশন ফাংশনগুলোর জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস প্রদান করে। এটি জটিল SecretKeyFactory + PBEKeySpec প্যাটার্নকে একটি পরিষ্কার বিল্ডার API (builder API) দিয়ে প্রতিস্থাপন করে।
+whyModernWins:
+- icon: "📐"
+ title: ক্লিন API
+ desc: জটিল KeySpec কনস্ট্রাকটরের পরিবর্তে বিল্ডার প্যাটার্ন ব্যবহার করুন।
+- icon: "🔧"
+ title: HKDF সাপোর্ট
+ desc: PBKDF2 এর পাশাপাশি আধুনিক HKDF অ্যালগরিদম।
+- icon: "🛡️"
+ title: স্ট্যান্ডার্ড
+ desc: সমস্ত কী ডেরিভেশন অ্যালগরিদমের জন্য ইউনিফাইড API।
+support:
+ description: JDK 25 LTS (JEP 510, সেপ্টেম্বর 2025) এ চূড়ান্ত হয়েছে।
\ No newline at end of file
diff --git a/translations/content/bn/security/pem-encoding.yaml b/translations/content/bn/security/pem-encoding.yaml
new file mode 100644
index 0000000..263d8b2
--- /dev/null
+++ b/translations/content/bn/security/pem-encoding.yaml
@@ -0,0 +1,18 @@
+---
+title: PEM এনকোডিং/ডিকোডিং (PEM encoding/decoding)
+oldApproach: ম্যানুয়াল Base64 + হেডারস
+modernApproach: PEM API
+summary: PEM-ফরম্যাটে ক্রিপ্টোগ্রাফিক অবজেক্টগুলোকে নেটিভলি এনকোড (encode) এবং ডিকোড (decode) করুন।
+explanation: PEM API, PEM ফরম্যাটে সার্টিফিকেট, কী এবং অন্যান্য ক্রিপ্টোগ্রাফিক অবজেক্টগুলোর জন্য স্ট্যান্ডার্ড এনকোডিং/ডিকোডিং প্রদান করে। এটিতে BEGIN/END হেডারগুলোর সাথে ম্যানুয়াল Base64 র্যাপিংয়ের আর প্রয়োজন নেই।
+whyModernWins:
+- icon: "🧹"
+ title: কোনো ম্যানুয়াল Base64 নেই
+ desc: PEM হেডার, লাইন র্যাপিং এবং Base64 স্বয়ংক্রিয়ভাবে হ্যান্ডেল করা হয়।
+- icon: "🔄"
+ title: দ্বি-মুখী (Bidirectional)
+ desc: একটি API দিয়ে PEM-এ এনকোড এবং PEM থেকে ডিকোড করুন।
+- icon: "🛡️"
+ title: স্ট্যান্ডার্ড ফরম্যাট (Standard Format)
+ desc: RFC 7468-কমপ্লায়েন্ট PEM আউটপুট তৈরি করে।
+support:
+ description: JDK 25 (JEP 470) এ প্রিভিউ। --enable-preview প্রয়োজন।
\ No newline at end of file
diff --git a/translations/content/bn/security/random-generator.yaml b/translations/content/bn/security/random-generator.yaml
new file mode 100644
index 0000000..346e3c6
--- /dev/null
+++ b/translations/content/bn/security/random-generator.yaml
@@ -0,0 +1,18 @@
+---
+title: RandomGenerator ইন্টারফেস
+oldApproach: new Random() / ThreadLocalRandom
+modernApproach: RandomGenerator ফ্যাক্টরি
+summary: একটি নির্দিষ্ট ক্লাসের সাথে কাপলিং (coupling) না করে, নাম অনুসারে র্যান্ডম নাম্বার অ্যালগরিদম (random number algorithms) বেছে নিতে RandomGenerator ইন্টারফেস ব্যবহার করুন।
+explanation: JDK 17 সমস্ত RNG ইমপ্লিমেন্টেশনের (implementations) জন্য একটি কমন ইন্টারফেস হিসাবে RandomGenerator চালু করেছে। new Random() বা ThreadLocalRandom কে হার্ড-কোডিং না করে, আপনি ফ্যাক্টরির মাধ্যমে নাম অনুসারে অ্যালগরিদম সিলেক্ট করতে পারবেন, যা বিভিন্ন ইউজ কেইসের জন্য অপ্টিমাইজড (স্পিড, স্ট্যাটিস্টিকাল কোয়ালিটি, স্প্লিটএবিলিটি) অ্যালগরিদমগুলোর মধ্যে অদলবদল করা সহজ করে তোলে।
+whyModernWins:
+- icon: "🔧"
+ title: অ্যালগরিদম-অ্যাগনস্টিক (Algorithm-agnostic)
+ desc: কোড স্ট্রাকচার পরিবর্তন না করেই নাম অনুসারে সেরা RNG অ্যালগরিদম বেছে নিন।
+- icon: "⚡"
+ title: উন্নত অ্যালগরিদম
+ desc: উচ্চতর স্ট্যাটিস্টিকাল প্রোপার্টি (statistical properties) সহ আধুনিক LXM জেনারেটরগুলিতে অ্যাক্সেস করুন।
+- icon: "🔗"
+ title: ইউনিফাইড API
+ desc: একটি ইন্টারফেস Random, ThreadLocalRandom, SplittableRandom এবং আরও অনেক কিছু কভার করে।
+support:
+ description: JDK 17 (সেপ্টেম্বর 2021, JEP 356) থেকে উপলব্ধ।
\ No newline at end of file
diff --git a/translations/content/bn/security/strong-random.yaml b/translations/content/bn/security/strong-random.yaml
new file mode 100644
index 0000000..d07f719
--- /dev/null
+++ b/translations/content/bn/security/strong-random.yaml
@@ -0,0 +1,18 @@
+---
+title: স্ট্রং র্যান্ডম জেনারেশন (Strong Random Generation)
+oldApproach: new SecureRandom()
+modernApproach: getInstanceStrong()
+summary: প্ল্যাটফর্মের সবচেয়ে স্ট্রং SecureRandom ইমপ্লিমেন্টেশনটি পান।
+explanation: getInstanceStrong() মেথডটি প্ল্যাটফর্মে সবচেয়ে শক্তিশালী হিসাবে কনফিগার করা SecureRandom ইমপ্লিমেন্টেশনটি রিটার্ন করে। এটি securerandom.strongAlgorithms সিকিউরিটি প্রোপার্টি (security property) দ্বারা নিয়ন্ত্রিত হয়।
+whyModernWins:
+- icon: "🛡️"
+ title: সবচেয়ে শক্তিশালী উপলব্ধ
+ desc: প্ল্যাটফর্মের জন্য স্বয়ংক্রিয়ভাবে সেরা অ্যালগরিদম নির্বাচন করে।
+- icon: "📖"
+ title: সুস্পষ্ট উদ্দেশ্য
+ desc: স্পষ্টভাবে কমিউনিকেট করে যে স্ট্রং র্যান্ডমনেস (randomness) প্রয়োজন।
+- icon: "🔧"
+ title: কনফিগারযোগ্য (Configurable)
+ desc: অ্যাডমিনিস্ট্রেটররা সিকিউরিটি প্রোপার্টিগুলোর (security properties) মাধ্যমে স্ট্রং অ্যালগরিদম পরিবর্তন করতে পারে।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/security/tls-default.yaml b/translations/content/bn/security/tls-default.yaml
new file mode 100644
index 0000000..7172238
--- /dev/null
+++ b/translations/content/bn/security/tls-default.yaml
@@ -0,0 +1,18 @@
+---
+title: ডিফল্টরূপে TLS 1.3
+oldApproach: ম্যানুয়াল TLS কনফিগ (Config)
+modernApproach: TLS 1.3 ডিফল্ট
+summary: TLS 1.3 ডিফল্টরূপে এনাবল করা হয়েছে – কোনো এক্সপ্লিসিট প্রোটোকল কনফিগারেশনের প্রয়োজন নেই।
+explanation: Java 11 TLS 1.3 সাপোর্ট যোগ করেছে এবং এটিকে পছন্দের প্রোটোকল হিসেবে তৈরি করেছে। HttpClient এটি স্বয়ংক্রিয়ভাবে ব্যবহার করে। সিকিউর কানেকশনের জন্য ম্যানুয়ালি প্রোটোকল ভার্সন উল্লেখ করার আর প্রয়োজন নেই।
+whyModernWins:
+- icon: "🛡️"
+ title: আরও সিকিউর
+ desc: TLS 1.3 অপ্রচলিত সাইফার স্যুট (cipher suites) এবং হ্যান্ডশেক প্যাটার্নগুলো (handshake patterns) সরিয়ে দেয়।
+- icon: "⚡"
+ title: দ্রুত হ্যান্ডশেক
+ desc: TLS 1.3 এক রাউন্ড ট্রিপে (one round trip) সম্পূর্ণ হয়, যেখানে আগে দুটি লাগত।
+- icon: "🆓"
+ title: জিরো কনফিগ (Zero Config)
+ desc: ডিফল্টরূপে সিকিউর – কোনো এক্সপ্লিসিট প্রোটোকল সিলেকশনের প্রয়োজন নেই।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/streams/collectors-flatmapping.yaml b/translations/content/bn/streams/collectors-flatmapping.yaml
new file mode 100644
index 0000000..14f1450
--- /dev/null
+++ b/translations/content/bn/streams/collectors-flatmapping.yaml
@@ -0,0 +1,18 @@
+---
+title: Collectors.flatMapping()
+oldApproach: নেস্টেড flatMap
+modernApproach: flatMapping()
+summary: একটি গ্রুপিং কালেক্টরের (grouping collector) ভিতরে ফ্ল্যাটেন (flatten) করতে flatMapping() ব্যবহার করুন।
+explanation: Collectors.flatMapping() একটি ওয়ান-টু-মেনি (one-to-many) ম্যাপিংকে ডাউনস্ট্রিম কালেক্টর হিসাবে প্রয়োগ করে। এটি Stream.flatMap()-এর কালেক্টর ইকুইভ্যালেন্ট (equivalent) — groupingBy বা partitioningBy-এর ভিতরে ব্যবহার করার জন্য উপযোগী।
+whyModernWins:
+- icon: "🧩"
+ title: কম্পোজেবল (Composable)
+ desc: groupingBy এর ভিতরে একটি ডাউনস্ট্রিম কালেক্টর হিসাবে কাজ করে।
+- icon: "📐"
+ title: সিঙ্গেল পাস (One Pass)
+ desc: একটি সিঙ্গেল স্ট্রিম ট্র্যাভার্সালে ফ্ল্যাটেন এবং গ্রুপ করুন।
+- icon: "🔗"
+ title: নেস্টেবল (Nestable)
+ desc: অন্যান্য ডাউনস্ট্রিম কালেক্টরগুলোর সাথে একত্রিত করুন।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/streams/optional-ifpresentorelse.yaml b/translations/content/bn/streams/optional-ifpresentorelse.yaml
new file mode 100644
index 0000000..a792976
--- /dev/null
+++ b/translations/content/bn/streams/optional-ifpresentorelse.yaml
@@ -0,0 +1,18 @@
+---
+title: Optional.ifPresentOrElse()
+oldApproach: if/else on Optional
+modernApproach: ifPresentOrElse()
+summary: Optional-এর present এবং empty উভয় কেইসকে একটি সিঙ্গেল কল-এই হ্যান্ডেল করুন।
+explanation: ifPresentOrElse() মেথডটি present কেইসের জন্য একটি Consumer এবং empty কেইসের জন্য একটি Runnable নেয়। এটি isPresent()/get() অ্যান্টি-প্যাটার্ন এড়িয়ে যায়।
+whyModernWins:
+- icon: "📏"
+ title: সিঙ্গেল এক্সপ্রেশন
+ desc: উভয় কেইস একটি মেথড কল-এই হ্যান্ডেল করা যায়।
+- icon: "🚫"
+ title: get() এর প্রয়োজন নেই
+ desc: বিপজ্জনক isPresent() + get() প্যাটার্ন বাদ দেয়।
+- icon: "🔗"
+ title: ফ্লুয়েন্ট
+ desc: findUser() বা যেকোনো Optional-রিটার্নিং মেথডের পরে স্বাভাবিকভাবে চেইন হয়।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/streams/optional-or.yaml b/translations/content/bn/streams/optional-or.yaml
new file mode 100644
index 0000000..db65446
--- /dev/null
+++ b/translations/content/bn/streams/optional-or.yaml
@@ -0,0 +1,18 @@
+---
+title: Optional.or() ফলব্যাক
+oldApproach: নেস্টেড ফলব্যাক
+modernApproach: .or() চেইন
+summary: নেস্টেড চেক ছাড়াই Optional ফলব্যাক চেইন করুন।
+explanation: Optional.or() মেথডটি যদি অরিজিনাল অপশনালে ভ্যালু থাকে তাহলে সেটি রিটার্ন করে, অন্যথায় বিকল্প অপশনাল পাওয়ার জন্য সাপ্লায়ারকে (supplier) ইভালুয়েট (evaluate) করে। সাপ্লায়ারগুলো লেজি (lazy) – অর্থাৎ কেবল প্রয়োজন হলেই কল করা হয়।
+whyModernWins:
+- icon: "🔗"
+ title: চেইনেবল (Chainable)
+ desc: একটি পঠনযোগ্য পাইপলাইনে ফলব্যাকগুলো স্ট্যাক করুন।
+- icon: "⚡"
+ title: লেজি ইভালুয়েশন (Lazy Evaluation)
+ desc: ফলব্যাক সাপ্লায়ারগুলো কেবল প্রয়োজন হলেই এক্সিকিউট (execute) হয়।
+- icon: "📖"
+ title: ডিক্লারেটিভ (Declarative)
+ desc: এটি 'প্রাইমারি চেষ্টা করুন, অথবা সেকেন্ডারি, অথবা ডিফল্ট' এর মতো পঠনযোগ্য।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/streams/predicate-not.yaml b/translations/content/bn/streams/predicate-not.yaml
new file mode 100644
index 0000000..d77daca
--- /dev/null
+++ b/translations/content/bn/streams/predicate-not.yaml
@@ -0,0 +1,18 @@
+---
+title: নেগেশনের (negation) জন্য Predicate.not()
+oldApproach: ল্যাম্বডা নেগেশন
+modernApproach: Predicate.not()
+summary: ল্যাম্বডা র্যাপার না লিখে পরিষ্কারভাবে মেথড রেফারেন্স (method references) নেগেট করতে Predicate.not() ব্যবহার করুন।
+explanation: Java 11 এর আগে, একটি মেথড রেফারেন্স নেগেট করার জন্য এটিকে একটি ল্যাম্বডার (lambda) মধ্যে র্যাপ করার প্রয়োজন হতো। Predicate.not() মেথডটি আপনাকে সরাসরি যেকোনো প্রেডিকেট (predicate) নেগেট করতে দেয়, যা স্ট্রিম পাইপলাইন জুড়ে কোডকে পঠনযোগ্য এবং মেথড রেফারেন্স স্টাইলের সাথে সামঞ্জস্যপূর্ণ রাখে।
+whyModernWins:
+- icon: "👁"
+ title: ক্লিনার নেগেশন
+ desc: শুধুমাত্র নেগেট করার জন্য মেথড রেফারেন্সগুলোকে ল্যাম্বডার মধ্যে র্যাপ করার প্রয়োজন নেই।
+- icon: "🔗"
+ title: কম্পোজেবল (Composable)
+ desc: যেকোনো প্রেডিকেট (Predicate) এর সাথে কাজ করে, যা পরিষ্কার প্রেডিকেট চেইন তৈরি করতে সক্ষম।
+- icon: "📖"
+ title: স্বাভাবিকভাবে পঠনযোগ্য
+ desc: Predicate.not(String::isBlank) ইংরেজিতে পড়ার মতোই সহজ।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে উপলব্ধ।
\ No newline at end of file
diff --git a/translations/content/bn/streams/stream-gatherers.yaml b/translations/content/bn/streams/stream-gatherers.yaml
new file mode 100644
index 0000000..9f450a6
--- /dev/null
+++ b/translations/content/bn/streams/stream-gatherers.yaml
@@ -0,0 +1,18 @@
+---
+title: Stream Gatherers
+oldApproach: কাস্টম কালেক্টর (Custom Collector)
+modernApproach: gather()
+summary: কাস্টম ইন্টারমিডিয়েট স্ট্রিম অপারেশনের (custom intermediate stream operations) জন্য gatherers ব্যবহার করুন।
+explanation: Gatherers হলো একটি নতুন ইন্টারমিডিয়েট স্ট্রিম অপারেশন, যা স্লাইডিং উইন্ডো, ফিক্সড-সাইজ গ্রুপ এবং স্ক্যান অপারেশনের মতো জটিল ট্রান্সফরমেশন প্রকাশ করতে পারে, যা স্ট্যান্ডার্ড স্ট্রিম অপস দিয়ে সম্ভব ছিল না।
+whyModernWins:
+- icon: "🧩"
+ title: কম্পোজেবল (Composable)
+ desc: Gatherers অন্যান্য স্ট্রিম অপারেশনগুলোর (stream operations) সাথে কম্পোজ করা যায়।
+- icon: "📦"
+ title: বিল্ট-ইন অপারেশন (Built-in Operations)
+ desc: windowFixed, windowSliding, fold, scan সরাসরি ব্যবহার করা যায়।
+- icon: "🔧"
+ title: এক্সটেনসিবল (Extensible)
+ desc: যেকোনো ইন্টারমিডিয়েট ট্রান্সফরমেশনের জন্য কাস্টম Gatherers লিখুন।
+support:
+ description: JDK 24 (JEP 485, মার্চ 2025) এ চূড়ান্ত হয়েছে।
\ No newline at end of file
diff --git a/translations/content/bn/streams/stream-iterate-predicate.yaml b/translations/content/bn/streams/stream-iterate-predicate.yaml
new file mode 100644
index 0000000..b56a95f
--- /dev/null
+++ b/translations/content/bn/streams/stream-iterate-predicate.yaml
@@ -0,0 +1,18 @@
+---
+title: Predicate সহ Stream.iterate()
+oldApproach: iterate + limit
+modernApproach: iterate(seed, pred, op)
+summary: আইটারেশন (iteration) বন্ধ করার জন্য একটি প্রেডিকেট (predicate) ব্যবহার করুন – এটি স্ট্রিম ফর্মের একটি ফর-লুপের (for-loop) মতো।
+explanation: তিন-আর্গুমেন্ট Stream.iterate(seed, hasNext, next) মেথডটি একটি ফর-লুপের মতো কাজ করে: seed হলো শুরু, hasNext নির্ধারণ করে কখন থামতে হবে এবং next পরবর্তী ভ্যালু তৈরি করে।
+whyModernWins:
+- icon: "🎯"
+ title: প্রাকৃতিক টার্মিনেশন (Natural Termination)
+ desc: একটি কন্ডিশনের (condition) উপর ভিত্তি করে থামুন, কোনো আর্টিকুলার লিমিট (arbitrary limit) নয়।
+- icon: "📐"
+ title: ফর-লুপ ইকুইভ্যালেন্ট (For-loop Equivalent)
+ desc: for(seed; hasNext; next) এর মতো একই সেমান্টিক্স (semantics)।
+- icon: "🛡️"
+ title: অসীম স্ট্রিম ঝুঁকির অনুপস্থিতি
+ desc: প্রেডিকেট (predicate) টার্মিনেশন নিশ্চিত করে।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/streams/stream-mapmulti.yaml b/translations/content/bn/streams/stream-mapmulti.yaml
new file mode 100644
index 0000000..f075b59
--- /dev/null
+++ b/translations/content/bn/streams/stream-mapmulti.yaml
@@ -0,0 +1,18 @@
+---
+title: Stream.mapMulti()
+oldApproach: flatMap + List
+modernApproach: mapMulti()
+summary: ইন্টারমিডিয়েট স্ট্রিম তৈরি না করেই প্রতি ইনপুটের জন্য শূন্য বা তার বেশি এলিমেন্ট নির্গত করুন।
+explanation: mapMulti() মেথডটি flatMap-এর একটি ইম্পারেটিভ বিকল্প, যা প্রতিটি এলিমেন্টের জন্য ইন্টারমিডিয়েট স্ট্রিম অবজেক্ট তৈরি করা এড়িয়ে যায়। ম্যাপিং যখন অল্প সংখ্যক এলিমেন্ট তৈরি করে, তখন এটি আরও ইফিশিয়েন্ট (efficient) হয়।
+whyModernWins:
+- icon: "⚡"
+ title: কম অ্যালোকেশন (Less Allocation)
+ desc: প্রতি এলিমেন্টের জন্য কোনো ইন্টারমিডিয়েট স্ট্রিম তৈরি হয় না।
+- icon: "🎯"
+ title: ইম্পারেটিভ স্টাইল (Imperative Style)
+ desc: সরাসরি লুপ এবং কন্ডিশনাল ব্যবহার করুন।
+- icon: "📐"
+ title: ফ্লেক্সিবল (Flexible)
+ desc: সম্পূর্ণ কন্ট্রোল সহ শূন্য, এক, বা একাধিক এলিমেন্ট নির্গত করুন।
+support:
+ description: JDK 16 (মার্চ 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/streams/stream-of-nullable.yaml b/translations/content/bn/streams/stream-of-nullable.yaml
new file mode 100644
index 0000000..ff6c81c
--- /dev/null
+++ b/translations/content/bn/streams/stream-of-nullable.yaml
@@ -0,0 +1,18 @@
+---
+title: Stream.ofNullable()
+oldApproach: Null চেক
+modernApproach: ofNullable()
+summary: nullable ভ্যালু (nullable value) থেকে শূন্য-বা-এক এলিমেন্টের স্ট্রিম তৈরি করুন।
+explanation: Stream.ofNullable() মেথডটি ভ্যালুটি নন-নাল (non-null) হলে একটি সিঙ্গেল-এলিমেন্ট স্ট্রিম রিটার্ন করে, অথবা null হলে একটি এম্পটি স্ট্রিম (empty stream) রিটার্ন করে। এটি টারনারি null চেক প্যাটার্নকে (ternary null check pattern) দূর করে।
+whyModernWins:
+- icon: "📏"
+ title: সুসংক্ষিপ্ত
+ desc: এক কল-এই টারনারি কন্ডিশনালকে প্রতিস্থাপন করে।
+- icon: "🔗"
+ title: flatMap-ফ্রেন্ডলি
+ desc: flatMap-এর ভিতরে null ভ্যালু বাদ দিতে পারফেক্ট।
+- icon: "🛡️"
+ title: Null-সেফ
+ desc: কোনো NPE ঝুঁকি নেই – null হলে এম্পটি স্ট্রিম হয়ে যায়।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/streams/stream-takewhile-dropwhile.yaml b/translations/content/bn/streams/stream-takewhile-dropwhile.yaml
new file mode 100644
index 0000000..47ef929
--- /dev/null
+++ b/translations/content/bn/streams/stream-takewhile-dropwhile.yaml
@@ -0,0 +1,18 @@
+---
+title: Stream takeWhile / dropWhile
+oldApproach: ম্যানুয়াল লুপ
+modernApproach: takeWhile/dropWhile
+summary: একটি প্রেডিকেটের (predicate) উপর ভিত্তি করে একটি স্ট্রিম থেকে এলিমেন্ট নিন বা বাদ দিন।
+explanation: takeWhile() মেথডটি প্রেডিকেট সত্য (true) হওয়া পর্যন্ত এলিমেন্ট রিটার্ন করে এবং প্রথম মিথ্যা (false) তে পৌঁছালে থামা। dropWhile() মেথডটি প্রেডিকেট সত্য থাকা পর্যন্ত এলিমেন্ট স্কিপ করে এবং বাকিগুলো রিটার্ন করে। উভয় মেথডই অর্ডারড স্ট্রিমগুলোতে (ordered streams) সবচেয়ে ভালো কাজ করে।
+whyModernWins:
+- icon: "🎯"
+ title: শর্ট-সার্কিট (Short-circuit)
+ desc: প্রেডিকেট ব্যর্থ হওয়ার সাথে সাথে প্রসেসিং বন্ধ হয়ে যায়।
+- icon: "🔗"
+ title: পাইপলাইন-ফ্রেন্ডলি (Pipeline-friendly)
+ desc: অন্যান্য স্ট্রিম অপারেশনগুলোর সাথে স্বাভাবিকভাবে চেইন হয়।
+- icon: "📖"
+ title: ডিক্লারেটিভ (Declarative)
+ desc: takeWhile মেথডটি '১০০ এর কম হলে নাও' এর মতো করে পঠনযোগ্য।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/streams/stream-tolist.yaml b/translations/content/bn/streams/stream-tolist.yaml
new file mode 100644
index 0000000..7fb422f
--- /dev/null
+++ b/translations/content/bn/streams/stream-tolist.yaml
@@ -0,0 +1,18 @@
+---
+title: Stream.toList()
+oldApproach: collect(Collectors.toList())
+modernApproach: .toList()
+summary: টার্মিনাল toList() মেথডটি verbose collect(Collectors.toList())-কে প্রতিস্থাপন করে।
+explanation: Stream.toList() মেথডটি একটি আনমডিফাইয়েবল লিস্ট (unmodifiable list) রিটার্ন করে। এটি .collect(Collectors.toUnmodifiableList()) এর সমতুল্য, কিন্তু অনেক সংক্ষিপ্ত। উল্লেখ্য যে, এর ফলাফল ইমিউটেবল (immutable), Collectors.toList()-এর মতো নয়।
+whyModernWins:
+- icon: "📏"
+ title: 7 ক্যারেক্টার বনাম 24
+ desc: .toList() মেথডটি .collect(Collectors.toList())-কে প্রতিস্থাপন করে।
+- icon: "🔒"
+ title: ইমিউটেবল (Immutable)
+ desc: ফলাফল লিস্টটি পরিবর্তন করা যায় না।
+- icon: "📖"
+ title: ফ্লুয়েন্ট (Fluent)
+ desc: একটি পাইপলাইনের শেষে স্বাভাবিকভাবে পঠনযোগ্য।
+support:
+ description: JDK 16 (মার্চ 2021) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/streams/virtual-thread-executor.yaml b/translations/content/bn/streams/virtual-thread-executor.yaml
new file mode 100644
index 0000000..dd5951b
--- /dev/null
+++ b/translations/content/bn/streams/virtual-thread-executor.yaml
@@ -0,0 +1,18 @@
+---
+title: ভার্চুয়াল থ্রেড এক্সিকিউটর (Virtual Thread Executor)
+oldApproach: ফিক্সড থ্রেড পুল (Fixed Thread Pool)
+modernApproach: ভার্চুয়াল থ্রেড এক্সিকিউটর
+summary: সীমাহীন লাইটওয়েট কনকারেন্সির (lightweight concurrency) জন্য ভার্চুয়াল থ্রেড এক্সিকিউটর ব্যবহার করুন।
+explanation: ভার্চুয়াল থ্রেড এক্সিকিউটর প্রতিটি টাস্কের জন্য একটি নতুন ভার্চুয়াল থ্রেড তৈরি করে। কোনো পুল সাইজিংয়ের (pool sizing) প্রয়োজন নেই – ভার্চুয়াল থ্রেডগুলো এত সস্তা যে লক্ষ লক্ষ তৈরি করা যায়।
+whyModernWins:
+- icon: "♾️"
+ title: কোনো সাইজিং নেই
+ desc: কোনো পুল সাইজ টিউন করার প্রয়োজন নেই – যতগুলো থ্রেড দরকার ততগুলো তৈরি করুন।
+- icon: "⚡"
+ title: লাইটওয়েট
+ desc: ভার্চুয়াল থ্রেডগুলো কিলোবাইট (KB) মেমরি ব্যবহার করে, মেগাবাইট (MB) নয়।
+- icon: "🧹"
+ title: অটো-ক্লোজেবল (Auto-closeable)
+ desc: ট্রাই-উইথ-রিসোর্সেস (try-with-resources) স্বয়ংক্রিয়ভাবে শাটডাউন হ্যান্ডেল করে।
+support:
+ description: JDK 21 LTS (সেপ্টেম্বর 2023) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/strings/string-chars-stream.yaml b/translations/content/bn/strings/string-chars-stream.yaml
new file mode 100644
index 0000000..b446604
--- /dev/null
+++ b/translations/content/bn/strings/string-chars-stream.yaml
@@ -0,0 +1,18 @@
+---
+title: Stream হিসাবে String chars (String chars as stream)
+oldApproach: ম্যানুয়াল লুপ
+modernApproach: chars() Stream
+summary: স্ট্রিং ক্যারেক্টারগুলোকে (string characters) একটি স্ট্রিম পাইপলাইন (stream pipeline) হিসাবে প্রসেস করুন।
+explanation: String.chars() মেথডটি ক্যারেক্টার ভ্যালুগুলোর একটি IntStream রিটার্ন করে, যা ফাংশনাল প্রসেসিং সক্ষম করে। ইউনিকোড সাপোর্টের জন্য, codePoints() মেথডটি সাপ্লিমেন্টারি ক্যারেক্টারগুলোকে (supplementary characters) সঠিকভাবে হ্যান্ডেল করে।
+whyModernWins:
+- icon: "🔗"
+ title: চেইনেবল (Chainable)
+ desc: ক্যারেক্টার স্ট্রিমগুলোতে filter, map, collect ব্যবহার করুন।
+- icon: "📐"
+ title: ডিক্লারেটিভ (Declarative)
+ desc: কী করতে হবে তা বর্ণনা করুন, কিভাবে লুপ করতে হবে তা নয়।
+- icon: "🌐"
+ title: ইউনিকোড-রেডি (Unicode-ready)
+ desc: codePoints() মেথডটি ইমোজি (emoji) এবং সাপ্লিমেন্টারি ক্যারেক্টারগুলো (supplementary chars) সঠিকভাবে হ্যান্ডেল করে।
+support:
+ description: JDK 8+ থেকে উপলব্ধ (9+ এ উন্নত)
\ No newline at end of file
diff --git a/translations/content/bn/strings/string-formatted.yaml b/translations/content/bn/strings/string-formatted.yaml
new file mode 100644
index 0000000..6954504
--- /dev/null
+++ b/translations/content/bn/strings/string-formatted.yaml
@@ -0,0 +1,18 @@
+---
+title: String.formatted()
+oldApproach: String.format()
+modernApproach: formatted()
+summary: টেমপ্লেট স্ট্রিং-এর উপর সরাসরি formatted() মেথডটি কল করুন।
+explanation: String.formatted() মেথডটি String.format()-এর একটি ইনস্ট্যান্স মেথড ইকুইভ্যালেন্ট, যা ফরম্যাট স্ট্রিং এর উপর কল করা হয়। এটি বাম থেকে ডানে (left-to-right) আরও স্বাভাবিকভাবে পঠনযোগ্য।
+whyModernWins:
+- icon: "📖"
+ title: স্বাভাবিকভাবে পঠনযোগ্য
+ desc: Template.formatted(args) মেথডটি String.format(template, args)-এর চেয়ে বেশি ফ্লুয়েন্ট।
+- icon: "🔗"
+ title: চেইনেবল (Chainable)
+ desc: অন্যান্য স্ট্রিং মেথডগুলোর সাথে চেইন করা যায়।
+- icon: "📏"
+ title: কম ভার্বোস (Less Verbose)
+ desc: অপ্রয়োজনীয় String.format() স্ট্যাটিক কলকে বাদ দেয়।
+support:
+ description: JDK 15 (সেপ্টেম্বর 2020) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/strings/string-indent-transform.yaml b/translations/content/bn/strings/string-indent-transform.yaml
new file mode 100644
index 0000000..f172b1c
--- /dev/null
+++ b/translations/content/bn/strings/string-indent-transform.yaml
@@ -0,0 +1,18 @@
+---
+title: String.indent() এবং transform()
+oldApproach: ম্যানুয়াল ইন্ডেন্টেশন
+modernApproach: indent() / transform()
+summary: টেক্সট ইন্ডেন্ট (indent) করুন এবং স্ট্রিং ট্রান্সফরমেশন (string transformations) ফ্লুয়েন্টলি চেইন (chain) করুন।
+explanation: indent(n) মেথডটি প্রতিটি লাইনে n সংখ্যক স্পেস যোগ করে। transform(fn) মেথডটি যেকোনো ফাংশন প্রয়োগ করে এবং ফলাফল রিটার্ন করে, যা স্ট্রিং অপারেশনগুলোর ফ্লুয়েন্ট চেইনিং সক্ষম করে।
+whyModernWins:
+- icon: "📏"
+ title: বিল্ট-ইন
+ desc: ইন্ডেন্টেশন একটি কমন অপারেশন – এখন এটি একটি সিঙ্গেল কল-এই করা যায়।
+- icon: "🔗"
+ title: চেইনেবল (Chainable)
+ desc: transform() মেথডটি স্ট্রিংগুলোতে ফ্লুয়েন্ট পাইপলাইন সক্ষম করে।
+- icon: "🧹"
+ title: ক্লিন কোড
+ desc: কোনো ম্যানুয়াল লাইন স্প্লিটিং এবং StringBuilder লুপের প্রয়োজন নেই।
+support:
+ description: JDK 12 (মার্চ 2019) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/strings/string-isblank.yaml b/translations/content/bn/strings/string-isblank.yaml
new file mode 100644
index 0000000..78f0775
--- /dev/null
+++ b/translations/content/bn/strings/string-isblank.yaml
@@ -0,0 +1,18 @@
+---
+title: String.isBlank()
+oldApproach: trim().isEmpty()
+modernApproach: isBlank()
+summary: একটি সিঙ্গেল মেথড কল দিয়ে ব্ল্যাঙ্ক (blank) স্ট্রিং চেক করুন।
+explanation: isBlank() মেথডটি রিটার্ন করে true যদি স্ট্রিংটি এম্পটি হয় বা শুধুমাত্র হোয়াইটস্পেস (whitespace) ধারণ করে, যার মধ্যে trim() মেথডটি মিস করে এমন ইউনিকোড হোয়াইটস্পেস ক্যারেক্টারও (Unicode whitespace characters) অন্তর্ভুক্ত।
+whyModernWins:
+- icon: "📖"
+ title: স্ব-ডকুমেন্টিং (Self-documenting)
+ desc: isBlank() মেথডটি ঠিক কী চেক করে তা স্পষ্টভাবে বলে।
+- icon: "🌐"
+ title: ইউনিকোড-অ্যাওয়ার (Unicode-aware)
+ desc: এটি শুধুমাত্র ASCII নয়, সমস্ত ইউনিকোড হোয়াইটস্পেস হ্যান্ডেল করে।
+- icon: "⚡"
+ title: কোনো অ্যালোকেশন (Allocation) নেই
+ desc: কোনো ইন্টারমিডিয়েট ট্রিমড স্ট্রিং (intermediate trimmed string) তৈরি হয় না।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/strings/string-lines.yaml b/translations/content/bn/strings/string-lines.yaml
new file mode 100644
index 0000000..413a441
--- /dev/null
+++ b/translations/content/bn/strings/string-lines.yaml
@@ -0,0 +1,18 @@
+---
+title: লাইন স্প্লিটিংয়ের জন্য String.lines()
+oldApproach: split("\n")
+modernApproach: lines()
+summary: regex ওভারহেড (overhead) ছাড়াই টেক্সটকে স্ট্রিম অব লাইনসে (stream of lines) বিভক্ত করতে String.lines() ব্যবহার করুন।
+explanation: String.lines() মেথডটি \n, \r, বা \r\n দ্বারা বিভক্ত লাইনগুলোর Stream রিটার্ন করে। এটি split() মেথডের চেয়ে বেশি লেজি (lazy) এবং ইফিশিয়েন্ট, regex কম্পাইলেশন এড়িয়ে যায় এবং আরও প্রসেসিংয়ের জন্য Stream API এর সাথে স্বাভাবিকভাবে ইন্টিগ্রেট করে।
+whyModernWins:
+- icon: "⚡"
+ title: লেজি স্ট্রিমিং (Lazy Streaming)
+ desc: লাইনগুলো ডিমান্ড অনুযায়ী তৈরি হয়, split() এর মতো সব একসাথে নয়।
+- icon: "🔧"
+ title: ইউনিভার্সাল লাইন এন্ডিং (Universal Line Endings)
+ desc: regex ছাড়াই স্বয়ংক্রিয়ভাবে \n, \r, এবং \r\n হ্যান্ডেল করে।
+- icon: "🔗"
+ title: স্ট্রিম ইন্টিগ্রেশন (Stream Integration)
+ desc: filter, map, collect-এর সাথে সরাসরি ব্যবহারের জন্য একটি Stream রিটার্ন করে।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে উপলব্ধ।
\ No newline at end of file
diff --git a/translations/content/bn/strings/string-repeat.yaml b/translations/content/bn/strings/string-repeat.yaml
new file mode 100644
index 0000000..58d41ff
--- /dev/null
+++ b/translations/content/bn/strings/string-repeat.yaml
@@ -0,0 +1,18 @@
+---
+title: String.repeat()
+oldApproach: StringBuilder লুপ
+modernApproach: repeat()
+summary: কোনো লুপ ছাড়াই একটি স্ট্রিংকে n বার রিপিট করুন।
+explanation: String.repeat(int) মেথডটি স্ট্রিংটিকে n বার নিজের সাথে কনক্যাটেনেট (concatenated) করে রিটার্ন করে। এটি এজ কেইসগুলো (edge cases) হ্যান্ডেল করে: repeat(0) এম্পটি স্ট্রিং রিটার্ন করে, repeat(1) একই স্ট্রিং রিটার্ন করে।
+whyModernWins:
+- icon: "📏"
+ title: ওয়ান-লাইনার (One-liner)
+ desc: StringBuilder কোডের ৫ লাইনকে একটি সিঙ্গেল কল দিয়ে প্রতিস্থাপন করুন।
+- icon: "⚡"
+ title: অপ্টিমাইজড (Optimized)
+ desc: ইন্টারনাল ইমপ্লিমেন্টেশন (internal implementation) বড় রিপিটেশনের জন্য অপ্টিমাইজ করা হয়েছে।
+- icon: "📖"
+ title: পরিষ্কার উদ্দেশ্য
+ desc: repeat(3) দ্বারা এর উদ্দেশ্য অবিলম্বে বোঝা যায়।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/strings/string-strip.yaml b/translations/content/bn/strings/string-strip.yaml
new file mode 100644
index 0000000..449f979
--- /dev/null
+++ b/translations/content/bn/strings/string-strip.yaml
@@ -0,0 +1,18 @@
+---
+title: String.strip() বনাম trim()
+oldApproach: trim()
+modernApproach: strip()
+summary: strip(), stripLeading(), stripTrailing() মেথডগুলো ব্যবহার করে ইউনিকোড-অ্যাওয়ার স্ট্রিপিং (Unicode-aware stripping) করুন।
+explanation: trim() মেথডটি শুধুমাত্র ≤ U+0020 (ASCII কন্ট্রোল ক্যারেক্টার এবং স্পেস) এর ক্যারেক্টারগুলো সরিয়ে দেয়। strip() মেথডটি Character.isWhitespace() ব্যবহার করে, যা ইউনিকোড স্পেস (Unicode spaces) যেমন নন-ব্রেকিং স্পেস (non-breaking space), আইডিওগ্রাফিক স্পেস (ideographic space) ইত্যাদি হ্যান্ডেল করে।
+whyModernWins:
+- icon: "🌐"
+ title: ইউনিকোড-কারেক্ট
+ desc: প্রতিটি স্ক্রিপ্ট থেকে সমস্ত হোয়াইটস্পেস ক্যারেক্টার হ্যান্ডেল করে।
+- icon: "🎯"
+ title: ডিরেকশনাল (Directional)
+ desc: এক-পার্শ্বযুক্ত ট্রিমিংয়ের জন্য stripLeading() এবং stripTrailing() ব্যবহার করুন।
+- icon: "🛡️"
+ title: কম বাগ
+ desc: আন্তর্জাতিক টেক্সটে অপ্রত্যাশিত হোয়াইটস্পেস থাকার ঝুঁকি থাকে না।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/tooling/aot-class-preloading.yaml b/translations/content/bn/tooling/aot-class-preloading.yaml
new file mode 100644
index 0000000..8ce3a16
--- /dev/null
+++ b/translations/content/bn/tooling/aot-class-preloading.yaml
@@ -0,0 +1,18 @@
+---
+title: AOT ক্লাস প্রিলোডিং (AOT class preloading)
+oldApproach: কোল্ড স্টার্ট প্রতিবার
+modernApproach: AOT ক্যাশে
+summary: তাত্ক্ষণিক স্টার্টআপের জন্য ক্লাস লোডিং (class loading) এবং কম্পাইলেশন (compilation) ক্যাশ করুন।
+explanation: AOT ক্লাস প্রিলোডিং একটি ট্রেনিং রান থেকে লোড করা এবং লিঙ্ক করা ক্লাসগুলোকে ক্যাশ করে। পরবর্তী স্টার্টআপে, ক্লাসগুলো ক্যাশ থেকে লোড হয়, যা ভ্যারিফিকেশন (verification) এবং লিঙ্কিং (linking) ধাপগুলো এড়িয়ে যায়। AOT কম্পাইলেশনের (compilation) সাথে মিলিত হলে, এটি স্টার্টআপ টাইমকে নাটকীয়ভাবে কমিয়ে দেয়।
+whyModernWins:
+- icon: "⚡"
+ title: দ্রুত স্টার্টআপ
+ desc: ক্লাস লোডিং, ভ্যারিফিকেশন এবং লিঙ্কিং ধাপগুলো এড়িয়ে যান।
+- icon: "📦"
+ title: ক্যাশড স্টেট (Cached State)
+ desc: ট্রেনিং রানটি আদর্শ ক্লাস স্টেট ক্যাপচার করে।
+- icon: "🔧"
+ title: কোনো কোড পরিবর্তন নেই
+ desc: বিদ্যমান অ্যাপ্লিকেশনগুলোর সাথে কাজ করে – শুধু JVM ফ্ল্যাগ যোগ করুন।
+support:
+ description: JDK 25 LTS (JEPs 514/515, সেপ্টেম্বর 2025) এ একটি স্ট্যান্ডার্ড ফিচার হিসাবে উপলব্ধ।
\ No newline at end of file
diff --git a/translations/content/bn/tooling/built-in-http-server.yaml b/translations/content/bn/tooling/built-in-http-server.yaml
new file mode 100644
index 0000000..6d56cc0
--- /dev/null
+++ b/translations/content/bn/tooling/built-in-http-server.yaml
@@ -0,0 +1,18 @@
+---
+title: বিল্ট-ইন HTTP সার্ভার (Built-in HTTP server)
+oldApproach: এক্সটার্নাল সার্ভার / ফ্রেমওয়ার্ক
+modernApproach: jwebserver CLI
+summary: Java 18 প্রোটোটাইপিং (prototyping) এবং ফাইল সার্ভিংয়ের জন্য একটি বিল্ট-ইন মিনিমাল HTTP সার্ভার অন্তর্ভুক্ত করে।
+explanation: JDK 18 একটি সিম্পল, জিরো-ডিপেন্ডেন্সি HTTP ফাইল সার্ভার যোগ করেছে, যা jwebserver কমান্ড-লাইন টুল বা SimpleFileServer API-এর মাধ্যমে অ্যাক্সেসযোগ্য। এটি একটি নির্দিষ্ট ডিরেক্টরি থেকে স্ট্যাটিক ফাইল সার্ভ করে, কোনো কনফিগারেশনের প্রয়োজন নেই। CLI টুলটি দ্রুত প্রোটোটাইপিং, টেস্টিং এবং অ্যাড-হক (ad-hoc) ফাইল শেয়ার করার জন্য আদর্শ – কোনো এক্সটার্নাল ডিপেন্ডেন্সি বা ফ্রেমওয়ার্কের প্রয়োজন নেই। API কাস্টমাইজেবল হ্যান্ডলার (customizable handlers) এবং আউটপুট লেভেল সহ প্রোগ্রামাটিক ব্যবহারের অনুমতি দেয়।
+whyModernWins:
+- icon: "🚀"
+ title: জিরো সেটআপ
+ desc: যেকোনো ডিরেক্টরিতে jwebserver চালান – কোনো ইন্সটলেশন, কনফিগ বা ডিপেন্ডেন্সি (dependencies) এর প্রয়োজন নেই।
+- icon: "📦"
+ title: JDK তে বিল্ট-ইন
+ desc: প্রতিটি JDK 18+ ইন্সটলেশনের সাথে আসে, জাভা সহ যেকোনো মেশিনে সর্বদা উপলব্ধ।
+- icon: "🧪"
+ title: প্রোটোটাইপিংয়ের জন্য দারুণ
+ desc: HTML, APIs, বা ফ্রন্ট-এন্ড ডেভেলপমেন্ট টেস্টিংয়ের জন্য অবিলম্বে স্ট্যাটিক ফাইল সার্ভ করুন।
+support:
+ description: JDK 18 (মার্চ 2022) থেকে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/tooling/compact-object-headers.yaml b/translations/content/bn/tooling/compact-object-headers.yaml
new file mode 100644
index 0000000..92f42d9
--- /dev/null
+++ b/translations/content/bn/tooling/compact-object-headers.yaml
@@ -0,0 +1,18 @@
+---
+title: কমপ্যাক্ট অবজেক্ট হেডারস (Compact Object Headers)
+oldApproach: 128-বিট হেডার
+modernApproach: 64-বিট হেডার
+summary: উন্নত মেমরি ডেনসিটি (memory density) এবং ক্যাশে ব্যবহারের (cache usage) জন্য অবজেক্ট হেডারের আকার অর্ধেক কমিয়ে দিন।
+explanation: কমপ্যাক্ট অবজেক্ট হেডার 64-বিট প্ল্যাটফর্মে প্রতি-অবজেক্ট ওভারহেড (per-object overhead) 128 বিট থেকে 64 বিটে কমিয়ে দেয়। এটি মেমরি সেভ করে এবং ক্যাশে ব্যবহার উন্নত করে, বিশেষ করে ছোট অবজেক্টের অ্যাপ্লিকেশনগুলোর জন্য।
+whyModernWins:
+- icon: "📦"
+ title: 50% ছোট হেডার
+ desc: প্রতি অবজেক্টে 16 বাইটের পরিবর্তে 8 বাইট।
+- icon: "⚡"
+ title: উন্নত ক্যাশে ব্যবহার
+ desc: CPU ক্যাশে লাইনে আরও অবজেক্ট ফিট হয়।
+- icon: "📊"
+ title: উচ্চ ঘনত্ব
+ desc: একই হিপ সাইজে (heap size) আরও অবজেক্ট ফিট করুন।
+support:
+ description: JDK 25 LTS (JEP 519, সেপ্টেম্বর 2025) এ চূড়ান্ত হয়েছে।
\ No newline at end of file
diff --git a/translations/content/bn/tooling/jfr-profiling.yaml b/translations/content/bn/tooling/jfr-profiling.yaml
new file mode 100644
index 0000000..f708ef2
--- /dev/null
+++ b/translations/content/bn/tooling/jfr-profiling.yaml
@@ -0,0 +1,18 @@
+---
+title: প্রোফাইলিংয়ের জন্য JFR
+oldApproach: এক্সটার্নাল প্রোফাইলার
+modernApproach: Java Flight Recorder
+summary: বিল্ট-ইন ফ্লাইট রেকর্ডার (Flight Recorder) ব্যবহার করে যেকোনো জাভা অ্যাপ (Java app) প্রোফাইল করুন – কোনো এক্সটার্নাল টুলের প্রয়োজন নেই।
+explanation: Java Flight Recorder (JFR) হলো JVM-এর (Java Virtual Machine) মধ্যে বিল্ট-ইন একটি লো-ওভারহেড প্রোফাইলিং টুল। এটি CPU, মেমরি, GC, I/O, থ্রেড এবং কাস্টম ইভেন্টগুলোর জন্য ইভেন্ট ক্যাপচার করে, যার পারফরম্যান্সের উপর ন্যূনতম প্রভাব (~1%) থাকে।
+whyModernWins:
+- icon: "🆓"
+ title: বিল্ট-ইন
+ desc: কোনো এক্সটার্নাল প্রোফাইলার ইনস্টল বা লাইসেন্স করার প্রয়োজন নেই।
+- icon: "⚡"
+ title: কম ওভারহেড
+ desc: পারফরম্যান্সে ~1% প্রভাব – প্রোডাকশনের (production) জন্য নিরাপদ।
+- icon: "📊"
+ title: সমৃদ্ধ ইভেন্ট
+ desc: CPU, মেমরি, GC, থ্রেড, I/O, লক এবং কাস্টম ইভেন্ট।
+support:
+ description: JDK 9/11 থেকে ব্যাপকভাবে উপলব্ধ (11-এ ওপেন সোর্স)
\ No newline at end of file
diff --git a/translations/content/bn/tooling/jshell-prototyping.yaml b/translations/content/bn/tooling/jshell-prototyping.yaml
new file mode 100644
index 0000000..1a8271e
--- /dev/null
+++ b/translations/content/bn/tooling/jshell-prototyping.yaml
@@ -0,0 +1,18 @@
+---
+title: প্রোটোটাইপিংয়ের জন্য JShell
+oldApproach: ফাইল তৈরি করুন + কম্পাইল + রান করুন
+modernApproach: jshell REPL
+summary: ফাইল তৈরি না করেই ইন্টারঅ্যাক্টিভভাবে (interactively) জাভা এক্সপ্রেশনগুলো (expressions) ট্রাই করুন।
+explanation: JShell হলো জাভার জন্য একটি রিড-ইভাল-প্রিন্ট লুপ (Read-Eval-Print Loop)। ফাইল তৈরি করা, কম্পাইল করা বা মেইন মেথড না লিখে এক্সপ্রেশন টেস্ট করুন, API-এর সাথে এক্সপেরিমেন্ট করুন এবং কোড প্রোটোটাইপ করুন। এতে ট্যাব কমপ্লিশন (tab completion) এবং ইনলাইন ডক্স (inline docs) অন্তর্ভুক্ত।
+whyModernWins:
+- icon: "⚡"
+ title: তাত্ক্ষণিক ফিডব্যাক (Instant Feedback)
+ desc: একটি এক্সপ্রেশন টাইপ করুন, সাথে সাথে ফলাফল দেখুন।
+- icon: "📝"
+ title: কোনো ফাইলের প্রয়োজন নেই
+ desc: কোনো .java ফাইল নেই, কোনো কম্পাইলেশন স্টেপ নেই।
+- icon: "🔍"
+ title: API এক্সপ্লোরেশন
+ desc: ট্যাব কমপ্লিশন মেথড এবং প্যারামিটারগুলো ডিসকভার করতে সাহায্য করে।
+support:
+ description: JDK 9 (সেপ্টেম্বর 2017) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/tooling/junit6-with-jspecify.yaml b/translations/content/bn/tooling/junit6-with-jspecify.yaml
new file mode 100644
index 0000000..cf51f03
--- /dev/null
+++ b/translations/content/bn/tooling/junit6-with-jspecify.yaml
@@ -0,0 +1,18 @@
+---
+title: JSpecify null সেফটি সহ JUnit 6
+oldApproach: আনঅ্যানোটেটেড API
+modernApproach: @NullMarked API
+summary: JUnit 6 JSpecify @NullMarked গ্রহণ করেছে, যা JUnit-এর অ্যাসারশন API (assertion API) জুড়ে null কন্টাক্টগুলোকে সুস্পষ্ট করে তোলে।
+explanation: JUnit 5 স্ট্যান্ডার্ডাইজড নাল্যাবিলিটি অ্যানোটেশন (nullability annotations) ছাড়াই রিলিজ হয়েছিল, যা ডেভেলপারদের অ্যাসারশন প্যারামিটার বা রিটার্ন ভ্যালুগুলো null হতে পারে কিনা তা নিয়ে অনুমান করতে বাধ্য করত। JUnit 6 তার পুরো মডিউল জুড়ে JSpecify গ্রহণ করেছে: @NullMarked অ্যানোটেশনটি ডিফল্টরূপে সমস্ত আনঅ্যানোটেটেড টাইপকে নন-নাল করে তোলে এবং @Nullable ব্যতিক্রমগুলোকে চিহ্নিত করে। Assertions ক্লাস স্পষ্টভাবে assertNull(@Nullable Object actual) এবং fail(@Nullable String message)-এর মতো প্যারামিটারগুলোকে অ্যানোটেট করে, তাই IDEs এবং NullAway ও Error Prone-এর মতো স্ট্যাটিক অ্যানালাইজারগুলো রানটাইমের পরিবর্তে কম্পাইল টাইমে null-এর ভুল ব্যবহার ধরতে পারে।
+whyModernWins:
+- icon: "📜"
+ title: সুস্পষ্ট কনট্র্যাক্ট (Explicit Contracts)
+ desc: JUnit 6 মডিউলে @NullMarked অ্যানোটেশনটি API-তে সরাসরি null সেমান্টিক্স (semantics) নথিভুক্ত করে – সোর্স-রিডিংয়ের প্রয়োজন নেই।
+- icon: "🛡️"
+ title: কম্পাইল-টাইম সেফটি
+ desc: IDEs এবং অ্যানালাইজারগুলো null পাস করা হলে ওয়ার্নিং দেয় যেখানে নন-নাল আশা করা হয়, যা টেস্ট রান করার আগেই বাগ ধরতে সাহায্য করে।
+- icon: "🌐"
+ title: ইকোসিস্টেম স্ট্যান্ডার্ড
+ desc: JSpecify Spring, Guava এবং অন্যান্য ফ্রেমওয়ার্ক দ্বারা গৃহীত হয়েছে – আপনার পুরো স্ট্যাক জুড়ে সামঞ্জস্যপূর্ণ null সেমান্টিক্স।
+support:
+ description: JUnit 6.0 থেকে উপলব্ধ (অক্টোবর 2025, Java 17+ প্রয়োজন)
\ No newline at end of file
diff --git a/translations/content/bn/tooling/multi-file-source.yaml b/translations/content/bn/tooling/multi-file-source.yaml
new file mode 100644
index 0000000..8b9df27
--- /dev/null
+++ b/translations/content/bn/tooling/multi-file-source.yaml
@@ -0,0 +1,18 @@
+---
+title: মাল্টি-ফাইল সোর্স লঞ্চার (Multi-file source launcher)
+oldApproach: প্রথমে সব কম্পাইল করুন
+modernApproach: সোর্স লঞ্চার
+summary: এক্সপ্লিসিট কম্পাইল স্টেপ (explicit compile step) ছাড়াই মাল্টি-ফাইল প্রোগ্রাম লঞ্চ করুন।
+explanation: Java 22+ একটি .java ফাইল থেকে লঞ্চ করার সময় রেফারেন্সড সোর্স ফাইলগুলোকে (referenced source files) স্বয়ংক্রিয়ভাবে কম্পাইল করতে পারে। এটি Maven বা Gradle এর প্রয়োজন ছাড়াই ছোট মাল্টি-ফাইল প্রোগ্রামগুলোকে স্ক্রিপ্টের মতো চালানো সহজ করে তোলে।
+whyModernWins:
+- icon: "🚀"
+ title: জিরো সেটআপ
+ desc: ছোট মাল্টি-ফাইল প্রোগ্রামগুলোর জন্য কোনো বিল্ড টুলের (build tool) প্রয়োজন নেই।
+- icon: "🔗"
+ title: অটো-রিজলভ (Auto-resolve)
+ desc: রেফারেন্সড ক্লাসগুলো স্বয়ংক্রিয়ভাবে খুঁজে বের করে এবং কম্পাইল করে।
+- icon: "📝"
+ title: স্ক্রিপ্ট-এর মতো
+ desc: মাল্টি-ফাইল প্রোগ্রামগুলোকে স্ক্রিপ্টের মতো চালান।
+support:
+ description: JDK 22 (মার্চ 2024) থেকে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/bn/tooling/single-file-execution.yaml b/translations/content/bn/tooling/single-file-execution.yaml
new file mode 100644
index 0000000..bf4108f
--- /dev/null
+++ b/translations/content/bn/tooling/single-file-execution.yaml
@@ -0,0 +1,18 @@
+---
+title: সিঙ্গেল-ফাইল এক্সিকিউশন (Single-file execution)
+oldApproach: টু-স্টেপ কম্পাইল (Two-Step Compile)
+modernApproach: ডিরেক্ট লঞ্চ
+summary: javac ছাড়াই সিঙ্গেল-ফাইল জাভা প্রোগ্রাম সরাসরি রান করুন।
+explanation: জাভা লঞ্চার একটি কমান্ডে একটি সিঙ্গেল সোর্স ফাইলকে কম্পাইল এবং রান করতে পারে। ইউনিক্সে শেবাং (shebang) সাপোর্ট সহ, জাভা ফাইলগুলো স্ক্রিপ্ট হিসেবে কাজ করতে পারে। কোনো আলাদা কম্পাইলেশন স্টেপের (compilation step) প্রয়োজন নেই।
+whyModernWins:
+- icon: "⚡"
+ title: একটি কমান্ড
+ desc: `java File.java` এক স্টেপেই কম্পাইল এবং রান করে।
+- icon: "📝"
+ title: স্ক্রিপ্ট-এর মতো
+ desc: `.java` ফাইলগুলোকে এক্সিকিউটেবল স্ক্রিপ্ট (executable scripts) তৈরি করতে একটি শেবাং লাইন যোগ করুন।
+- icon: "🎓"
+ title: শেখার জন্য সহজ
+ desc: নতুনরা বিল্ড টুল না শিখে অবিলম্বে কোড রান করতে পারে।
+support:
+ description: JDK 11 (সেপ্টেম্বর 2018) থেকে ব্যাপকভাবে উপলব্ধ
\ No newline at end of file
diff --git a/translations/content/de/collections/copying-collections-immutably.yaml b/translations/content/de/collections/copying-collections-immutably.yaml
index 0ed476c..2734dfa 100644
--- a/translations/content/de/collections/copying-collections-immutably.yaml
+++ b/translations/content/de/collections/copying-collections-immutably.yaml
@@ -13,7 +13,7 @@ whyModernWins:
title: Ein einziger Aufruf
desc: Kein manuelles ArrayList-Erstellen und Verpacken.
- icon: "🛡️"
- title: Defensive Kopie
- desc: Änderungen am Original wirken sich nicht auf die Kopie aus.
+ title: Jede Collection
+ desc: Nimmt jede Collection als Eingabe entgegen – keine ArrayList-Zwischenkonvertierung nötig.
support:
description: Weitgehend verfügbar seit JDK 10 (März 2018)
diff --git a/translations/content/de/collections/stream-toarray-typed.yaml b/translations/content/de/collections/stream-toarray-typed.yaml
index a0a0bc8..e4c2f46 100644
--- a/translations/content/de/collections/stream-toarray-typed.yaml
+++ b/translations/content/de/collections/stream-toarray-typed.yaml
@@ -1,5 +1,5 @@
title: Typisiertes Stream-toArray
-oldApproach: Manuelle Array-Kopie
+oldApproach: Manuelle Filterung + Kopie
modernApproach: "toArray(generator)"
summary: Streams mit einer Methodenreferenz in typisierte Arrays umwandeln.
explanation: "Die Methode toArray(IntFunction) erstellt ein korrekt typisiertes Array\
diff --git a/translations/content/de/language/call-c-from-java.yaml b/translations/content/de/language/call-c-from-java.yaml
new file mode 100644
index 0000000..20694a9
--- /dev/null
+++ b/translations/content/de/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: "C-Code aus Java aufrufen"
+oldApproach: "JNI (Java Native Interface)"
+modernApproach: "FFM (Foreign Function & Memory API)"
+summary: "FFM ermöglicht es Java, C-Bibliotheken direkt aufzurufen, ohne JNI-Boilerplate oder Java-Kenntnisse auf der C-Seite."
+explanation: "Java bietet zwei Ansätze zum Aufrufen von nativem C/C++-Code: das traditionelle JNI und die moderne FFM API. Bei JNI deklarieren Sie eine Methode als native, führen javac -h aus, um eine C-Header-Datei zu generieren, und implementieren die Funktion mit der umständlichen JNI-C-API (JNIEnv, jstring usw.). FFM, als Standard-API in Java 22 eingeführt, eliminiert all das: C-Code bleibt reines C — keine JNI-Konventionen erforderlich. Dies macht es viel einfacher, bestehende C/C++-Bibliotheken ohne Änderungen aufzurufen. Die Java-Seite verwendet Arena für sicheres Off-Heap-Speichermanagement und MethodHandle für den Downcall, was sowohl Flexibilität als auch Sicherheit gewährleistet."
+whyModernWins:
+- icon: "👁"
+ title: "C-Code bleibt reines C"
+ desc: "Die C-Funktion benötigt keine JNI-Annotationen oder JNIEnv-Boilerplate — jede vorhandene C-Bibliothek kann direkt aufgerufen werden."
+- icon: "⚡"
+ title: "Flexibler"
+ desc: "Die meisten vorhandenen C/C++-Bibliotheken können direkt aufgerufen werden, ohne Adaptercode zu schreiben oder Header-Dateien zu generieren."
+- icon: "🛠️"
+ title: "Einfacherer Workflow"
+ desc: "Kein Stoppen, kein Ausführen von javac -h und kein Implementieren der in der generierten .h-Datei definierten Schnittstelle."
+support:
+ description: "In JDK 22 standardisiert (März 2024); zuvor seit JDK 14 in der Inkubationsphase"
diff --git a/translations/content/es/collections/copying-collections-immutably.yaml b/translations/content/es/collections/copying-collections-immutably.yaml
index 910e832..a5094b4 100644
--- a/translations/content/es/collections/copying-collections-immutably.yaml
+++ b/translations/content/es/collections/copying-collections-immutably.yaml
@@ -14,7 +14,7 @@ whyModernWins:
title: "Una sola llamada"
desc: "Sin construcción manual de ArrayList + envoltorio."
- icon: "🛡️"
- title: "Copia defensiva"
- desc: "Los cambios en el original no afectan a la copia."
+ title: "Cualquier Collection"
+ desc: "Acepta cualquier Collection como entrada, sin conversión intermedia a ArrayList."
support:
description: "Ampliamente disponible desde JDK 10 (marzo 2018)"
diff --git a/translations/content/es/collections/stream-toarray-typed.yaml b/translations/content/es/collections/stream-toarray-typed.yaml
index 086834a..5fa1312 100644
--- a/translations/content/es/collections/stream-toarray-typed.yaml
+++ b/translations/content/es/collections/stream-toarray-typed.yaml
@@ -1,6 +1,6 @@
---
title: "toArray tipado en streams"
-oldApproach: "Copia manual de array"
+oldApproach: "Filtro manual + copia"
modernApproach: "toArray(generator)"
summary: "Convierte streams en arrays tipados con una referencia a método."
explanation: "El método toArray(IntFunction) crea un array correctamente tipado a\
diff --git a/translations/content/es/language/call-c-from-java.yaml b/translations/content/es/language/call-c-from-java.yaml
new file mode 100644
index 0000000..f1302f0
--- /dev/null
+++ b/translations/content/es/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: Llamar a código C desde Java
+oldApproach: JNI (Java Native Interface)
+modernApproach: FFM (Foreign Function & Memory API)
+summary: FFM permite a Java llamar directamente a bibliotecas C sin el código repetitivo de JNI ni conocimiento de Java en el lado C.
+explanation: "Java tiene dos enfoques para llamar a código nativo C/C++: el tradicional JNI y la moderna API FFM. Con JNI, se declara un método como native, se ejecuta javac -h para generar un archivo de encabezado C y se implementa la función usando la complicada API JNI de C (JNIEnv, jstring, etc.). FFM, introducida como API estándar en Java 22, elimina todo eso: el código C es simplemente C puro — sin necesidad de convenciones JNI. Esto facilita mucho la llamada a bibliotecas C/C++ existentes sin modificaciones. El lado Java usa Arena para la gestión segura de memoria fuera del heap y MethodHandle para el downcall, garantizando flexibilidad y seguridad."
+whyModernWins:
+- icon: "👁"
+ title: El código C permanece como C puro
+ desc: "La función C no requiere anotaciones JNI ni código JNIEnv repetitivo — cualquier biblioteca C existente puede llamarse tal cual."
+- icon: "⚡"
+ title: Más flexible
+ desc: "Llama directamente a la mayoría de las bibliotecas C/C++ existentes sin escribir código adaptador ni generar archivos de encabezado."
+- icon: "🛠️"
+ title: Flujo de trabajo más sencillo
+ desc: "No es necesario detenerse, ejecutar javac -h e implementar la interfaz definida en el archivo .h generado."
+support:
+ description: Estandarizado en JDK 22 (marzo 2024); anteriormente en incubación desde JDK 14
diff --git a/translations/content/fr/collections/copying-collections-immutably.yaml b/translations/content/fr/collections/copying-collections-immutably.yaml
index 4e9cf74..1021d2c 100644
--- a/translations/content/fr/collections/copying-collections-immutably.yaml
+++ b/translations/content/fr/collections/copying-collections-immutably.yaml
@@ -12,7 +12,7 @@ whyModernWins:
title: "Un seul appel"
desc: "Sans construction manuelle d'ArrayList + wrapper."
- icon: "🛡️"
- title: "Copie défensive"
- desc: "Les modifications de l'original n'affectent pas la copie."
+ title: "N'importe quelle Collection"
+ desc: "Accepte n'importe quelle Collection en entrée—sans conversion intermédiaire en ArrayList."
support:
description: "Disponible depuis JDK 10 (mars 2018)"
diff --git a/translations/content/fr/collections/stream-toarray-typed.yaml b/translations/content/fr/collections/stream-toarray-typed.yaml
index 4340844..58e1c3c 100644
--- a/translations/content/fr/collections/stream-toarray-typed.yaml
+++ b/translations/content/fr/collections/stream-toarray-typed.yaml
@@ -1,6 +1,6 @@
---
title: "toArray typé dans les streams"
-oldApproach: "Copie manuelle de tableau"
+oldApproach: "Filtrage manuel + copie"
modernApproach: "toArray(generator)"
summary: "Convertit des streams en tableaux typés avec une référence de méthode."
explanation: "La méthode toArray(IntFunction) crée un tableau correctement typé à partir d'un stream. Le générateur (String[]::new) indique au stream quel type de tableau créer."
diff --git a/translations/content/fr/language/call-c-from-java.yaml b/translations/content/fr/language/call-c-from-java.yaml
new file mode 100644
index 0000000..357973c
--- /dev/null
+++ b/translations/content/fr/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: Appeler du code C depuis Java
+oldApproach: JNI (Java Native Interface)
+modernApproach: FFM (Foreign Function & Memory API)
+summary: FFM permet à Java d'appeler directement des bibliothèques C, sans code répétitif JNI ni connaissance de Java côté C.
+explanation: "Java propose deux approches pour appeler du code natif C/C++ : le JNI traditionnel et la moderne API FFM. Avec JNI, vous déclarez une méthode comme native, exécutez javac -h pour générer un fichier d'en-tête C, puis implémentez la fonction en utilisant la lourde API JNI C (JNIEnv, jstring, etc.). FFM, introduite comme API standard dans Java 22, élimine tout cela : le code C reste du C pur — aucune convention JNI n'est requise. Cela facilite considérablement l'appel de bibliothèques C/C++ existantes sans modification. Le côté Java utilise Arena pour la gestion sécurisée de la mémoire hors tas et MethodHandle pour le downcall, garantissant flexibilité et sécurité."
+whyModernWins:
+- icon: "👁"
+ title: Le code C reste du C pur
+ desc: "La fonction C n'a besoin d'aucune annotation JNI ni de code JNIEnv répétitif — toute bibliothèque C existante peut être appelée telle quelle."
+- icon: "⚡"
+ title: Plus flexible
+ desc: "Appelez directement la plupart des bibliothèques C/C++ existantes sans écrire de code adaptateur ni générer de fichiers d'en-tête."
+- icon: "🛠️"
+ title: Workflow simplifié
+ desc: "Inutile de s'arrêter, d'exécuter javac -h et d'implémenter l'interface définie dans le fichier .h généré."
+support:
+ description: Standardisé dans JDK 22 (mars 2024) ; auparavant en incubation depuis JDK 14
diff --git a/translations/content/it/collections/copying-collections-immutably.yaml b/translations/content/it/collections/copying-collections-immutably.yaml
index 46eb60a..e7b3eb6 100644
--- a/translations/content/it/collections/copying-collections-immutably.yaml
+++ b/translations/content/it/collections/copying-collections-immutably.yaml
@@ -12,7 +12,7 @@ whyModernWins:
title: Una chiamata
desc: "Nessuna costruzione manuale di ArrayList + wrapping."
- icon: 🛡️
- title: Copia difensiva
- desc: "Le modifiche all'originale non influenzano la copia."
+ title: Qualsiasi Collection
+ desc: "Accetta qualsiasi Collection come input—senza conversione intermedia in ArrayList."
support:
description: Ampiamente disponibile dal JDK 10 (marzo 2018)
diff --git a/translations/content/it/collections/stream-toarray-typed.yaml b/translations/content/it/collections/stream-toarray-typed.yaml
index cdbff94..0376b75 100644
--- a/translations/content/it/collections/stream-toarray-typed.yaml
+++ b/translations/content/it/collections/stream-toarray-typed.yaml
@@ -1,6 +1,6 @@
---
title: Stream toArray tipizzato
-oldApproach: Copia manuale dell'array
+oldApproach: Filtraggio manuale + copia
modernApproach: toArray(generatore)
summary: "Converti gli stream in array tipizzati con un riferimento a metodo."
explanation: "Il metodo toArray(IntFunction) crea un array correttamente tipizzato da uno stream. Il generatore (String[]::new) indica allo stream quale tipo di array creare."
diff --git a/translations/content/it/language/call-c-from-java.yaml b/translations/content/it/language/call-c-from-java.yaml
new file mode 100644
index 0000000..0c1b4f7
--- /dev/null
+++ b/translations/content/it/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: Chiamare codice C da Java
+oldApproach: JNI (Java Native Interface)
+modernApproach: FFM (Foreign Function & Memory API)
+summary: "FFM consente a Java di chiamare direttamente librerie C, senza boilerplate JNI né conoscenza di Java lato C."
+explanation: "Java offre due approcci per chiamare codice nativo C/C++: il tradizionale JNI e la moderna API FFM. Con JNI, si dichiara un metodo come native, si esegue javac -h per generare un file di intestazione C, quindi si implementa la funzione usando la complicata JNI C API (JNIEnv, jstring, ecc.). FFM, introdotta come API standard in Java 22, elimina tutto ciò: il codice C rimane puro C — nessuna convenzione JNI richiesta. Questo rende molto più semplice chiamare librerie C/C++ esistenti senza modifiche. Il lato Java usa Arena per la gestione sicura della memoria off-heap e MethodHandle per il downcall, garantendo flessibilità e sicurezza."
+whyModernWins:
+- icon: "👁"
+ title: Il codice C rimane C puro
+ desc: "La funzione C non richiede annotazioni JNI né boilerplate JNIEnv — qualsiasi libreria C esistente può essere chiamata così com'è."
+- icon: "⚡"
+ title: Più flessibile
+ desc: "Chiama direttamente la maggior parte delle librerie C/C++ esistenti senza scrivere codice adattatore né generare file di intestazione."
+- icon: "🛠️"
+ title: Flusso di lavoro più semplice
+ desc: "Nessuna necessità di fermarsi, eseguire javac -h e implementare l'interfaccia definita nel file .h generato."
+support:
+ description: Standardizzato in JDK 22 (marzo 2024); precedentemente in incubazione da JDK 14
diff --git a/translations/content/ja/collections/copying-collections-immutably.yaml b/translations/content/ja/collections/copying-collections-immutably.yaml
index 9373f50..467192b 100644
--- a/translations/content/ja/collections/copying-collections-immutably.yaml
+++ b/translations/content/ja/collections/copying-collections-immutably.yaml
@@ -11,7 +11,7 @@ whyModernWins:
title: 1回の呼び出し
desc: "ArrayListの手動構築+ラッピングは不要です。"
- icon: "🛡️"
- title: 防御的コピー
- desc: "元のコレクションへの変更はコピーに影響しません。"
+ title: あらゆるCollectionに対応
+ desc: "ArrayListへの中間変換なしに、あらゆるCollectionを入力として受け付けます。"
support:
description: "JDK 10(2018年3月)以降、広く利用可能"
diff --git a/translations/content/ja/collections/stream-toarray-typed.yaml b/translations/content/ja/collections/stream-toarray-typed.yaml
index b59b8b7..27b19bd 100644
--- a/translations/content/ja/collections/stream-toarray-typed.yaml
+++ b/translations/content/ja/collections/stream-toarray-typed.yaml
@@ -1,5 +1,5 @@
title: 型付きストリームのtoArray
-oldApproach: 手動配列コピー
+oldApproach: 手動フィルタリング + コピー
modernApproach: toArray(ジェネレータ)
summary: "メソッド参照を使ってストリームを型付き配列に変換する。"
explanation: "toArray(IntFunction)メソッドはストリームから適切に型付けされた配列を作成します。ジェネレータ(String[]::new)は、ストリームが作成する配列の型を指定します。"
diff --git a/translations/content/ja/language/call-c-from-java.yaml b/translations/content/ja/language/call-c-from-java.yaml
new file mode 100644
index 0000000..5e519fc
--- /dev/null
+++ b/translations/content/ja/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: JavaからCコードを呼び出す
+oldApproach: JNI(Java Native Interface)
+modernApproach: FFM(Foreign Function & Memory API)
+summary: "FFMを使えば、JNIのボイラープレートやC側でのJavaの知識なしに、JavaからCライブラリを直接呼び出せる。"
+explanation: "Javaにはネイティブな C/C++ コードを呼び出す2つのアプローチがあります:従来のJNIとモダンなFFM APIです。JNIでは、メソッドをnativeとして宣言し、javac -hを実行してCヘッダーファイルを生成し、煩雑なJNI C API(JNIEnv、jstringなど)を使って関数を実装する必要があります。Java 22で標準APIとして導入されたFFMは、そのすべてを不要にします:Cコードはただの普通のC — JNIの慣例は不要です。これにより、既存のC/C++ライブラリを変更なしに呼び出すことがはるかに容易になります。Javaサイドでは、安全なオフヒープメモリ管理にArenaを、ダウンコールにMethodHandleを使用し、柔軟性と安全性の両方を確保します。"
+whyModernWins:
+- icon: "👁"
+ title: Cコードは普通のCのまま
+ desc: "C関数にJNIアノテーションもJNIEnvのボイラープレートも不要 — 既存のCライブラリをそのまま呼び出せます。"
+- icon: "⚡"
+ title: より柔軟
+ desc: "アダプターコードを書いたりヘッダーファイルを生成したりせずに、ほとんどの既存C/C++ライブラリを直接呼び出せます。"
+- icon: "🛠️"
+ title: ワークフローが簡単
+ desc: "javac -hを実行して生成された.hファイルで定義されたインターフェースを実装するために作業を止める必要がありません。"
+support:
+ description: JDK 22で標準化(2024年3月);JDK 14からインキュベーション中
diff --git a/translations/content/ko/collections/copying-collections-immutably.yaml b/translations/content/ko/collections/copying-collections-immutably.yaml
index b3ffa2a..f821065 100644
--- a/translations/content/ko/collections/copying-collections-immutably.yaml
+++ b/translations/content/ko/collections/copying-collections-immutably.yaml
@@ -11,7 +11,7 @@ whyModernWins:
title: "한 번의 호출"
desc: "ArrayList 수동 생성과 래핑이 필요 없습니다."
- icon: "🛡️"
- title: "방어적 복사"
- desc: "원본을 변경해도 복사본에 영향을 주지 않습니다."
+ title: "모든 Collection 지원"
+ desc: "ArrayList로 중간 변환 없이 모든 Collection을 입력으로 받습니다."
support:
description: "JDK 10 (2018년 3월) 이후 널리 사용 가능"
diff --git a/translations/content/ko/collections/stream-toarray-typed.yaml b/translations/content/ko/collections/stream-toarray-typed.yaml
index bd5db27..4c714d6 100644
--- a/translations/content/ko/collections/stream-toarray-typed.yaml
+++ b/translations/content/ko/collections/stream-toarray-typed.yaml
@@ -1,5 +1,5 @@
title: "타입이 지정된 스트림 toArray"
-oldApproach: "수동 배열 복사"
+oldApproach: "수동 필터 + 복사"
modernApproach: "toArray(생성자)"
summary: "메서드 참조로 스트림을 타입이 지정된 배열로 변환합니다."
explanation: "toArray(IntFunction) 메서드는 스트림에서 올바르게 타입이 지정된 배열을 만듭니다. 생성자(String[]::new)는 스트림에 생성할 배열 타입을 알려줍니다."
diff --git a/translations/content/ko/language/call-c-from-java.yaml b/translations/content/ko/language/call-c-from-java.yaml
new file mode 100644
index 0000000..df4acd6
--- /dev/null
+++ b/translations/content/ko/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: "Java에서 C 코드 호출하기"
+oldApproach: "JNI (Java Native Interface)"
+modernApproach: "FFM (Foreign Function & Memory API)"
+summary: "FFM은 JNI 보일러플레이트나 C 측의 Java 지식 없이 Java가 C 라이브러리를 직접 호출할 수 있게 합니다."
+explanation: "Java에는 네이티브 C/C++ 코드를 호출하는 두 가지 접근 방식이 있습니다: 전통적인 JNI와 현대적인 FFM API입니다. JNI를 사용하면 메서드를 native로 선언하고, javac -h를 실행하여 C 헤더 파일을 생성한 다음, 번거로운 JNI C API(JNIEnv, jstring 등)를 사용하여 함수를 구현해야 합니다. Java 22에서 표준 API로 도입된 FFM은 이 모든 것을 없애줍니다: C 코드는 그냥 순수한 C — JNI 규약이 필요 없습니다. 이를 통해 기존 C/C++ 라이브러리를 수정 없이 훨씬 쉽게 호출할 수 있습니다. Java 측에서는 안전한 오프힙 메모리 관리를 위해 Arena를, 다운콜을 위해 MethodHandle을 사용하여 유연성과 안전성을 모두 보장합니다."
+whyModernWins:
+- icon: "👁"
+ title: "C 코드는 순수한 C 그대로"
+ desc: "C 함수에는 JNI 어노테이션이나 JNIEnv 보일러플레이트가 필요 없습니다 — 기존 C 라이브러리를 그대로 호출할 수 있습니다."
+- icon: "⚡"
+ title: "더 유연함"
+ desc: "어댑터 코드를 작성하거나 헤더 파일을 생성하지 않고도 대부분의 기존 C/C++ 라이브러리를 직접 호출할 수 있습니다."
+- icon: "🛠️"
+ title: "더 쉬운 워크플로"
+ desc: "멈춰서 javac -h를 실행하고 생성된 .h 파일에 정의된 인터페이스를 구현할 필요가 없습니다."
+support:
+ description: "JDK 22에서 표준화됨 (2024년 3월); 이전에는 JDK 14부터 인큐베이팅"
diff --git a/translations/content/pl/collections/copying-collections-immutably.yaml b/translations/content/pl/collections/copying-collections-immutably.yaml
index 869b400..1e470db 100644
--- a/translations/content/pl/collections/copying-collections-immutably.yaml
+++ b/translations/content/pl/collections/copying-collections-immutably.yaml
@@ -11,7 +11,7 @@ whyModernWins:
title: Jedno wywołanie
desc: Bez ręcznej konstrukcji ArrayList i opakowywania.
- icon: 🛡️
- title: Kopia defensywna
- desc: Zmiany w oryginale nie wpływają na kopię.
+ title: Dowolna kolekcja
+ desc: Przyjmuje dowolną kolekcję jako wejście—bez pośredniej konwersji do ArrayList.
support:
description: Szeroko dostępne od JDK 10 (marzec 2018)
diff --git a/translations/content/pl/collections/stream-toarray-typed.yaml b/translations/content/pl/collections/stream-toarray-typed.yaml
index 6361733..0a3e627 100644
--- a/translations/content/pl/collections/stream-toarray-typed.yaml
+++ b/translations/content/pl/collections/stream-toarray-typed.yaml
@@ -1,5 +1,5 @@
title: Typowana konwersja strumienia do tablicy
-oldApproach: Ręczne kopiowanie tablicy
+oldApproach: Ręczne filtrowanie + kopiowanie
modernApproach: toArray(generator)
summary: Konwertuj strumienie do typowanych tablic za pomocą referencji do metody.
explanation: Metoda toArray(IntFunction) tworzy poprawnie typowaną tablicę ze strumienia. Generator (String[]::new) mówi strumieniowi, jakiego typu tablicę utworzyć.
diff --git a/translations/content/pl/language/call-c-from-java.yaml b/translations/content/pl/language/call-c-from-java.yaml
new file mode 100644
index 0000000..f0c0806
--- /dev/null
+++ b/translations/content/pl/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: Wywołanie kodu C z Javy
+oldApproach: JNI (Java Native Interface)
+modernApproach: FFM (Foreign Function & Memory API)
+summary: FFM pozwala Javie wywoływać biblioteki C bezpośrednio, bez kodu szablonowego JNI ani znajomości Javy po stronie C.
+explanation: "Java oferuje dwa podejścia do wywoływania natywnego kodu C/C++: tradycyjne JNI oraz nowoczesne API FFM. W JNI deklarujesz metodę jako native, uruchamiasz javac -h, aby wygenerować plik nagłówkowy C, a następnie implementujesz funkcję przy użyciu uciążliwego JNI C API (JNIEnv, jstring itp.). FFM, wprowadzone jako standardowe API w Java 22, eliminuje to wszystko: kod C pozostaje zwykłym C — bez żadnych konwencji JNI. Dzięki temu wywołanie istniejących bibliotek C/C++ bez modyfikacji jest znacznie łatwiejsze. Strona Java używa Arena do bezpiecznego zarządzania pamięcią poza stertą oraz MethodHandle do downcallu, zapewniając zarówno elastyczność, jak i bezpieczeństwo."
+whyModernWins:
+- icon: "👁"
+ title: Kod C pozostaje zwykłym C
+ desc: Funkcja C nie wymaga adnotacji JNI ani kodu szablonowego JNIEnv — każdą istniejącą bibliotekę C można wywołać bez zmian.
+- icon: "⚡"
+ title: Większa elastyczność
+ desc: Bezpośrednie wywoływanie większości istniejących bibliotek C/C++ bez pisania kodu adaptera ani generowania plików nagłówkowych.
+- icon: "🛠️"
+ title: Prostszy przepływ pracy
+ desc: "Nie trzeba zatrzymywać się, uruchamiać javac -h i implementować interfejsu zdefiniowanego w wygenerowanym pliku .h."
+support:
+ description: Ustandaryzowane w JDK 22 (marzec 2024); wcześniej w fazie inkubacji od JDK 14
diff --git a/translations/content/pl/language/sealed-classes.yaml b/translations/content/pl/language/sealed-classes.yaml
index b05eb8a..a9a4fe7 100644
--- a/translations/content/pl/language/sealed-classes.yaml
+++ b/translations/content/pl/language/sealed-classes.yaml
@@ -1,8 +1,8 @@
-title: Klasy sealed dla hierarchii typów
+title: Klasy zapieczętowane dla hierarchii typów
oldApproach: Otwarta hierarchia
modernApproach: sealed permits
summary: Ogranicz, które klasy mogą rozszerzać typ — umożliwiając wyczerpujące switche.
-explanation: Klasy sealed definiują zamknięty zestaw podtypów. Kompilator zna wszystkie możliwe przypadki, umożliwiając wyczerpujące dopasowanie wzorców bez gałęzi default. W połączeniu z rekordami modelują algebraiczne typy danych.
+explanation: Klasy zapieczętowane definiują zamknięty zestaw podtypów. Kompilator zna wszystkie możliwe przypadki, umożliwiając wyczerpujące dopasowanie wzorców bez gałęzi default. W połączeniu z rekordami modelują algebraiczne typy danych.
whyModernWins:
- icon: "🔐"
title: Kontrolowana hierarchia
diff --git a/translations/content/pt-BR/collections/copying-collections-immutably.yaml b/translations/content/pt-BR/collections/copying-collections-immutably.yaml
index 599629f..c80e203 100644
--- a/translations/content/pt-BR/collections/copying-collections-immutably.yaml
+++ b/translations/content/pt-BR/collections/copying-collections-immutably.yaml
@@ -13,7 +13,7 @@ whyModernWins:
title: Uma chamada
desc: Sem construção manual de ArrayList + encapsulamento.
- icon: "🛡️"
- title: Cópia defensiva
- desc: Alterações na coleção original não afetam a cópia.
+ title: Qualquer Collection
+ desc: Aceita qualquer Collection como entrada—sem conversão intermediária para ArrayList.
support:
description: Amplamente disponível desde o JDK 10 (março de 2018)
diff --git a/translations/content/pt-BR/collections/stream-toarray-typed.yaml b/translations/content/pt-BR/collections/stream-toarray-typed.yaml
index fb6d5a9..0b9212f 100644
--- a/translations/content/pt-BR/collections/stream-toarray-typed.yaml
+++ b/translations/content/pt-BR/collections/stream-toarray-typed.yaml
@@ -1,5 +1,5 @@
title: toArray tipado com streams
-oldApproach: Cópia manual de array
+oldApproach: Filtro manual + cópia
modernApproach: toArray(generator)
summary: Converta streams em arrays tipados com uma referência de método.
explanation: "O método toArray(IntFunction) cria um array com tipo correto a partir\
diff --git a/translations/content/pt-BR/language/call-c-from-java.yaml b/translations/content/pt-BR/language/call-c-from-java.yaml
new file mode 100644
index 0000000..cbefb92
--- /dev/null
+++ b/translations/content/pt-BR/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: Chamar código C a partir do Java
+oldApproach: JNI (Java Native Interface)
+modernApproach: FFM (Foreign Function & Memory API)
+summary: FFM permite que o Java chame bibliotecas C diretamente, sem boilerplate de JNI ou conhecimento de Java no lado C.
+explanation: "O Java possui duas abordagens para chamar código nativo C/C++: o tradicional JNI e a moderna API FFM. Com o JNI, você declara um método como native, executa javac -h para gerar um arquivo de cabeçalho C e implementa a função usando a complicada API JNI de C (JNIEnv, jstring, etc.). O FFM, introduzido como API padrão no Java 22, elimina tudo isso: o código C é C puro — sem convenções JNI necessárias. Isso torna muito mais fácil chamar bibliotecas C/C++ existentes sem modificações. O lado Java usa Arena para o gerenciamento seguro de memória fora do heap e MethodHandle para o downcall, garantindo flexibilidade e segurança."
+whyModernWins:
+- icon: "👁"
+ title: Código C permanece C puro
+ desc: "A função C não requer anotações JNI ou boilerplate JNIEnv — qualquer biblioteca C existente pode ser chamada como está."
+- icon: "⚡"
+ title: Mais flexível
+ desc: "Chame diretamente a maioria das bibliotecas C/C++ existentes sem escrever código adaptador ou gerar arquivos de cabeçalho."
+- icon: "🛠️"
+ title: Fluxo de trabalho mais simples
+ desc: "Sem necessidade de parar, executar javac -h e implementar a interface definida no arquivo .h gerado."
+support:
+ description: Padronizado no JDK 22 (março de 2024); anteriormente em incubação desde o JDK 14
diff --git a/translations/content/ru/collections/collectors-teeing.yaml b/translations/content/ru/collections/collectors-teeing.yaml
new file mode 100644
index 0000000..b468e9d
--- /dev/null
+++ b/translations/content/ru/collections/collectors-teeing.yaml
@@ -0,0 +1,19 @@
+title: "Collectors.teeing()"
+oldApproach: Два прохода
+modernApproach: "teeing()"
+summary: Вычисление двух агрегаций за один проход по потоку.
+explanation: "Collectors.teeing() направляет каждый элемент в два дочерних Collector\
+ \ и объединяет результаты. Это позволяет избежать двукратного обхода данных или\
+ \ использования изменяемого аккумулятора."
+whyModernWins:
+- icon: "⚡"
+ title: Один проход
+ desc: Обработать поток один раз вместо двух.
+- icon: "🧩"
+ title: Комбинируемый
+ desc: Соединить два произвольных Collector с функцией слияния.
+- icon: "🔒"
+ title: Неизменяемый результат
+ desc: Сразу объединить в Record или Value-Object.
+support:
+ description: Широко доступно начиная с JDK 12 (март 2019)
diff --git a/translations/content/ru/collections/copying-collections-immutably.yaml b/translations/content/ru/collections/copying-collections-immutably.yaml
new file mode 100644
index 0000000..e64f8e4
--- /dev/null
+++ b/translations/content/ru/collections/copying-collections-immutably.yaml
@@ -0,0 +1,19 @@
+title: Неизменяемое копирование коллекций
+oldApproach: Ручное копирование + обёртка
+modernApproach: "List.copyOf()"
+summary: Создание неизменяемой копии любой коллекции одним вызовом.
+explanation: "List.copyOf(), Set.copyOf() и Map.copyOf() создают неизменяемые снимки\
+ \ существующих коллекций. Если источник уже является неизменяемой коллекцией,\
+ \ копия не создаётся."
+whyModernWins:
+- icon: "⚡"
+ title: Умное копирование
+ desc: Копирование пропускается, если источник уже неизменяем.
+- icon: "📏"
+ title: Один вызов
+ desc: Без ручного создания ArrayList и обёртывания.
+- icon: "🛡️"
+ title: Любая коллекция
+ desc: Принимает любую Collection на входе — без промежуточного преобразования в ArrayList.
+support:
+ description: Широко доступно начиная с JDK 10 (март 2018)
diff --git a/translations/content/ru/collections/immutable-list-creation.yaml b/translations/content/ru/collections/immutable-list-creation.yaml
new file mode 100644
index 0000000..4f174d3
--- /dev/null
+++ b/translations/content/ru/collections/immutable-list-creation.yaml
@@ -0,0 +1,19 @@
+title: Создание неизменяемых списков
+oldApproach: Многословное обёртывание
+modernApproach: "List.of()"
+summary: Создание неизменяемых списков одним чистым выражением.
+explanation: "List.of() создаёт по-настоящему неизменяемый список — без обёртывания\
+ \ и защитного копирования. Не допускает null-элементов и структурно неизменяем.\
+ \ Старый подход требовал трёх вложенных вызовов."
+whyModernWins:
+- icon: "📏"
+ title: Один вызов
+ desc: Заменить три вложенных вызова одним фабричным методом.
+- icon: "🔒"
+ title: По-настоящему неизменяемый
+ desc: Не просто обёртка — сам список неизменяем.
+- icon: "🛡️"
+ title: Безопасен для null
+ desc: Отклоняет null-элементы при создании и немедленно завершается с ошибкой.
+support:
+ description: Широко доступно начиная с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/collections/immutable-map-creation.yaml b/translations/content/ru/collections/immutable-map-creation.yaml
new file mode 100644
index 0000000..bfd410e
--- /dev/null
+++ b/translations/content/ru/collections/immutable-map-creation.yaml
@@ -0,0 +1,18 @@
+title: Создание неизменяемых Map
+oldApproach: Паттерн Map-Builder
+modernApproach: "Map.of()"
+summary: Создание неизменяемых Map встроенно без Builder.
+explanation: "Map.of() принимает пары ключ-значение встроенно и возвращает неизменяемую\
+ \ Map. Для более чем 10 записей использовать Map.ofEntries() с парами Map.entry()."
+whyModernWins:
+- icon: "📏"
+ title: Встроенное создание
+ desc: Не требует временной изменяемой Map.
+- icon: "🔒"
+ title: Неизменяемый результат
+ desc: Map нельзя изменить после создания.
+- icon: "🚫"
+ title: Без null-ключей/значений
+ desc: Null-записи немедленно отклоняются.
+support:
+ description: Широко доступно начиная с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/collections/immutable-set-creation.yaml b/translations/content/ru/collections/immutable-set-creation.yaml
new file mode 100644
index 0000000..7abd118
--- /dev/null
+++ b/translations/content/ru/collections/immutable-set-creation.yaml
@@ -0,0 +1,18 @@
+title: Создание неизменяемых Set
+oldApproach: Многословное обёртывание
+modernApproach: "Set.of()"
+summary: Создание неизменяемых Set одним фабричным вызовом.
+explanation: "Set.of() создаёт по-настоящему неизменяемое Set, которое отклоняет\
+ \ null-элементы и дубликаты при создании. Больше никакого обёртывания изменяемых Set."
+whyModernWins:
+- icon: "📏"
+ title: Лаконично
+ desc: Одна строка вместо трёх вложенных вызовов.
+- icon: "🚫"
+ title: Обнаруживает дубликаты
+ desc: Выбрасывает исключение при случайной передаче повторяющихся элементов.
+- icon: "🔒"
+ title: Неизменяемый
+ desc: Нельзя добавлять или удалять элементы после создания.
+support:
+ description: Широко доступно начиная с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/collections/map-entry-factory.yaml b/translations/content/ru/collections/map-entry-factory.yaml
new file mode 100644
index 0000000..eb42a22
--- /dev/null
+++ b/translations/content/ru/collections/map-entry-factory.yaml
@@ -0,0 +1,19 @@
+title: "Фабрика Map.entry()"
+oldApproach: SimpleEntry
+modernApproach: "Map.entry()"
+summary: Создание записей Map с помощью чистого фабричного метода.
+explanation: "Map.entry() заменяет многословный конструктор AbstractMap.SimpleEntry.\
+ \ Возвращает неизменяемую запись, идеально подходящую для Map.ofEntries()\
+ \ и операций со Stream."
+whyModernWins:
+- icon: "📏"
+ title: Лаконично
+ desc: Одна строка вместо трёх с более чётким намерением.
+- icon: "🔒"
+ title: Неизменяемый
+ desc: Возвращаемую запись нельзя изменить.
+- icon: "🧩"
+ title: Комбинируемый
+ desc: "Отлично работает с Map.ofEntries() для больших Map."
+support:
+ description: Широко доступно начиная с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/collections/reverse-list-iteration.yaml b/translations/content/ru/collections/reverse-list-iteration.yaml
new file mode 100644
index 0000000..906d2ca
--- /dev/null
+++ b/translations/content/ru/collections/reverse-list-iteration.yaml
@@ -0,0 +1,20 @@
+title: Обратная итерация по списку
+oldApproach: Ручной ListIterator
+modernApproach: "reversed()"
+summary: Итерация по списку в обратном порядке с помощью чистого цикла for-each.
+explanation: "Метод reversed() из SequencedCollection возвращает представление списка\
+ \ в обратном порядке. Это представление опирается на исходный список, поэтому\
+ \ копирование не происходит. Расширенный цикл for делает обратную итерацию\
+ \ такой же читаемой, как прямую."
+whyModernWins:
+- icon: "📖"
+ title: Естественный синтаксис
+ desc: Расширенный цикл for вместо многословного ListIterator.
+- icon: "⚡"
+ title: Без копирования
+ desc: "reversed() возвращает представление — без накладных расходов на производительность."
+- icon: "🧩"
+ title: Согласованный API
+ desc: "Работает единообразно на List, Deque и SortedSet."
+support:
+ description: Широко доступно начиная с JDK 21 LTS (сент. 2023)
diff --git a/translations/content/ru/collections/sequenced-collections.yaml b/translations/content/ru/collections/sequenced-collections.yaml
new file mode 100644
index 0000000..43deeef
--- /dev/null
+++ b/translations/content/ru/collections/sequenced-collections.yaml
@@ -0,0 +1,19 @@
+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: Единый API
+ desc: "Работает одинаково на List, Deque и SortedSet."
+support:
+ description: Широко доступно начиная с JDK 21 LTS (сент. 2023)
diff --git a/translations/content/ru/collections/stream-toarray-typed.yaml b/translations/content/ru/collections/stream-toarray-typed.yaml
new file mode 100644
index 0000000..f2d1ce9
--- /dev/null
+++ b/translations/content/ru/collections/stream-toarray-typed.yaml
@@ -0,0 +1,19 @@
+title: Типизированный Stream-toArray
+oldApproach: Ручная фильтрация + копирование
+modernApproach: "toArray(generator)"
+summary: Преобразование Stream в типизированные массивы с помощью ссылки на метод.
+explanation: "Метод toArray(IntFunction) создаёт правильно типизированный массив\
+ \ из Stream. Генератор (String[]::new) сообщает Stream, какой тип массива\
+ \ нужно создать."
+whyModernWins:
+- icon: "🎯"
+ title: Типобезопасный
+ desc: "Без приведения к Object[] — тип массива правильный."
+- icon: "🔗"
+ title: Цепочечный
+ desc: Работает в конце любого потокового конвейера.
+- icon: "📏"
+ title: Лаконично
+ desc: Одно выражение заменяет ручной цикл.
+support:
+ description: Широко доступно начиная с JDK 8 (март 2014)
diff --git a/translations/content/ru/collections/unmodifiable-collectors.yaml b/translations/content/ru/collections/unmodifiable-collectors.yaml
new file mode 100644
index 0000000..c56b137
--- /dev/null
+++ b/translations/content/ru/collections/unmodifiable-collectors.yaml
@@ -0,0 +1,20 @@
+title: Немодифицируемые Collector-ы
+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: Читается естественно как завершающий шаг любого потокового конвейера.
+support:
+ description: Широко доступно начиная с JDK 16 (март 2021)
diff --git a/translations/content/ru/concurrency/completablefuture-chaining.yaml b/translations/content/ru/concurrency/completablefuture-chaining.yaml
new file mode 100644
index 0000000..64ed4bb
--- /dev/null
+++ b/translations/content/ru/concurrency/completablefuture-chaining.yaml
@@ -0,0 +1,20 @@
+title: Цепочки CompletableFuture
+oldApproach: "Блокирующий Future.get()"
+modernApproach: CompletableFuture
+summary: Объединение асинхронных операций в цепочки без блокировки с помощью CompletableFuture.
+explanation: "CompletableFuture позволяет строить неблокирующие асинхронные конвейеры.\
+ \ Операции объединяются с помощью thenApply, thenCompose, thenAccept. Ошибки\
+ \ обрабатываются через exceptionally(). Несколько Future можно комбинировать\
+ \ с allOf/anyOf."
+whyModernWins:
+- icon: "🔗"
+ title: Цепочки
+ desc: Объединение асинхронных шагов в читаемый конвейер.
+- icon: "🚫"
+ title: Без блокировок
+ desc: Ни один поток не ждёт результатов впустую.
+- icon: "🛡️"
+ title: Обработка ошибок
+ desc: "exceptionally() и handle() для надёжного восстановления после ошибок."
+support:
+ description: Широко доступно с JDK 8 (март 2014)
diff --git a/translations/content/ru/concurrency/concurrent-http-virtual.yaml b/translations/content/ru/concurrency/concurrent-http-virtual.yaml
new file mode 100644
index 0000000..1590074
--- /dev/null
+++ b/translations/content/ru/concurrency/concurrent-http-virtual.yaml
@@ -0,0 +1,19 @@
+title: Параллельные HTTP-запросы с виртуальными потоками
+oldApproach: Thread Pool + 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/ru/concurrency/executor-try-with-resources.yaml b/translations/content/ru/concurrency/executor-try-with-resources.yaml
new file mode 100644
index 0000000..6d75fed
--- /dev/null
+++ b/translations/content/ru/concurrency/executor-try-with-resources.yaml
@@ -0,0 +1,19 @@
+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/ru/concurrency/lock-free-lazy-init.yaml b/translations/content/ru/concurrency/lock-free-lazy-init.yaml
new file mode 100644
index 0000000..84f85e1
--- /dev/null
+++ b/translations/content/ru/concurrency/lock-free-lazy-init.yaml
@@ -0,0 +1,19 @@
+title: Ленивая инициализация без блокировок
+oldApproach: synchronized + volatile
+modernApproach: StableValue
+summary: Замена двойной проверки блокировки на StableValue для ленивых синглтонов.
+explanation: "StableValue инкапсулирует паттерн ленивой инициализации с корректной\
+ \ потокобезопасностью. JVM может оптимизировать путь чтения после инициализации,\
+ \ делая его потенциально быстрее, чем volatile-чтения."
+whyModernWins:
+- icon: "🧹"
+ title: Нет шаблонного кода
+ desc: "Никаких volatile, synchronized или двойных проверок на null."
+- icon: "⚡"
+ title: Быстрое чтение
+ desc: JVM может свернуть значение в константу после инициализации.
+- icon: "✅"
+ title: Гарантированная корректность
+ desc: "Никаких тонких ошибок порядка — JVM берёт это на себя."
+support:
+ description: "Preview в JDK 25 (JEP 502, StableValue). Требует --enable-preview."
diff --git a/translations/content/ru/concurrency/process-api.yaml b/translations/content/ru/concurrency/process-api.yaml
new file mode 100644
index 0000000..7ed617c
--- /dev/null
+++ b/translations/content/ru/concurrency/process-api.yaml
@@ -0,0 +1,19 @@
+title: Современный API процессов
+oldApproach: "Runtime.exec()"
+modernApproach: ProcessHandle
+summary: Инспектирование и управление процессами ОС с помощью ProcessHandle.
+explanation: "ProcessHandle предоставляет PID, информацию о процессе (команда, аргументы,\
+ \ время запуска, загрузка CPU), отношения родитель-потомок и завершение процесса.\
+ \ Больше не нужны недокументированные внутренности Process."
+whyModernWins:
+- icon: "🔍"
+ title: Полная информация
+ desc: "Доступ к PID, команде, аргументам, времени запуска, загрузке CPU."
+- icon: "🌳"
+ title: Дерево процессов
+ desc: "Навигация между родительскими, дочерними и дочерними процессами."
+- icon: "📊"
+ title: Мониторинг
+ desc: "onExit() возвращает CompletableFuture для асинхронного мониторинга."
+support:
+ description: Широко доступно с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/concurrency/scoped-values.yaml b/translations/content/ru/concurrency/scoped-values.yaml
new file mode 100644
index 0000000..d38ae3d
--- /dev/null
+++ b/translations/content/ru/concurrency/scoped-values.yaml
@@ -0,0 +1,19 @@
+title: Scoped Values
+oldApproach: ThreadLocal
+modernApproach: ScopedValue
+summary: Безопасный обмен данными по стеку вызовов без ловушек ThreadLocal.
+explanation: "ScopedValue предоставляет неизменяемый, наследуемый, ограниченный\
+ \ контекст. В отличие от ThreadLocal, Scoped Values автоматически очищаются,\
+ \ работают с виртуальными потоками и не могут быть изменены вызываемыми методами."
+whyModernWins:
+- icon: "🔒"
+ title: Неизменяемость
+ desc: "Вызываемые методы могут читать Scoped Value, но не могут его изменить."
+- icon: "🧹"
+ title: Автоматическая очистка
+ desc: "Нет ручного remove() — значение ограничено блоком."
+- icon: "⚡"
+ title: Совместимость с виртуальными потоками
+ desc: Эффективно работает с миллионами виртуальных потоков.
+support:
+ description: "Финализировано в JDK 25 LTS (JEP 506, сент. 2025)."
diff --git a/translations/content/ru/concurrency/stable-values.yaml b/translations/content/ru/concurrency/stable-values.yaml
new file mode 100644
index 0000000..7361946
--- /dev/null
+++ b/translations/content/ru/concurrency/stable-values.yaml
@@ -0,0 +1,19 @@
+title: Stable Values
+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: "Supplier выполняется ровно один раз, даже при конкуренции."
+support:
+ description: "Preview в JDK 25 (JEP 502). Требует --enable-preview."
diff --git a/translations/content/ru/concurrency/structured-concurrency.yaml b/translations/content/ru/concurrency/structured-concurrency.yaml
new file mode 100644
index 0000000..6da32de
--- /dev/null
+++ b/translations/content/ru/concurrency/structured-concurrency.yaml
@@ -0,0 +1,20 @@
+title: Структурированный параллелизм
+oldApproach: Ручное управление жизненным циклом потоков
+modernApproach: StructuredTaskScope
+summary: Управление жизненным циклом параллельных задач как единой единицей работы.
+explanation: "Структурированный параллелизм рассматривает группу параллельных задач\
+ \ как единую операцию. Если одна подзадача завершается с ошибкой, остальные\
+ \ отменяются. Scope гарантирует, что ни один поток не будет потерян, и создаёт\
+ \ чёткие отношения родитель-потомок."
+whyModernWins:
+- icon: "🛡️"
+ title: Нет утечек потоков
+ desc: Все разветвлённые задачи завершаются до закрытия Scope.
+- icon: "⚡"
+ title: Быстрый сбой
+ desc: ShutdownOnFailure отменяет дочерние задачи при сбое одной из них.
+- icon: "📐"
+ title: Чёткая структура
+ desc: Жизненный цикл задач соответствует лексическому Scope в коде.
+support:
+ description: "Preview в JDK 25 (пятое preview, JEP 505). Требует --enable-preview."
diff --git a/translations/content/ru/concurrency/thread-sleep-duration.yaml b/translations/content/ru/concurrency/thread-sleep-duration.yaml
new file mode 100644
index 0000000..25dd478
--- /dev/null
+++ b/translations/content/ru/concurrency/thread-sleep-duration.yaml
@@ -0,0 +1,19 @@
+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/ru/concurrency/virtual-threads.yaml b/translations/content/ru/concurrency/virtual-threads.yaml
new file mode 100644
index 0000000..04e0941
--- /dev/null
+++ b/translations/content/ru/concurrency/virtual-threads.yaml
@@ -0,0 +1,20 @@
+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/ru/datetime/date-formatting.yaml b/translations/content/ru/datetime/date-formatting.yaml
new file mode 100644
index 0000000..c27c882
--- /dev/null
+++ b/translations/content/ru/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/ru/datetime/duration-and-period.yaml b/translations/content/ru/datetime/duration-and-period.yaml
new file mode 100644
index 0000000..e0325db
--- /dev/null
+++ b/translations/content/ru/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/ru/datetime/hex-format.yaml b/translations/content/ru/datetime/hex-format.yaml
new file mode 100644
index 0000000..c259422
--- /dev/null
+++ b/translations/content/ru/datetime/hex-format.yaml
@@ -0,0 +1,17 @@
+title: HexFormat
+oldApproach: Ручное шестнадцатеричное преобразование
+modernApproach: HexFormat
+summary: Преобразуйте шестнадцатеричные строки в байтовые массивы и обратно с помощью HexFormat.
+explanation: "HexFormat обеспечивает двунаправленное кодирование и декодирование hex для байтов, целых чисел и массивов. Разделители, префиксы, суффиксы и регистр символов настраиваемы. Ручное форматирование и разбор больше не нужны."
+whyModernWins:
+- icon: 📐
+ title: Двунаправленность
+ desc: "Преобразуйте байты→hex и hex→байты с помощью единого API."
+- icon: 🔧
+ title: Настраиваемость
+ desc: "Разделители, префикс, суффикс, регистр символов."
+- icon: 📦
+ title: Поддержка массивов
+ desc: Кодирование и декодирование целых байтовых массивов за один раз.
+support:
+ description: Широко доступен начиная с JDK 17 LTS (сентябрь 2021)
diff --git a/translations/content/ru/datetime/instant-precision.yaml b/translations/content/ru/datetime/instant-precision.yaml
new file mode 100644
index 0000000..eccf104
--- /dev/null
+++ b/translations/content/ru/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 несёт в себе свою точность — никаких неоднозначных значений long."
+- icon: 🌐
+ title: Основан на UTC
+ desc: "Instant всегда в UTC — никакой путаницы с часовыми поясами."
+support:
+ description: Широко доступен начиная с JDK 9 (сентябрь 2017)
diff --git a/translations/content/ru/datetime/java-time-basics.yaml b/translations/content/ru/datetime/java-time-basics.yaml
new file mode 100644
index 0000000..7aea057
--- /dev/null
+++ b/translations/content/ru/datetime/java-time-basics.yaml
@@ -0,0 +1,17 @@
+title: Основы API 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: Понятный API
+ desc: "Month.JANUARY вместо 0. DayOfWeek.MONDAY вместо 2."
+- icon: 🛡️
+ title: Потокобезопасность
+ desc: "Синхронизация не требуется — можно свободно использовать между потоками."
+support:
+ description: Широко доступен начиная с JDK 8 (март 2014)
diff --git a/translations/content/ru/datetime/math-clamp.yaml b/translations/content/ru/datetime/math-clamp.yaml
new file mode 100644
index 0000000..230e74e
--- /dev/null
+++ b/translations/content/ru/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]. Понятнее, чем вложенные Math.min/Math.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/ru/enterprise/ejb-timer-vs-jakarta-scheduler.yaml b/translations/content/ru/enterprise/ejb-timer-vs-jakarta-scheduler.yaml
new file mode 100644
index 0000000..080cd79
--- /dev/null
+++ b/translations/content/ru/enterprise/ejb-timer-vs-jakarta-scheduler.yaml
@@ -0,0 +1,17 @@
+title: EJB Timer vs. Jakarta Scheduler
+oldApproach: EJB TimerService
+modernApproach: ManagedScheduledExecutorService
+summary: Замените громоздкие EJB-таймеры на ManagedScheduledExecutorService из Jakarta Concurrency для более простого планирования задач.
+explanation: EJB-таймеры требуют @Stateless- или @Singleton-бина с @Timeout-колбэком и XML- или аннотационными выражениями расписания. Jakarta Concurrency предоставляет ManagedScheduledExecutorService, использующий привычный API планирования java.util.concurrent. Результат — меньше шаблонного кода, упрощённое модульное тестирование и отсутствие зависимости от EJB-контейнера.
+whyModernWins:
+- icon: 🪶
+ title: Меньше шаблонного кода
+ desc: "Никаких @Timeout-колбэков или ScheduleExpression — используйте стандартный API ScheduledExecutorService."
+- icon: 🧪
+ title: Лучшая тестируемость
+ desc: Простые методы и заглушки для Executor делают модульное тестирование без EJB-контейнера простым.
+- icon: ☁️
+ title: Совместимость с облачными подходами
+ desc: Управляемые Executor-ы интегрируются в жизненный цикл контейнера и работают в облегчённых средах выполнения.
+support:
+ description: "Доступно начиная с Jakarta EE 10 / Concurrency 3.0"
diff --git a/translations/content/ru/enterprise/ejb-vs-cdi.yaml b/translations/content/ru/enterprise/ejb-vs-cdi.yaml
new file mode 100644
index 0000000..db06b69
--- /dev/null
+++ b/translations/content/ru/enterprise/ejb-vs-cdi.yaml
@@ -0,0 +1,17 @@
+title: EJB против CDI
+oldApproach: EJB
+modernApproach: CDI-бин
+summary: Замените громоздкие EJB облегчёнными CDI-бинами для внедрения зависимостей и управления транзакциями.
+explanation: CDI (Contexts and Dependency Injection) предоставляет те же возможности внедрения зависимостей и управления транзакциями, что и EJB, но в виде простых Java-классов без специфичных для контейнера интерфейсов или суперклассов. Области видимости, такие как @ApplicationScoped и @RequestScoped, управляют жизненным циклом, а @Transactional заменяет обязательную транзакционную семантику EJB.
+whyModernWins:
+- icon: 🪶
+ title: Облегчённость
+ desc: CDI-бины — это простые Java-классы без EJB-специфичных интерфейсов или дескрипторов.
+- icon: 💉
+ title: Единое внедрение
+ desc: "@Inject работает единообразно для любого управляемого бина, JAX-RS-ресурса и компонента Jakarta EE."
+- icon: 🧪
+ title: Простое модульное тестирование
+ desc: Простые классы без EJB-прокси-overhead легко инстанциировать и заменять заглушками.
+support:
+ description: Широко доступно начиная с Jakarta EE 8 / Java 11
diff --git a/translations/content/ru/enterprise/jdbc-resultset-vs-jpa-criteria.yaml b/translations/content/ru/enterprise/jdbc-resultset-vs-jpa-criteria.yaml
new file mode 100644
index 0000000..af12f56
--- /dev/null
+++ b/translations/content/ru/enterprise/jdbc-resultset-vs-jpa-criteria.yaml
@@ -0,0 +1,17 @@
+title: Маппинг JDBC ResultSet vs. JPA Criteria API
+oldApproach: JDBC ResultSet
+modernApproach: JPA Criteria API
+summary: Замените ручное маппирование JDBC ResultSet на типобезопасный Criteria API JPA для динамических запросов.
+explanation: Сырой JDBC требует построения SQL-строк, установки параметров по индексу и ручного маппинга каждого столбца ResultSet — процесс, подверженный ошибкам и незаметно ломающийся при изменении схемы. JPA Criteria API формирует запросы программно с помощью типобезопасного паттерна Builder. Имена столбцов проверяются по модели сущностей, маппинг результатов выполняется автоматически, а сложные динамические запросы легко компонуются без конкатенации строк.
+whyModernWins:
+- icon: 🔒
+ title: Типобезопасные запросы
+ desc: Criteria Builder выявляет неверные имена полей и ошибки типов на этапе компиляции.
+- icon: 🗺️
+ title: Автоматический маппинг
+ desc: JPA отображает строки результата на объекты-сущности — никакого ручного извлечения столбец за столбцом.
+- icon: 🧩
+ title: Компонуемые предикаты
+ desc: Динамические WHERE-клаузулы легко строить с помощью and(), or() и повторно используемых объектов Predicate.
+support:
+ description: Широко доступно начиная с Jakarta EE 8 / Java 11
diff --git a/translations/content/ru/enterprise/jdbc-vs-jooq.yaml b/translations/content/ru/enterprise/jdbc-vs-jooq.yaml
new file mode 100644
index 0000000..70f39ea
--- /dev/null
+++ b/translations/content/ru/enterprise/jdbc-vs-jooq.yaml
@@ -0,0 +1,17 @@
+title: JDBC против jOOQ
+oldApproach: Сырой JDBC
+modernApproach: jOOQ SQL DSL
+summary: Замените строковой SQL с сырым JDBC на типобезопасный плавный SQL DSL библиотеки jOOQ.
+explanation: "jOOQ (Java Object Oriented Querying) генерирует Java-код из схемы базы данных, превращая имена таблиц и столбцов в типобезопасные Java-константы. Плавный DSL отражает синтаксис SQL, делая запросы читаемыми и компонуемыми. Все параметры привязываются автоматически, что устраняет риски SQL-инъекций. В отличие от JPA/JPQL, jOOQ полностью поддерживает SQL — оконные функции, CTE, RETURNING-клаузулы и расширения, специфичные для поставщика, являются первоклассными возможностями."
+whyModernWins:
+- icon: 🔒
+ title: Типобезопасные столбцы
+ desc: Имена столбцов — это сгенерированные Java-константы; опечатки и ошибки типов становятся ошибками компиляции, а не ошибками времени выполнения.
+- icon: 📖
+ title: Плавность SQL
+ desc: DSL jOOQ точно отражает синтаксис SQL, поэтому сложные JOIN-ы, подзапросы и CTE остаются читаемыми.
+- icon: 🛡️
+ title: Защита от инъекций по дизайну
+ desc: Параметры всегда привязываются безопасно — никакой конкатенации строк означает никакого риска SQL-инъекции.
+support:
+ description: Свободная версия jOOQ поддерживает все распространённые СУБД с открытым исходным кодом; более старые коммерческие СУБД требуют платной лицензии
diff --git a/translations/content/ru/enterprise/jdbc-vs-jpa.yaml b/translations/content/ru/enterprise/jdbc-vs-jpa.yaml
new file mode 100644
index 0000000..3bc31c7
--- /dev/null
+++ b/translations/content/ru/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: Сущности — это простые аннотированные классы, не требующие ручного преобразования ResultSet в объект.
+- icon: 🔒
+ title: Типобезопасные запросы
+ desc: JPQL работает с типами и полями сущностей, а не с сырыми строками таблиц и столбцов.
+- icon: ⚡
+ title: Встроенное кэширование
+ desc: Кэши первого и второго уровня автоматически снижают количество обращений к базе данных.
+support:
+ description: Широко доступно начиная с Jakarta EE 8 / Java 11
diff --git a/translations/content/ru/enterprise/jndi-lookup-vs-cdi-injection.yaml b/translations/content/ru/enterprise/jndi-lookup-vs-cdi-injection.yaml
new file mode 100644
index 0000000..60e57e2
--- /dev/null
+++ b/translations/content/ru/enterprise/jndi-lookup-vs-cdi-injection.yaml
@@ -0,0 +1,17 @@
+title: JNDI Lookup vs. CDI-инъекция
+oldApproach: JNDI Lookup
+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/ru/enterprise/jpa-vs-jakarta-data.yaml b/translations/content/ru/enterprise/jpa-vs-jakarta-data.yaml
new file mode 100644
index 0000000..4b945bc
--- /dev/null
+++ b/translations/content/ru/enterprise/jpa-vs-jakarta-data.yaml
@@ -0,0 +1,17 @@
+title: JPA против Jakarta Data
+oldApproach: JPA EntityManager
+modernApproach: Jakarta Data Repository
+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/ru/enterprise/jsf-managed-bean-vs-cdi-named.yaml b/translations/content/ru/enterprise/jsf-managed-bean-vs-cdi-named.yaml
new file mode 100644
index 0000000..b2a9e7c
--- /dev/null
+++ b/translations/content/ru/enterprise/jsf-managed-bean-vs-cdi-named.yaml
@@ -0,0 +1,17 @@
+title: JSF Managed Bean vs. CDI Named Bean
+oldApproach: "@ManagedBean"
+modernApproach: "@Named + CDI"
+summary: Замените устаревший JSF-@ManagedBean на CDI-@Named для единой модели внедрения зависимостей.
+explanation: Аннотации @ManagedBean и @ManagedProperty из JSF были объявлены устаревшими в Jakarta Faces 2.3 и удалены в Jakarta EE 10. CDI-замена использует @Named для доступа к бину через EL-выражения и @Inject для связывания зависимостей. Это унифицирует модель бинов — JSF-страницы, JAX-RS-ресурсы и EJB используют один и тот же 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/ru/enterprise/manual-transaction-vs-declarative.yaml b/translations/content/ru/enterprise/manual-transaction-vs-declarative.yaml
new file mode 100644
index 0000000..bb3e259
--- /dev/null
+++ b/translations/content/ru/enterprise/manual-transaction-vs-declarative.yaml
@@ -0,0 +1,17 @@
+title: Ручное управление транзакциями JPA vs. декларативный @Transactional
+oldApproach: Ручная транзакция
+modernApproach: "@Transactional"
+summary: Замените многословные блоки begin/commit/rollback одной аннотацией @Transactional.
+explanation: Ручное управление транзакциями требует явных вызовов begin(), commit() и rollback(), обёрнутых в блоки try-catch — каждый сервисный метод повторяет этот шаблонный код. Аннотация @Transactional делегирует управление жизненным циклом контейнеру — он запускает транзакцию перед вызовом метода, фиксирует её при успехе и автоматически откатывает при RuntimeException.
+whyModernWins:
+- icon: 🗑️
+ title: Никакого шаблонного кода
+ desc: Одна аннотация заменяет повторяющиеся блоки begin/commit/rollback с try-catch.
+- icon: 🛡️
+ title: Более безопасный откат
+ desc: Контейнер гарантирует откат при непроверяемых исключениях — никакого риска забыть блок catch.
+- icon: 📐
+ title: Декларативное управление
+ desc: Распространение, изоляция и правила отката выражаются как атрибуты аннотации.
+support:
+ description: Широко доступно начиная с Jakarta EE 8 / Java 11
diff --git a/translations/content/ru/enterprise/mdb-vs-reactive-messaging.yaml b/translations/content/ru/enterprise/mdb-vs-reactive-messaging.yaml
new file mode 100644
index 0000000..c4b111b
--- /dev/null
+++ b/translations/content/ru/enterprise/mdb-vs-reactive-messaging.yaml
@@ -0,0 +1,17 @@
+title: Message-Driven Bean vs. Reactive Messaging
+oldApproach: Message-Driven Bean
+modernApproach: Reactive Messaging
+summary: Замените JMS Message-Driven Beans на MicroProfile Reactive Messaging для более простой обработки событий.
+explanation: Message-Driven Beans требуют реализации 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/ru/enterprise/servlet-vs-jaxrs.yaml b/translations/content/ru/enterprise/servlet-vs-jaxrs.yaml
new file mode 100644
index 0000000..5f1b98e
--- /dev/null
+++ b/translations/content/ru/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. Никакого ручного разбора параметров запроса или установки Content-Type в ответе — среда выполнения берёт на себя маршализацию и маршрутизацию автоматически."
+whyModernWins:
+- icon: 📐
+ title: Декларативная маршрутизация
+ desc: Аннотации определяют HTTP-метод, путь и Content-Type вместо императивного if/else-диспатчинга.
+- icon: 🔄
+ title: Автоматическая маршализация
+ desc: "Возвращайте POJO напрямую; среда выполнения сериализует их в JSON или XML на основе @Produces."
+- icon: 🧪
+ title: Упрощённое тестирование
+ desc: Классы ресурсов — это простые Java-объекты, тестируемые без Servlet-контейнера.
+support:
+ description: Широко доступно начиная с Jakarta EE 8 / Java 11
diff --git a/translations/content/ru/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml b/translations/content/ru/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml
new file mode 100644
index 0000000..ad2d323
--- /dev/null
+++ b/translations/content/ru/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml
@@ -0,0 +1,17 @@
+title: Singleton EJB vs. CDI @ApplicationScoped
+oldApproach: "@Singleton EJB"
+modernApproach: "@ApplicationScoped CDI"
+summary: Замените Singleton-EJB на CDI-бины с @ApplicationScoped для более простого управления общим состоянием.
+explanation: "Singleton-EJB объединяет управление параллелизмом (@Lock, @ConcurrencyManagement) и раннюю инициализацию (@Startup) в EJB-контейнере. CDI-бин с @ApplicationScoped достигает того же жизненного цикла с одним экземпляром при значительно меньших усилиях. Когда требуется управление параллелизмом, стандартные утилиты java.util.concurrent обеспечивают более тонкий контроль, чем Lock-аннотации 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/ru/enterprise/soap-vs-jakarta-rest.yaml b/translations/content/ru/enterprise/soap-vs-jakarta-rest.yaml
new file mode 100644
index 0000000..d68010b
--- /dev/null
+++ b/translations/content/ru/enterprise/soap-vs-jakarta-rest.yaml
@@ -0,0 +1,17 @@
+title: SOAP веб-сервисы vs. Jakarta REST
+oldApproach: JAX-WS / SOAP
+modernApproach: Jakarta REST / JSON
+summary: Замените громоздкие SOAP/WSDL-эндпоинты чистыми Jakarta REST-ресурсами, возвращающими JSON.
+explanation: Веб-сервисы на основе SOAP опираются на WSDL-контракты, XML-маршализацию и JAX-WS-аннотации, создавая значительные накладные расходы. Jakarta REST (ранее JAX-RS) использует интуитивные аннотации, такие как @GET, @Path и @Produces, для предоставления RESTful JSON API. Модель программирования проще, полезные нагрузки меньше, а подход соответствует стилю взаимодействия современных микросервисов.
+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/ru/enterprise/spring-api-versioning.yaml b/translations/content/ru/enterprise/spring-api-versioning.yaml
new file mode 100644
index 0000000..0bd6d9d
--- /dev/null
+++ b/translations/content/ru/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. Версия может извлекаться из заголовка запроса, сегмента URL-пути или параметра запроса — всё управляется централизованно.
+whyModernWins:
+- icon: 🗂️
+ title: Без дублирования контроллеров
+ desc: Все версии живут в одном классе контроллера; только отдельные методы-обработчики несут атрибут version.
+- icon: ⚙️
+ title: Централизованная стратегия версионирования
+ desc: Переключайтесь с заголовочного на URL- или параметровое версионирование одним вызовом configureApiVersioning.
+- icon: 📈
+ title: Инкрементальная эволюция
+ desc: Добавляйте новую версию к методу, не затрагивая несвязанные эндпоинты и не создавая новых файлов контроллеров.
+support:
+ description: "Доступно начиная с Spring Framework 7.0 (требует Java 17+)"
diff --git a/translations/content/ru/enterprise/spring-null-safety-jspecify.yaml b/translations/content/ru/enterprise/spring-null-safety-jspecify.yaml
new file mode 100644
index 0000000..81be273
--- /dev/null
+++ b/translations/content/ru/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 типы требуют аннотации `@Nullable`, что резко снижает многословность. Аннотации JSpecify распознаются ведущими инструментами статического анализа — NullAway, Error Prone и IntelliJ IDEA — обеспечивая более широкую поддержку инструментами, чем Spring-специфичные аннотации."
+whyModernWins:
+- icon: ✂️
+ title: Non-null как умолчание
+ desc: "@NullMarked делает все неаннотированные типы non-null, так что аннотировать нужно только nullable-исключения."
+- icon: 🌐
+ title: Экосистемный стандарт
+ desc: Аннотации JSpecify — это кросс-фреймворковый стандарт, распознаваемый NullAway, Error Prone и IDE.
+- icon: 🔍
+ title: Расширенная поддержка инструментами
+ desc: Современные статические анализаторы понимают null-модель JSpecify и сообщают о нарушениях на этапе компиляции.
+support:
+ description: "Доступно начиная с Spring Framework 7.0 (требует Java 17+)"
diff --git a/translations/content/ru/enterprise/spring-xml-config-vs-annotations.yaml b/translations/content/ru/enterprise/spring-xml-config-vs-annotations.yaml
new file mode 100644
index 0000000..160c002
--- /dev/null
+++ b/translations/content/ru/enterprise/spring-xml-config-vs-annotations.yaml
@@ -0,0 +1,17 @@
+title: Spring XML-конфигурация бинов vs. на основе аннотаций
+oldApproach: XML-определения бинов
+modernApproach: Бины на основе аннотаций
+summary: Замените многословные Spring XML-определения бинов лаконичной конфигурацией на основе аннотаций с Spring Boot.
+explanation: "Традиционные Spring-приложения связывали бины через XML-файлы конфигурации, объявляя каждый класс с его зависимостями в виде многословных элементов . Хотя поддержка аннотаций существовала с Spring 2.5, XML оставался преобладающим подходом до тех пор, пока Spring Boot не ввёл автоконфигурацию. Spring Boot обнаруживает бины, аннотированные @Component, @Service, @Repository и @Controller, через сканирование classpath, автоматически удовлетворяет зависимости через инъекцию конструктора и настраивает инфраструктуру, такую как DataSource, из classpath — устраняя все файлы XML-связывания."
+whyModernWins:
+- icon: 🚫
+ title: Никакого XML
+ desc: "@SpringBootApplication активирует сканирование компонентов и автоконфигурацию, устраняя все XML-файлы связывания."
+- icon: 💉
+ title: Инъекция конструктора
+ desc: Spring автоматически инъецирует зависимости через конструкторы, делая бины проще для тестирования и понимания.
+- icon: ⚡
+ title: Автоконфигурация
+ desc: Spring Boot настраивает DataSource, JPA и другую инфраструктуру из classpath без шаблонного кода.
+support:
+ description: "Широко доступно начиная с Spring Boot 1.0 (апрель 2014); Spring Boot 3 требует Java 17+"
diff --git a/translations/content/ru/errors/helpful-npe.yaml b/translations/content/ru/errors/helpful-npe.yaml
new file mode 100644
index 0000000..fd210e0
--- /dev/null
+++ b/translations/content/ru/errors/helpful-npe.yaml
@@ -0,0 +1,17 @@
+title: "Информативные NullPointerExceptions"
+oldApproach: "Криптичная NPE"
+modernApproach: "Подробная NPE"
+summary: "JVM автоматически сообщает, какая переменная была null."
+explanation: "Информативные NPE описывают, какое выражение было null и какая операция завершилась ошибкой. По умолчанию включено начиная с Java 14 — изменений в коде не требуется, достаточно обновить JDK."
+whyModernWins:
+- icon: "🔍"
+ title: "Точная переменная"
+ desc: "Сообщение указывает переменную null в цепочке вызовов."
+- icon: "⚡"
+ title: "Более быстрая отладка"
+ desc: "Больше не нужно гадать, какой из пяти цепочечных вызовов вернул null."
+- icon: "🆓"
+ title: "Бесплатное улучшение"
+ desc: "Никаких изменений в коде — достаточно запустить на JDK 14+."
+support:
+ description: "Доступно в JDK 14 (март 2020)"
diff --git a/translations/content/ru/errors/multi-catch.yaml b/translations/content/ru/errors/multi-catch.yaml
new file mode 100644
index 0000000..e2521b1
--- /dev/null
+++ b/translations/content/ru/errors/multi-catch.yaml
@@ -0,0 +1,17 @@
+title: "Обработка исключений с Multi-Catch"
+oldApproach: "Отдельные блоки catch"
+modernApproach: "Multi-Catch"
+summary: "Перехват нескольких типов исключений в одном блоке catch."
+explanation: "Multi-Catch обрабатывает несколько типов исключений одним и тем же кодом. Переменная исключения является эффективно final, поэтому её можно повторно выбросить без оборачивания."
+whyModernWins:
+- icon: "📏"
+ title: "DRY"
+ desc: "Одна и та же логика обработки пишется один раз, а не трижды."
+- icon: "🔄"
+ title: "Повторный выброс"
+ desc: "Пойманное исключение можно повторно выбросить с его точным типом."
+- icon: "📖"
+ title: "Наглядность"
+ desc: "Все обрабатываемые типы видны в одном месте."
+support:
+ description: "Доступно в JDK 7 (июль 2011)"
diff --git a/translations/content/ru/errors/null-in-switch.yaml b/translations/content/ru/errors/null-in-switch.yaml
new file mode 100644
index 0000000..d015900
--- /dev/null
+++ b/translations/content/ru/errors/null-in-switch.yaml
@@ -0,0 +1,17 @@
+title: "Случай null в switch"
+oldApproach: "Проверка перед switch"
+modernApproach: "case null"
+summary: "Обрабатывать null непосредственно как case в switch — без отдельной проверки."
+explanation: "Switch с сопоставлением шаблонов может сопоставлять null как метку case. Это устраняет необходимость проверки null перед switch, делая обработку null явной и наглядной."
+whyModernWins:
+- icon: "🎯"
+ title: "Явность"
+ desc: "Обработка null видна непосредственно в switch."
+- icon: "🛡️"
+ title: "Нет NPE"
+ desc: "Switch на значение null не выбрасывает NullPointerException."
+- icon: "📐"
+ title: "Всё в одном"
+ desc: "Все случаи, включая null, в одном выражении switch."
+support:
+ description: "Доступно в JDK 21 LTS (сент. 2023)"
diff --git a/translations/content/ru/errors/optional-chaining.yaml b/translations/content/ru/errors/optional-chaining.yaml
new file mode 100644
index 0000000..6b9983d
--- /dev/null
+++ b/translations/content/ru/errors/optional-chaining.yaml
@@ -0,0 +1,17 @@
+title: "Цепочки Optional"
+oldApproach: "Вложенные проверки null"
+modernApproach: "Конвейер Optional"
+summary: "Замена вложенных проверок null на конвейер Optional."
+explanation: "Optional.map() связывает допускающие null значения и прерывает цепочку при первом 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/ru/errors/optional-orelsethrow.yaml b/translations/content/ru/errors/optional-orelsethrow.yaml
new file mode 100644
index 0000000..d77d16d
--- /dev/null
+++ b/translations/content/ru/errors/optional-orelsethrow.yaml
@@ -0,0 +1,17 @@
+title: "Optional.orElseThrow() без Supplier"
+oldApproach: "get() или orElseThrow(supplier)"
+modernApproach: "orElseThrow()"
+summary: "Использовать Optional.orElseThrow() как более ясную альтернативу get(), выражающую намерение."
+explanation: "Optional.get() широко считается code smell, поскольку скрывает возможность сбоя. Метод orElseThrow() без аргументов, добавленный в Java 10, делает то же самое, но явно выражает намерение: разработчик ожидает значение и хочет получить исключение, если его нет."
+whyModernWins:
+- icon: "📖"
+ title: "Самодокументирующийся"
+ desc: "orElseThrow() явно сигнализирует, что пустой результат не ожидается."
+- icon: "🔒"
+ title: "Без get()"
+ desc: "Инструменты статического анализа помечают get() как рискованный; orElseThrow() является идиоматичным."
+- icon: "⚡"
+ title: "Меньше шаблонного кода"
+ desc: "Не нужен Supplier для стандартного NoSuchElementException."
+support:
+ description: "Доступно с JDK 10 (март 2018)."
diff --git a/translations/content/ru/errors/record-based-errors.yaml b/translations/content/ru/errors/record-based-errors.yaml
new file mode 100644
index 0000000..33da39d
--- /dev/null
+++ b/translations/content/ru/errors/record-based-errors.yaml
@@ -0,0 +1,17 @@
+title: "Ответы об ошибках на основе Record"
+oldApproach: "Map или громоздкий класс"
+modernApproach: "Record-ошибки"
+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/ru/errors/require-nonnull-else.yaml b/translations/content/ru/errors/require-nonnull-else.yaml
new file mode 100644
index 0000000..0844547
--- /dev/null
+++ b/translations/content/ru/errors/require-nonnull-else.yaml
@@ -0,0 +1,17 @@
+title: "Objects.requireNonNullElse()"
+oldApproach: "Тернарная проверка null"
+modernApproach: "requireNonNullElse()"
+summary: "Получить ненулевое значение с явным значением по умолчанию — без тернарного оператора."
+explanation: "requireNonNullElse возвращает первый аргумент, если он не null, иначе — второй. Значение по умолчанию само не может быть null — при двух null-значениях выбрасывается NPE, что выявляет ошибки на раннем этапе."
+whyModernWins:
+- icon: "📖"
+ title: "Явное намерение"
+ desc: "Название метода точно описывает, что он делает."
+- icon: "🛡️"
+ title: "Null-безопасное значение по умолчанию"
+ desc: "Значение по умолчанию также проверяется на null."
+- icon: "📏"
+ title: "Читаемость"
+ desc: "Лучше тернарного оператора для простой логики null-или-по-умолчанию."
+support:
+ description: "Доступно в JDK 9 (сент. 2017)"
diff --git a/translations/content/ru/io/deserialization-filters.yaml b/translations/content/ru/io/deserialization-filters.yaml
new file mode 100644
index 0000000..def4966
--- /dev/null
+++ b/translations/content/ru/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/ru/io/file-memory-mapping.yaml b/translations/content/ru/io/file-memory-mapping.yaml
new file mode 100644
index 0000000..bd760fd
--- /dev/null
+++ b/translations/content/ru/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 гарантирует освобождение памяти при выходе из области видимости, а не при сборке мусора."
+- icon: "⚡"
+ title: "Лучшая производительность"
+ desc: "Оптимизировано для современных моделей памяти и оборудования."
+support:
+ description: "Доступно в JDK 22 (март 2024)"
diff --git a/translations/content/ru/io/files-mismatch.yaml b/translations/content/ru/io/files-mismatch.yaml
new file mode 100644
index 0000000..c4d6d51
--- /dev/null
+++ b/translations/content/ru/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/ru/io/http-client.yaml b/translations/content/ru/io/http-client.yaml
new file mode 100644
index 0000000..d7bb179
--- /dev/null
+++ b/translations/content/ru/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 или вручную читать потоки InputStream."
+whyModernWins:
+- icon: "📐"
+ title: "Builder API"
+ desc: "Текучий Builder для запросов, заголовков и таймаутов."
+- icon: "🔄"
+ title: "Поддержка HTTP/2"
+ desc: "Встроенный HTTP/2 с мультиплексированием и Server Push."
+- icon: "⚡"
+ title: "Асинхронность"
+ desc: "sendAsync() возвращает CompletableFuture."
+support:
+ description: "Доступно в JDK 11 (сент. 2018)"
diff --git a/translations/content/ru/io/inputstream-transferto.yaml b/translations/content/ru/io/inputstream-transferto.yaml
new file mode 100644
index 0000000..8095c76
--- /dev/null
+++ b/translations/content/ru/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: "Никаких ошибок смещения на единицу при управлении буфером."
+support:
+ description: "Доступно в JDK 9 (сент. 2017)"
diff --git a/translations/content/ru/io/io-class-console-io.yaml b/translations/content/ru/io/io-class-console-io.yaml
new file mode 100644
index 0000000..abc5230
--- /dev/null
+++ b/translations/content/ru/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: "Новые разработчики могут использовать консольный ввод-вывод без знания Scanner, System.out или операторов import."
+support:
+ description: "Предварительный просмотр в JDK 25 как часть неявно объявленных классов (JEP 495)"
diff --git a/translations/content/ru/io/path-of.yaml b/translations/content/ru/io/path-of.yaml
new file mode 100644
index 0000000..8e07068
--- /dev/null
+++ b/translations/content/ru/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: "Единообразный API"
+ 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/ru/io/reading-files.yaml b/translations/content/ru/io/reading-files.yaml
new file mode 100644
index 0000000..1c51c3e
--- /dev/null
+++ b/translations/content/ru/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/ru/io/try-with-resources-effectively-final.yaml b/translations/content/ru/io/try-with-resources-effectively-final.yaml
new file mode 100644
index 0000000..b276b99
--- /dev/null
+++ b/translations/content/ru/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/ru/io/writing-files.yaml b/translations/content/ru/io/writing-files.yaml
new file mode 100644
index 0000000..743b44d
--- /dev/null
+++ b/translations/content/ru/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: "Не нужна обёртка Writer или try-with-resources."
+- icon: "🛡️"
+ title: "Безопасные значения по умолчанию"
+ desc: "Кодировка UTF-8, корректное закрытие дескриптора файла."
+- icon: "🔧"
+ title: "Опции"
+ desc: "Флаги OpenOption для добавления содержимого, создания файла и т.д."
+support:
+ description: "Доступно в JDK 11 (сент. 2018)"
diff --git a/translations/content/ru/language/call-c-from-java.yaml b/translations/content/ru/language/call-c-from-java.yaml
new file mode 100644
index 0000000..1ee2ae1
--- /dev/null
+++ b/translations/content/ru/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: "Вызов C-кода из Java"
+oldApproach: "JNI (Java Native Interface)"
+modernApproach: "FFM (Foreign Function & Memory API)"
+summary: "FFM позволяет Java напрямую вызывать C-библиотеки без шаблонного кода JNI и без знания Java на стороне C."
+explanation: "Java предлагает два подхода для вызова нативного кода C/C++: традиционный JNI и современный FFM API. При использовании JNI нужно объявить метод как native, запустить javac -h для генерации заголовочного файла C и реализовать функцию с громоздким JNI C API (JNIEnv, jstring и т.д.). FFM, ставший стандартным API в Java 22, устраняет всё это: C-код остаётся чистым C — никаких JNI-соглашений не требуется. Это значительно упрощает вызов существующих библиотек C/C++ без каких-либо изменений. На стороне Java используется Arena для безопасного управления памятью вне кучи и MethodHandle для downcall, что обеспечивает гибкость и безопасность."
+whyModernWins:
+- icon: "👁"
+ title: "C-код остаётся чистым C"
+ desc: "Функции C не нужны JNI-аннотации или шаблонный JNIEnv — любая существующая C-библиотека может быть вызвана напрямую."
+- icon: "⚡"
+ title: "Более гибкий подход"
+ desc: "Большинство существующих библиотек C/C++ можно вызывать напрямую без написания адаптерного кода или генерации заголовочных файлов."
+- icon: "🛠️"
+ title: "Упрощённый рабочий процесс"
+ desc: "Не нужно останавливаться, запускать javac -h или реализовывать интерфейс, определённый в сгенерированном .h-файле."
+support:
+ description: "Стандартизирован в JDK 22 (март 2024); ранее находился в инкубационной фазе с JDK 14"
diff --git a/translations/content/ru/language/compact-canonical-constructor.yaml b/translations/content/ru/language/compact-canonical-constructor.yaml
new file mode 100644
index 0000000..10a3310
--- /dev/null
+++ b/translations/content/ru/language/compact-canonical-constructor.yaml
@@ -0,0 +1,17 @@
+title: "Компактный канонический конструктор"
+oldApproach: "Явная валидация в конструкторе"
+modernApproach: "Компактный конструктор"
+summary: "Валидация и нормализация полей record без повторения списка параметров."
+explanation: "Record может объявить компактный канонический конструктор, который опускает список параметров и присваивания полей. Компилятор автоматически присваивает параметры полям после выполнения вашей логики валидации. Это идеально подходит для проверки предусловий, защитного копирования и нормализации."
+whyModernWins:
+- icon: "✂️"
+ title: "Меньше повторений"
+ desc: "Не нужно повторять список параметров и вручную присваивать каждое поле."
+- icon: "🛡️"
+ title: "Валидация"
+ desc: "Отлично подходит для проверки на null, валидации диапазонов и защитного копирования."
+- icon: "📖"
+ title: "Более понятное намерение"
+ desc: "Компактный синтаксис акцентирует внимание на валидации, а не на шаблонном коде."
+support:
+ description: "Доступно в JDK 16 (март 2021)"
diff --git a/translations/content/ru/language/compact-source-files.yaml b/translations/content/ru/language/compact-source-files.yaml
new file mode 100644
index 0000000..d0c8e6d
--- /dev/null
+++ b/translations/content/ru/language/compact-source-files.yaml
@@ -0,0 +1,17 @@
+title: "Компактные исходные файлы"
+oldApproach: "Церемония классов для main"
+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/ru/language/default-interface-methods.yaml b/translations/content/ru/language/default-interface-methods.yaml
new file mode 100644
index 0000000..a9f35c5
--- /dev/null
+++ b/translations/content/ru/language/default-interface-methods.yaml
@@ -0,0 +1,17 @@
+title: "Методы по умолчанию в интерфейсах"
+oldApproach: "Абстрактные классы для общего поведения"
+modernApproach: "Методы по умолчанию в интерфейсах"
+summary: "Размещать реализации методов непосредственно в интерфейсах, обеспечивая множественное наследование поведения."
+explanation: "До Java 8 совместное использование поведения между несвязанными классами требовало абстрактных классов, что ограничивало одиночным наследованием. Методы по умолчанию позволяют интерфейсам предоставлять реализации методов, так что классы могут наследовать поведение от нескольких интерфейсов. Это было ключевым для развития Collections API (например, List.forEach, Map.getOrDefault) без нарушения существующих реализаций."
+whyModernWins:
+- icon: "🔀"
+ title: "Множественное наследование"
+ desc: "Классы могут реализовывать множество интерфейсов с методами по умолчанию — в отличие от единственного абстрактного класса."
+- icon: "📦"
+ title: "Эволюция API"
+ desc: "Добавлять новые методы в интерфейсы без нарушения существующих реализаций."
+- icon: "🧩"
+ title: "Компонуемое поведение"
+ desc: "Свободно комбинировать возможности из нескольких интерфейсов."
+support:
+ description: "Доступно с JDK 8 (март 2014)."
diff --git a/translations/content/ru/language/diamond-operator.yaml b/translations/content/ru/language/diamond-operator.yaml
new file mode 100644
index 0000000..ac1c34b
--- /dev/null
+++ b/translations/content/ru/language/diamond-operator.yaml
@@ -0,0 +1,17 @@
+title: "Оператор diamond с анонимными классами"
+oldApproach: "Повторение аргументов типа"
+modernApproach: "Diamond <>"
+summary: "Оператор diamond теперь работает и с анонимными классами."
+explanation: "Java 7 представила <>, но это не работало с анонимными внутренними классами. Java 9 исправила это, так что аргументы типа в правой части никогда не нужно повторять."
+whyModernWins:
+- icon: "📏"
+ title: "Единые правила"
+ desc: "Diamond работает везде — как в конструкторах, так и в анонимных классах."
+- icon: "🧹"
+ title: "Меньше избыточности"
+ desc: "Аргументы типа указываются один раз слева и никогда не повторяются."
+- icon: "🔧"
+ title: "Принцип DRY"
+ desc: "Компилятор уже знает тип — зачем писать его дважды?"
+support:
+ description: "Diamond с анонимными классами с JDK 9 (сент. 2017)."
diff --git a/translations/content/ru/language/exhaustive-switch.yaml b/translations/content/ru/language/exhaustive-switch.yaml
new file mode 100644
index 0000000..b45fefd
--- /dev/null
+++ b/translations/content/ru/language/exhaustive-switch.yaml
@@ -0,0 +1,17 @@
+title: "Исчерпывающий switch без default"
+oldApproach: "Обязательная ветка default"
+modernApproach: "Исчерпываемость sealed"
+summary: "Компилятор проверяет, что все sealed-подтипы охвачены — default не требуется."
+explanation: "При switch по sealed-типу компилятор знает все возможные подтипы и проверяет, что каждый случай обработан. Если добавить новый подтип, компилятор укажет на каждый switch, который стал неполным."
+whyModernWins:
+- icon: "✅"
+ title: "Безопасность на этапе компиляции"
+ desc: "Добавьте новый подтип — компилятор покажет каждое место, которое нужно обновить."
+- icon: "🚫"
+ title: "Нет мёртвого кода"
+ desc: "Никакой недостижимой ветки default, скрывающей ошибки."
+- icon: "📐"
+ title: "Алгебраические типы"
+ desc: "sealed + records + исчерпывающий switch = настоящие ADT в Java."
+support:
+ description: "Доступно в JDK 21 LTS (сент. 2023)"
diff --git a/translations/content/ru/language/flexible-constructor-bodies.yaml b/translations/content/ru/language/flexible-constructor-bodies.yaml
new file mode 100644
index 0000000..7a22414
--- /dev/null
+++ b/translations/content/ru/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: "Больше не нужны статические вспомогательные методы или паттерн Factory для обхода ограничения."
+support:
+ description: "Финализировано в JDK 25 LTS (JEP 513, сент. 2025)."
diff --git a/translations/content/ru/language/guarded-patterns.yaml b/translations/content/ru/language/guarded-patterns.yaml
new file mode 100644
index 0000000..31a1145
--- /dev/null
+++ b/translations/content/ru/language/guarded-patterns.yaml
@@ -0,0 +1,17 @@
+title: "Охраняемые паттерны с when"
+oldApproach: "Вложенный if"
+modernApproach: "Клауза when"
+summary: "Добавлять условия к ветвям паттернов с помощью охранников when."
+explanation: "Охраняемые паттерны позволяют уточнить совпадение по типу дополнительным булевым условием. Благодаря этому вся логика ветвления остаётся в switch, а не вложена в ветви в виде if-операторов."
+whyModernWins:
+- icon: "🎯"
+ title: "Точное совпадение"
+ desc: "Объединить тип и условие в одной метке case."
+- icon: "📐"
+ title: "Плоская структура"
+ desc: "Никаких вложенных if/else внутри ветвей switch."
+- icon: "📖"
+ title: "Читаемое намерение"
+ desc: "Клауза when читается как естественный язык."
+support:
+ description: "Доступно в JDK 21 LTS (сент. 2023)"
diff --git a/translations/content/ru/language/markdown-javadoc-comments.yaml b/translations/content/ru/language/markdown-javadoc-comments.yaml
new file mode 100644
index 0000000..cc02f6d
--- /dev/null
+++ b/translations/content/ru/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: "Обратные кавычки для inline-кода и ``` для блоков вместо HTML-тегов."
+- icon: "✍️"
+ title: "Проще писать"
+ desc: "Никакого {@code}, , -тегов — просто пишите Markdown."
+- icon: "👁"
+ title: "Лучше в редакторах"
+ desc: "Markdown отлично отображается в современных IDE и текстовых редакторах."
+support:
+ description: "Доступно с JDK 23 (сент. 2024)"
diff --git a/translations/content/ru/language/module-import-declarations.yaml b/translations/content/ru/language/module-import-declarations.yaml
new file mode 100644
index 0000000..3fcb33b
--- /dev/null
+++ b/translations/content/ru/language/module-import-declarations.yaml
@@ -0,0 +1,17 @@
+title: "Объявления импорта модулей"
+oldApproach: "Множество импортов"
+modernApproach: "import module"
+summary: "Импортировать все экспортируемые пакеты модуля одним объявлением."
+explanation: "Объявления импорта модулей позволяют импортировать всё, что экспортирует модуль, одной строкой. Особенно полезно для java.base, который охватывает коллекции, ввод-вывод, потоки и многое другое."
+whyModernWins:
+- icon: "🧹"
+ title: "Одна строка"
+ desc: "Заменить стену импортов одним импортом модуля."
+- icon: "📦"
+ title: "Осведомлённость о модульной системе"
+ desc: "Использует модульную систему для импорта связанных пакетов."
+- icon: "🚀"
+ title: "Быстрый старт"
+ desc: "Идеально для скриптов и прототипов, где списки импортов утомительны."
+support:
+ description: "Финализировано в JDK 25 LTS (JEP 511, сент. 2025)."
diff --git a/translations/content/ru/language/pattern-matching-instanceof.yaml b/translations/content/ru/language/pattern-matching-instanceof.yaml
new file mode 100644
index 0000000..d7321d6
--- /dev/null
+++ b/translations/content/ru/language/pattern-matching-instanceof.yaml
@@ -0,0 +1,17 @@
+title: "Pattern Matching для instanceof"
+oldApproach: "instanceof + приведение типа"
+modernApproach: "Переменная паттерна"
+summary: "Совместить проверку типа и приведение в одном шаге с помощью pattern matching."
+explanation: "Pattern matching для instanceof устраняет избыточное приведение после проверки типа. Переменная автоматически ограничена областью видимости, в которой паттерн совпадает, что делает код безопаснее и короче."
+whyModernWins:
+- icon: "🔄"
+ title: "Нет лишнего приведения"
+ desc: "Проверка типа и привязка переменной происходят в одном выражении."
+- icon: "📏"
+ title: "Меньше строк"
+ desc: "Одна строка вместо двух — строка с приведением исчезает полностью."
+- icon: "🛡️"
+ title: "Безопасность области видимости"
+ desc: "Переменная паттерна находится в области видимости только там, где тип гарантирован."
+support:
+ description: "Доступно в JDK 16 (март 2021)"
diff --git a/translations/content/ru/language/pattern-matching-switch.yaml b/translations/content/ru/language/pattern-matching-switch.yaml
new file mode 100644
index 0000000..eb3d94e
--- /dev/null
+++ b/translations/content/ru/language/pattern-matching-switch.yaml
@@ -0,0 +1,17 @@
+title: "Pattern Matching в switch"
+oldApproach: "Цепочка if-else"
+modernApproach: "Паттерны типов"
+summary: "Заменить цепочки if-else-instanceof чистыми паттернами типов в switch."
+explanation: "Pattern matching в switch позволяет напрямую сопоставлять типы, объединяя проверку типа, приведение и привязку в лаконичной метке case. Компилятор проверяет полноту охвата."
+whyModernWins:
+- icon: "📐"
+ title: "Структурированная диспетчеризация"
+ desc: "Switch делает структуру ветвления явной и понятной."
+- icon: "🎯"
+ title: "Форма выражения"
+ desc: "Возвращает значение напрямую — изменяемая переменная не нужна."
+- icon: "✅"
+ title: "Проверка исчерпываемости"
+ desc: "Компилятор обеспечивает обработку всех типов."
+support:
+ description: "Доступно в JDK 21 LTS (сент. 2023)"
diff --git a/translations/content/ru/language/primitive-types-in-patterns.yaml b/translations/content/ru/language/primitive-types-in-patterns.yaml
new file mode 100644
index 0000000..7ac1d2b
--- /dev/null
+++ b/translations/content/ru/language/primitive-types-in-patterns.yaml
@@ -0,0 +1,17 @@
+title: "Примитивные типы в паттернах"
+oldApproach: "Ручные проверки диапазонов"
+modernApproach: "Примитивные паттерны"
+summary: "Pattern matching теперь работает и с примитивными типами, а не только с объектами."
+explanation: "Java 25 расширяет pattern matching на примитивные типы. int, long, double и т.д. можно использовать в паттернах switch с охранниками when, что избавляет от боксинга и ручных проверок диапазонов."
+whyModernWins:
+- icon: "📦"
+ title: "Нет боксинга"
+ desc: "Сопоставлять примитивы напрямую — обёртка Integer не нужна."
+- icon: "🎯"
+ title: "Единообразие паттернов"
+ desc: "Одинаковый синтаксис паттернов для объектов и примитивов."
+- icon: "⚡"
+ title: "Лучшая производительность"
+ desc: "Избежать накладных расходов автобоксинга при pattern matching."
+support:
+ description: "Предварительный просмотр в JDK 25 (третий превью, JEP 507). Требует --enable-preview."
diff --git a/translations/content/ru/language/private-interface-methods.yaml b/translations/content/ru/language/private-interface-methods.yaml
new file mode 100644
index 0000000..3bf286d
--- /dev/null
+++ b/translations/content/ru/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: "DRY-интерфейсы"
+ desc: "Больше никакого копирования и вставки между методами по умолчанию."
+support:
+ description: "Доступно в JDK 9 (сент. 2017)"
diff --git a/translations/content/ru/language/record-patterns.yaml b/translations/content/ru/language/record-patterns.yaml
new file mode 100644
index 0000000..f9c8b84
--- /dev/null
+++ b/translations/content/ru/language/record-patterns.yaml
@@ -0,0 +1,17 @@
+title: "Паттерны записей (деструктуризация)"
+oldApproach: "Ручной доступ к полям"
+modernApproach: "Деструктуризация"
+summary: "Деструктурировать записи прямо в паттернах — извлекать поля за один шаг."
+explanation: "Паттерны записей позволяют разложить компоненты записи непосредственно в instanceof и switch. Вложенные паттерны также поддерживаются, что обеспечивает глубокое сопоставление без промежуточных переменных."
+whyModernWins:
+- icon: "🎯"
+ title: "Прямой доступ"
+ desc: "Обращаться к компонентам записи без ручного вызова аксессоров."
+- icon: "🪆"
+ title: "Вложенность"
+ desc: "Паттерны можно вкладывать — сопоставлять внутренние записи в одном выражении."
+- icon: "📏"
+ title: "Компактный код"
+ desc: "Пять строк превращаются в две — меньше церемоний, та же ясность."
+support:
+ description: "Доступно в JDK 21 LTS (сент. 2023)"
diff --git a/translations/content/ru/language/records-for-data-classes.yaml b/translations/content/ru/language/records-for-data-classes.yaml
new file mode 100644
index 0000000..e46fb63
--- /dev/null
+++ b/translations/content/ru/language/records-for-data-classes.yaml
@@ -0,0 +1,17 @@
+title: "Записи для классов данных"
+oldApproach: "Многословный POJO"
+modernApproach: "record"
+summary: "Одна строка заменяет более 30 строк шаблонного кода для неизменяемых носителей данных."
+explanation: "Записи автоматически генерируют конструктор, аксессоры (x(), y()), equals(), hashCode() и toString(). Они неизменяемы по своей природе и идеально подходят для DTO, объектов-значений и pattern matching."
+whyModernWins:
+- icon: "⚡"
+ title: "Однострочное определение"
+ desc: "Одна строка заменяет конструктор, геттеры, equals, hashCode, toString."
+- icon: "🔒"
+ title: "Неизменяемость по умолчанию"
+ desc: "Все поля final — никаких ловушек с сеттерами."
+- icon: "🧩"
+ title: "Дружественность к паттернам"
+ desc: "Записи работают с паттернами деструктуризации в switch и instanceof."
+support:
+ description: "Доступно в JDK 16 (март 2021)"
diff --git a/translations/content/ru/language/sealed-classes.yaml b/translations/content/ru/language/sealed-classes.yaml
new file mode 100644
index 0000000..d52b1e7
--- /dev/null
+++ b/translations/content/ru/language/sealed-classes.yaml
@@ -0,0 +1,17 @@
+title: "Запечатанные классы для иерархий типов"
+oldApproach: "Открытая иерархия"
+modernApproach: "sealed permits"
+summary: "Ограничить, какие классы могут расширять тип — для исчерпывающих switch."
+explanation: "Запечатанные классы определяют закрытое множество подтипов. Компилятор знает все возможные случаи и позволяет использовать исчерпывающий pattern matching без ветки default. В сочетании с записями они моделируют алгебраические типы данных."
+whyModernWins:
+- icon: "🔐"
+ title: "Контролируемая иерархия"
+ desc: "Расширять могут только разрешённые подтипы — никаких неожиданных подклассов."
+- icon: "✅"
+ title: "Исчерпывающее сопоставление"
+ desc: "Компилятор проверяет, что switch охватывает все случаи — default не нужен."
+- icon: "📐"
+ title: "Алгебраические типы данных"
+ desc: "Естественное моделирование типов-сумм — sealed + records = ADT в Java."
+support:
+ description: "Доступно в JDK 17 LTS (сент. 2021)"
diff --git a/translations/content/ru/language/static-members-in-inner-classes.yaml b/translations/content/ru/language/static-members-in-inner-classes.yaml
new file mode 100644
index 0000000..8ad0124
--- /dev/null
+++ b/translations/content/ru/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/ru/language/static-methods-in-interfaces.yaml b/translations/content/ru/language/static-methods-in-interfaces.yaml
new file mode 100644
index 0000000..44a4602
--- /dev/null
+++ b/translations/content/ru/language/static-methods-in-interfaces.yaml
@@ -0,0 +1,17 @@
+title: "Статические методы в интерфейсах"
+oldApproach: "Вспомогательные классы"
+modernApproach: "Статические методы интерфейса"
+summary: "Добавлять статические вспомогательные методы непосредственно в интерфейсы вместо отдельных вспомогательных классов."
+explanation: "До Java 8 вспомогательные методы, относящиеся к интерфейсу, должны были находиться в отдельном классе (например, Collections для Collection). Статические методы в интерфейсах позволяют держать связанные вспомогательные функции вместе. Широко используется в современных API: Comparator.comparing(), Stream.of() и List.of()."
+whyModernWins:
+- icon: "📦"
+ title: "Лучшая организация"
+ desc: "Хранить связанные вспомогательные функции рядом с интерфейсом, а не в отдельном классе."
+- icon: "🔍"
+ title: "Обнаруживаемость"
+ desc: "Фабричные и вспомогательные методы находятся там, где их ожидают."
+- icon: "🧩"
+ title: "Связность API"
+ desc: "Больше не нужны отдельные классы *Utils или *Helper."
+support:
+ description: "Доступно с JDK 8 (март 2014)"
diff --git a/translations/content/ru/language/switch-expressions.yaml b/translations/content/ru/language/switch-expressions.yaml
new file mode 100644
index 0000000..329a767
--- /dev/null
+++ b/translations/content/ru/language/switch-expressions.yaml
@@ -0,0 +1,17 @@
+title: "Switch-выражения"
+oldApproach: "Оператор switch"
+modernApproach: "Switch-выражение"
+summary: "Switch как выражение, возвращающее значение — без break и без fall-through."
+explanation: "Switch-выражения возвращают значение напрямую, используют стрелочный синтаксис для предотвращения ошибок fall-through, а компилятор проверяет исчерпываемость. Это заменяет подверженную ошибкам форму оператора."
+whyModernWins:
+- icon: "🎯"
+ title: "Возвращает значение"
+ desc: "Присвоить результат switch напрямую — временная переменная не нужна."
+- icon: "🛡️"
+ title: "Нет fall-through"
+ desc: "Стрелочный синтаксис устраняет случайные ошибки fall-through из-за пропущенного break."
+- icon: "✅"
+ title: "Проверка исчерпываемости"
+ desc: "Компилятор обеспечивает охват всех случаев."
+support:
+ description: "Доступно в JDK 14 (март 2020)"
diff --git a/translations/content/ru/language/text-blocks-for-multiline-strings.yaml b/translations/content/ru/language/text-blocks-for-multiline-strings.yaml
new file mode 100644
index 0000000..ddead24
--- /dev/null
+++ b/translations/content/ru/language/text-blocks-for-multiline-strings.yaml
@@ -0,0 +1,17 @@
+title: "Текстовые блоки для многострочных строк"
+oldApproach: "Конкатенация строк"
+modernApproach: "Текстовые блоки"
+summary: "Писать многострочные строки естественно с помощью текстовых блоков с тройными кавычками."
+explanation: "Текстовые блоки позволяют писать многострочные строки именно так, как они выглядят. Больше не нужны escape-последовательности для кавычек или \\n. Компилятор автоматически удаляет случайные отступы."
+whyModernWins:
+- icon: "📖"
+ title: "Читается как есть"
+ desc: "JSON, SQL и HTML в исходном коде выглядят как настоящие JSON, SQL и HTML."
+- icon: "🚫"
+ title: "Никаких escape-последовательностей"
+ desc: "Встроенные кавычки не требуют экранирования обратной косой чертой."
+- icon: "📐"
+ title: "Умные отступы"
+ desc: "Ведущие пробелы автоматически обрезаются по позиции закрывающего разделителя."
+support:
+ description: "Доступно в JDK 15 (сент. 2020)"
diff --git a/translations/content/ru/language/type-inference-with-var.yaml b/translations/content/ru/language/type-inference-with-var.yaml
new file mode 100644
index 0000000..71ce0c5
--- /dev/null
+++ b/translations/content/ru/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/ru/language/unnamed-variables.yaml b/translations/content/ru/language/unnamed-variables.yaml
new file mode 100644
index 0000000..f52f1f6
--- /dev/null
+++ b/translations/content/ru/language/unnamed-variables.yaml
@@ -0,0 +1,17 @@
+title: "Безымянные переменные с _"
+oldApproach: "Неиспользуемая переменная"
+modernApproach: "_ как заполнитель"
+summary: "Использовать _, чтобы явно указать, что переменная намеренно не используется."
+explanation: "Безымянные переменные сообщают читателям и инструментам, что значение намеренно игнорируется. Больше не нужны соглашения об именовании типа «ignored» или «unused», больше нет предупреждений IDE."
+whyModernWins:
+- icon: "📢"
+ title: "Явное намерение"
+ desc: "_ явно говорит «это значение здесь не нужно»."
+- icon: "🔇"
+ title: "Нет предупреждений"
+ desc: "IDE и линтеры больше не помечают намеренно неиспользуемые переменные."
+- icon: "🧹"
+ title: "Более чистые лямбды"
+ desc: "Лямбды с несколькими параметрами выглядят чище, когда нужны только некоторые из них."
+support:
+ description: "Финализировано в JDK 22 (JEP 456, март 2024)."
diff --git a/translations/content/ru/security/key-derivation-functions.yaml b/translations/content/ru/security/key-derivation-functions.yaml
new file mode 100644
index 0000000..6776795
--- /dev/null
+++ b/translations/content/ru/security/key-derivation-functions.yaml
@@ -0,0 +1,19 @@
+title: Функции формирования ключей
+oldApproach: Ручной PBKDF2
+modernApproach: KDF API
+summary: Формирование криптографических ключей с помощью стандартного KDF API.
+explanation: KDF API предоставляет стандартный интерфейс для функций формирования
+ ключей, включая HKDF. Он заменяет неудобный шаблон SecretKeyFactory + PBEKeySpec
+ на чистый строительный API.
+whyModernWins:
+- icon: 📐
+ title: Чистый API
+ desc: Шаблон строителя вместо неудобных конструкторов KeySpec.
+- icon: 🔧
+ title: Поддержка HKDF
+ desc: Современный алгоритм HKDF наряду с PBKDF2.
+- icon: 🛡️
+ title: Стандарт
+ desc: Единый API для всех алгоритмов формирования ключей.
+support:
+ description: Финализировано в JDK 25 LTS (JEP 510, сент. 2025).
diff --git a/translations/content/ru/security/pem-encoding.yaml b/translations/content/ru/security/pem-encoding.yaml
new file mode 100644
index 0000000..ddbb8d4
--- /dev/null
+++ b/translations/content/ru/security/pem-encoding.yaml
@@ -0,0 +1,19 @@
+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 с помощью одного API.
+- icon: 🛡️
+ title: Стандартный формат
+ desc: Создаёт PEM-вывод, соответствующий RFC 7468.
+support:
+ description: Предварительная версия в JDK 25 (JEP 470). Требует --enable-preview.
diff --git a/translations/content/ru/security/random-generator.yaml b/translations/content/ru/security/random-generator.yaml
new file mode 100644
index 0000000..2c991c6
--- /dev/null
+++ b/translations/content/ru/security/random-generator.yaml
@@ -0,0 +1,21 @@
+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: Единый API
+ desc: Один интерфейс охватывает Random, ThreadLocalRandom, SplittableRandom и другие.
+support:
+ description: Доступно с JDK 17 (сентябрь 2021, JEP 356).
diff --git a/translations/content/ru/security/strong-random.yaml b/translations/content/ru/security/strong-random.yaml
new file mode 100644
index 0000000..0d78ecb
--- /dev/null
+++ b/translations/content/ru/security/strong-random.yaml
@@ -0,0 +1,19 @@
+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/ru/security/tls-default.yaml b/translations/content/ru/security/tls-default.yaml
new file mode 100644
index 0000000..b74c174
--- /dev/null
+++ b/translations/content/ru/security/tls-default.yaml
@@ -0,0 +1,19 @@
+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/ru/streams/collectors-flatmapping.yaml b/translations/content/ru/streams/collectors-flatmapping.yaml
new file mode 100644
index 0000000..34f90f4
--- /dev/null
+++ b/translations/content/ru/streams/collectors-flatmapping.yaml
@@ -0,0 +1,19 @@
+title: Collectors.flatMapping()
+oldApproach: Вложенный flatMap
+modernApproach: flatMapping()
+summary: Использование flatMapping() для сглаживания внутри группирующего Collector.
+explanation: Collectors.flatMapping() применяет отображение «один ко многим» в качестве
+ нижестоящего Collector. Это эквивалент Collector для Stream.flatMap() — полезен
+ внутри groupingBy или partitioningBy.
+whyModernWins:
+- icon: 🧩
+ title: Компонуемый
+ desc: Работает как нижестоящий Collector внутри groupingBy.
+- icon: 📐
+ title: Один проход
+ desc: Сглаживание и группировка за один проход Stream.
+- icon: 🔗
+ title: Вкладываемый
+ desc: Сочетается с другими нижестоящими Collectors.
+support:
+ description: Широко доступно с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/streams/optional-ifpresentorelse.yaml b/translations/content/ru/streams/optional-ifpresentorelse.yaml
new file mode 100644
index 0000000..c97827c
--- /dev/null
+++ b/translations/content/ru/streams/optional-ifpresentorelse.yaml
@@ -0,0 +1,19 @@
+title: Optional.ifPresentOrElse()
+oldApproach: if/else с Optional
+modernApproach: ifPresentOrElse()
+summary: Обработка обоих случаев Optional — наличие и отсутствие значения — в одном
+ вызове.
+explanation: ifPresentOrElse() принимает Consumer для случая наличия значения и Runnable
+ для случая пустого Optional. Устраняет антипаттерн 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/ru/streams/optional-or.yaml b/translations/content/ru/streams/optional-or.yaml
new file mode 100644
index 0000000..2aa4bf8
--- /dev/null
+++ b/translations/content/ru/streams/optional-or.yaml
@@ -0,0 +1,19 @@
+title: Optional.or() как запасной вариант
+oldApproach: Вложенный запасной вариант
+modernApproach: Цепочка .or()
+summary: Цепочка запасных вариантов Optional без вложенных проверок.
+explanation: Optional.or() возвращает исходный Optional, если он содержит значение,
+ в противном случае вычисляет Supplier для получения альтернативного Optional.
+ Supplier-ы ленивы — они вызываются только при необходимости.
+whyModernWins:
+- icon: 🔗
+ title: Цепочный
+ desc: Выстраивать запасные варианты в читаемый пайплайн.
+- icon: ⚡
+ title: Ленивое вычисление
+ desc: Supplier запасного варианта выполняется только при необходимости.
+- icon: 📖
+ title: Декларативный
+ desc: "Читается как 'попробуй основное, или вторичное, или по умолчанию'."
+support:
+ description: Широко доступно с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/streams/predicate-not.yaml b/translations/content/ru/streams/predicate-not.yaml
new file mode 100644
index 0000000..b572c8b
--- /dev/null
+++ b/translations/content/ru/streams/predicate-not.yaml
@@ -0,0 +1,20 @@
+title: Predicate.not() для отрицания
+oldApproach: Отрицание через лямбду
+modernApproach: Predicate.not()
+summary: Использование Predicate.not() для чистого отрицания ссылок на методы вместо
+ написания лямбда-обёрток.
+explanation: До Java 11 для отрицания ссылки на метод требовалась её обёртка в лямбду.
+ Predicate.not() позволяет напрямую отрицать любой предикат, что делает код читаемым
+ и согласованным со стилем ссылок на методы во всём пайплайне Stream.
+whyModernWins:
+- icon: 👁
+ title: Чистое отрицание
+ desc: Не нужны лямбда-обёртки для ссылок на методы только ради отрицания.
+- icon: 🔗
+ title: Компонуемый
+ desc: Работает с любым Predicate и позволяет строить чистые цепочки предикатов.
+- icon: 📖
+ title: Естественно читаемый
+ desc: Predicate.not(String::isBlank) читается как естественный язык.
+support:
+ description: Доступно с JDK 11 (сентябрь 2018).
diff --git a/translations/content/ru/streams/stream-gatherers.yaml b/translations/content/ru/streams/stream-gatherers.yaml
new file mode 100644
index 0000000..d878150
--- /dev/null
+++ b/translations/content/ru/streams/stream-gatherers.yaml
@@ -0,0 +1,19 @@
+title: Stream Gatherers
+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/ru/streams/stream-iterate-predicate.yaml b/translations/content/ru/streams/stream-iterate-predicate.yaml
new file mode 100644
index 0000000..046aab2
--- /dev/null
+++ b/translations/content/ru/streams/stream-iterate-predicate.yaml
@@ -0,0 +1,19 @@
+title: Stream.iterate() с предикатом
+oldApproach: iterate + limit
+modernApproach: iterate(seed, pred, op)
+summary: Использование предиката для завершения итерации — как цикл 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: Предикат гарантирует завершение.
+support:
+ description: Широко доступно с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/streams/stream-mapmulti.yaml b/translations/content/ru/streams/stream-mapmulti.yaml
new file mode 100644
index 0000000..b8c0b41
--- /dev/null
+++ b/translations/content/ru/streams/stream-mapmulti.yaml
@@ -0,0 +1,20 @@
+title: Stream.mapMulti()
+oldApproach: flatMap + List
+modernApproach: mapMulti()
+summary: Вывод нуля или более элементов на входной элемент без создания промежуточных
+ Stream.
+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/ru/streams/stream-of-nullable.yaml b/translations/content/ru/streams/stream-of-nullable.yaml
new file mode 100644
index 0000000..a6efe03
--- /dev/null
+++ b/translations/content/ru/streams/stream-of-nullable.yaml
@@ -0,0 +1,19 @@
+title: Stream.ofNullable()
+oldApproach: Проверка на null
+modernApproach: ofNullable()
+summary: Создание Stream с нулём или одним элементом из nullable-значения.
+explanation: Stream.ofNullable() возвращает однопоточный Stream, если значение не
+ null, или пустой Stream, если оно null. Устраняет паттерн тернарной проверки на
+ null.
+whyModernWins:
+- icon: 📏
+ title: Краткость
+ desc: Один вызов заменяет тернарное выражение.
+- icon: 🔗
+ title: flatMap-совместимый
+ desc: Отлично подходит внутри flatMap для пропуска null-значений.
+- icon: 🛡️
+ title: Null-безопасный
+ desc: Нет риска NPE — null превращается в пустой Stream.
+support:
+ description: Широко доступно с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/streams/stream-takewhile-dropwhile.yaml b/translations/content/ru/streams/stream-takewhile-dropwhile.yaml
new file mode 100644
index 0000000..81d4fd4
--- /dev/null
+++ b/translations/content/ru/streams/stream-takewhile-dropwhile.yaml
@@ -0,0 +1,19 @@
+title: Stream takeWhile / dropWhile
+oldApproach: Ручной цикл
+modernApproach: takeWhile/dropWhile
+summary: Брать или пропускать элементы из Stream на основе предиката.
+explanation: takeWhile() возвращает элементы, пока предикат истинен, и останавливается
+ при первом ложном значении. dropWhile() пропускает элементы, пока предикат истинен,
+ и возвращает остальные. Оба лучше работают с упорядоченными Stream.
+whyModernWins:
+- icon: 🎯
+ title: Оценка с коротким замыканием
+ desc: Прекращает обработку, как только предикат не выполняется.
+- icon: 🔗
+ title: Совместимый с пайплайном
+ desc: Естественно связывается с другими операциями Stream.
+- icon: 📖
+ title: Декларативный
+ desc: "takeWhile читается как естественный язык: 'брать, пока меньше 100'."
+support:
+ description: Широко доступно с JDK 9 (сент. 2017)
diff --git a/translations/content/ru/streams/stream-tolist.yaml b/translations/content/ru/streams/stream-tolist.yaml
new file mode 100644
index 0000000..947504e
--- /dev/null
+++ b/translations/content/ru/streams/stream-tolist.yaml
@@ -0,0 +1,19 @@
+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: Fluent
+ desc: Читается естественно в конце пайплайна.
+support:
+ description: Широко доступно с JDK 16 (март 2021)
diff --git a/translations/content/ru/streams/virtual-thread-executor.yaml b/translations/content/ru/streams/virtual-thread-executor.yaml
new file mode 100644
index 0000000..0fcf38e
--- /dev/null
+++ b/translations/content/ru/streams/virtual-thread-executor.yaml
@@ -0,0 +1,20 @@
+title: Исполнитель виртуальных потоков
+oldApproach: Фиксированный пул потоков
+modernApproach: Virtual-Thread-Executor
+summary: Использование исполнителей виртуальных потоков для неограниченного лёгковесного
+ параллелизма.
+explanation: Исполнитель виртуальных потоков создаёт новый виртуальный поток для
+ каждой задачи. Не нужно задавать размер пула — виртуальные потоки достаточно дёшевы,
+ чтобы создавать их миллионами.
+whyModernWins:
+- icon: ♾️
+ title: Без настройки размера
+ desc: Не нужно задавать размер пула — создавать столько потоков, сколько нужно.
+- icon: ⚡
+ title: Лёгковесный
+ desc: Виртуальные потоки используют КБ вместо МБ памяти.
+- icon: 🧹
+ title: Auto-closeable
+ desc: try-with-resources автоматически выполняет завершение работы.
+support:
+ description: Широко доступно с JDK 21 LTS (сент. 2023)
diff --git a/translations/content/ru/strings/string-chars-stream.yaml b/translations/content/ru/strings/string-chars-stream.yaml
new file mode 100644
index 0000000..1a90bce
--- /dev/null
+++ b/translations/content/ru/strings/string-chars-stream.yaml
@@ -0,0 +1,19 @@
+title: Символы строки как поток
+oldApproach: Ручной цикл
+modernApproach: Поток chars()
+summary: Обработка символов строки в виде конвейера потока.
+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/ru/strings/string-formatted.yaml b/translations/content/ru/strings/string-formatted.yaml
new file mode 100644
index 0000000..944aaec
--- /dev/null
+++ b/translations/content/ru/strings/string-formatted.yaml
@@ -0,0 +1,19 @@
+title: String.formatted()
+oldApproach: String.format()
+modernApproach: formatted()
+summary: Вызов formatted() непосредственно на строке-шаблоне.
+explanation: String.formatted() — это метод экземпляра, аналогичный String.format(),
+ но вызываемый на строке форматирования. Он читается более естественно в потоке
+ слева направо.
+whyModernWins:
+- icon: 📖
+ title: Естественная читаемость
+ desc: "Template.formatted(args) воспринимается лучше, чем String.format(template, args)."
+- icon: 🔗
+ title: Цепочки вызовов
+ desc: Можно объединять в цепочку с другими строковыми методами.
+- icon: 📏
+ title: Меньше кода
+ desc: Устраняет избыточный статический вызов String.format().
+support:
+ description: Широко доступно с JDK 15 (сентябрь 2020)
diff --git a/translations/content/ru/strings/string-indent-transform.yaml b/translations/content/ru/strings/string-indent-transform.yaml
new file mode 100644
index 0000000..ba358b5
--- /dev/null
+++ b/translations/content/ru/strings/string-indent-transform.yaml
@@ -0,0 +1,19 @@
+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/ru/strings/string-isblank.yaml b/translations/content/ru/strings/string-isblank.yaml
new file mode 100644
index 0000000..78c449c
--- /dev/null
+++ b/translations/content/ru/strings/string-isblank.yaml
@@ -0,0 +1,18 @@
+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/ru/strings/string-lines.yaml b/translations/content/ru/strings/string-lines.yaml
new file mode 100644
index 0000000..c56535e
--- /dev/null
+++ b/translations/content/ru/strings/string-lines.yaml
@@ -0,0 +1,21 @@
+title: String.lines() для разбиения на строки
+oldApproach: "split(\"\\\\n\")"
+modernApproach: lines()
+summary: Использование String.lines() для разбиения текста на поток строк без
+ издержек регулярных выражений.
+explanation: "String.lines() возвращает Stream строк, разбитых по \\n,\
+ \ \\r или \\r\\n. Это ленивее и эффективнее, чем split(), избегает компиляции\
+ \ регулярных выражений и естественно интегрируется в Stream API для дальнейшей\
+ \ обработки."
+whyModernWins:
+- icon: ⚡
+ title: Ленивый поток
+ desc: Строки генерируются по запросу, а не все сразу, как в split().
+- icon: 🔧
+ title: Универсальные разделители строк
+ desc: "Автоматически обрабатывает \\n, \\r и \\r\\n без регулярных выражений."
+- icon: 🔗
+ title: Интеграция со Stream
+ desc: Возвращает поток для прямого использования с filter, map, collect.
+support:
+ description: Доступно с JDK 11 (сентябрь 2018).
diff --git a/translations/content/ru/strings/string-repeat.yaml b/translations/content/ru/strings/string-repeat.yaml
new file mode 100644
index 0000000..49c4fde
--- /dev/null
+++ b/translations/content/ru/strings/string-repeat.yaml
@@ -0,0 +1,19 @@
+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/ru/strings/string-strip.yaml b/translations/content/ru/strings/string-strip.yaml
new file mode 100644
index 0000000..90a3461
--- /dev/null
+++ b/translations/content/ru/strings/string-strip.yaml
@@ -0,0 +1,20 @@
+title: String.strip() vs 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/ru/tooling/aot-class-preloading.yaml b/translations/content/ru/tooling/aot-class-preloading.yaml
new file mode 100644
index 0000000..a5501fb
--- /dev/null
+++ b/translations/content/ru/tooling/aot-class-preloading.yaml
@@ -0,0 +1,20 @@
+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 (JEP 514/515, сентябрь 2025).
diff --git a/translations/content/ru/tooling/built-in-http-server.yaml b/translations/content/ru/tooling/built-in-http-server.yaml
new file mode 100644
index 0000000..4ee600d
--- /dev/null
+++ b/translations/content/ru/tooling/built-in-http-server.yaml
@@ -0,0 +1,25 @@
+title: Встроенный HTTP-сервер
+oldApproach: Внешний сервер / фреймворк
+modernApproach: CLI jwebserver
+summary: Java 18 включает встроенный минималистичный HTTP-сервер для прототипирования
+ и раздачи файлов.
+explanation: В JDK 18 добавлен простой HTTP-сервер файлов без зависимостей, доступный
+ через инструмент командной строки jwebserver или API SimpleFileServer. Он раздаёт
+ статические файлы из указанного каталога без какой-либо конфигурации. CLI-инструмент
+ идеально подходит для быстрого прототипирования, тестирования и ситуативного
+ обмена файлами — внешние зависимости или фреймворки не нужны. API позволяет
+ использовать его программно с настраиваемыми обработчиками и уровнями вывода.
+whyModernWins:
+- icon: 🚀
+ title: Никакой настройки
+ desc: "Запустите jwebserver в любом каталоге — установка, конфигурация и зависимости\
+ \ не нужны."
+- icon: 📦
+ title: Встроен в JDK
+ desc: Поставляется с каждой установкой JDK 18+, всегда доступен на любой машине с Java.
+- icon: 🧪
+ title: Идеально для прототипирования
+ desc: Мгновенная раздача статических файлов для тестирования HTML, API или
+ фронтенд-разработки.
+support:
+ description: Доступно начиная с JDK 18 (март 2022)
diff --git a/translations/content/ru/tooling/compact-object-headers.yaml b/translations/content/ru/tooling/compact-object-headers.yaml
new file mode 100644
index 0000000..ba51517
--- /dev/null
+++ b/translations/content/ru/tooling/compact-object-headers.yaml
@@ -0,0 +1,21 @@
+title: Компактные заголовки объектов
+oldApproach: 128-битный заголовок
+modernApproach: 64-битный заголовок
+summary: Уменьшение размера заголовков объектов вдвое для повышения плотности
+ хранения и эффективности кэша.
+explanation: Компактные заголовки объектов сокращают накладные расходы на каждый
+ объект со 128 бит до 64 бит на 64-битных платформах. Это экономит память и
+ улучшает использование кэша, особенно для приложений с большим количеством
+ небольших объектов.
+whyModernWins:
+- icon: 📦
+ title: "Заголовки меньше на 50\u202F%"
+ desc: 8 байт вместо 16 на каждый объект.
+- icon: ⚡
+ title: Лучшее использование кэша
+ desc: Больше объектов помещается в строки кэша процессора.
+- icon: 📊
+ title: Более высокая плотность
+ desc: Больше объектов в том же объёме кучи.
+support:
+ description: Финализировано в JDK 25 LTS (JEP 519, сентябрь 2025).
diff --git a/translations/content/ru/tooling/jfr-profiling.yaml b/translations/content/ru/tooling/jfr-profiling.yaml
new file mode 100644
index 0000000..36f2d92
--- /dev/null
+++ b/translations/content/ru/tooling/jfr-profiling.yaml
@@ -0,0 +1,23 @@
+title: JFR для профилирования
+oldApproach: Внешний профилировщик
+modernApproach: Java Flight Recorder
+summary: Профилирование любого Java-приложения встроенным Flight Recorder — без
+ внешних инструментов.
+explanation: Java Flight Recorder (JFR) — инструмент профилирования, встроенный
+ в JVM с минимальными накладными расходами. Он фиксирует события CPU, памяти,
+ GC, ввода-вывода, потоков и пользовательские события с минимальным влиянием
+ на производительность (~1%).
+whyModernWins:
+- icon: 🆓
+ title: Встроен
+ desc: Никаких внешних профилировщиков для установки или лицензирования.
+- icon: ⚡
+ title: Минимальные накладные расходы
+ desc: "~1\u202F% влияния на производительность — безопасно для использования\
+ \ в продакшене."
+- icon: 📊
+ title: Богатый набор событий
+ desc: "CPU, память, GC, потоки, ввод-вывод, блокировки и пользовательские\
+ \ события."
+support:
+ description: Широко доступно начиная с JDK 9/11 (открытый исходный код с версии 11)
diff --git a/translations/content/ru/tooling/jshell-prototyping.yaml b/translations/content/ru/tooling/jshell-prototyping.yaml
new file mode 100644
index 0000000..306226d
--- /dev/null
+++ b/translations/content/ru/tooling/jshell-prototyping.yaml
@@ -0,0 +1,20 @@
+title: JShell для прототипирования
+oldApproach: Создать файл + скомпилировать + запустить
+modernApproach: REPL JShell
+summary: Интерактивное тестирование выражений Java без создания файлов.
+explanation: JShell — это цикл чтения-вычисления-вывода (REPL) для Java. Тестируйте
+ выражения, исследуйте API и прототипируйте код, не создавая файлы, не компилируя
+ и не пишу метод main. Автодополнение по Tab и контекстная документация уже
+ включены.
+whyModernWins:
+- icon: ⚡
+ title: Мгновенная обратная связь
+ desc: Введите выражение и сразу увидите результат.
+- icon: 📝
+ title: Файлы не нужны
+ desc: Никаких .java-файлов, никакого шага компиляции.
+- icon: 🔍
+ title: Изучение API
+ desc: Автодополнение по Tab помогает обнаруживать методы и параметры.
+support:
+ description: Широко доступно начиная с JDK 9 (сентябрь 2017)
diff --git a/translations/content/ru/tooling/junit6-with-jspecify.yaml b/translations/content/ru/tooling/junit6-with-jspecify.yaml
new file mode 100644
index 0000000..a41a863
--- /dev/null
+++ b/translations/content/ru/tooling/junit6-with-jspecify.yaml
@@ -0,0 +1,29 @@
+title: JUnit 6 с типобезопасностью JSpecify по null
+oldApproach: API без аннотаций
+modernApproach: "@NullMarked API"
+summary: "JUnit 6 принимает @NullMarked из JSpecify, делая null-контракты явными\
+ \ во всём Assertion API."
+explanation: "JUnit 5 поставлялся без стандартизированных аннотаций допустимости null,\
+ \ поэтому разработчики вынуждены были догадываться, могут ли параметры или\
+ \ возвращаемые значения методов утверждения быть null. JUnit 6 принимает JSpecify\
+ \ для всего своего модуля: аннотация @NullMarked делает все неаннотированные\
+ \ типы ненулевыми по умолчанию, а @Nullable отмечает исключения. Класс Assertions\
+ \ явно аннотирует параметры — например, assertNull(@Nullable Object actual) и\
+ \ fail(@Nullable String message), — благодаря чему IDE и статические анализаторы,\
+ \ такие как NullAway и Error Prone, могут обнаруживать ошибки работы с null во\
+ \ время компиляции, а не во время выполнения."
+whyModernWins:
+- icon: 📜
+ title: Явные контракты
+ desc: "@NullMarked в модуле JUnit 6 документирует семантику null прямо в API\
+ \ — читать исходный код не нужно."
+- icon: 🛡️
+ title: Безопасность на этапе компиляции
+ desc: IDE и анализаторы предупреждают при передаче null туда, где ожидается
+ ненулевое значение, выявляя ошибки до запуска тестов.
+- icon: 🌐
+ title: Стандарт экосистемы
+ desc: JSpecify принят Spring, Guava и другими библиотеками — единая семантика
+ null во всём стеке.
+support:
+ description: Доступно начиная с JUnit 6.0 (октябрь 2025, требуется Java 17+)
diff --git a/translations/content/ru/tooling/multi-file-source.yaml b/translations/content/ru/tooling/multi-file-source.yaml
new file mode 100644
index 0000000..63e63cd
--- /dev/null
+++ b/translations/content/ru/tooling/multi-file-source.yaml
@@ -0,0 +1,19 @@
+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/ru/tooling/single-file-execution.yaml b/translations/content/ru/tooling/single-file-execution.yaml
new file mode 100644
index 0000000..812e156
--- /dev/null
+++ b/translations/content/ru/tooling/single-file-execution.yaml
@@ -0,0 +1,20 @@
+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/content/tr/collections/copying-collections-immutably.yaml b/translations/content/tr/collections/copying-collections-immutably.yaml
index a38954b..58e0c67 100644
--- a/translations/content/tr/collections/copying-collections-immutably.yaml
+++ b/translations/content/tr/collections/copying-collections-immutably.yaml
@@ -12,7 +12,7 @@ whyModernWins:
title: "Tek çağrı"
desc: "Elle ArrayList oluşturma ve sarmalama gerekmez."
- icon: "🛡️"
- title: "Savunmacı kopya"
- desc: "Orijinaldeki değişiklikler kopyayı etkilemez."
+ title: "Her Collection"
+ desc: "Herhangi bir Collection'ı girdi olarak kabul eder—ara ArrayList dönüşümü gerekmez."
support:
description: JDK 10'dan itibaren geniş çapta kullanılabilir (Mart 2018)
diff --git a/translations/content/tr/collections/stream-toarray-typed.yaml b/translations/content/tr/collections/stream-toarray-typed.yaml
index 6486725..1c11267 100644
--- a/translations/content/tr/collections/stream-toarray-typed.yaml
+++ b/translations/content/tr/collections/stream-toarray-typed.yaml
@@ -1,6 +1,6 @@
---
title: Tiplendirilmiş stream toArray
-oldApproach: Elle Dizi Kopyalama
+oldApproach: Elle Filtreleme + Kopyalama
modernApproach: toArray(generator)
summary: "Stream'leri metot referansıyla tiplendirilmiş dizilere dönüştürün."
explanation: "toArray(IntFunction) metodu, bir stream'den düzgün tiplendirilmiş bir dizi oluşturur. Üretici (String[]::new), stream'e hangi türde dizi oluşturacağını söyler."
diff --git a/translations/content/tr/language/call-c-from-java.yaml b/translations/content/tr/language/call-c-from-java.yaml
new file mode 100644
index 0000000..aeeba59
--- /dev/null
+++ b/translations/content/tr/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: "Java'dan C Kodu Çağırma"
+oldApproach: "JNI (Java Native Interface)"
+modernApproach: "FFM (Foreign Function & Memory API)"
+summary: "FFM, Java'nın JNI şablon kodu veya C tarafında Java bilgisi gerektirmeksizin C kütüphanelerini doğrudan çağırmasını sağlar."
+explanation: "Java'nın yerel C/C++ kodu çağırmak için iki yaklaşımı vardır: geleneksel JNI ve modern FFM API'si. JNI ile bir metodu native olarak tanımlar, C başlık dosyası oluşturmak için javac -h çalıştırır, ardından zahmetli JNI C API'sini (JNIEnv, jstring vb.) kullanarak işlevi uygularsınız. Java 22'de standart API olarak tanıtılan FFM, bunların tümünü ortadan kaldırır: C kodu yalnızca sade C'dir — JNI kurallarına gerek yoktur. Bu, mevcut C/C++ kütüphanelerini değişiklik yapmadan çağırmayı çok daha kolay hale getirir. Java tarafı, güvenli yığın dışı bellek yönetimi için Arena ve downcall için MethodHandle kullanarak hem esneklik hem de güvenlik sağlar."
+whyModernWins:
+- icon: "👁"
+ title: "C kodu sade C olarak kalır"
+ desc: "C işlevi JNI açıklamaları veya JNIEnv şablon kodu gerektirmez — mevcut herhangi bir C kütüphanesi olduğu gibi çağrılabilir."
+- icon: "⚡"
+ title: "Daha esnek"
+ desc: "Bağdaştırıcı kod yazmadan veya başlık dosyaları oluşturmadan mevcut C/C++ kütüphanelerinin çoğunu doğrudan çağırın."
+- icon: "🛠️"
+ title: "Daha kolay iş akışı"
+ desc: "Durmanıza, javac -h çalıştırmanıza ve oluşturulan .h dosyasında tanımlanan arayüzü uygulamanıza gerek yoktur."
+support:
+ description: "JDK 22'de standartlaştırıldı (Mart 2024); daha önce JDK 14'ten bu yana inkübasyon aşamasındaydı"
diff --git a/translations/content/zh-CN/collections/copying-collections-immutably.yaml b/translations/content/zh-CN/collections/copying-collections-immutably.yaml
index f4f81a6..6f51120 100644
--- a/translations/content/zh-CN/collections/copying-collections-immutably.yaml
+++ b/translations/content/zh-CN/collections/copying-collections-immutably.yaml
@@ -12,7 +12,7 @@ whyModernWins:
title: 真正不可变
desc: "结果集合结构上不可修改。"
- icon: 📏
- title: 简洁
- desc: "一行代码替代多行手动复制和包装。"
+ title: 支持任意 Collection
+ desc: "接受任意 Collection 作为输入,无需中间转换为 ArrayList。"
support:
description: 自 JDK 10 起广泛可用(2018 年 3 月)
diff --git a/translations/content/zh-CN/collections/stream-toarray-typed.yaml b/translations/content/zh-CN/collections/stream-toarray-typed.yaml
index 66471fe..dab29dd 100644
--- a/translations/content/zh-CN/collections/stream-toarray-typed.yaml
+++ b/translations/content/zh-CN/collections/stream-toarray-typed.yaml
@@ -1,6 +1,6 @@
---
title: 类型化流 toArray
-oldApproach: 手动数组复制
+oldApproach: 手动过滤 + 复制
modernApproach: toArray(generator)
summary: "使用方法引用将流转换为类型化数组。"
explanation: "toArray(IntFunction) 方法从流创建正确类型化的数组。传递 String[]::new 获取 String[],而非 Object[]。"
diff --git a/translations/content/zh-CN/language/call-c-from-java.yaml b/translations/content/zh-CN/language/call-c-from-java.yaml
new file mode 100644
index 0000000..24aacda
--- /dev/null
+++ b/translations/content/zh-CN/language/call-c-from-java.yaml
@@ -0,0 +1,17 @@
+title: "从 Java 调用 C 代码"
+oldApproach: "JNI(Java 原生接口)"
+modernApproach: "FFM(外部函数与内存 API)"
+summary: "FFM 让 Java 直接调用 C 库,无需 JNI 样板代码或在 C 端了解 Java。"
+explanation: "Java 有两种调用原生 C/C++ 代码的方式:传统的 JNI 和现代的 FFM API。使用 JNI,需要将方法声明为 native,运行 javac -h 生成 C 头文件,然后使用繁琐的 JNI C API(JNIEnv、jstring 等)实现函数。FFM 在 Java 22 中作为标准 API 引入,消除了这一切:C 代码就是普通的 C——无需 JNI 约定。这使得调用现有 C/C++ 库无需修改变得更加容易。Java 端使用 Arena 进行安全的堆外内存管理,使用 MethodHandle 进行降调用,确保灵活性和安全性。"
+whyModernWins:
+- icon: "👁"
+ title: "C 代码保持纯 C"
+ desc: "C 函数无需 JNI 注解或 JNIEnv 样板——任何现有的 C 库都可以直接调用。"
+- icon: "⚡"
+ title: "更灵活"
+ desc: "无需编写适配器代码或生成头文件,即可直接调用大多数现有的 C/C++ 库。"
+- icon: "🛠️"
+ title: "工作流更简便"
+ desc: "无需停下来运行 javac -h,也无需实现生成的 .h 文件中定义的接口。"
+support:
+ description: "在 JDK 22 中标准化(2024 年 3 月);此前自 JDK 14 起处于孵化阶段"
diff --git a/translations/strings/ar.yaml b/translations/strings/ar.yaml
index 2e6af61..9b0554a 100644
--- a/translations/strings/ar.yaml
+++ b/translations/strings/ar.yaml
@@ -31,6 +31,7 @@ sections:
filters:
show: "عرض:"
all: الكل
+ noResults: لم يتم العثور على أنماط برمجية لهذا الفلتر.
difficulty:
beginner: مبتدئ
intermediate: متوسط
diff --git a/translations/strings/bn.yaml b/translations/strings/bn.yaml
new file mode 100644
index 0000000..ad09fa2
--- /dev/null
+++ b/translations/strings/bn.yaml
@@ -0,0 +1,94 @@
+site:
+ title: java.evolved
+ tagline: জাভাতে এসেছে নতুন দিগন্ত, আপনার কোডও হোক প্রাণবন্ত
+ tagline_line1: জাভাতে এসেছে নতুন দিগন্ত,
+ tagline_line2: আপনার কোডও হোক প্রাণবন্ত।
+ description: আধুনিক জাভা কোড সংকলন। প্রতিটি পুরনো প্যাটার্ন ও তার পরিচ্ছন্ন বিকল্পের পাশাপাশি তুলনা।।
+ 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: সম্পর্কিত ডকুমেন্টেশন
+ proof: প্রমাণ
+ proofLink: প্রমাণ সোর্স দেখুন
+ relatedPatterns: সম্পর্কিত প্যাটার্ন
+filters:
+ show: 'দেখান:'
+ all: সব
+ jdk: 'JDK:'
+ category: 'বিভাগ:'
+ noResults: এই ফিল্টারের জন্য কোনো কোড প্যাটার্ন পাওয়া যায়নি।
+difficulty:
+ beginner: প্রাথমিক
+ intermediate: মধ্যম
+ advanced: উন্নত
+search:
+ placeholder: স্নিপেট খুঁজুন…
+ noResults: কোনো ফলাফল পাওয়া যায়নি।
+ esc: ESC
+ searchTrigger: খুঁজুন…
+ navigate: নেভিগেট
+ open: খুলুন
+ close: বন্ধ করুন
+cards:
+ old: পুরনো
+ modern: আধুনিক
+ hoverHint: আধুনিক দেখতে হোভার করুন →
+ hoverHintRelated: আধুনিক দেখতে হোভার করুন ➜
+ touchHint: 👆 ট্যাপ বা সোয়াইপ করুন →
+ learnMore: আরও জানুন
+copy:
+ copy: কপি
+ copied: কপি হয়েছে!
+share:
+ label: শেয়ার
+view:
+ expandAll: সব প্রসারিত করুন
+ collapseAll: সব সংকুচিত করুন
+stats:
+ modernPatterns: আধুনিক প্যাটার্ন
+ jdkVersions: অন্তর্ভুক্ত JDK সংস্করণ
+ categories: বিভাগ
+ linesOfPython: প্রয়োজনীয় Python লাইনের সংখ্যা
+footer:
+ tagline: জাভাতে এসেছে নতুন দিগন্ত, আপনার কোডও হোক প্রাণবন্ত
+ madeWith: ভালোবাসা দিয়ে তৈরি করেছেন
+ and: এবং
+ inspiredBy: অনুপ্রাণিত
+ viewOnGitHub: GitHub-এ দেখুন
+copilot:
+ headline: GitHub Copilot দিয়ে আপনার Java কোডবেস আধুনিক করুন।
+ description: Copilot-কে ব্যবহার করে লেগ্যাসি প্যাটার্নগুলোকে আধুনিক Java-তে স্বয়ংক্রিয়ভাবে মাইগ্রেট করুন।
+ appModernization: অ্যাপ আধুনিকীকরণ →
+ javaGuide: Java গাইড →
+support:
+ available: উপলব্ধ
+ preview: প্রিভিউ
+ experimental: পরীক্ষামূলক
+contribute:
+ button: অবদান রাখুন
+ codeIssue: কোড সমস্যা রিপোর্ট করুন
+ translationIssue: অনুবাদ সমস্যা রিপোর্ট করুন
+ suggestPattern: নতুন প্যাটার্ন প্রস্তাব করুন
+ seeIssue: এই কোডে সমস্যা দেখছেন?
+ reportIt: আমাদের জানান।
+untranslated:
+ notice: এই পৃষ্ঠাটি এখনো {{localeName}}-এ অনুবাদ করা হয়নি।
+ viewInEnglish: ইংরেজিতে দেখুন
diff --git a/translations/strings/de.yaml b/translations/strings/de.yaml
index 7905417..304fb48 100644
--- a/translations/strings/de.yaml
+++ b/translations/strings/de.yaml
@@ -33,6 +33,7 @@ sections:
filters:
show: 'Anzeigen:'
all: Alle
+ noResults: Keine Code-Muster für diesen Filter gefunden.
difficulty:
beginner: Einsteiger
intermediate: Fortgeschritten
diff --git a/translations/strings/en.yaml b/translations/strings/en.yaml
index b835458..86f445d 100644
--- a/translations/strings/en.yaml
+++ b/translations/strings/en.yaml
@@ -35,6 +35,7 @@ filters:
all: All
jdk: 'JDK:'
category: 'Category:'
+ noResults: No code patterns found for this filter.
difficulty:
beginner: Beginner
intermediate: Intermediate
diff --git a/translations/strings/es.yaml b/translations/strings/es.yaml
index 3ad0ef8..7c97084 100644
--- a/translations/strings/es.yaml
+++ b/translations/strings/es.yaml
@@ -33,6 +33,7 @@ sections:
filters:
show: 'Mostrar:'
all: Todos
+ noResults: No se encontraron patrones de código para este filtro.
difficulty:
beginner: Principiante
intermediate: Intermedio
diff --git a/translations/strings/fr.yaml b/translations/strings/fr.yaml
index 07171be..7061aaa 100644
--- a/translations/strings/fr.yaml
+++ b/translations/strings/fr.yaml
@@ -33,6 +33,7 @@ sections:
filters:
show: 'Afficher :'
all: Tous
+ noResults: Aucun patron de code trouvé pour ce filtre.
difficulty:
beginner: Débutant
intermediate: Intermédiaire
diff --git a/translations/strings/it.yaml b/translations/strings/it.yaml
index 529ac0e..71eaf39 100644
--- a/translations/strings/it.yaml
+++ b/translations/strings/it.yaml
@@ -33,6 +33,7 @@ sections:
filters:
show: 'Mostra:'
all: Tutti
+ noResults: Nessun pattern di codice trovato per questo filtro.
difficulty:
beginner: Principiante
intermediate: Intermedio
diff --git a/translations/strings/ja.yaml b/translations/strings/ja.yaml
index ac68ffc..40fe5ee 100644
--- a/translations/strings/ja.yaml
+++ b/translations/strings/ja.yaml
@@ -31,6 +31,7 @@ sections:
filters:
show: '表示:'
all: すべて
+ noResults: このフィルターに一致するコードパターンが見つかりません。
difficulty:
beginner: 初級
intermediate: 中級
diff --git a/translations/strings/ko.yaml b/translations/strings/ko.yaml
index 6eb84b7..30dd557 100644
--- a/translations/strings/ko.yaml
+++ b/translations/strings/ko.yaml
@@ -31,6 +31,7 @@ sections:
filters:
show: '표시:'
all: 전체
+ noResults: 이 필터에 해당하는 코드 패턴이 없습니다.
difficulty:
beginner: 초급
intermediate: 중급
diff --git a/translations/strings/pl.yaml b/translations/strings/pl.yaml
index 49e1595..dbea837 100644
--- a/translations/strings/pl.yaml
+++ b/translations/strings/pl.yaml
@@ -32,6 +32,7 @@ sections:
filters:
show: 'Pokaż:'
all: Wszystkie
+ noResults: Nie znaleziono wzorców kodu dla tego filtra.
difficulty:
beginner: Początkujący
intermediate: Średniozaawansowany
diff --git a/translations/strings/pt-BR.yaml b/translations/strings/pt-BR.yaml
index 7f7df6a..7cf28f5 100644
--- a/translations/strings/pt-BR.yaml
+++ b/translations/strings/pt-BR.yaml
@@ -32,6 +32,7 @@ sections:
filters:
show: 'Mostrar:'
all: Todos
+ noResults: Nenhum padrão de código encontrado para este filtro.
difficulty:
beginner: Iniciante
intermediate: Intermediário
diff --git a/translations/strings/ru.yaml b/translations/strings/ru.yaml
new file mode 100644
index 0000000..98765b1
--- /dev/null
+++ b/translations/strings/ru.yaml
@@ -0,0 +1,95 @@
+site:
+ title: java.evolved
+ 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: Связанная документация
+ proof: Доказательство
+ proofLink: Посмотреть исходник доказательства
+ relatedPatterns: Похожие шаблоны
+filters:
+ show: 'Показать:'
+ all: Все
+ jdk: 'JDK:'
+ category: 'Категория:'
+ noResults: Шаблоны кода для этого фильтра не найдены.
+difficulty:
+ beginner: Начинающий
+ intermediate: Средний
+ advanced: Продвинутый
+search:
+ placeholder: Поиск сниппетов…
+ noResults: Результаты не найдены.
+ esc: ESC
+ searchTrigger: Поиск…
+ navigate: навигация
+ open: открыть
+ close: закрыть
+cards:
+ old: Старый
+ modern: Современный
+ hoverHint: наведите, чтобы увидеть современный →
+ hoverHintRelated: Наведите, чтобы увидеть современный ➜
+ touchHint: 👆 нажмите или смахните →
+ learnMore: подробнее
+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: Экспериментально
+contribute:
+ button: Внести вклад
+ codeIssue: Сообщить о проблеме в коде
+ translationIssue: Сообщить о проблеме с переводом
+ suggestPattern: Предложить новый шаблон
+ seeIssue: "Заметили проблему в этом коде?"
+ reportIt: "Сообщите нам."
+untranslated:
+ notice: Эта страница ещё не переведена на {{localeName}}.
+ viewInEnglish: Просмотреть на английском
diff --git a/translations/strings/tr.yaml b/translations/strings/tr.yaml
index 8190c9c..46a8165 100644
--- a/translations/strings/tr.yaml
+++ b/translations/strings/tr.yaml
@@ -32,6 +32,7 @@ sections:
filters:
show: 'Göster:'
all: Tümü
+ noResults: Bu filtre için kod deseni bulunamadı.
difficulty:
beginner: Başlangıç
intermediate: Orta
diff --git a/translations/strings/zh-CN.yaml b/translations/strings/zh-CN.yaml
index 248db18..5f15e4f 100644
--- a/translations/strings/zh-CN.yaml
+++ b/translations/strings/zh-CN.yaml
@@ -32,6 +32,7 @@ sections:
filters:
show: '显示:'
all: 全部
+ noResults: 未找到与此筛选条件匹配的代码模式。
difficulty:
beginner: 入门
intermediate: 中级