كيفية تنسيق الأعداد الترتيبية مثل الأول، الثاني، الثالث

استخدم JavaScript لعرض الأعداد الترتيبية مع اللواحق والتنسيق المناسب للغة

مقدمة

تشير الأعداد الترتيبية إلى الموضع أو الترتيب في تسلسل. في اللغة الإنجليزية، تكتب 1st، 2nd، 3rd، 4th لوصف مواضع الإنهاء في سباق أو عناصر في قائمة. تساعد هذه اللواحق في التمييز بين الأعداد الترتيبية وأعداد العد العادية.

تستخدم اللغات المختلفة اصطلاحات مختلفة تمامًا للأعداد الترتيبية. تضيف الإنجليزية لواحق مثل st، nd، rd، وth. تستخدم الفرنسية أحرفًا مرتفعة مثل 1er و2e. تضيف الألمانية نقطة بعد الرقم مثل 1. و2. تضيف اليابانية بادئة للأرقام بالحرف 第. عندما تقوم بترميز اللواحق الترتيبية الإنجليزية بشكل ثابت، فإنك تفترض أن جميع المستخدمين يتبعون نفس الاصطلاح.

توفر JavaScript واجهة برمجة التطبيقات Intl.PluralRules مع نوع ترتيبي للتعامل مع هذه الاختلافات تلقائيًا. يشرح هذا الدرس ماهية الأعداد الترتيبية، ولماذا يختلف تنسيقها عبر اللغات، وكيفية تنسيقها بشكل صحيح لأي لغة.

ما هي الأعداد الترتيبية

تعبر الأعداد الترتيبية عن الموضع أو الرتبة أو الترتيب في تسلسل. تجيب على سؤال "أيهم" بدلاً من "كم عددهم". تصف الأرقام 1st، 2nd، 3rd المواضع في سباق. تصف الكلمات الأول، الثاني، الثالث العناصر في قائمة.

تعبر الأعداد الأصلية عن الكمية أو المقدار. تجيب على سؤال "كم عددهم". تصف الأرقام 1، 2، 3 أعداد الأشياء. تصف الكلمات واحد، اثنان، ثلاثة المقادير.

تخدم نفس القيمة الرقمية كلا الغرضين حسب السياق. الرقم 5 هو عدد أصلي في "5 تفاحات" ولكنه ترتيبي في "المركز الخامس". يهم هذا التمييز لأن العديد من اللغات تنسق الأعداد الترتيبية بشكل مختلف عن الأعداد الأصلية.

في اللغة الإنجليزية، الأعداد الترتيبية تحت 10 لها أشكال كلمات فريدة. First وsecond وthird وfourth وfifth هي كلمات متميزة. فوق 10، تشكل الإنجليزية الأعداد الترتيبية بإضافة لواحق. Eleventh وtwelfth وtwentieth وtwenty-first تتبع أنماطاً لكنها تتطلب لواحق.

عند كتابة الأعداد الترتيبية كأرقام بدلاً من كلمات، تضيف الإنجليزية اللواحق 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 مع النوع الترتيبي

تحدد واجهة برمجة التطبيقات 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));
// Output: "one"

console.log(rules.select(2));
// Output: "two"

console.log(rules.select(3));
// Output: "few"

console.log(rules.select(4));
// Output: "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 ومany وother. لا تميز جميع اللغات بين جميع الفئات الست. تستخدم الأرقام الترتيبية الإنجليزية أربع فئات فقط: one وtwo وfew وother.

لا تتوافق أسماء الفئات مباشرة مع القيم الرقمية. تتضمن الفئة "one" الأرقام 1 و21 و31 و41 وجميع الأرقام المنتهية بـ 1 باستثناء 11. تتضمن الفئة "two" الأرقام 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"

يجمع هذا النمط كائن القواعد وتعيين اللواحق معاً، مما يجعل المنسق سهل الاستخدام عبر تطبيقك.