refactor: fix i18n bug in node v22 (#10129)

This commit is contained in:
Sébastien Lorber 2024-05-10 15:53:23 +02:00 committed by GitHub
parent e48b7818af
commit 02e38d8ccf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -10,10 +10,36 @@ import {getLangDir} from 'rtl-detect';
import type {I18n, DocusaurusConfig, I18nLocaleConfig} from '@docusaurus/types'; import type {I18n, DocusaurusConfig, I18nLocaleConfig} from '@docusaurus/types';
import type {LoadContextParams} from './site'; import type {LoadContextParams} from './site';
function inferLanguageDisplayName(locale: string) {
const tryLocale = (l: string) => {
try {
return new Intl.DisplayNames(l, {
type: 'language',
fallback: 'code',
}).of(l)!;
} catch (e) {
// This is to compensate "of()" that is a bit strict
// Looks like starting Node 22, this locale throws: "en-US-u-ca-buddhist"
// RangeError: invalid_argument
return null;
}
};
const parts = locale.split('-');
// This is a best effort, we try various locale forms that could give a result
return (
tryLocale(locale) ??
tryLocale(`${parts[0]}-${parts[1]}`) ??
tryLocale(parts[0]!)
);
}
function getDefaultLocaleLabel(locale: string) { function getDefaultLocaleLabel(locale: string) {
const languageName = new Intl.DisplayNames(locale, {type: 'language'}).of( const languageName = inferLanguageDisplayName(locale);
locale, if (!languageName) {
)!; return locale;
}
return ( return (
languageName.charAt(0).toLocaleUpperCase(locale) + languageName.substring(1) languageName.charAt(0).toLocaleUpperCase(locale) + languageName.substring(1)
); );
@ -44,6 +70,7 @@ function getDefaultCalendar(localeStr: string) {
} }
export function getDefaultLocaleConfig(locale: string): I18nLocaleConfig { export function getDefaultLocaleConfig(locale: string): I18nLocaleConfig {
try {
return { return {
label: getDefaultLocaleLabel(locale), label: getDefaultLocaleLabel(locale),
direction: getLangDir(locale), direction: getLangDir(locale),
@ -51,6 +78,12 @@ export function getDefaultLocaleConfig(locale: string): I18nLocaleConfig {
calendar: getDefaultCalendar(locale), calendar: getDefaultCalendar(locale),
path: locale, path: locale,
}; };
} catch (e) {
throw new Error(
`Docusaurus couldn't get default locale config for ${locale}`,
{cause: e},
);
}
} }
export async function loadI18n( export async function loadI18n(