كيفية تنسيق الأعداد الترتيبية مثل الأول، الثاني، الثالث
استخدام جافا سكريبت لعرض الأعداد الترتيبية مع لواحق وتنسيق مناسب للغة
مقدمة
تشير الأعداد الترتيبية إلى الموضع أو الرتبة في تسلسل ما. في اللغة الإنجليزية، تكتب 1st و2nd و3rd و4th لوصف مراكز الإنهاء في سباق أو العناصر في قائمة. تساعد هذه اللواحق في التمييز بين الأعداد الترتيبية والأعداد العادية.
تستخدم اللغات المختلفة اصطلاحات مختلفة تمامًا للأعداد الترتيبية. تضيف اللغة الإنجليزية لواحق مثل st وnd وrd وth. تستخدم الفرنسية أحرفًا علوية مثل 1er و2e. تضيف الألمانية نقطة بعد الرقم مثل 1. و2. اليابانية تضع بادئة للأرقام بالحرف 第. عندما تقوم ببرمجة لواحق الأعداد الترتيبية الإنجليزية بشكل ثابت، فإنك تفترض أن جميع المستخدمين يتبعون نفس الاصطلاح.
توفر JavaScript واجهة برمجة التطبيقات Intl.PluralRules مع نوع ترتيبي للتعامل مع هذه الاختلافات تلقائيًا. يشرح هذا الدرس ماهية الأعداد الترتيبية، ولماذا يختلف تنسيقها عبر اللغات، وكيفية تنسيقها بشكل صحيح لأي لغة محلية.
ما هي الأعداد الترتيبية
تعبر الأعداد الترتيبية عن الموضع أو الرتبة أو الترتيب في تسلسل ما. فهي تجيب على سؤال "أيها" بدلاً من "كم العدد". تصف الأرقام 1st و2nd و3rd المراكز في سباق. الأول والثاني والثالث تصف العناصر في قائمة.
تعبر الأعداد الأصلية عن الكمية أو المقدار. فهي تجيب على سؤال "كم العدد". تصف الأرقام 1 و2 و3 عدد الأشياء. واحد واثنان وثلاثة تصف الكميات.
تخدم نفس القيمة العددية كلا الغرضين حسب السياق. الرقم 5 هو أصلي في "5 تفاحات" ولكنه ترتيبي في "المركز الخامس". هذا التمييز مهم لأن العديد من اللغات تنسق الأعداد الترتيبية بشكل مختلف عن الأعداد الأصلية.
في اللغة الإنجليزية، الأعداد الترتيبية تحت 10 لها أشكال كلمات فريدة. الأول والثاني والثالث والرابع والخامس هي كلمات متميزة. فوق 10، تشكل اللغة الإنجليزية الأعداد الترتيبية بإضافة لواحق. الحادي عشر والثاني عشر والعشرون والحادي والعشرون تتبع أنماطًا ولكنها تتطلب لواحق.
عند كتابة الأعداد الترتيبية كأرقام بدلاً من الكلمات، تضيف اللغة الإنجليزية لواحق st وnd وrd أو th. تتبع هذه اللواحق قواعد محددة بناءً على الأرقام النهائية للعدد.
لماذا تختلف صياغة الأعداد الترتيبية حسب اللغة
طورت اللغات المختلفة أنظمة مختلفة للتعبير عن الأعداد الترتيبية. تعكس هذه الاصطلاحات قواعد النحو وأنظمة الكتابة والممارسات الثقافية الفريدة لكل لغة.
في اللغة الإنجليزية، تستخدم الأعداد الترتيبية أربعة لواحق مختلفة. الأرقام التي تنتهي بـ 1 تستخدم st، والأرقام التي تنتهي بـ 2 تستخدم nd، والأرقام التي تنتهي بـ 3 تستخدم rd، وجميع الأرقام الأخرى تستخدم th. ومع ذلك، فإن الأرقام التي تنتهي بـ 11 أو 12 أو 13 تستخدم جميعها th. وهذا ينتج 1st و2nd و3rd و4th و11th و12th و13th و21st و22nd و23rd.
في اللغة الفرنسية، تستخدم الأعداد الترتيبية اختصارات مرتفعة. العنصر الأول يستخدم 1er للمذكر أو 1re للمؤنث. جميع الأعداد الترتيبية الأخرى تستخدم e مرتفعة، مثل 2e و3e و4e. تتضمن الصياغة طباعة مرتفعة، وليس مجرد أحرف لاحقة.
في اللغة الألمانية، تستخدم الأعداد الترتيبية نقطة بعد الرقم. الترميز 1. و2. و3. يمثل الأول والثاني والثالث. تشير هذه النقطة إلى أن القارئ يجب أن يضيف ذهنيًا النهاية النحوية المناسبة عند القراءة بصوت عالٍ.
في اللغة الإسبانية، تستخدم الأعداد الترتيبية مؤشرات مرتفعة حسب الجنس. الأعداد الترتيبية المذكرة تستخدم 1.º و2.º و3.º بينما الأعداد الترتيبية المؤنثة تستخدم 1.ª و2.ª و3.ª. تفصل النقطة الرقم عن المؤشر.
في اللغة اليابانية، تضيف الأعداد الترتيبية البادئة 第 قبل الرقم. الأول والثاني والثالث تظهر كـ 第一 و第二 و第三. تغير هذه البادئة المعنى من عدد أصلي إلى عدد ترتيبي.
عندما تبني سلاسل ترتيبية عن طريق ربط الأرقام بلواحق مبرمجة، فإنك تجبر جميع المستخدمين على تفسير الاصطلاحات الإنجليزية. هذا يجعل تطبيقك أصعب استخدامًا للأشخاص الذين يتوقعون تنسيقات مختلفة.
فهم Intl.PluralRules مع نوع ordinal
تحدد واجهة برمجة التطبيقات Intl.PluralRules الفئة الجمعية التي ينتمي إليها الرقم للغة معينة. بينما تُستخدم واجهة برمجة التطبيقات هذه بشكل شائع للاختيار بين أشكال الكلمات المفردة والجمع، فإنها تتعامل أيضًا مع الأعداد الترتيبية.
يقبل المنشئ معرف اللغة وكائن خيارات. قم بتعيين خيار type إلى "ordinal" للعمل مع الأعداد الترتيبية بدلاً من الأعداد الأصلية.
const rules = new Intl.PluralRules('en-US', { type: 'ordinal' });
هذا ينشئ كائن قواعد يفهم أنماط الأعداد الترتيبية الإنجليزية. تُرجع طريقة select() اسم فئة لأي رقم تمرره إليها.
const rules = new Intl.PluralRules('en-US', { type: 'ordinal' });
console.log(rules.select(1));
// الناتج: "one"
console.log(rules.select(2));
// الناتج: "two"
console.log(rules.select(3));
// الناتج: "few"
console.log(rules.select(4));
// الناتج: "other"
الفئات المُرجعة هي مصطلحات لغوية، وليست اللواحق الفعلية. تتوافق الفئة "one" مع الأرقام التي تأخذ اللاحقة st في اللغة الإنجليزية. تتوافق الفئة "two" مع لواحق nd. تتوافق الفئة "few" مع لواحق rd. تتوافق الفئة "other" مع لواحق th.
تقوم بربط أسماء هذه الفئات باللواحق المناسبة للغتك. تتعامل واجهة برمجة التطبيقات مع القواعد المعقدة لتحديد الفئة التي ينتمي إليها كل رقم.
بناء دالة تنسيق الأعداد الترتيبية
لتنسيق الأعداد الترتيبية، يمكنك الجمع بين Intl.PluralRules مع تعيين من فئات الجمع إلى اللواحق. قم بإنشاء دالة تنسيق تأخذ رقمًا وتعيد السلسلة النصية المنسقة.
function formatOrdinal(number, locale) {
const rules = new Intl.PluralRules(locale, { type: 'ordinal' });
const category = rules.select(number);
const suffixes = {
one: 'st',
two: 'nd',
few: 'rd',
other: 'th'
};
const suffix = suffixes[category];
return `${number}${suffix}`;
}
console.log(formatOrdinal(1, 'en-US'));
// Output: "1st"
console.log(formatOrdinal(2, 'en-US'));
// Output: "2nd"
console.log(formatOrdinal(3, 'en-US'));
// Output: "3rd"
console.log(formatOrdinal(4, 'en-US'));
// Output: "4th"
تقوم هذه الدالة بإنشاء كائن PluralRules جديد في كل مرة يتم تشغيلها. للحصول على أداء أفضل، قم بإنشاء كائن القواعد مرة واحدة وإعادة استخدامه لأرقام متعددة.
const rules = new Intl.PluralRules('en-US', { type: 'ordinal' });
const suffixes = {
one: 'st',
two: 'nd',
few: 'rd',
other: 'th'
};
function formatOrdinal(number) {
const category = rules.select(number);
const suffix = suffixes[category];
return `${number}${suffix}`;
}
console.log(formatOrdinal(1));
// Output: "1st"
console.log(formatOrdinal(21));
// Output: "21st"
console.log(formatOrdinal(22));
// Output: "22nd"
console.log(formatOrdinal(23));
// Output: "23rd"
تتعامل واجهة البرمجة بشكل صحيح مع الأرقام مثل 11 و12 و13، والتي تستخدم جميعها th على الرغم من أرقامها النهائية.
console.log(formatOrdinal(11));
// Output: "11th"
console.log(formatOrdinal(12));
// Output: "12th"
console.log(formatOrdinal(13));
// Output: "13th"
تقوم قواعد الجمع بترميز جميع الحالات الخاصة والاستثناءات للغة المحلية. لا تحتاج إلى كتابة منطق شرطي للتعامل مع هذه الحالات الاستثنائية.
تنسيق الأعداد الترتيبية للغات المحلية المختلفة
تتغير فئات الجمع ومعانيها عبر اللغات المحلية المختلفة. بعض اللغات لديها فئات أقل من الإنجليزية. وبعضها الآخر لديه قواعد مختلفة لتحديد الأرقام التي تندرج ضمن كل فئة.
تستخدم اللغة الويلزية نظام تصنيف مختلف. تحدد القواعد المزيد من الفئات، كل منها يتوافق مع أشكال ترتيبية مختلفة في الويلزية.
const enRules = new Intl.PluralRules('en-US', { type: 'ordinal' });
const cyRules = new Intl.PluralRules('cy', { type: 'ordinal' });
console.log(enRules.select(1));
// Output: "one"
console.log(cyRules.select(1));
// Output: "one"
console.log(enRules.select(2));
// Output: "two"
console.log(cyRules.select(2));
// Output: "two"
console.log(enRules.select(5));
// Output: "other"
console.log(cyRules.select(5));
// Output: "many"
لدعم لغات محلية متعددة، تحتاج إلى تعيينات لواحق مختلفة لكل لغة محلية. تبقى الفئات كما هي، لكن اللواحق تتغير.
const ordinalSuffixes = {
'en-US': {
one: 'st',
two: 'nd',
few: 'rd',
other: 'th'
},
'fr-FR': {
one: 'er',
other: 'e'
}
};
function formatOrdinal(number, locale) {
const rules = new Intl.PluralRules(locale, { type: 'ordinal' });
const category = rules.select(number);
const suffixes = ordinalSuffixes[locale];
const suffix = suffixes[category] || suffixes.other;
return `${number}${suffix}`;
}
console.log(formatOrdinal(1, 'en-US'));
// Output: "1st"
console.log(formatOrdinal(1, 'fr-FR'));
// Output: "1er"
console.log(formatOrdinal(2, 'en-US'));
// Output: "2nd"
console.log(formatOrdinal(2, 'fr-FR'));
// Output: "2e"
يعمل هذا النهج بشكل جيد عندما تتحكم في سلاسل اللواحق لكل لغة محلية. ومع ذلك، فإنه يتطلب الحفاظ على بيانات اللواحق لكل لغة محلية تدعمها.
فهم فئات الأعداد الترتيبية
تستخدم واجهة برمجة التطبيقات Intl.PluralRules ستة أسماء فئات محتملة. تستخدم اللغات المختلفة مجموعات فرعية مختلفة من هذه الفئات.
الفئات هي صفر (zero)، واحد (one)، اثنان (two)، قليل (few)، كثير (many)، وأخرى (other). لا تميز جميع اللغات بين جميع الفئات الستة. تستخدم الأعداد الترتيبية الإنجليزية أربعة فقط: واحد، اثنان، قليل، وأخرى.
لا تتوافق أسماء الفئات مباشرة مع القيم العددية. تتضمن فئة "واحد" الأرقام 1، 21، 31، 41، وجميع الأرقام التي تنتهي بـ 1 باستثناء 11. تتضمن فئة "اثنان" الأرقام 2، 22، 32، 42، وجميع الأرقام التي تنتهي بـ 2 باستثناء 12.
يمكنك التحقق من الفئات التي تستخدمها لغة معينة عن طريق استدعاء طريقة resolvedOptions() وفحص خاصية pluralCategories.
const rules = new Intl.PluralRules('en-US', { type: 'ordinal' });
const options = rules.resolvedOptions();
console.log(options.pluralCategories);
// Output: ["one", "two", "few", "other"]
هذا يوضح أن الأعداد الترتيبية الإنجليزية تستخدم أربع فئات. تستخدم اللغات الأخرى مجموعات مختلفة من الفئات.
const rules = new Intl.PluralRules('fr-FR', { type: 'ordinal' });
const options = rules.resolvedOptions();
console.log(options.pluralCategories);
// Output: ["one", "other"]
تميز الأعداد الترتيبية الفرنسية فقط بين واحد وأخرى. يعكس هذا التصنيف الأبسط قواعد اللواحق الأبسط في اللغة الفرنسية.
تنسيق الأعداد الترتيبية للغة المستخدم
بدلاً من ترميز لغة محددة، يمكنك استخدام اللغة المفضلة للمستخدم من المتصفح. تُرجع خاصية navigator.language تفضيل اللغة الأعلى للمستخدم.
const userLocale = navigator.language;
const rules = new Intl.PluralRules(userLocale, { type: 'ordinal' });
const suffixes = {
one: 'st',
two: 'nd',
few: 'rd',
other: 'th'
};
function formatOrdinal(number) {
const category = rules.select(number);
const suffix = suffixes[category] || suffixes.other;
return `${number}${suffix}`;
}
console.log(formatOrdinal(1));
// Output varies by user's locale
يتكيف هذا النهج تلقائيًا مع تفضيل لغة المستخدم. ومع ذلك، لا يزال يتعين عليك توفير تعيينات لاحقة مناسبة لكل لغة يدعمها تطبيقك.
بالنسبة للغات التي لا تحتوي على تعيينات لاحقة محددة، يمكنك الرجوع إلى سلوك افتراضي أو عرض الرقم بدون لاحقة.
function formatOrdinal(number, locale = navigator.language) {
const rules = new Intl.PluralRules(locale, { type: 'ordinal' });
const category = rules.select(number);
const localeMapping = ordinalSuffixes[locale];
if (!localeMapping) {
return String(number);
}
const suffix = localeMapping[category] || localeMapping.other || '';
return `${number}${suffix}`;
}
تُرجع هذه الدالة الرقم فقط عندما لا يوجد تعيين لاحقة للغة المحددة.
حالات الاستخدام الشائعة للأعداد الترتيبية
تظهر الأعداد الترتيبية في العديد من السياقات الشائعة في واجهات المستخدم. فهم هذه الحالات يساعدك على تحديد متى يجب تنسيق الأرقام كأعداد ترتيبية.
تُظهر التصنيفات ولوحات المتصدرين مراكز المستخدمين. يعرض تطبيق الألعاب "المركز الأول"، "المركز الثاني"، "المركز الثالث" بدلاً من "مركز 1"، "مركز 2"، "مركز 3".
function formatRanking(position) {
const rules = new Intl.PluralRules('en-US', { type: 'ordinal' });
const category = rules.select(position);
const suffixes = {
one: 'st',
two: 'nd',
few: 'rd',
other: 'th'
};
const suffix = suffixes[category];
return `${position}${suffix} place`;
}
console.log(formatRanking(1));
// Output: "1st place"
console.log(formatRanking(42));
// Output: "42nd place"
تنسيق التاريخ يستخدم أحيانًا الأعداد الترتيبية ليوم الشهر. بعض اللغات المحلية تكتب "1 يناير" بدلاً من "يناير 1".
التعليمات خطوة بخطوة تستخدم الأعداد الترتيبية لترقيم كل خطوة. يعرض البرنامج التعليمي "الخطوة الأولى: تثبيت البرنامج"، "الخطوة الثانية: تكوين الإعدادات"، "الخطوة الثالثة: بدء التطبيق".
عناصر القائمة في التسلسلات الطويلة تستفيد من التنسيق الترتيبي عندما يكون التأكيد على الموضع أكثر أهمية من مجرد التعداد.
إعادة استخدام كائنات القواعد لتحسين الأداء
إنشاء نسخة جديدة من Intl.PluralRules يتضمن تحميل بيانات اللغة المحلية ومعالجة الخيارات. عندما تقوم بتنسيق أعداد ترتيبية متعددة بنفس اللغة المحلية، قم بإنشاء كائن القواعد مرة واحدة وأعد استخدامه.
const rules = new Intl.PluralRules('en-US', { type: 'ordinal' });
const suffixes = {
one: 'st',
two: 'nd',
few: 'rd',
other: 'th'
};
function formatOrdinal(number) {
const category = rules.select(number);
const suffix = suffixes[category];
return `${number}${suffix}`;
}
const positions = [1, 2, 3, 4, 5];
positions.forEach(position => {
console.log(formatOrdinal(position));
});
// Output:
// "1st"
// "2nd"
// "3rd"
// "4th"
// "5th"
هذا النهج أكثر كفاءة من إنشاء كائن قواعد جديد لكل رقم. يصبح فرق الأداء كبيرًا عند تنسيق مصفوفات تحتوي على مئات أو آلاف القيم.
يمكنك أيضًا إنشاء مصنع منسق يعيد دالة مكونة للغة محلية محددة.
function createOrdinalFormatter(locale, suffixMapping) {
const rules = new Intl.PluralRules(locale, { type: 'ordinal' });
return function(number) {
const category = rules.select(number);
const suffix = suffixMapping[category] || suffixMapping.other || '';
return `${number}${suffix}`;
};
}
const formatEnglishOrdinal = createOrdinalFormatter('en-US', {
one: 'st',
two: 'nd',
few: 'rd',
other: 'th'
});
console.log(formatEnglishOrdinal(1));
// Output: "1st"
console.log(formatEnglishOrdinal(2));
// Output: "2nd"
هذا النمط يغلف كائن القواعد وتعيين اللواحق معًا، مما يجعل المنسق سهل إعادة الاستخدام عبر تطبيقك.