التثنية وStringsdict
تعامل مع قواعد التثنية عبر اللغات.
التثنية وStringsdict درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
مشكلة صيغ الجمع
للغة الإنجليزية صيغتان — 1 item و2 items — ولذلك يكتب المطورون غالبًا "\(n) item" + (n == 1 ? "" : "s"). لكن هذا يسبب مشكلات كبيرة: فللغة العربية ست فئات للجمع، وللروسية ثلاث، ولليابانية فئة واحدة. إن ترميز منطق الجمع بشكل ثابت خطأ في التوطين ينتظر الحدوث.
// FRAGILE — only works for English
let n = 5
let bad = "\(n) item" + (n == 1 ? "" : "s")
print(bad)فئات الجمع
يحدد Unicode فئات الجمع التالية: صفر، واحد، اثنان، قليل، كثير، آخر. وتستخدم كل لغة مجموعة جزئية منها. ويختار النظام الفئة المناسبة للعدد استنادًا إلى قواعد الإعداد المحلي، لذا لا تكتبون القواعد بأنفسكم أبدًا.
// English uses: one, other
// Russian uses: one, few, many, other
// Japanese uses: other (only)
// You provide a variant string per category needed.صيغ الجمع المتعددة في String Catalog
في String Catalog، تحددون أن السلسلة النصية لها صيغ متعددة للجمع. ويتيح لكم Xcode بعد ذلك توفير نص لكل فئة. وأثناء التشغيل، تُختار الصيغة الصحيحة تلقائيًا استنادًا إلى العدد المستوفى وإعداد المستخدم المحلي.
// Catalog entry, key "message_count":
// one: "You have %lld message"
// other: "You have %lld messages"
let count = 1
let text = String(localized: "You have \(count) messages")
print(text)ملف .stringsdict القديم
قبل ظهور String Catalog، كانت صيغ الجمع تُحفظ في ملف .stringsdict، وهو قائمة خصائص تربط مفتاحًا بسلسلة تنسيق بالإضافة إلى صيغ لكل فئة. ولا تزالون ترون هذه الملفات في المشاريع القديمة، كما أنها ما زالت مدعومة بالكامل.
// Localizable.stringsdict (plist) structure:
// key: "items_count"
// NSStringLocalizedFormatKey: "%#@items@"
// items: NSStringPluralRuleType
// one: "%lld item"
// other: "%lld items"بنية إدخال stringsdict
يحتوي كل إدخال على مفتاح تنسيق يشير إلى متغير واحد أو أكثر من المتغيرات المسماة والمغلّفة داخل %#@name@. ويحدد كل متغير نوع القاعدة (NSStringPluralRuleType)، ومحدد نوع القيمة (%lld)، وسلسلة نصية لكل فئة من فئات الجمع.
// The %#@items@ token expands to the chosen
// plural variant. %lld is the integer placeholder
// substituted inside each variant string.
let n = 3
print(String(localized: "\(n) items selected"))البحث عن سلسلة نصية بصيغة الجمع
من جهة الكود، يبدو موضع الاستدعاء مطابقًا لأي سلسلة نصية مترجمة — كل ما عليك هو إدراج العدد. يحدث اختيار صيغة الجمع داخل إطار العمل، لذلك يعمل سطر Swift نفسه في كل لغة.
func messagesLabel(_ count: Int) -> String {
return String(localized: "You have \(count) messages")
}
print(messagesLabel(0))
print(messagesLabel(1))
print(messagesLabel(7))لماذا لا تعني 'one' الرقم 1 فقط
من الأخطاء الشائعة افتراض أن فئة one تعني العدد 1 بالضبط. ففي بعض اللغات تشمل أي عدد ينتهي بالرقم 1، مثل 21 و31، وقد تكون فئة zero مميزة أو لا تكون كذلك. وفّر دائمًا نصًا لكل فئة، ودَع القواعد تحدد الفئة المناسبة.
// Russian: 1, 21, 31 -> 'one'
// 2, 3, 4 -> 'few'
// 5..20, 0 -> 'many'
// Never assume one == 1.دمج صيغ الجمع مع القيم الأخرى
يمكن أن يحتوي التنسيق على عدة متغيرات — مثل العدد والاسم. ويمكن لكل منها أن يتعامل مع صيغة الجمع بشكل مستقل. في String Catalog، تحدد أي عملية إدراج تتغير، بينما تبقى بقية العناصر ثابتة عبر التنويعات.
let files = 2
let folder = "Photos"
let text = String(
localized: "\(files) files in \(folder)")
// 'files' drives the plural; 'folder' is substituted as-is
print(text)تنويعات العرض والجهاز
تدعم آلية الكتالوج نفسها تنويعات الجهاز والعرض، ما يتيح لك عرض تسمية قصيرة على الساعة وتسمية أطول على iPad، أو اختصارها عندما تكون المساحة محدودة. وتعمل هذه التنويعات إلى جانب تنويعات صيغة الجمع.
// Catalog can vary by:
// plural: one / other
// device: iPhone / iPad / watch
// width: short / medium / long
let label = String(localized: "Notifications")
print(label)اختبار صيغ الجمع
للتحقق من تنويعاتك، شغّل التطبيق بكل لغة مستهدفة باستخدام تجاوز تعريب المخطط في Xcode، أو استخدم اللغة الزائفة ومعاينات كل لغة محلية. اختبر سريعًا الأعداد الحدية: 0 و1 و2 و5 و11 و21 و100.
let samples = [0, 1, 2, 5, 11, 21, 100]
for n in samples {
print(String(localized: "\(n) items"))
}أفضل الممارسات
للحصول على صيغ جمع صحيحة:
- لا تدمج لاحقات
sأو تضعها مباشرة في النص. - وفّر كل فئة تحتاج إليها اللغات المستهدفة.
- استمد صيغة الجمع من العدد الصحيح المُدرج، لا من سلسلة نصية محسوبة مسبقًا.
- فضّل String Catalogs في الكود الجديد، واحتفظ بـ
.stringsdictللأهداف القديمة فقط.
func cartSummary(_ items: Int) -> String {
String(localized: "Your cart has \(items) items",
comment: "Cart count; pluralized")
}
print(cartSummary(1))تحقق سريع
تذكّر كيفية التعامل مع اختيار صيغة الجمع.
مراجعة
لقد تعلمت كيفية تطبيق صيغة الجمع بما يتوافق مع اللغة المحلية:
- فئات الجمع في Unicode هي zero, one, two, few, many, other؛ وتستخدم كل لغة مجموعة فرعية منها.
- يتيح لك String Catalogs إضافة تنويعات صيغة الجمع لكل مفتاح، بينما ينفذ
.stringsdictالقديم الأمر نفسه عبر plist. - تبقى مواضع الاستدعاء بسيطة — أدرج العدد، وسيختار إطار العمل التنويع المناسب.
- لا تضع منطق صيغة الجمع مباشرة في الكود؛ ففئة one لا تعني الرقم 1 فقط.
الأسئلة الشائعة
هل درس «التثنية وStringsdict» مجاني؟
نعم — نص درس «التثنية وStringsdict» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «التثنية وStringsdict»؟
تعامل مع قواعد التثنية عبر اللغات. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «التثنية وStringsdict»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كتالوجات السلاسل النصية والسلاسل المترجمة
- التثنية وStringsdict
- التنسيق المراعي للمحلية
- من اليمين إلى اليسار واتجاه التخطيط