كيف أقوم بتنسيق القوائم مثل A وB وC في JavaScript؟
استخدم Intl.ListFormat لتنسيق المصفوفات مع أدوات الربط والفواصل الخاصة بكل لغة.
مقدمة
عندما تعرض قائمة من العناصر للمستخدمين، تحتاج إلى ربطها بفواصل وأداة ربط مثل "و". اللغات المختلفة لديها اصطلاحات مختلفة لتنسيق القوائم. الإنجليزية تستخدم الفواصل و"and"، الإسبانية تستخدم "y"، الفرنسية تستخدم "et"، والصينية تستخدم علامات ترقيم مختلفة تماماً.
واجهة برمجة التطبيقات Intl.ListFormat تقوم بتنسيق المصفوفات إلى نصوص مناسبة للغة مع الفواصل وأدوات الربط الصحيحة. هذا يتعامل مع الاختلافات الثقافية في تنسيق القوائم تلقائياً.
المشكلة مع التنسيق اليدوي للقوائم
يمكنك ربط عناصر المصفوفة بفواصل باستخدام طريقة join().
const fruits = ["apples", "oranges", "bananas"];
const list = fruits.join(", ");
console.log(list);
// "apples, oranges, bananas"
هذا النهج لديه مشكلتان. أولاً، لا يضيف أداة ربط قبل العنصر الأخير. ثانياً، يستخدم علامات ترقيم إنجليزية لا تعمل مع اللغات الأخرى.
يمكنك إضافة "و" يدوياً قبل العنصر الأخير.
const fruits = ["apples", "oranges", "bananas"];
const lastFruit = fruits[fruits.length - 1];
const otherFruits = fruits.slice(0, -1);
const list = otherFruits.join(", ") + ", and " + lastFruit;
console.log(list);
// "apples, oranges, and bananas"
هذا الكود يعمل فقط مع الإنجليزية. المستخدمون الإسبان سيرون "apples, oranges, and bananas" بدلاً من "apples, oranges y bananas". المستخدمون الفرنسيون سيرون "and" بدلاً من "et". قواعد علامات الترقيم وأدوات الربط تختلف حسب اللغة.
استخدام Intl.ListFormat لتنسيق القوائم
منشئ Intl.ListFormat ينشئ أداة تنسيق تحول المصفوفات إلى نصوص قوائم مناسبة للغة.
const formatter = new Intl.ListFormat("en");
const fruits = ["apples", "oranges", "bananas"];
console.log(formatter.format(fruits));
// "apples, oranges, and bananas"
أداة التنسيق تستخدم الفواصل وأداة الربط الصحيحة للغة المحددة. تمرر اللغة كوسيط أول إلى المنشئ.
const enFormatter = new Intl.ListFormat("en");
const esFormatter = new Intl.ListFormat("es");
const frFormatter = new Intl.ListFormat("fr");
const fruits = ["apples", "oranges", "bananas"];
console.log(enFormatter.format(fruits));
// "apples, oranges, and bananas"
console.log(esFormatter.format(fruits));
// "apples, oranges y bananas"
console.log(frFormatter.format(fruits));
// "apples, oranges et bananas"
أداة التنسيق تطبق تلقائياً قواعد علامات الترقيم وأدوات الربط لكل لغة.
تنسيق القوائم باستخدام "و"
السلوك الافتراضي لـ Intl.ListFormat يستخدم حرف العطف "و" أو ما يعادله في اللغات الأخرى. يُسمى هذا تنسيق العطف.
const formatter = new Intl.ListFormat("en", { type: "conjunction" });
const items = ["bread", "milk", "eggs"];
console.log(formatter.format(items));
// "bread, milk, and eggs"
يتحكم خيار type في الرابط الذي يظهر بين العناصر. تنتج القيمة "conjunction" قوائم تستخدم "و". هذه هي القيمة الافتراضية، لذا يمكنك حذفها.
فهم خيارات نوع القائمة
يقبل خيار type ثلاث قيم تتحكم في كيفية ربط العناصر.
يستخدم النوع "conjunction" "و" أو ما يعادله.
const formatter = new Intl.ListFormat("en", { type: "conjunction" });
console.log(formatter.format(["red", "green", "blue"]));
// "red, green, and blue"
يستخدم النوع "disjunction" "أو" أو ما يعادله.
const formatter = new Intl.ListFormat("en", { type: "disjunction" });
console.log(formatter.format(["red", "green", "blue"]));
// "red, green, or blue"
ينسق النوع "unit" قوائم القياسات أو الكميات بدون حرف عطف.
const formatter = new Intl.ListFormat("en", { type: "unit" });
console.log(formatter.format(["5 pounds", "12 ounces"]));
// "5 pounds, 12 ounces"
يستخدم نوع الوحدة علامات ترقيم بسيطة مناسبة للبيانات التقنية أو بيانات القياس.
فهم خيارات النمط
يتحكم خيار style في طول وشكلية المخرجات المنسقة. يقبل ثلاث قيم.
يستخدم النمط "long" كلمات كاملة وعلامات ترقيم قياسية. هذا هو الافتراضي.
const formatter = new Intl.ListFormat("en", { style: "long" });
console.log(formatter.format(["Alice", "Bob", "Carol"]));
// "Alice, Bob, and Carol"
يستخدم النمط "short" أشكالاً مختصرة عند توفرها.
const formatter = new Intl.ListFormat("en", { style: "short" });
console.log(formatter.format(["Alice", "Bob", "Carol"]));
// "Alice, Bob, & Carol"
يستخدم النمط "narrow" الشكل الأكثر إيجازاً ممكناً.
const formatter = new Intl.ListFormat("en", { style: "narrow" });
console.log(formatter.format(["Alice", "Bob", "Carol"]));
// "Alice, Bob, Carol"
غالباً ما يحذف النمط الضيق حرف العطف بالكامل. يعتمد المخرج الدقيق على اللغة المحلية.
كيف تنسق اللغات المحلية المختلفة القوائم
لكل لغة محلية قواعدها الخاصة لتنسيق القوائم. يطبق المنسق هذه القواعد تلقائياً.
تستخدم الإنجليزية الفواصل وتتضمن الفاصلة الأكسفوردية قبل "و".
const formatter = new Intl.ListFormat("en");
console.log(formatter.format(["coffee", "tea", "juice"]));
// "coffee, tea, and juice"
تستخدم الإسبانية الفواصل وحرف العطف "y".
const formatter = new Intl.ListFormat("es");
console.log(formatter.format(["café", "té", "jugo"]));
// "café, té y jugo"
تستخدم الفرنسية الفواصل وحرف العطف "et".
const formatter = new Intl.ListFormat("fr");
console.log(formatter.format(["café", "thé", "jus"]));
// "café, thé et jus"
تستخدم الصينية الحرف 和 لكلمة "و" وفاصلة التعداد 、 كفاصل.
const formatter = new Intl.ListFormat("zh");
console.log(formatter.format(["咖啡", "茶", "可乐"]));
// "咖啡、茶和可乐"
تستخدم الألمانية الفواصل وحرف العطف "und".
const formatter = new Intl.ListFormat("de");
console.log(formatter.format(["Kaffee", "Tee", "Saft"]));
// "Kaffee, Tee und Saft"
يتعامل المنسق مع هذه الاختلافات دون الحاجة إلى معرفة القواعد الخاصة بكل لغة.
الحصول على الأجزاء الفردية باستخدام formatToParts
تُرجع الدالة formatToParts() مصفوفة من الكائنات تمثل كل جزء من القائمة المنسقة. هذا مفيد عندما تحتاج إلى تنسيق أجزاء مختلفة بشكل منفصل.
const formatter = new Intl.ListFormat("en");
const parts = formatter.formatToParts(["red", "green", "blue"]);
console.log(parts);
الناتج عبارة عن مصفوفة من الكائنات تحتوي على خصائص type و value.
[
{ type: "element", value: "red" },
{ type: "literal", value: ", " },
{ type: "element", value: "green" },
{ type: "literal", value: ", and " },
{ type: "element", value: "blue" }
]
كل عنصر في القائمة له نوع "element". الفواصل وحروف العطف لها نوع "literal". يمكنك استخدام هذا لتطبيق تنسيق مخصص.
const formatter = new Intl.ListFormat("en");
const parts = formatter.formatToParts(["red", "green", "blue"]);
const html = parts
.map((part) => {
if (part.type === "element") {
return `<strong>${part.value}</strong>`;
}
return part.value;
})
.join("");
console.log(html);
// "<strong>red</strong>, <strong>green</strong>, and <strong>blue</strong>"
يمنحك هذا النهج تحكماً دقيقاً في التنسيق مع الحفاظ على الفواصل وحروف العطف المناسبة للغة.
دعم المتصفحات
واجهة برمجة التطبيقات Intl.ListFormat متاحة في جميع المتصفحات الحديثة. تم دعمها منذ أبريل 2021 عبر المتصفحات الرئيسية بما في ذلك Chrome وFirefox وSafari وEdge.
يمكنك التحقق من توفر واجهة برمجة التطبيقات قبل استخدامها.
if (typeof Intl.ListFormat !== "undefined") {
const formatter = new Intl.ListFormat("en");
console.log(formatter.format(["a", "b", "c"]));
} else {
console.log("Intl.ListFormat is not supported");
}
بالنسبة للمتصفحات القديمة، تحتاج إلى توفير بديل أو استخدام polyfill. يمكن أن يستخدم البديل الدالة البسيطة join().
function formatList(items, locale) {
if (typeof Intl.ListFormat !== "undefined") {
const formatter = new Intl.ListFormat(locale);
return formatter.format(items);
}
return items.join(", ");
}
console.log(formatList(["red", "green", "blue"], "en"));
// "red, green, and blue" (or "red, green, blue" in older browsers)
يضمن هذا عمل الكود الخاص بك حتى في المتصفحات التي لا تدعم Intl.ListFormat.