تتعامل أمل مع تعقيدات علامات التشكيل في العربية: 8 علامات تشكيل (فتحة، ضمة، كسرة، شدة، سكون، فتحتان، ضمتان، كسرتان)، 4 أنواع للألف (العادية، ممدودة، هَمْزَة أعلى، هَمْزَة أسفل، وصل)، 3 أنواع للهمزة (منفصلة، على الواو، على الياء)، ورموز لام-ألف. تتعامل تقنيات التعرف على النطق، عرض النصوص، وتقييم التشابه في التطبيق مع العربية المشكولة ("كَتَبَ") بشكل مختلف عن العربية غير المشكولة ("كتب") — وهو تمييز حاسم تغفله معظم تطبيقات تعلم العربية.
لماذا التشكيل مهم للتعلم
مشكلة الغموض
العربية بدون تشكيل تكون غامضة:
- "كتب" يمكن أن تعني:
- "كَتَبَ" (هو كتب) — الفعل الماضي
- "كُتُب" (كتب) — جمع لكلمة كتاب
- "كُتِبَ" (كُتب) — صيغة المبني للمجهول
الجميع يُكتَب بنفس الطريقة بدون تشكيل. التشكيل يزيل الغموض.
تطور التعلم
- مبتدئ: التعلم على القراءة مع التشكيل (سهل — الحركات موجودة)
- متوسط: الممارسة مع التشكيل حتى تصبح تلقائية
- متقدم: إزالة التشكيل تدريجياً، القراءة تصبح أصعب
- طليق: القراءة بدون تشكيل بطلاقة (مستوى اللغة الأم)
معظم تطبيقات تعلم العربية تتخطى المرحلة 1 — لا تعلّم التشكيل على الإطلاق، أو تزيله. هذا يعلّم عادات سيئة. تطور أمل علمياً صحيح.
تنفيذنا على مستوى اليونيكود
علامات التشكيل (عددها 8)
// lib/src/utils/arabic_extension.dart
class ArabicExtension {
static const Map tashkeelMarks = {
'FATHA': '\u064E', // َ (vowel 'a')
'DAMMA': '\u064F', // ُ (vowel 'u')
'KASRA': '\u0650', // ِ (vowel 'i')
'SUKUN': '\u0652', // ْ (no vowel)
'SHADDA': '\u0651', // ّ (doubled letter)
'FATHATAN': '\u064B', // ً (tanween 'an')
'DAMMATAN': '\u064C', // ٌ (tanween 'un')
'KASRATAN': '\u064D', // ٍ (tanween 'in')
};
static const Map<String, String> alefVariants = {
'ALEF_STANDARD': 'ا', // ا
'ALEF_WITH_MADDA': 'آ', // آ (elongated)
'ALEF_WITH_HAMZA_ABOVE': 'أ', // أ
'ALEF_WITH_HAMZA_BELOW': 'إ', // إ
'ALEF_WASLA': 'ٰ', // ٰ (connecting alef)
};
static const Map<String, String> hamzaVariants = {
'HAMZA_ISOLATED': 'ء', // Standalone hamza
'HAMZA_ON_WAW': 'ؤ', // Hamza on waw (و + hamza)
'HAMZA_ON_YEH': 'ئ', // Hamza on yeh (ي + hamza)
};
}
التشكيلات القرآنية وتوقفات عثماني
لدينا دعم في ثريا لعلامات خاصة بالقرآن:
static const Map quranicMarks = {
'STOP_FULL': 'ۖ', // Full stop (‖)
'STOP_HALF': 'ۗ', // Half stop
'STOP_QUA': 'ۙ', // Qua stop
'STOP_NECESSARY': 'ۚ', // Necessary stop
'TAJWEED_ELONGATION': '', // Elongation indicator
};
التعرف على الكلام المستند إلى التشكيل
التحيز السياقي بالتشكيل
عندما يتعلم الطفل "كَتَبَ" (هو كتب، بصيغة الماضي)، نميل التعرف على النطق نحو تلك التشكيلة الدقيقة:
# src/services/stt_client.py
def recognize_with_diacritical_context(audio_bytes, expected_text):
# expected_text = "كَتَبَ" (with diacritics)
# Create speech context hint
speech_context = {
'phrases': [expected_text],
'boost': 20.0 # High boost for expected text
}
# Send to Google Cloud STT
response = google_stt_client.recognize(
audio=audio_bytes,
language_code='ar-SA',
speech_contexts=[speech_context]
)
# Result: Google STT is biased toward "kataba" pronunciation
return response
تقييم التشابه المستند إلى التشكيل
تقييم التشابه يميز بين النص المشكول وغير المشكول:
def compare_pronunciations(expected, actual):
"""
expected: "كَتَبَ" (with diacritics)
actual: "كتب" (child's attempt, possibly undiacritized)
"""
# Strip diacritics for coarse comparison
expected_base = strip_diacritics(expected) # "كتب"
actual_base = strip_diacritics(actual) # "كتب"
# Base similarity (ignoring diacritics)
base_similarity = string_similarity(expected_base, actual_base) # 1.0 (perfect)
# Diacritical bonus (if child's attempt includes diacritics)
diacritic_bonus = 0.0
if has_diacritics(actual):
diacritic_accuracy = diacritics_match_ratio(expected, actual)
diacritic_bonus = diacritic_accuracy * 0.15 # Up to +15% for correct diacritics
# Final score
final_score = min(base_similarity + diacritic_bonus, 1.0)
return {
'base_score': base_similarity,
'diacritic_bonus': diacritic_bonus,
'final_score': final_score,
'feedback': 'Great! Pronunciation is perfect. Next, practice the diacritical marks.'
}
هذا يعني:
- الطفل يقول "كتب" (بدون تشكيل) → 85-90٪ درجة (قاعدة صحيحة، تشكيل مفقود)
- الطفل يقول "كَتَبَ" (مشكول بالكامل) → 98٪+ درجة (مثالية)
- التطور واضح: إتقان قاعدة النطق أولاً، ثم إضافة التشكيل الدقيق
تحديات العرض من اليمين إلى اليسار
إدارة اتجاه النص
// lib/src/screens/lesson_screen.dart
Column(
children: [
Directionality(
textDirection: TextDirection.rtl, // For Arabic text
child: Text(
'كَتَبَ',
textAlign: TextAlign.right, // Right-aligned for RTL
style: TextStyle(
fontFamily: 'IBMPlexSansArabic',
fontSize: 36,
height: 1.8, // Extra line height for diacritics
),
),
),
// English instructions below
Directionality(
textDirection: TextDirection.ltr, // For English
child: Text(
'Pronounce: "he wrote"',
textAlign: TextAlign.left, // Left-aligned for LTR
),
),
],
)
تشكيل الحروف المتصلة
تغير أشكال حروف اللغة العربية حسب الموقع:
- مفردة: "ك" (كاف)
- في البداية: "كَـــ" (كاف في بداية الكلمة)
- في الوسط: "ـــكَـــ" (كاف في الوسط)
- في النهاية: "ـــكَ" (كاف في النهاية)
يتعامل خط IBMPlexSansArabic مع التشكيل تلقائياً، ولكن نحتاج إلى تسلسلات يونيكود الصحيحة:
// Correct: Uses Unicode joining characters
String word = 'ك' + '\u0640' + 'ت' + '\u0640' + 'ب'; // Kashida (extension character)
// Incorrect: Direct concatenation
String word = 'ك' + 'ت' + 'ب'; // May not shape correctly on all devices
الخلط في النصوص ثنائية الاتجاه
عندما تظهر الإنجليزية والعربية معاً:
RichText(
textDirection: TextDirection.rtl, // Overall RTL
text: TextSpan(
children: [
TextSpan(text: 'means ', style: englishStyle), // LTR
TextSpan(text: 'كتاب', style: arabicStyle), // RTL
TextSpan(text: ' (book)', style: englishStyle), // LTR
],
),
)
النتيجة: "means كتاب (book)" مع تدفق ثنائي الاتجاه صحيح.
الأسئلة الشائعة
س: لماذا يجب إكراه المتعلمين المبتدئين على استخدام التشكيل؟ ألا يجعل ذلك الأمر أصعب؟
ج: نعم في البداية. لكن التعلم باستخدام التشكيل يبني روابط أقوى بين الحروف والأصوات. الأبحاث تظهر أن استخدام التشكيل في التعلم يؤدي إلى طلاقة أسرع. بعد إتقان التشكيل، تصبح القراءة بدونها عملية طبيعية.
س: ماذا لو كان لوحة مفاتيح طفلي لا تدعم إدخال التشكيل؟
ج: التطبيق لا يطلب أبداً من الأطفال كتابة التشكيل. التعرف والنطق مستندان على الصوت. فقط الكبار (المعلمين والمنشئين للمحتوى) بحاجة إلى إدخال التشكيل، ويستخدمون لوحات مفاتيح عربية متخصصة.
س: هل تدعم أمل التراكيب غير القياسية للتشكيل؟
ج: ندعم جميع التراكيب المعيارية ضمن اليونيكود. قد لا تظهر التراكيب النادرة أو المخصصة بشكل صحيح، لكن القرآن الحديث والعربية القياسية مدعومان بالكامل.



