fix(core): fix default i18n calendar used, infer it from locale if possible (#9878)

This commit is contained in:
Sébastien Lorber 2024-02-22 17:06:12 +01:00 committed by GitHub
parent 85d74245f8
commit 6bf21d215c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 4 deletions

View file

@ -81,7 +81,7 @@ describe('defaultLocaleConfig', () => {
label: 'فارسی',
direction: 'rtl',
htmlLang: 'fa',
calendar: 'gregory',
calendar: 'persian',
path: 'fa',
});
expect(getDefaultLocaleConfig('fa-IR')).toEqual({
@ -89,7 +89,7 @@ describe('defaultLocaleConfig', () => {
label: 'فارسی (ایران)',
direction: 'rtl',
htmlLang: 'fa-IR',
calendar: 'gregory',
calendar: 'persian',
path: 'fa-IR',
});
expect(getDefaultLocaleConfig('en-US-u-ca-buddhist')).toEqual({

View file

@ -19,13 +19,36 @@ function getDefaultLocaleLabel(locale: string) {
);
}
function getDefaultCalendar(localeStr: string) {
const locale = new Intl.Locale(localeStr);
// If the locale name includes -u-ca-xxx the calendar will be defined
if (locale.calendar) {
return locale.calendar;
}
// Not well-supported but server code can infer a calendar from the locale
// See https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getCalendars
// See https://caniuse.com/mdn-javascript_builtins_intl_locale_getcalendars
const calendars =
// @ts-expect-error: new std method (Bun/JSC/WebKit)
locale.getCalendars?.() ??
// @ts-expect-error: non-std attribute (V8/Chromium/Node)
locale.calendars;
if (calendars instanceof Array && calendars[0]) {
return calendars[0];
}
return 'gregory';
}
export function getDefaultLocaleConfig(locale: string): I18nLocaleConfig {
return {
label: getDefaultLocaleLabel(locale),
direction: getLangDir(locale),
htmlLang: locale,
// If the locale name includes -u-ca-xxx the calendar will be defined
calendar: new Intl.Locale(locale).calendar ?? 'gregory',
calendar: getDefaultCalendar(locale),
path: locale,
};
}