Si e trajton Amal Tashkeelin, Shaddan dhe Hamzën në Arabisht
Lexim: 5 minMohammad Shaker

Si e trajton Amal Tashkeelin, Shaddan dhe Hamzën në Arabisht

Amal trajton plotësisht diakritikët në arabisht me njohjen zanore dhe prezantim korrekt për mësimin efektiv të gjuhës.

Engineering

Përgjigje e shpejtë

Amal trajton plotësisht diakritikët në arabisht me njohjen zanore dhe prezantim korrekt për mësimin efektiv të gjuhës.

Amal trajton plotësisht kompleksitetin e diakritikëve arabë: 8 shenja tashkeel (fatha, damma, kasra, shadda, sukun, fathatan, dammatan, kasratan), 4 variante të alefit (standard, madda, hamza mbi, hamza poshtë, wasla), 3 variante të hamzës (e izoluar, mbi waw, mbi yeh) dhe ligaturat Lam-Alef. Njohja zanore, shfaqja e tekstit dhe vlerësimi i ngjashmërisë në aplikacion trajtojnë ndryshimin mes arabërishtes me diakritikë ("كَتَبَ") dhe asaj pa diakritikë ("كتب") — një dallim kritik që shumica e aplikacioneve të mësimit të arabishtes i neglizhojnë.

Pse janë të rëndësishme diakritikët për mësim

Problemi i Ambiguitetit

  • "كتب" mund të nënkuptojë:
    • "kataba" (ai shkroi) — kohë e shkuar
    • "kutub" (libra) — numër shumës
    • "kutiba" (është shkruar) — zanorë pasive

Të gjitha shkruhen të njëjta pa diakritikë. Diakritikët largojnë ambiguitetin.

Progresioni i Mësimit
1. Fillestar: Mëso të lexosh ME diakritikë (lehtë — zanoret janë të shënuara)
2. Nivel i Mesëm: Praktiko ME diakritikë deri sa të bëhet automatik
3. Avancuar: Pakëso gradualisht diakritikët, leximi bëhet më i vështirë
4. Fluent: Lexo rrjedhshëm pa diakritikë (niveli vendës)

Shumica e aplikacioneve të mësimit në arabisht anashkalojnë hapin 1 — nuk mësojnë diakritikët fare ose i heqin. Kjo krijon zakone të këqija. Progresioni i Amalës është shkencërisht i saktë.

Zbatimi në nivel Unicode

Shenjat Diakritike (8 gjithsej)

// lib/src/utils/arabic_extension.dart
class ArabicExtension {
  static const Map<String, String> tashkeelMarks = {
    'FATHA': '\u064E',      // َ (zanori 'a')
    'DAMMA': '\u064F',      // ُ (zanori 'u')
    'KASRA': '\u0650',      // ِ (zanori 'i')
    'SUKUN': '\u0652',      // ْ (pa zanor)
    'SHADDA': '\u0651',     // ّ (shkronjë e dyfishuar)
    'FATHATAN': '\u064B',   // ً (tanvin 'an')
    'DAMMATAN': '\u064C',   // ٌ (tanvin 'un')
    'KASRATAN': '\u064D',   // ٍ (tanvin 'in')
  };

static const Map<String, String> alefVariants = { 'ALEF_STANDARD': 'ا', // ا 'ALEF_WITH_MADDA': 'آ', // آ (zgjatje) 'ALEF_WITH_HAMZA_ABOVE': 'أ', // أ 'ALEF_WITH_HAMZA_BELOW': 'إ', // إ 'ALEF_WASLA': 'ٰ', // ٰ (alef lidhës) };

static const Map<String, String> hamzaVariants = { 'HAMZA_ISOLATED': 'ء', // Hamza e vetmuar 'HAMZA_ON_WAW': 'ؤ', // Hamza mbi waw (و + hamza) 'HAMZA_ON_YEH': 'ئ', // Hamza mbi yeh (ي + hamza) }; }

Diakritikë Kur'anore dhe Ndalesa Uthmani

Për Thurayya, mbështesim shenjat specifike të Kur'anit:

static const Map<String, String> quranicMarks = {
  'STOP_FULL': 'ۖ',         // Ndalesë e plotë (‖)
  'STOP_HALF': 'ۗ',         // Ndalesë e gjysmë
  'STOP_QUA': 'ۙ',          // Ndalesë Qua
  'STOP_NECESSARY': 'ۚ',    // Ndalesë e nevojshme
  'TAJWEED_ELONGATION': '۝', // Tregues zgjatjeje
};

Njohje Zanore me Kujdes për Diakritikët

Konteksti i Theksuar me Diakritikët

Kur një fëmijë mëson "كَتَبَ" (ai shkroi, koha e kaluar), njohja zanore theksohet drejt asaj vocalizimi të saktë:

# src/services/stt_client.py
def recognize_with_diacritical_context(audio_bytes, expected_text):
    # expected_text = "كَتَبَ" (me diakritikë)
# Krijo sugjerim konteksti zanor
speech_context = {
    'phrases': [expected_text],
    'boost': 20.0  # Fuqishëm për tekstin e pritshëm
}

# Dërgo te Google Cloud STT
response = google_stt_client.recognize(
    audio=audio_bytes,
    language_code='ar-SA',
    speech_contexts=[speech_context]
)

# Rezultati: Google STT përqendrohet në shqiptimin "kataba"
return response

Vlerësimi i Ngjashmërisë me Kujdes për Diakritikët

def compare_pronunciations(expected, actual):
    """
    expected: "كَتَبَ" (me diakritikë)
    actual: "كتب" (përpjekja e fëmijës, ndoshta pa diakritikë)
    """
    
    # Heq diakritikët për krahasim të përgjithshëm
    expected_base = strip_diacritics(expected)  # "كتب"
    actual_base = strip_diacritics(actual)      # "كتب"
    
    # Ngjashmëria bazë (pa marrë parasysh diakritikët)
    base_similarity = string_similarity(expected_base, actual_base)  # 1.0 (perfekte)
    
    # Shtesë për diakritikë (nëse përpjekja e fëmijës ka diakritikë)
    diacritic_bonus = 0.0
    if has_diacritics(actual):
        diacritic_accuracy = diacritics_match_ratio(expected, actual)
        diacritic_bonus = diacritic_accuracy * 0.15  # Deri +15% për diakritikë të saktë
    
    # Rezultati përfundimtar
    final_score = min(base_similarity + diacritic_bonus, 1.0)
    
    return {
        'base_score': base_similarity,
        'diacritic_bonus': diacritic_bonus,
        'final_score': final_score,
        'feedback': 'Shumë mirë! Shqiptimi është perfekt. Tani, praktikoni shenjat diakritike.'
    }

Kjo do të thotë:

  • Fëmija thotë "كتب" (pa diakritikë) → 85-90% pikë (bazë e saktë, mungesë diakritikësh)
  • Fëmija thotë "كَتَبَ" (plotësisht me diakritikë) → 98%+ pikë (perfekt)
Progresioni është i qartë: së pari zotëro shqiptimin bazë, më pas shto hollësitë diakritike.

Sfida në Paraqitjen RTL (Djathtas-Në-Të-Majtë)

Menaxhimi i Drejtimit të Tekstit

// lib/src/screens/lesson_screen.dart
Column(
  children: [
    Directionality(
      textDirection: TextDirection.rtl,  // Për tekst arab
      child: Text(
        'كَتَبَ',
        textAlign: TextAlign.right,      // E drejtuar djathtas për RTL
        style: TextStyle(
          fontFamily: 'IBMPlexSansArabic',
          fontSize: 36,
          height: 1.8,  // Lartësi ekstra për diakritikët
        ),
      ),
    ),
    // Udhëzime në anglisht më poshtë
    Directionality(
      textDirection: TextDirection.ltr,  // Për anglisht
      child: Text(
        'Pronounce: "he wrote"',
        textAlign: TextAlign.left,       // E orientuar majtas për LTR
      ),
    ),
  ],
)

Formimi i Shkronjave të Lidhura

Shkronjat arabe ndryshojnë formën varësisht pozitës në fjalë:

  • I izoluar: "ك" (Kaf)
  • Në fillim: "كَـــ" (Kaf në fillim fjalë)
  • Në mes: "ـــكَـــ" (Kaf në mes)
  • Në fund: "ـــكَ" (Kaf në fund)

Font-i IBMPlexSansArabic kujdeset automatikisht për formimin, por duhet sekuenca e duhur Unicode:

// Korrekt: Përdor karaktere bashkimi Unicode
String word = 'ك' + '\u0640' + 'ت' + '\u0640' + 'ب';  // Kashida (karakter zgjatjeje)

// Gabim: Thjesht lidhje drejtpërdrejt
String word = 'ك' + 'ت' + 'ب';  // Mund të mos formësohet saktë në disa pajisje

Përzierja e Teksteve në Drejtim të Kundërt

Kur bashkëshqiptojnë anglisht dhe arabisht:

RichText(
  textDirection: TextDirection.rtl,  // RTL përgjithshëm
  text: TextSpan(
    children: [
      TextSpan(text: 'means ', style: englishStyle),  // LTR
      TextSpan(text: 'كتاب', style: arabicStyle),    // RTL
      TextSpan(text: ' (book)', style: englishStyle), // LTR
    ],
  ),
)

Rezultati: "means كتاب (book)" shfaqet me rrjedhjen korrekte bidireksionale.

Pyetje të Shpeshta

P: Pse të imponojmë diakritikët për fillestarët? A nuk e vështirëson mësimin?
P: Në fillim po, por mësimi me diakritikë forcon lidhjen ndërmjet shkronjës dhe shqiptimit. Hulumtimet tregojnë që kjo sjell rrjedhshmëri më të shpejtë. Më vonë, lexo pa diakritikë është progres natyral.

P: Çfarë nëse tastiera e fëmijës nuk mbështet shkrimin e diakritikëve?
P: Amal nuk kërkon që fëmijët të shkruajnë diakritikë. Njohja e shqiptimit bazohet në zë. Vetëm të rriturit (mësues, krijues përmbajtjeje) fusin diakritikë duke përdorur tastiera të specializuara.

P: A mbështet Amal kombinacione jo-standarde diakritikësh?
P: Mbështesim të gjitha kombinimet e standardizuara në Unicode. Kombinacionet e rralla ose të personalizuara mund të mos shfaqen saktë, por arabishte standarde dhe Kur'anore mbështeten plotësisht.

Artikuj të Ngjashëm