كيفية التحقق من التقويم أو نظام الترقيم الذي يستخدمه اللوكيل
اكتشف وتحقق من أنظمة التقويم وتنسيقات الترقيم لأي لوكيل باستخدام JavaScript
مقدمة
عندما يشاهد شخص ما في تايلاند تاريخًا على تطبيق الويب الخاص بك، فإنه يتوقع رؤية التواريخ بالتقويم البوذي، وليس التقويم الميلادي المستخدم في الدول الغربية. وبالمثل، يتوقع الناطقون بالعربية رؤية الأرقام معروضة كـ ١٢٣ بدلاً من 123. تستخدم الثقافات المختلفة أنظمة تقويم وأنظمة ترقيم مختلفة، وتوفر JavaScript أدوات لاكتشاف الأنظمة التي تنطبق على لوكيلات محددة.
تتضمن واجهة برمجة التطبيقات Intl.Locale خصائص وطرقًا تكشف عن أنظمة التقويم والترقيم التي يستخدمها اللوكيل. تساعدك هذه المعلومات على تنسيق التواريخ والأرقام بشكل صحيح دون افتراضات مسبقة حول الأنظمة التي تفضلها الثقافات المختلفة.
يشرح هذا الدليل كيفية التحقق من أنظمة التقويم والترقيم للوكيلات، وفهم معاني الأنظمة المختلفة، واستخدام هذه المعلومات لتنسيق المحتوى بشكل مناسب.
فهم أنظمة التقويم
نظام التقويم هو طريقة لتنظيم الوقت إلى سنوات وأشهر وأيام. بينما التقويم الميلادي منتشر على نطاق واسع، تستخدم العديد من الثقافات أنظمة تقويم مختلفة لأغراض دينية أو تاريخية أو ثقافية.
تشمل أنظمة التقويم الأكثر شيوعًا:
gregoryللتقويم الميلادي، المستخدم في معظم الدول الغربيةbuddhistللتقويم البوذي، المستخدم في تايلاند وكمبوديا وميانمارislamicللتقويم الهجري القمري، المستخدم للأغراض الدينية في الدول الإسلاميةhebrewللتقويم العبري، المستخدم في إسرائيل وللشعائر الدينية اليهوديةjapaneseللتقويم الياباني، الذي يستخدم أسماء الحقبة الإمبراطوريةchineseللتقويم الصيني القمري الشمسي، المستخدم للأعياد التقليديةpersianللتقويم الفارسي الشمسي، المستخدم في إيران وأفغانستانindianللتقويم الوطني الهنديcopticللتقويم القبطي، المستخدم في مصر من قبل المسيحيين الأقباط
تستخدم المناطق المختلفة تقاويم مختلفة كإعداد افتراضي، وبعض المناطق تستخدم عادةً أنظمة تقويم متعددة.
فهم أنظمة الترقيم
نظام الترقيم هو مجموعة من الرموز المستخدمة لتمثيل الأرقام. بينما تستخدم الدول الغربية الأرقام اللاتينية (0، 1، 2، 3، 4، 5، 6، 7، 8، 9)، تستخدم الثقافات الأخرى رموزاً مختلفة لتمثيل نفس القيم الرقمية.
تشمل أنظمة الترقيم الشائعة:
latnللأرقام اللاتينية: 0 1 2 3 4 5 6 7 8 9arabللأرقام العربية الهندية: ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩arabextللأرقام العربية الهندية الشرقية: ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹devaللأرقام الديفاناغارية: ० १ २ ३ ४ ५ ६ ७ ८ ९bengللأرقام البنغالية: ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯thaiللأرقام التايلاندية: ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙hanidecللأرقام العشرية الصينيةfullwideللأرقام كاملة العرض المستخدمة في الطباعة الآسيوية الشرقية
تمثل جميع أنظمة الترقيم نفس القيم الرقمية ولكنها تستخدم رموزاً بصرية مختلفة بناءً على نظام الكتابة الخاص باللغة.
التحقق من التقويم الافتراضي للغة معينة
تُرجع الدالة getCalendars() مصفوفة من أنظمة التقويم المستخدمة عادةً للغة معينة، مرتبة حسب الأفضلية. العنصر الأول هو التقويم الافتراضي.
const locale = new Intl.Locale("th-TH");
const calendars = locale.getCalendars();
console.log(calendars);
// ["buddhist", "gregory"]
تستخدم اللغات التايلاندية التقويم البوذي بشكل افتراضي ولكنها تستخدم أيضاً التقويم الميلادي بشكل شائع. يخبرك هذا أنه عند تنسيق التواريخ للمستخدمين التايلانديين، يُفضل التقويم البوذي.
تُرجع اللغات المختلفة تفضيلات تقويم مختلفة:
const usLocale = new Intl.Locale("en-US");
console.log(usLocale.getCalendars());
// ["gregory"]
const saLocale = new Intl.Locale("ar-SA");
console.log(saLocale.getCalendars());
// ["gregory", "islamic", "islamic-civil"]
const jpLocale = new Intl.Locale("ja-JP");
console.log(jpLocale.getCalendars());
// ["gregory", "japanese"]
تستخدم الإنجليزية الأمريكية التقويم الميلادي فقط. تستخدم العربية السعودية عادةً كلاً من التقويم الميلادي والتقويم الهجري. تستخدم اللغات اليابانية كلاً من التقويم الميلادي والتقويم الإمبراطوري الياباني.
يحتوي المصفوفة على جميع التقاويم المستخدمة بشكل شائع في تلك اللغة، مما يتيح لك تقديم خيارات تقويم متعددة عند الاقتضاء.
التحقق من نظام الترقيم الافتراضي للغة
تُرجع الدالة getNumberingSystems() مصفوفة من أنظمة الترقيم المستخدمة بشكل شائع للغة. العنصر الأول هو نظام الترقيم الافتراضي.
const locale = new Intl.Locale("ar-EG");
const numberingSystems = locale.getNumberingSystems();
console.log(numberingSystems);
// ["arab"]
تستخدم العربية المصرية الأرقام الهندية العربية بشكل افتراضي. عند تنسيق الأرقام لمستخدمي العربية المصرية، استخدم نظام الترقيم الهندي العربي ما لم يحدد المستخدم خلاف ذلك.
تستخدم اللغات المختلفة أنظمة ترقيم افتراضية مختلفة:
const usLocale = new Intl.Locale("en-US");
console.log(usLocale.getNumberingSystems());
// ["latn"]
const inLocale = new Intl.Locale("hi-IN");
console.log(inLocale.getNumberingSystems());
// ["latn"]
const thLocale = new Intl.Locale("th-TH");
console.log(thLocale.getNumberingSystems());
// ["latn"]
تستخدم الإنجليزية الأمريكية الأرقام اللاتينية. تستخدم الهندية في الهند أيضاً الأرقام اللاتينية بشكل افتراضي في السياقات الحديثة، على الرغم من وجود أرقام ديفاناغاري. تستخدم التايلاندية الأرقام اللاتينية بشكل افتراضي في معظم السياقات الحديثة.
تستخدم العديد من اللغات الحديثة الأرقام اللاتينية بشكل افتراضي حتى عندما توجد أنظمة ترقيم تقليدية، مما يعكس أنماط الاستخدام الحالية.
قراءة التقويم النشط من اللغة
تُرجع الخاصية calendar نظام التقويم المحدد صراحةً للغة. إذا لم يتم تحديد تقويم، فإنها تُرجع undefined.
const locale = new Intl.Locale("en-US");
console.log(locale.calendar);
// undefined
تُرجع اللغة الأساسية بدون امتدادات تقويم undefined. ستستخدم اللغة تقويمها الافتراضي عند تنسيق التواريخ.
يمكنك إنشاء لغات بتفضيلات تقويم صريحة باستخدام امتدادات يونيكود:
const locale = new Intl.Locale("en-US-u-ca-buddhist");
console.log(locale.calendar);
// "buddhist"
يحدد الامتداد -u-ca-buddhist التقويم البوذي. تُرجع الخاصية calendar القيمة "buddhist".
يمكنك أيضًا تعيين التقويم عند إنشاء اللغة المحلية:
const locale = new Intl.Locale("en-US", { calendar: "islamic" });
console.log(locale.calendar);
// "islamic"
يأخذ كائن الخيارات الأولوية على أي تقويم محدد في سلسلة اللغة المحلية.
قراءة نظام الترقيم النشط من لغة محلية
تُرجع الخاصية numberingSystem نظام الترقيم المحدد صراحةً للغة محلية. إذا لم يتم تحديد نظام ترقيم، فإنها تُرجع undefined.
const locale = new Intl.Locale("en-US");
console.log(locale.numberingSystem);
// undefined
تُرجع لغة محلية أساسية بدون امتدادات نظام ترقيم undefined. ستستخدم اللغة المحلية نظام الترقيم الافتراضي الخاص بها عند تنسيق الأرقام.
يمكنك إنشاء لغات محلية بتفضيلات نظام ترقيم صريحة:
const locale = new Intl.Locale("en-US-u-nu-arab");
console.log(locale.numberingSystem);
// "arab"
يحدد الامتداد -u-nu-arab الأرقام الهندية العربية. تُرجع الخاصية numberingSystem "arab".
يمكنك أيضًا تعيين نظام الترقيم عند إنشاء اللغة المحلية:
const locale = new Intl.Locale("ar-SA", { numberingSystem: "latn" });
console.log(locale.numberingSystem);
// "latn"
ينشئ هذا لغة محلية عربية تستخدم الأرقام اللاتينية بدلاً من الأرقام الهندية العربية الافتراضية.
اكتشاف متى تحتوي لغة محلية على تقويم صريح
للتحقق مما إذا كانت اللغة المحلية تحتوي على تقويم محدد صراحةً مقابل استخدام التقويم الافتراضي، تحقق مما إذا كانت الخاصية calendar محددة:
function hasExplicitCalendar(localeString) {
const locale = new Intl.Locale(localeString);
return locale.calendar !== undefined;
}
console.log(hasExplicitCalendar("en-US"));
// false
console.log(hasExplicitCalendar("en-US-u-ca-buddhist"));
// true
يهم هذا التمييز عندما تحتاج إلى تحديد ما إذا كان المستخدم قد اختار صراحةً تفضيل تقويم أو ما إذا كان يجب عليك استخدام التقويم الافتراضي للغة المحلية.
اكتشاف متى تحتوي لغة محلية على نظام ترقيم صريح
بالمثل، تحقق مما إذا كانت الخاصية numberingSystem محددة لاكتشاف تفضيلات نظام الترقيم الصريحة:
function hasExplicitNumberingSystem(localeString) {
const locale = new Intl.Locale(localeString);
return locale.numberingSystem !== undefined;
}
console.log(hasExplicitNumberingSystem("ar-EG"));
// false
console.log(hasExplicitNumberingSystem("ar-EG-u-nu-latn"));
// true
ستستخدم اللغة المحلية الأولى نظام الترقيم الافتراضي للعربية المصرية. تطلب اللغة المحلية الثانية صراحةً الأرقام اللاتينية.
استخدام معلومات التقويم لتنسيق التواريخ
بمجرد معرفة التقويم الذي يستخدمه اللغة المحلية، قم بتطبيقه عند تنسيق التواريخ باستخدام Intl.DateTimeFormat:
const date = new Date("2025-03-15");
const gregorianLocale = new Intl.Locale("en-US");
const gregorianFormatter = new Intl.DateTimeFormat(gregorianLocale, {
year: "numeric",
month: "long",
day: "numeric"
});
console.log(gregorianFormatter.format(date));
// "March 15, 2025"
const buddhistLocale = new Intl.Locale("th-TH");
const buddhistFormatter = new Intl.DateTimeFormat(buddhistLocale, {
year: "numeric",
month: "long",
day: "numeric"
});
console.log(buddhistFormatter.format(date));
// "15 มีนาคม 2568"
يعرض التقويم البوذي التايلاندي نفس التاريخ كعام 2568، وهو متقدم بـ 543 عامًا عن التقويم الميلادي.
يمكنك أيضًا تجاوز التقويم بشكل صريح:
const date = new Date("2025-03-15");
const locale = new Intl.Locale("en-US", { calendar: "hebrew" });
const formatter = new Intl.DateTimeFormat(locale, {
year: "numeric",
month: "long",
day: "numeric"
});
console.log(formatter.format(date));
// "15 Adar II 5785"
يقوم هذا بتنسيق التاريخ في التقويم العبري، مع عرض السنة والشهر العبريين المقابلين.
استخدام معلومات نظام الترقيم لتنسيق الأرقام
قم بتطبيق معلومات نظام الترقيم عند تنسيق الأرقام باستخدام Intl.NumberFormat:
const number = 123456;
const latinLocale = new Intl.Locale("ar-EG", { numberingSystem: "latn" });
const latinFormatter = new Intl.NumberFormat(latinLocale);
console.log(latinFormatter.format(number));
// "123,456"
const arabicLocale = new Intl.Locale("ar-EG", { numberingSystem: "arab" });
const arabicFormatter = new Intl.NumberFormat(arabicLocale);
console.log(arabicFormatter.format(number));
// "١٢٣٬٤٥٦"
يتم عرض نفس الرقم برموز أرقام مختلفة بناءً على نظام الترقيم.
إنشاء محدد تقويم
استخدم معلومات التقويم لإنشاء واجهات مستخدم تتيح للمستخدمين اختيار التقويم المفضل لديهم:
function getCalendarOptions(localeString) {
const locale = new Intl.Locale(localeString);
const calendars = locale.getCalendars();
return calendars.map(calendar => ({
value: calendar,
label: calendar.charAt(0).toUpperCase() + calendar.slice(1)
}));
}
const options = getCalendarOptions("ar-SA");
console.log(options);
// [
// { value: "gregory", label: "Gregory" },
// { value: "islamic", label: "Islamic" },
// { value: "islamic-civil", label: "Islamic-civil" }
// ]
ينشئ هذا قائمة بخيارات التقويم المناسبة لمستخدمي اللغة العربية السعودية، الذين يستخدمون عادةً تقويمات متعددة.
إنشاء محدد نظام ترقيم
قم بإنشاء واجهات مستخدم لتفضيلات نظام الترقيم:
function getNumberingSystemOptions(localeString) {
const locale = new Intl.Locale(localeString);
const systems = locale.getNumberingSystems();
const labels = {
latn: "Western (0-9)",
arab: "Arabic-Indic (٠-٩)",
arabext: "Eastern Arabic (۰-۹)",
deva: "Devanagari (०-९)",
beng: "Bengali (০-৯)"
};
return systems.map(system => ({
value: system,
label: labels[system] || system
}));
}
const options = getNumberingSystemOptions("ar-EG");
console.log(options);
// [{ value: "arab", label: "Arabic-Indic (٠-٩)" }]
يوفر هذا تسميات واضحة لخيارات نظام الترقيم، مع إظهار شكل كل خيار للمستخدمين.
التحقق من توافق التقويم
قبل تطبيق تقويم على لغة محلية، تحقق من أن اللغة المحلية تدعم هذا التقويم:
function supportsCalendar(localeString, calendar) {
const locale = new Intl.Locale(localeString);
const supportedCalendars = locale.getCalendars();
return supportedCalendars.includes(calendar);
}
console.log(supportsCalendar("th-TH", "buddhist"));
// true
console.log(supportsCalendar("en-US", "buddhist"));
// false
تدعم اللغات المحلية التايلاندية التقويم البوذي، لكن اللغات المحلية الإنجليزية الأمريكية لا تستخدمه بشكل شائع.
التحقق من توافق نظام الترقيم
تحقق مما إذا كانت اللغة المحلية تدعم نظام ترقيم معين:
function supportsNumberingSystem(localeString, numberingSystem) {
const locale = new Intl.Locale(localeString);
const supportedSystems = locale.getNumberingSystems();
return supportedSystems.includes(numberingSystem);
}
console.log(supportsNumberingSystem("ar-EG", "arab"));
// true
console.log(supportsNumberingSystem("en-US", "arab"));
// false
اللغة العربية المصرية تدعم الأرقام العربية الهندية، لكن الإنجليزية الأمريكية لا تستخدمها.
تحديد التقويم الفعلي للتنسيق
عند تنسيق التواريخ، حدد التقويم الذي سيتم استخدامه فعلياً:
function getEffectiveCalendar(localeString) {
const locale = new Intl.Locale(localeString);
if (locale.calendar) {
return locale.calendar;
}
const defaultCalendars = locale.getCalendars();
return defaultCalendars[0];
}
console.log(getEffectiveCalendar("th-TH"));
// "buddhist"
console.log(getEffectiveCalendar("en-US-u-ca-islamic"));
// "islamic"
تُرجع هذه الدالة التقويم المحدد صراحةً إذا كان موجوداً، وإلا فإنها تُرجع التقويم الافتراضي للغة المحلية.
تحديد نظام الترقيم الفعلي للتنسيق
حدد نظام الترقيم الذي سيتم استخدامه عند تنسيق الأرقام:
function getEffectiveNumberingSystem(localeString) {
const locale = new Intl.Locale(localeString);
if (locale.numberingSystem) {
return locale.numberingSystem;
}
const defaultSystems = locale.getNumberingSystems();
return defaultSystems[0];
}
console.log(getEffectiveNumberingSystem("ar-EG"));
// "arab"
console.log(getEffectiveNumberingSystem("ar-EG-u-nu-latn"));
// "latn"
يُرجع هذا نظام الترقيم المحدد صراحةً إذا كان موجوداً، وإلا فإنه يُرجع النظام الافتراضي للغة المحلية.
تخزين تفضيلات تقويم المستخدم
عندما يختار المستخدمون تفضيل تقويم معين، قم بتخزينه كسلسلة لغة محلية مع الامتدادات:
function setUserCalendarPreference(baseLocale, calendar) {
const locale = new Intl.Locale(baseLocale, { calendar });
return locale.toString();
}
const preference = setUserCalendarPreference("en-US", "buddhist");
console.log(preference);
// "en-US-u-ca-buddhist"
ينشئ هذا سلسلة لغة محلية كاملة تحافظ على تفضيل التقويم. قم بتخزين هذه السلسلة في إعدادات المستخدم أو ملفات تعريف الارتباط.
تخزين تفضيلات نظام ترقيم المستخدم
قم بتخزين تفضيلات نظام الترقيم بنفس الطريقة:
function setUserNumberingPreference(baseLocale, numberingSystem) {
const locale = new Intl.Locale(baseLocale, { numberingSystem });
return locale.toString();
}
const preference = setUserNumberingPreference("ar-SA", "latn");
console.log(preference);
// "ar-SA-u-nu-latn"
تتضمن سلسلة اللغة المحلية تفضيل نظام الترقيم ويمكن استخدامها مباشرةً مع واجهات برمجة التطبيقات الخاصة بالتنسيق.
التعامل مع تفضيلات متعددة في وقت واحد
يمكن أن يكون لدى المستخدمين تفضيلات لكل من التقويم ونظام الترقيم:
function createLocaleWithPreferences(baseLocale, options) {
const locale = new Intl.Locale(baseLocale, {
calendar: options.calendar,
numberingSystem: options.numberingSystem
});
return locale.toString();
}
const preference = createLocaleWithPreferences("ar-SA", {
calendar: "islamic",
numberingSystem: "latn"
});
console.log(preference);
// "ar-SA-u-ca-islamic-nu-latn"
يجمع هذا تفضيلات تنسيق متعددة في سلسلة لغة محلية واحدة.
التحقق من خيارات التنسيق المحلولة
بعد إنشاء أداة تنسيق، تحقق من التقويم ونظام الترقيم الذي تستخدمه:
const locale = new Intl.Locale("th-TH");
const formatter = new Intl.DateTimeFormat(locale, {
year: "numeric",
month: "long",
day: "numeric"
});
const options = formatter.resolvedOptions();
console.log(options.calendar);
// "buddhist"
console.log(options.numberingSystem);
// "latn"
تُظهر طريقة resolvedOptions() التقويم ونظام الترقيم الذي يستخدمه المُنسِّق فعلياً بعد حل الإعدادات الافتراضية وتفضيلات المستخدم.
دعم المتصفحات
واجهة برمجة التطبيقات Intl.Locale مدعومة في جميع المتصفحات الحديثة. تتطلب طريقتا getCalendars() و getNumberingSystems() إصدارات حديثة من المتصفحات. يدعم Chrome 99 وFirefox 99 وSafari 15.4 وEdge 99 هذه الطرق. يدعمها Node.js ابتداءً من الإصدار 18.
تتمتع خاصيتا calendar و numberingSystem بدعم أوسع، وهما متاحتان منذ تقديم Intl.Locale في Chrome 74 وFirefox 75 وSafari 14 وNode.js 12.
تحقق من دعم الطريقة قبل الاستخدام:
const locale = new Intl.Locale("th-TH");
if (typeof locale.getCalendars === "function") {
const calendars = locale.getCalendars();
console.log(calendars);
}
يضمن هذا عمل الكود الخاص بك في البيئات التي تدعم Intl.Locale ولكنها تفتقر إلى الطرق الأحدث.
الخلاصة
توفر JavaScript أدوات للكشف عن التقويم وأنظمة الترقيم التي يستخدمها اللوكيل من خلال واجهة برمجة التطبيقات Intl.Locale. تساعدك هذه الأدوات على تنسيق التواريخ والأرقام بشكل صحيح للثقافات المختلفة دون ترميز الافتراضات بشكل ثابت.
المفاهيم الأساسية:
- استخدم
getCalendars()للحصول على مصفوفة من التقويمات الشائعة الاستخدام للوكيل - استخدم
getNumberingSystems()للحصول على مصفوفة من أنظمة الترقيم الشائعة الاستخدام للوكيل - تُرجع خاصية
calendarالتقويم المحدد صراحةً أوundefined - تُرجع خاصية
numberingSystemنظام الترقيم المحدد صراحةً أوundefined - تستخدم اللوكيلات المختلفة تقويمات وأنظمة ترقيم افتراضية مختلفة
- طبّق معلومات التقويم ونظام الترقيم عند إنشاء المُنسِّقات
- احفظ تفضيلات المستخدم كسلاسل لوكيل مع امتدادات Unicode
- تحقق من أن اللوكيلات تدعم تقويمات وأنظمة ترقيم محددة قبل تطبيقها
استخدم هذه الطرق عند إنشاء محددات اللغة، أو تخزين تفضيلات المستخدم، أو التحقق من صحة خيارات التنسيق، أو إنشاء تطبيقات متعددة اللغات تحترم الاتفاقيات الثقافية للتواريخ والأرقام.