«الليجاتشر» في تطوير التطبيقات المحمولة — الأساسيات وتطبيق اتصالات الحروف

المؤلف: IT Sectr نُشر: 2026-07-24 وقت القراءة: 9 دق

الليجاتشر هو دمج رسومي لحرفين أو أكثر في رمز طباعي واحد لتحسين قابلية القراءة وجماليات النص. تشمل الأمثلة التقليدية الأزواج fi, fl, ff, ffi — حيث يندمج العنصر البارز للحرف f مع الحرف المجاور، مما يمنع التعارض البصري. في تطوير تطبيقات الجوال والويب الحديث، تتم إدارة الليجاتشر على مستوى الخط عبر ميزات OpenType وهي مدعومة على iOS وAndroid وفي المتصفحات. وفقًا لـ MDN Web Docs، تسمح خاصية CSS font-variant-ligatures للمطور بتشغيل وإيقاف أنواع مختلفة من الليجاتشر: القياسية، والاختيارية (الزخرفية)، والسياقية.

النقاط الرئيسية

  • الليجاتشر — دمج عدة حروف في عنصر رسومي واحد لتحسين قابلية القراءة
  • الليجاتشر القياسي (fi, fl, ff) مفعل افتراضيًا في الخطوط الاحترافية
  • الليجاتشر الاختياري (ct, st, sp) زخرفي ويُفعّل اختياريًا
  • على iOS يتم التحكم عبر UIFontDescriptor مع featureSettings لميزات OpenType
  • في خطوط البرمجة، يدمج الليجاتشر العوامل: !=, >=, ->, =>

ما هو الليجاتشر في الطباعة

الليجاتشر هو تقنية طباعية يتم فيها استبدال حرفين أو أكثر برمز واحد مصمم خصيصًا. الهدف الرئيسي من الليجاتشر هو إزالة التعارضات البصرية بين الحروف المتجاورة وتحسين إدراك النص. في الزوج fi، على سبيل المثال، يتصادم البروز العلوي للحرف f مع نقطة الحرف i — يدمجهما الليجاتشر في رمز واحد أنيق.

تنقسم الليجاتشر إلى إلزامية (قياسية) واختيارية (زخرفية). الليجاتشر القياسي هو أزواج توجد في معظم الخطوط: fi, fl, ff, ffi, ffl. تُعتبر ضرورية للطباعة عالية الجودة ومفعلة في الخط افتراضيًا. وفقًا لمواصفات OpenType، يتم ترميز الليجاتشر القياسي بعلامة 'liga' ويجب أن تكون موجودة في أي خط احترافي.

التأثير البصري: بدون الليجاتشر، يبدو الزوج fi كحرفين منفصلين مع تصادم غير مرغوب فيه. مع الليجاتشر، يبدو كرمز واحد متناغم. الفرق ملحوظ بشكل خاص في الأحجام الكبيرة (العناوين، الشعارات) وفي النص الذي يحتوي على أزواج متكررة كثيرة (على سبيل المثال، في الألمانية مع häufigen Buchstabenkombinationen).

أنواع الليجاتشر: قياسي، اختياري، سياقي

تدعم خطوط OpenType عدة أنواع من الليجاتشر، لكل منها علامتها والغرض منها. القياسي (علامة 'liga') هو ليجاتشر إلزامي مفعل افتراضيًا في الخط. يحسن قابلية القراءة ولا يجب تعطيله دون سبب وجيه. يتضمن الأزواج fi, fl, ff, ffi, ffl وغيرها الخاصة بنمط الخط.

الليجاتشر الاختياري (علامة 'dlig') هو ليجاتشر زخرفي يُفعّل اختياريًا وفقًا لتقدير المصمم. ليس ضروريًا لقابلية القراءة ويُستخدم لتنميق النص: ct, st, sp, Th, Qu وغيرها. يوجد الليجاتشر الاختياري غالبًا في الخطوط ذات الطابع التاريخي أو الخطي — على سبيل المثال، في Garamond أو Adobe Caslon. تحذير: الإفراط في الليجاتشر الاختياري يضعف قابلية القراءة، خاصة للمستخدمين الذين يعانون من عسر القراءة.

الليجاتشر السياقي (علامة 'clig') هو ليجاتشر يعتمد على السياق المحيط بالحرف. يُطبّق فقط في ظروف معينة: إذا كان الحرف في بداية أو نهاية الكلمة، بعد علامة ترقيم محددة، وهكذا. الليجاتشر السياقي هو ميزة OpenType متقدمة لا تدعمها جميع الخطوط. الليجاتشر التاريخي (علامة 'hlig') هو ليجاتشر قديم يحاكي أسلوب الكتب المطبوعة القديمة (long s, &). يُستخدم نادرًا، فقط في النصوص التاريخية أو المنمقة.

نوع الليجاتشرعلامة OpenTypeأمثلةافتراضيًا
قياسيligafi, fl, ff, ffiمفعل
اختياريdligct, st, sp, Thمعطل
سياقيcligيعتمد على الموضعمفعل
تاريخيhliglong s, ct (تاريخي)معطل

الأنواع النادرة: توجد أيضًا ليجاتشر للتركيب الرياضي (علامة 'dlig' للرموز الرياضية) وليجاتشر للأحرف الأولى (الأحرف الكبيرة المزخرفة)، لكنها لا تُستخدم في طباعة الواجهة وهي مدعومة فقط بواسطة خطوط متخصصة.

تاريخ الليجاتشر: من الحروف المعدنية إلى الخطوط الرقمية

ظهرت الليجاتشر قبل الطباعة الرقمية بوقت طويل — في عصر الحروف المعدنية في القرن الخامس عشر. استخدم أول طابع يوهانس غوتنبرغ الليجاتشر لتوفير المساحة في سطور كتابه المقدس المكون من 42 سطرًا. كان كل حرف قطعة معدنية مادية، ودمج حرفين في قطعة واحدة يوفر الرصاص ويبسط عملية التركيب. الليجاتشر القياسي fi, fl, ffi, ffl هو إرث من تلك الحقبة.

في التنضيد الضوئي (القرن العشرين)، فقدت الليجاتشر وظيفتها العملية لكنها بقيت كعنصر جمالي في الطباعة عالية الجودة. استمر مصممو الخطوط في تضمين الليجاتشر في خطوطهم حيث أصبحت علامة على الاحترافية والاهتمام بالتفاصيل. في عصر الخطوط الرقمية (PostScript, TrueType)، تم تنفيذ الليجاتشر كحروف رسومية منفصلة مع استبدال برمجي.

OpenType (1996) كان ثورة: قدم آلية GSUB (جدول استبدال الحروف الرسومية)، التي تستبدل تلقائيًا تسلسل الحروف بليجاتشر دون تدخل المستخدم. تدعم GSUB الاستبدالات السياقية والشروط والمتغيرات البديلة. سمح هذا للخطوط بامتلاك مئات الليجاتشر التي يمكن تشغيلها/إيقافها عبر العلامات. الخطوط الحديثة — SF Pro, Roboto, Inter — تدعم ليجاتشر OpenType على جميع المنصات: iOS، Android، macOS، Windows، الويب.

تنفيذ الليجاتشر على iOS عبر UIFontDescriptor

على iOS، يمكن التحكم في الليجاتشر عبر UIFontDescriptor باستخدام السمة featureSettings. تقبل هذه السمة مصفوفة من القواميس، يصف كل منها ميزة OpenType واحدة. التحكم في الليجاتشر عبر الواصف هو الطريقة الوحيدة لإدارة الأنواع الفردية من الليجاتشر دون التأثير على ميزات OpenType الأخرى للخط.

swift
let descriptor = UIFontDescriptor.preferredFontDescriptor(
    withTextStyle: .body
)

// تفعيل الليجاتشر الاختياري
let ligatureDescriptor = descriptor.addingAttributes([
    .featureSettings: [
        [
            UIFontDescriptor.FeatureIdentifier: kLigaturesType,
            UIFontDescriptor.TypeIdentifier: kCommonLigaturesOnSelector
        ]
    ]
])

let font = UIFont(
    descriptor: ligatureDescriptor,
    size: 17
)

NSAttributedString يدعم أيضًا سمة ligature: NSNumber. القيمة 0 تعطل جميع الليجاتشر، 1 تفعل القياسي (افتراضيًا)، 2 تفعل الكل (بما في ذلك الاختياري). ومع ذلك، فإن سمة ligature في NSAttributedString لا توفر تحكمًا دقيقًا في أنواع الليجاتشر — فقط تشغيل/إيقاف عام. للتحكم الانتقائي، استخدم UIFontDescriptor مع featureSettings.

SwiftUI لا يوفر معدلاً مباشرًا للليجاتشر. للتحكم في الليجاتشر في SwiftUI، أنشئ UIFont بالإعدادات المطلوبة عبر UIFontDescriptor واستخدمه عبر Font(descriptor:size:). بدلاً من ذلك، استخدم AttributedString (iOS 15+) مع سمة .ligature لـ NSMutableAttributedString في مشاهدات AppKit/UIKit.

swift
// SwiftUI مع ليجاتشر مخصص عبر AttributedString
var attributedText: AttributedString {
    var text = AttributedString(
        "Effective typography with ligatures"
    )

    // تفعيل جميع الليجاتشر للنص بأكمله
    text.ligature = .all

    return text
}

var body: some View {
    Text(attributedText)
}

التحكم في الليجاتشر في CSS وAndroid

على الويب، يتم التحكم في الليجاتشر عبر خاصية CSS font-variant-ligatures، التي تقبل الكلمات المفتاحية: common-ligatures (قياسي مفعل)، no-common-ligatures (قياسي معطل)، discretionary-ligatures، no-discretionary-ligatures، contextual، no-contextual. الخاصية مدعومة من قبل جميع المتصفحات الحديثة منذ 2015. افتراضيًا، تفعّل المتصفحات الليجاتشر القياسي والسياقي.

css
/* Disable all ligatures for monospace */
code, pre {
    font-variant-ligatures: none;
}

/* Enable discretionary ligatures for headings */
.title-fancy {
    font-variant-ligatures:
        common-ligatures
        discretionary-ligatures
        contextual;
}

Android ليس لديه واجهة برمجة تطبيقات مباشرة للتحكم في الليجاتشر. على Android، يتم التحكم في الليجاتشر على مستوى الخط ومحرك العرض Minikin (Android 10+). إذا كان الخط يحتوي على جدول OpenType GSUB، يتم تطبيق الليجاتشر تلقائيًا. لتعطيل الليجاتشر على Android، تُستخدم خطوط مخصصة تم إنشاؤها عبر Typeface.Builder أو معالجة النص المسبقة (استبدال الحروف قبل العرض). تحديد: على Android الأقدم من 10، قد لا تعمل الليجاتشر بشكل صحيح مع بعض خطوط TTF.

تحكم منخفض المستوى: على جميع المنصات، يمكنك استخدام CSS @font-face مع معامل font-feature-settings لميزات OpenType. توفر هذه الطريقة الوصول إلى أي علامات OpenType، بما في ذلك الليجاتشر. مثال: font-feature-settings: 'liga' 1, 'dlig' 1. ومع ذلك، فإن font-feature-settings هو بناء جملة منخفض المستوى، ويوصي MDN باستخدام font-variant-ligatures كبديل أعلى مستوى.

الليجاتشر في خطوط البرمجة

فئة خاصة من الليجاتشر — ليجاتشر البرمجة — تجمع بين العوامل ورموز الكود في حروف رسومية أكثر قابلية للقراءة. تتضمن خطوط البرمجة مثل Fira Code وJetBrains Mono وCascadia Code ليجاتشر اختياري للعوامل الشائعة: != (يصبح ≠)، >= (يصبح ≥)، -> (يصبح سهمًا)، => (يصبح سهمًا سميكًا)، === (يصبح ثلاثي يساوي).

ليجاتشر البرمجة موضوع مثير للجدل في مجتمع المطورين. يجادل المؤيدون بأن الليجاتشر يسرع قراءة الكود لأن العوامل تُدرك كمفاهيم فردية. دراسة (Kera et al., PLATEAU 2020) أظهرت أن الليجاتشر لا يؤثر على سرعة قراءة الكود، لكن 67% من المطورين يعجبهم بشكل شخصي. يشير معارضو الليجاتشر إلى أنه يشوه الكود: رمز != في المحرر يظهر كـ ≠، لكن في ملف النص يُخزّن كحرفين، مما قد يسبب ارتباكًا أثناء التعاون.

التنفيذ التقني: ليجاتشر البرمجة هو ليجاتشر اختياري OpenType (علامة 'dlig'). إنه معطل افتراضيًا ويُفعّل في محرر الكود عبر إعدادات الخط. يجب على المطورين الذين يستخدمون هذه الخطوط تكوين المحرر لتفعيل الليجاتشر الاختياري. في الطرفية (iTerm2, Windows Terminal)، الليجاتشر مدعوم أيضًا عبر إعدادات الخط. التوافق: لا تدعم جميع المحررات والطرفيات ليجاتشر OpenType. قبل اختيار خط، تحقق من التوافق مع أدواتك.

kotlin
// مثال: ليجاتشر العوامل في JetBrains Mono
val isEqual = a != b  // != يُعرض كـ ≠
val arrow = x -> x + 1  // -> يُعرض كـ →
val range = 1 .. 10  // .. يُعرض كـ نطاق

الخطوط الشائعة مع ليجاتشر البرمجة: Fira Code (أول خط جماهيري مع ليجاتشر، 2015)، JetBrains Mono (محسّن لقراءة الكود، 2020)، Cascadia Code (من Microsoft، 2019)، Iosevka (خط قابل للتخصيص بنظام ليجاتشر معياري). كل خط لديه مجموعته الخاصة من الليجاتشر — من 50 إلى 150+ استبدال. توصية: ابدأ بـ Fira Code أو JetBrains Mono — لديهما أفضل دعم في المحررات وبيئات التطوير.

الأسئلة الشائعة

كيفية تعطيل الليجاتشر على iOS؟

اضبط attribute ligature = 0 في NSAttributedString أو استخدم UIFontDescriptor مع kCommonLigaturesOffSelector. في SwiftUI، أنشئ AttributedString مع .ligature = .disabled.

كيف يختلف الليجاتشر عن الكيرنينج؟

الليجاتشر يستبدل حرفين برمز جديد واحد، مما يغير شكلهما. الكيرنينج يضبط المسافة بين الحروف دون تغيير شكلها. الليجاتشر هو اتصال رسومي؛ الكيرنينج هو تعديل مكاني.

هل يدعم Android الليجاتشر؟

نعم، بدءًا من Android 10 (API 29). يدعم عرض Minikin بالكامل جداول OpenType GSUB. في الإصدارات الأقدم، يعتمد الدعم على مُصنّع الجهاز وإصدار محرك الخطوط.

هل يجب استخدام الليجاتشر في واجهة التطبيق؟

للنص الأساسي، الليجاتشر القياسي (fi, fl, ff) كافٍ — يحسن قابلية القراءة وغير مرئي للمستخدم. استخدم الليجاتشر الاختياري فقط في العناوين أو النص الزخرفي، حيث أنه يقلل قابلية قراءة النصوص الطويلة.

لماذا لا تظهر الليجاتشر في جميع محررات الكود؟

يجب أن يدعم المحرر علامة OpenType 'dlig' ويكون قادرًا على عرض الليجاتشر الاختياري. VS Code وIntelliJ IDEA وSublime Text تدعمها. الأطراف الطرفية والمحررات القديمة (nano، vim بدون واجهة رسومية) لا تدعمها. تحقق من إعدادات المحرر: فعّل font-ligatures.

الملخص

  • الليجاتشر — دمج عدة حروف في عنصر رسومي واحد للجماليات وقابلية القراءة
  • الليجاتشر القياسي (fi, fl, ff) مفعل افتراضيًا في الخطوط الاحترافية
  • الليجاتشر الاختياري (ct, st, sp) زخرفي، يُفعّل عبر CSS font-variant-ligatures
  • على iOS يتم التحكم عبر UIFontDescriptor مع featureSettings أو سمة ligature
  • على الويب يتم التحكم عبر font-variant-ligatures أو font-feature-settings ('liga', 'dlig')
  • ليجاتشر البرمجة (Fira Code, JetBrains Mono) تدمج العوامل: !=, >=, ->
  • لطباعة الواجهة، استخدم فقط الليجاتشر القياسي — الليجاتشر الاختياري يقلل قابلية القراءة

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا