Amal تمامی پیچیدگیهای نقطهگذاری عربی را مدیریت میکند: ۸ علامت تشکيل (فتحه، ضمه، کسره، شدة، ساکن، فتحتان، ضمتان، کسراتان)، ۴ نوع مختلف الف (استاندارد، مَدّه، همزه بالا، همزه پایین، وصلۀ الف)، ۳ نوع همزه (مجزا، روی واو، روی یاء) و ترکیبهای لام-الف. تشخیص گفتار، نمایش متن و امتیازدهی شباهت در این اپ بهطور جداگانه عربی نقطهگذاریشده (مثلاً "كَتَبَ") را از عربی بدون نقطه ("كتب") تفکیک میکند؛ تمایزی اساسی که بیشتر اپهای آموزش عربی آن را نادیده میگیرند.
چرا نقطهگذاری برای یادگیری اهمیت دارد؟
مشکل ابهام
عربی بدون نقطهگذاری میتواند معانی مختلفی داشته باشد:
- "كتب" میتواند به معانی زیر باشد:
- "kataba" (او نوشت) — گذشته
- "kutub" (کتابها) — جمع
- "kutiba" (نوشته شد) — ماضی مجهول
همه اینها بدون نقطه به یک شکل نوشته میشوند اما نقطهها ابهام را برطرف میکنند.
مسیر یادگیری
- مبتدی: یادگیری خواندن با نقطهگذاری (ساده و با نشانهگذاری حروف صدادار)
- متوسط: تمرین خواندن با نقطهگذاری تا تسلط خودکار
- پیشرفته: حذف تدریجی نقطهها، خواندن دشوارتر میشود
- روان: خواندن بدون نقطهها (سطح بومی)
بیشتر اپهای آموزش عربی، مرحله اول را حذف کرده و یا نقطهها را پاک میکنند که باعث ایجاد عادات نادرست میشود. روند Amal علمی و اصولی است.
پیادهسازی در سطح یونیکد
علامتهای تشکيل (۸ علامت)
class ArabicExtension {
static const Map<String, String> tashkeelMarks = {
'FATHA': '\u064E', // َ (حرف صدادار 'a')
'DAMMA': '\u064F', // ُ (حرف صدادار 'u')
'KASRA': '\u0650', // ِ (حرف صدادار 'i')
'SUKUN': '\u0652', // ْ (بدون حرف صدادار)
'SHADDA': '\u0651', // ّ (تکرار حرف)
'FATHATAN': '\u064B', // ً (تنوین 'an')
'DAMMATAN': '\u064C', // ٌ (تنوین 'un')
'KASRATAN': '\u064D', // ٍ (تنوین 'in')
};
static const Map<String, String> alefVariants = {
'ALEF_STANDARD': 'ا', // ا
'ALEF_WITH_MADDA': 'آ', // آ (طولانی شده)
'ALEF_WITH_HAMZA_ABOVE': 'أ', // أ
'ALEF_WITH_HAMZA_BELOW': 'إ', // إ
'ALEF_WASLA': 'ٰ', // ٰ (الف وصل)
};
static const Map<String, String> hamzaVariants = {
'HAMZA_ISOLATED': 'ء', // همزه مجزا
'HAMZA_ON_WAW': 'ؤ', // همزه روی واو (و + همزه)
'HAMZA_ON_YEH': 'ئ', // همزه روی یاء (ی + همزه)
};
}
علامتهای خاص قرآن و توقفات عثمانی
static const Map<String, String> quranicMarks = {
'STOP_FULL': 'ۖ', // توقف کامل (‖)
'STOP_HALF': 'ۗ', // توقف نیمه
'STOP_QUA': 'ۙ', // توقف ق
'STOP_NECESSARY': 'ۚ', // توقف ضروری
'TAJWEED_ELONGATION': '', // علامت کشیده شدن
};
تشخیص گفتار آگاه به نقطهگذاری
تمرکز روی بستر متنی با نقطهگذاری
def recognize_with_diacritical_context(audio_bytes, expected_text):
speech_context = {
'phrases': [expected_text],
'boost': 20.0 # تقویت بالا برای متن مورد انتظار
}
response = google_stt_client.recognize(
audio=audio_bytes,
language_code='ar-SA',
speech_contexts=[speech_context]
)
return response
این گزینه باعث میشود تشخیص گفتار به خوانش دقیق و نقطهگذاری شده مانند "كَتَبَ" حساس شود.
امتیازدهی شباهت هوشمند نسبت به نقطهگذاری
def compare_pronunciations(expected, actual):
expected_base = strip_diacritics(expected) # "كتب"
actual_base = strip_diacritics(actual) # "كتب"
base_similarity = string_similarity(expected_base, actual_base) # 1.0
diacritic_bonus = 0.0
if has_diacritics(actual):
diacritic_accuracy = diacritics_match_ratio(expected, actual)
diacritic_bonus = diacritic_accuracy * 0.15 # حداکثر ۱۵٪ امتیاز اضافی
final_score = min(base_similarity + diacritic_bonus, 1.0)
return {
'base_score': base_similarity,
'diacritic_bonus': diacritic_bonus,
'final_score': final_score,
'feedback': 'عالی! تلفظ درست است. اکنون روی علامتهای تشکيل تمرین کنید.'
}
به این ترتیب:
- کودک "كتب" بدون نقطه را میگوید → امتیاز حدود ۸۵-۹۰٪
- کودک "كَتَبَ" کاملاً نقطهدار را میگوید → امتیاز بالای ۹۸٪
مسیر پیشرفت واضح است: ابتدا تلفظ پایه را بیاموزید سپس به یادگیری دقیق نقطهها بپردازید.
چالشهای نمایش متن راست-به-چپ (RTL)
مدیریت جهت متن
Column(
children: [
Directionality(
textDirection: TextDirection.rtl, // برای متن عربی
child: Text(
'كَتَبَ',
textAlign: TextAlign.right, // راستچین برای RTL
style: TextStyle(
fontFamily: 'IBMPlexSansArabic',
fontSize: 36,
height: 1.8, // فاصله خط اضافی برای نقطهها
),
),
),
Directionality(
textDirection: TextDirection.ltr, // برای انگلیسی
child: Text(
'Pronounce: "he wrote"',
textAlign: TextAlign.left, // چپچین برای LTR
),
),
],
)
شکلگیری حروف متصل
حروف عربی بسته به موقعیت تغییر شکل میدهند:
- مجزا: "ك" (کاف)
- ابتدایی: "كَـــ" (کاف اول کلمه)
- وسطی: "ـــكَـــ" (کاف وسط کلمه)
- نهایی: "ـــكَ" (کاف انتهای کلمه)
فونت IBMPlexSansArabic این شکلگیری را خودکار مدیریت میکند اما باید از توالیهای یونیکد صحیح استفاده کنیم:
// صحیح: استفاده از کاراکتر کَشیده
String word = 'ك' + '\u0640' + 'ت' + '\u0640' + 'ب';
// اشتباه: اتصال مستقیم بدون کشیده
String word = 'ك' + 'ت' + 'ب';
مدیریت متنهای دوجهته (ترکیب انگلیسی و عربی)
RichText(
textDirection: TextDirection.rtl, // کل متن راستبهچپ
text: TextSpan(
children: [
TextSpan(text: 'means ', style: englishStyle), // چپبهراست
TextSpan(text: 'كتاب', style: arabicStyle), // راستبهچپ
TextSpan(text: ' (book)', style: englishStyle), // چپبهراست
],
),
)
نتیجه: نمایش عبارت "means كتاب (book)" با جریان درست دوجهته.
پرسشهای متداول
س: چرا به زبانآموزان مبتدی تأکید میشود از نقطهها استفاده کنند؟ آیا یادگیری سختتر نمیشود؟
ج: در ابتدا بله، اما آموزش با نقطهگذاری برقراری ارتباط صحیح بین حروف و صداها را قویتر میکند. تحقیقات نشان میدهد یادگیری نقطهها باعث تسلط سریعتر میشود. پس از تسلط، خواندن بدون نقطهها بهصورت طبیعی پیش میآید.
س: اگر صفحهکلید کودک من از تایپ نقطهها پشتیبانی نکند، چه باید کرد؟
ج: اپ هرگز از کودکان نمیخواهد نقطهها را تایپ کنند. تشخیص و تلفظ روی گفتار است. تنها بزرگسالان (معلمان و سازندگان محتوا) برای ورود محتوا از صفحهکلیدهای تخصصی عربی استفاده میکنند.
س: آیا Amal از ترکیبهای غیر استاندارد نقطهگذاری پشتیبانی میکند؟
ج: ما از همه ترکیبهای استاندارد یونیکد پشتیبانی میکنیم. ترکیبهای نادر یا سفارشی ممکن است بهدرستی نمایش داده نشوند ولی نقطهگذاری قرآن و عربی مدرن کاملاً پشتیبانی شده است.



