Comment vérifier quel calendrier ou système de numérotation utilise une locale
Détecter et valider les systèmes de calendrier et les formats de numérotation pour n'importe quelle locale avec JavaScript
Introduction
Lorsqu'une personne en Thaïlande consulte une date sur votre application web, elle s'attend à voir des dates dans le calendrier bouddhiste, et non dans le calendrier grégorien utilisé dans les pays occidentaux. De même, les locuteurs arabes s'attendent à voir les chiffres rendus comme ١٢٣ au lieu de 123. Différentes cultures utilisent différents systèmes de calendrier et de numération, et JavaScript fournit des outils pour détecter lesquels s'appliquent à des locales spécifiques.
L'API Intl.Locale comprend des propriétés et des méthodes qui révèlent quels calendriers et systèmes de numération une locale utilise. Ces informations vous aident à formater correctement les dates et les nombres sans coder en dur des hypothèses sur les systèmes que différentes cultures préfèrent.
Ce guide explique comment vérifier les systèmes de calendrier et de numération pour les locales, comprendre ce que signifient les différents systèmes et utiliser ces informations pour formater le contenu de manière appropriée.
Comprendre les systèmes de calendrier
Un système de calendrier est une façon d'organiser le temps en années, mois et jours. Bien que le calendrier grégorien soit répandu, de nombreuses cultures utilisent différents systèmes de calendrier pour des raisons religieuses, historiques ou culturelles.
Les systèmes de calendrier les plus courants comprennent :
gregorypour le calendrier grégorien, utilisé dans la plupart des pays occidentauxbuddhistpour le calendrier bouddhiste, utilisé en Thaïlande, au Cambodge et au Myanmarislamicpour le calendrier lunaire islamique, utilisé à des fins religieuses dans les pays musulmanshebrewpour le calendrier hébraïque, utilisé en Israël et pour les observances religieuses juivesjapanesepour le calendrier japonais, qui utilise les noms d'ère impérialechinesepour le calendrier luni-solaire chinois, utilisé pour les fêtes traditionnellespersianpour le calendrier solaire persan, utilisé en Iran et en Afghanistanindianpour le calendrier national indiencopticpour le calendrier copte, utilisé en Égypte par les chrétiens coptes
Différentes régions utilisent différents calendriers comme valeur par défaut, et certaines régions utilisent couramment plusieurs systèmes de calendrier.
Comprendre les systèmes de numération
Un système de numération est un ensemble de symboles utilisés pour représenter des chiffres. Alors que les pays occidentaux utilisent les chiffres latins (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), d'autres cultures utilisent différents symboles pour représenter les mêmes valeurs numériques.
Les systèmes de numération courants comprennent :
latnpour les chiffres latins : 0 1 2 3 4 5 6 7 8 9arabpour les chiffres arabo-indiens : ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩arabextpour les chiffres arabo-indiens orientaux : ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹devapour les chiffres devanagari : ० १ २ ३ ४ ५ ६ ७ ८ ९bengpour les chiffres bengalis : ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯thaipour les chiffres thaïlandais : ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙hanidecpour les nombres décimaux chinoisfullwidepour les chiffres pleine largeur utilisés dans la typographie est-asiatique
Tous les systèmes de numération représentent les mêmes valeurs numériques mais utilisent différents symboles visuels basés sur le système d'écriture de la langue.
Vérifier le calendrier par défaut pour une locale
La méthode getCalendars() renvoie un tableau des systèmes de calendrier couramment utilisés pour une locale, triés par préférence. Le premier élément est le calendrier par défaut.
const locale = new Intl.Locale("th-TH");
const calendars = locale.getCalendars();
console.log(calendars);
// ["buddhist", "gregory"]
Les locales thaïlandaises utilisent par défaut le calendrier bouddhiste mais utilisent également couramment le calendrier grégorien. Cela vous indique que lors du formatage des dates pour les utilisateurs thaïlandais, le calendrier bouddhiste est préféré.
Différentes locales renvoient différentes préférences de calendrier :
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"]
L'anglais américain utilise uniquement le calendrier grégorien. L'arabe d'Arabie saoudite utilise couramment à la fois les calendriers grégorien et islamique. Les locales japonaises utilisent à la fois les calendriers grégorien et impérial japonais.
Le tableau contient tous les calendriers couramment utilisés dans cette locale, vous permettant d'offrir plusieurs options de calendrier lorsque cela est approprié.
Vérifier le système de numération par défaut pour une locale
La méthode getNumberingSystems() renvoie un tableau des systèmes de numération couramment utilisés pour une locale. Le premier élément est le système de numération par défaut.
const locale = new Intl.Locale("ar-EG");
const numberingSystems = locale.getNumberingSystems();
console.log(numberingSystems);
// ["arab"]
L'arabe égyptien utilise par défaut les chiffres arabo-indiens. Lors du formatage des nombres pour les utilisateurs arabes égyptiens, utilisez le système de numération arabo-indien, sauf si l'utilisateur a spécifié autrement.
Différentes locales utilisent différents systèmes de numération par défaut :
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"]
L'anglais américain utilise les chiffres latins. Le hindi en Inde utilise également les chiffres latins par défaut dans les contextes modernes, bien que les chiffres dévanagari existent. Le thaï utilise les chiffres latins par défaut dans la plupart des contextes modernes.
De nombreuses locales modernes utilisent par défaut les chiffres latins même lorsque des systèmes de numération traditionnels existent, reflétant les modèles d'utilisation actuels.
Lire le calendrier actif d'une locale
La propriété calendar renvoie le système de calendrier explicitement défini pour une locale. Si aucun calendrier n'est spécifié, elle renvoie undefined.
const locale = new Intl.Locale("en-US");
console.log(locale.calendar);
// undefined
Une locale de base sans extensions de calendrier renvoie undefined. La locale utilisera son calendrier par défaut lors du formatage des dates.
Vous pouvez créer des locales avec des préférences de calendrier explicites en utilisant des extensions Unicode :
const locale = new Intl.Locale("en-US-u-ca-buddhist");
console.log(locale.calendar);
// "buddhist"
L'extension -u-ca-buddhist spécifie le calendrier bouddhiste. La propriété calendar renvoie "buddhist".
Vous pouvez également définir le calendrier lors de la création de la locale :
const locale = new Intl.Locale("en-US", { calendar: "islamic" });
console.log(locale.calendar);
// "islamic"
L'objet options a priorité sur tout calendrier spécifié dans la chaîne de locale.
Lire le système de numération actif à partir d'une locale
La propriété numberingSystem renvoie le système de numération explicitement défini pour une locale. Si aucun système de numération n'est spécifié, elle renvoie undefined.
const locale = new Intl.Locale("en-US");
console.log(locale.numberingSystem);
// undefined
Une locale de base sans extensions de système de numération renvoie undefined. La locale utilisera son système de numération par défaut lors du formatage des nombres.
Vous pouvez créer des locales avec des préférences explicites de système de numération :
const locale = new Intl.Locale("en-US-u-nu-arab");
console.log(locale.numberingSystem);
// "arab"
L'extension -u-nu-arab spécifie les chiffres arabo-indiens. La propriété numberingSystem renvoie "arab".
Vous pouvez également définir le système de numération lors de la création de la locale :
const locale = new Intl.Locale("ar-SA", { numberingSystem: "latn" });
console.log(locale.numberingSystem);
// "latn"
Cela crée une locale arabe qui utilise les chiffres latins au lieu des chiffres arabo-indiens par défaut.
Détecter quand une locale a un calendrier explicite
Pour vérifier si une locale a un calendrier explicitement défini plutôt que d'utiliser son calendrier par défaut, vérifiez si la propriété calendar est définie :
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
Cette distinction est importante lorsque vous devez déterminer si l'utilisateur a explicitement choisi une préférence de calendrier ou si vous devez utiliser le calendrier par défaut de la locale.
Détecter quand une locale a un système de numération explicite
De même, vérifiez si la propriété numberingSystem est définie pour détecter les préférences explicites de système de numération :
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
La première locale utilisera le système de numération par défaut pour l'arabe égyptien. La seconde locale demande explicitement des chiffres latins.
Utiliser les informations de calendrier pour formater les dates
Une fois que vous savez quel calendrier une locale utilise, appliquez-le lors du formatage des dates avec 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"
Le calendrier bouddhiste thaïlandais affiche la même date comme année 2568, soit 543 ans en avance sur le calendrier grégorien.
Vous pouvez également remplacer explicitement le calendrier :
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"
Ceci formate la date dans le calendrier hébraïque, affichant l'année et le mois hébraïques correspondants.
Utiliser les informations de système de numération pour formater les nombres
Appliquez les informations du système de numération lors du formatage des nombres avec 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));
// "١٢٣٬٤٥٦"
Le même nombre s'affiche avec différents symboles de chiffres selon le système de numération.
Construire un sélecteur de calendrier
Utilisez les informations de calendrier pour créer des interfaces utilisateur permettant aux utilisateurs de choisir leur calendrier préféré :
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" }
// ]
Cela crée une liste d'options de calendrier appropriées pour les utilisateurs arabes d'Arabie saoudite, qui utilisent couramment plusieurs calendriers.
Construire un sélecteur de système de numération
Créez des interfaces utilisateur pour les préférences de système de numération :
function getNumberingSystemOptions(localeString) {
const locale = new Intl.Locale(localeString);
const systems = locale.getNumberingSystems();
const labels = {
latn: "Occidental (0-9)",
arab: "Indo-arabe (٠-٩)",
arabext: "Arabe oriental (۰-۹)",
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: "Indo-arabe (٠-٩)" }]
Cela fournit des libellés clairs pour les options de système de numération, montrant aux utilisateurs à quoi ressemble chaque choix.
Valider la compatibilité des calendriers
Avant d'appliquer un calendrier à une locale, vérifiez que la locale prend en charge ce calendrier :
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
Les locales thaïlandaises prennent en charge le calendrier bouddhiste, mais les locales en anglais américain ne l'utilisent pas couramment.
Valider la compatibilité du système de numération
Vérifiez si une locale prend en charge un système de numération spécifique :
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
L'arabe égyptien prend en charge les chiffres indo-arabes, mais l'anglais américain ne les utilise pas.
Déterminer le calendrier effectif pour le formatage
Lors du formatage des dates, déterminez quel calendrier sera effectivement utilisé :
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"
Cette fonction renvoie le calendrier explicitement défini s'il en existe un, sinon elle renvoie le calendrier par défaut pour la locale.
Déterminer le système de numération effectif pour le formatage
Déterminez quel système de numération sera utilisé lors du formatage des nombres :
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"
Cela renvoie le système de numération explicitement défini s'il est présent, sinon celui par défaut pour la locale.
Stocker les préférences de calendrier des utilisateurs
Lorsque les utilisateurs sélectionnent une préférence de calendrier, stockez-la sous forme de chaîne de locale avec des extensions :
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"
Cela crée une chaîne de locale complète qui préserve la préférence de calendrier. Stockez cette chaîne dans les paramètres utilisateur ou les cookies.
Stocker les préférences de système de numération des utilisateurs
Stockez les préférences de système de numération de la même manière :
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"
La chaîne de locale inclut la préférence de système de numération et peut être utilisée directement avec les API de formatage.
Gérer plusieurs préférences simultanément
Les utilisateurs peuvent avoir à la fois des préférences de calendrier et de système de numération :
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"
Cela combine plusieurs préférences de formatage en une seule chaîne de locale.
Vérifier les options de formatage résolues
Après avoir créé un formateur, vérifiez quel calendrier et système de numération il utilise :
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"
La méthode resolvedOptions() montre quel calendrier et système de numération le formateur utilise réellement après avoir résolu les valeurs par défaut et les préférences utilisateur.
Compatibilité des navigateurs
L'API Intl.Locale est prise en charge par tous les navigateurs modernes. Les méthodes getCalendars() et getNumberingSystems() nécessitent des versions récentes de navigateurs. Chrome 99, Firefox 99, Safari 15.4 et Edge 99 prennent en charge ces méthodes. Node.js les prend en charge à partir de la version 18.
Les propriétés calendar et numberingSystem bénéficient d'une prise en charge plus large, disponibles depuis l'introduction d'Intl.Locale dans Chrome 74, Firefox 75, Safari 14 et Node.js 12.
Vérifiez la prise en charge des méthodes avant de les utiliser :
const locale = new Intl.Locale("th-TH");
if (typeof locale.getCalendars === "function") {
const calendars = locale.getCalendars();
console.log(calendars);
}
Cela garantit que votre code fonctionne dans des environnements qui prennent en charge Intl.Locale mais qui ne disposent pas des méthodes plus récentes.
Résumé
JavaScript fournit des outils pour détecter quels calendriers et systèmes de numération une locale utilise via l'API Intl.Locale. Ces outils vous aident à formater correctement les dates et les nombres pour différentes cultures sans coder en dur des hypothèses.
Concepts clés :
- Utilisez
getCalendars()pour obtenir un tableau des calendriers couramment utilisés pour une locale - Utilisez
getNumberingSystems()pour obtenir un tableau des systèmes de numération couramment utilisés pour une locale - La propriété
calendarrenvoie le calendrier explicitement défini ouundefined - La propriété
numberingSystemrenvoie le système de numération explicitement défini ouundefined - Différentes locales utilisent par défaut différents calendriers et systèmes de numération
- Appliquez les informations de calendrier et de système de numération lors de la création de formateurs
- Stockez les préférences utilisateur sous forme de chaînes de locale avec des extensions Unicode
- Validez que les locales prennent en charge des calendriers et systèmes de numération spécifiques avant de les appliquer
Utilisez ces méthodes lors de la création de sélecteurs de locale, du stockage des préférences utilisateur, de la validation des options de formatage ou de la création d'applications internationalisées qui respectent les conventions culturelles pour les dates et les nombres.