كيفية عرض AM/PM أو فترات اليوم الخاصة بكل لغة

استخدم JavaScript لعرض فترات الوقت التي تتطابق مع طريقة تقسيم اليوم في كل ثقافة

مقدمة

عندما تعرض وقتاً مثل 4:00، يحتاج المستخدمون إلى سياق لمعرفة ما إذا كان يحدث في الصباح أو بعد الظهر. في اللغة الإنجليزية، تضيف AM أو PM للتوضيح. 4:00 AM يحدث قبل شروق الشمس، بينما 4:00 PM يحدث بعد الظهر.

اللغات الأخرى لا تترجم AM و PM ببساطة. العديد من الثقافات تقسم اليوم إلى أكثر من فترتين، مع مصطلحات محددة للصباح الباكر، والصباح المتأخر، وبعد الظهر، والمساء، والليل. الإسبانية لديها "madrugada" للساعات بعد منتصف الليل ولكن قبل الفجر. الألمانية تقسم اليوم إلى ست فترات متميزة بدلاً من اثنتين. بعض اللغات تسمي 1:00 AM "1 في الليل" بدلاً من "1 في الصباح".

توفر Intl.DateTimeFormat في JavaScript خيار dayPeriod لعرض هذه التقسيمات الزمنية الخاصة بكل ثقافة تلقائياً. يشرح هذا الدرس كيفية عمل فترات اليوم عبر الثقافات، ولماذا تهم التطبيقات الدولية، وكيفية تنسيق الأوقات مع تسميات فترات اليوم المناسبة.

لماذا تختلف فترات اليوم حسب الثقافة

طورت الثقافات المختلفة طرقاً مختلفة لتقسيم اليوم الذي يستمر 24 ساعة إلى فترات مسماة. تعكس هذه التقسيمات كيفية تفكير الناس في كل ثقافة وحديثهم عن الوقت.

يقسم المتحدثون بالإنجليزية اليوم إلى أربع فترات. يمتد الصباح من منتصف الليل إلى الظهر، وبعد الظهر من الظهر إلى المساء، والمساء من بعد الظهر المتأخر حتى حلول الظلام، والليل من الظلام حتى منتصف الليل. توفر المصطلحات AM و PM نظاماً أبسط من فترتين للساعة ذات الـ 12 ساعة.

يتعرف المتحدثون بالإسبانية على "madrugada" كفترة متميزة تغطي الساعات بعد منتصف الليل ولكن قبل أن يستيقظ الناس عادةً. هذا يخلق نظامًا من خمس فترات يميز بين ساعات الليل المتأخرة وساعات الصباح الباكر.

يستخدم المتحدثون بالروسية "ночь" (ليل) للإشارة إلى أي ساعة يكون فيها الناس نائمين عادةً. الساعة 1:00 صباحًا هي "1 في الليل" بدلاً من "1 في الصباح" لأن الناس عادةً ما يكونون نائمين في تلك الساعة.

تقسم الألمانية اليوم إلى ست فترات. "Morgen" (صباح)، "Vormittag" (قبل الظهر)، "Mittag" (منتصف النهار)، "Nachmittag" (بعد الظهر)، "Abend" (مساء)، و"Nacht" (ليل) تغطي كل منها نطاقات محددة من الساعات.

تستخدم الإندونيسية "pagi" (من الفجر حتى 10 صباحًا)، "siang" (من 10 صباحًا حتى 2 ظهرًا)، "sore" (من 2 ظهرًا حتى غروب الشمس)، و"malam" (ليل) لتقسيم اليوم إلى أربع فترات بناءً على موضع الشمس.

تقسم البنغالية اليوم إلى ست فترات. "ভোর" (فجر)، "সকাল" (صباح)، "দুপুর" (بعد الظهر المبكر)، "বিকাল" (بعد الظهر المتأخر)، "সন্ধ্যা" (مساء)، و"রাত" (ليل) لكل منها نطاقات زمنية محددة.

عندما تعرض الأوقات في تطبيق دولي، تحتاج إلى استخدام مصطلحات تتطابق مع كيفية حديث المستخدمين في كل ثقافة بشكل طبيعي عن الوقت. إظهار "4 صباحًا" لجميع المستخدمين يتجاهل كيفية وصف اللغات الأخرى لتلك الساعة.

فهم خيار dayPeriod

يخبر خيار dayPeriod في Intl.DateTimeFormat المنسق بتضمين فترة اليوم الخاصة بالمنطقة عند تنسيق الوقت. بدلاً من عرض الساعة والدقيقة فقط، يضيف المنسق المصطلح المناسب لذلك الوقت من اليوم في اللغة المستهدفة.

يعمل هذا الخيار فقط مع تنسيقات الوقت ذات 12 ساعة. في تنسيقات 24 ساعة، يوفر رقم الساعة نفسه سياقًا كافيًا. 04:00 هو بوضوح صباح و16:00 هو بوضوح بعد الظهر دون تسميات إضافية. توجد فترات اليوم لإزالة الغموض عن الساعات المتكررة في تنسيق 12 ساعة.

يقبل الخيار dayPeriod ثلاث قيم. ينتج narrow أقصر شكل ممكن، غالباً حرف واحد أو اختصار. ينتج short شكلاً مختصراً. ينتج long الكلمة أو العبارة الكاملة.

بالنسبة للعديد من اللغات المحلية، تنتج هذه القيم الثلاث مخرجات متطابقة. لا تحدد بيانات اللغة المحلية في Unicode أشكالاً مميزة لكل مجموعة من اللغة المحلية وطول التنسيق. عندما لا توجد أشكال مميزة، يستخدم المنسق نفس المخرجات بغض النظر عن القيمة التي تحددها.

تنسيق الأوقات مع فترات اليوم

لعرض فترة اليوم، أنشئ نسخة من Intl.DateTimeFormat مع تعيين الخيار dayPeriod إلى narrow أو short أو long. يجب أيضاً تضمين خيار مكون الوقت مثل hour وتحديد تنسيق 12 ساعة باستخدام hourCycle.

const date = new Date('2025-01-15T04:30:00');

const formatter = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  minute: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'long'
});

console.log(formatter.format(date));
// Output: "4:30 in the morning"

ينشئ هذا منسقاً يعرض الساعة والدقيقة وفترة اليوم. يحدد الخيار hourCycle: 'h12' تنسيق 12 ساعة، وهو مطلوب لظهور فترات اليوم. يطلب الخيار dayPeriod: 'long' عبارة فترة اليوم الكاملة.

بدون الخيار dayPeriod، سيعرض المنسق "4:30 AM" بدلاً من ذلك. يستبدل خيار فترة اليوم مؤشر AM/PM البسيط بعبارة أكثر وصفاً.

عرض فترات اليوم عبر أوقات مختلفة

تتغير فترات اليوم بناءً على الوقت الذي يتم تنسيقه. يختار المنسق تلقائياً الفترة المناسبة لكل وقت وفقاً لاصطلاحات اللغة المحلية.

const options = {
  hour: 'numeric',
  minute: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'long'
};

const formatter = new Intl.DateTimeFormat('en-US', options);

const morning = new Date('2025-01-15T04:30:00');
console.log(formatter.format(morning));
// Output: "4:30 in the morning"

const afternoon = new Date('2025-01-15T14:30:00');
console.log(formatter.format(afternoon));
// Output: "2:30 in the afternoon"

const evening = new Date('2025-01-15T20:30:00');
console.log(formatter.format(evening));
// Output: "8:30 in the evening"

const night = new Date('2025-01-15T23:30:00');
console.log(formatter.format(night));
// Output: "11:30 at night"

تميز اللغة الإنجليزية بين الصباح وبعد الظهر والمساء والليل. يتلقى كل وقت العبارة المناسبة بناءً على الساعة. لا تحتاج إلى تحديد الفترة المناسبة. يتعامل المنسق مع هذا تلقائياً بناءً على بيانات اللغة المحلية في Unicode.

مقارنة التنسيقات الضيقة والقصيرة والطويلة

تنتج أطوال التنسيق الثلاثة مخرجات مختلفة في بعض اللغات. تختلف الفروقات حسب اللغة وقد تكون طفيفة أو غير موجودة.

const date = new Date('2025-01-15T04:30:00');

const narrow = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'narrow'
});
console.log(narrow.format(date));
// Output: "4 in the morning"

const short = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'short'
});
console.log(short.format(date));
// Output: "4 in the morning"

const long = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'long'
});
console.log(long.format(date));
// Output: "4 in the morning"

بالنسبة للإنجليزية الأمريكية، تنتج جميع الأطوال الثلاثة مخرجات متطابقة. لا تحدد بيانات اللغة أشكالاً مختلفة لهذا المزيج من اللغة والوقت.

بعض اللغات تميز بين الأطوال. تنتج الفرنسية مخرجات مختلفة للتنسيقات الضيقة والطويلة.

const date = new Date('2025-01-15T04:30:00');

const frNarrow = new Intl.DateTimeFormat('fr-FR', {
  hour: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'narrow'
});
console.log(frNarrow.format(date));
// Output: "4 mat."

const frLong = new Intl.DateTimeFormat('fr-FR', {
  hour: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'long'
});
console.log(frLong.format(date));
// Output: "4 du matin"

تستخدم الفرنسية "mat." كشكل مختصر و"du matin" كشكل طويل. كلاهما يعني الصباح، لكن الشكل الطويل أكثر وضوحاً.

ما لم تكن لديك قيود محددة على المساحة تتطلب أقصر مخرجات ممكنة، استخدم long للوضوح. الأشكال الأطول أسهل للمستخدمين في الفهم، والعديد من اللغات لا توفر بدائل أقصر على أي حال.

كيف تعمل فترات اليوم عبر اللغات المختلفة

تستخدم اللغات المختلفة مصطلحات مختلفة لفترات اليوم وتقسم اليوم عند حدود مختلفة. يطبق المنسق تلقائياً الاصطلاحات الخاصة بكل لغة.

const date = new Date('2025-01-15T04:30:00');
const options = {
  hour: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'long'
};

const enUS = new Intl.DateTimeFormat('en-US', options);
console.log(enUS.format(date));
// Output: "4 in the morning"

const enGB = new Intl.DateTimeFormat('en-GB', options);
console.log(enGB.format(date));
// Output: "4 at night"

const deDK = new Intl.DateTimeFormat('de-DE', options);
console.log(deDK.format(date));
// Output: "4 morgens"

const fr = new Intl.DateTimeFormat('fr-FR', options);
console.log(fr.format(date));
// Output: "4 du matin"

تعتبر الإنجليزية البريطانية الساعة 4:30 صباحاً "في الليل" بدلاً من "في الصباح"، مما يعكس حدوداً ثقافية مختلفة لفترات اليوم. تستخدم الألمانية "morgens" لساعات الصباح. تستخدم الفرنسية "du matin" لنفس الفترة.

هذه الاختلافات ليست أخطاء أو تناقضات. إنها تعكس اختلافات ثقافية حقيقية في كيفية تصور الناس والحديث عن الوقت. يحترم المنسق هذه الاختلافات تلقائياً بناءً على اللغة.

فترات اليوم تتطلب تنسيق 12 ساعة

يعمل خيار dayPeriod فقط عندما تحدد تنسيق 12 ساعة باستخدام hourCycle: 'h12' أو hourCycle: 'h11'. بدون تنسيق 12 ساعة، لا تظهر فترات اليوم.

const date = new Date('2025-01-15T04:30:00');

const with12Hour = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'long'
});
console.log(with12Hour.format(date));
// Output: "4 in the morning"

const with24Hour = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  hourCycle: 'h23',
  dayPeriod: 'long'
});
console.log(with24Hour.format(date));
// Output: "04"

لا يعرض تنسيق الـ 24 ساعة فترة اليوم حتى لو تم تحديد الخيار. في تنسيق الـ 24 ساعة، يوفر رقم الساعة سياقاً كافياً دون الحاجة إلى تسميات إضافية.

يتعلق الفرق بين h12 و h11 بكيفية ترقيم منتصف الليل والظهر. استخدم h12 للساعة القياسية ذات الـ 12 ساعة حيث تتراوح الساعات من 1 إلى 12. استخدم h11 لنظام الساعات من 0 إلى 11. كلاهما يعمل مع فترات اليوم.

دمج فترات اليوم مع الدقائق والثواني

يمكنك تضمين الدقائق والثواني مع فترات اليوم. يضع المنسق فترة اليوم بشكل مناسب وفقاً لاصطلاحات اللغة المحلية.

const date = new Date('2025-01-15T04:30:45');

const withMinutes = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  minute: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'long'
});
console.log(withMinutes.format(date));
// Output: "4:30 in the morning"

const withSeconds = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'long'
});
console.log(withSeconds.format(date));
// Output: "4:30:45 in the morning"

تظهر فترة اليوم بعد مكونات الوقت. لا تحتاج إلى وضع أو تنسيق فترة اليوم يدوياً. يتعامل المنسق مع التخطيط وفقاً لاصطلاحات اللغة المحلية.

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

بدلاً من تحديد لغة محلية معينة بشكل ثابت، استخدم اللغة المفضلة للمستخدم من المتصفح. تُرجع الخاصية navigator.language تفضيل اللغة الأول للمستخدم.

const date = new Date('2025-01-15T04:30:00');

const formatter = new Intl.DateTimeFormat(navigator.language, {
  hour: 'numeric',
  minute: 'numeric',
  hourCycle: 'h12',
  dayPeriod: 'long'
});

console.log(formatter.format(date));
// Output varies by user's locale
// For en-US: "4:30 in the morning"
// For en-GB: "4:30 at night"
// For de-DE: "4:30 morgens"
// For fr-FR: "4:30 du matin"

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

متى تستخدم فترات اليوم

تعمل فترات اليوم بشكل جيد عندما تريد توفير سياق أكثر من مؤشرات AM/PM البسيطة. إنها تجعل الأوقات أكثر حوارية وأسهل في التفسير من النظرة الأولى.

استخدم فترات اليوم في واجهات المستخدم حيث تظهر الأوقات جنباً إلى جنب مع النص الوصفي. التقويم الذي يعرض "4:30 في الصباح" أوضح من "4:30 AM" لأن العبارة تبدو أكثر طبيعية في النص المتواصل.

استخدم فترات اليوم في الإشعارات والرسائل حيث تحسّن اللغة الحوارية من سهولة القراءة. "يبدأ اجتماعك في الساعة 8:30 مساءً" أفضل قراءة من "يبدأ اجتماعك في الساعة 8:30 PM".

تجنب فترات اليوم في العروض المدمجة حيث تكون المساحة محدودة. تعمل الجداول والرسوم البيانية والتخطيطات الكثيفة بشكل أفضل مع مؤشرات AM/PM القياسية أو التنسيق على مدار 24 ساعة.

تجنب فترات اليوم عند عرض الأوقات بتنسيق 24 ساعة. لا تضيف فترة اليوم أي معلومات مفيدة عندما يشير رقم الساعة بالفعل إلى وقت اليوم.

الملخص

يعرض خيار dayPeriod في Intl.DateTimeFormat مصطلحات خاصة بالثقافة لأوقات اليوم. تقسم الثقافات المختلفة اليوم بشكل مختلف، باستخدام مصطلحات مثل "madrugada" في الإسبانية أو ست فترات متميزة في الألمانية بدلاً من AM وPM فقط.

يقبل الخيار ثلاث قيم. ينتج narrow الشكل الأقصر، وينتج short شكلاً مختصراً، وينتج long العبارة الكاملة. تنتج العديد من اللغات المحلية مخرجات متطابقة للقيم الثلاث جميعها.

تظهر فترات اليوم فقط عند استخدام تنسيق 12 ساعة المحدد بـ hourCycle: 'h12' أو hourCycle: 'h11'. لا تظهر في تنسيق 24 ساعة لأن رقم الساعة يوفر سياقاً كافياً.

تستخدم اللغات المحلية المختلفة مصطلحات مختلفة لفترات اليوم وترسم الحدود في ساعات مختلفة. يطبق المنسق هذه الاصطلاحات تلقائياً بناءً على معرّف اللغة المحلية. تعامل الإنجليزية البريطانية الساعة 4:30 صباحاً على أنها "في الليل" بينما تعاملها الإنجليزية الأمريكية على أنها "في الصباح".