Skip to content

Commit 8f71ab1

Browse files
authored
fix: DateFNS locale fallback mapping (#763)
* fix: local mapping * test: add test case * test: more test case
1 parent 73032a3 commit 8f71ab1

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

src/generate/dateFns.ts

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,15 @@ import {
2323
setSeconds,
2424
setYear,
2525
startOfWeek,
26+
type Locale,
2627
} from 'date-fns';
27-
import * as Locale from 'date-fns/locale';
28+
import * as locales from 'date-fns/locale';
2829
import type { GenerateConfig } from '.';
2930

30-
const localeMap: Record<string, string> = {
31-
ko_KR: 'ko'
32-
};
33-
34-
const dealLocal = (str: string) => {
35-
return localeMap[str] || str.replace(/_/g, '');
31+
const getLocale = (locale: string): Locale => {
32+
return (
33+
locales[locale] || locales[locale.replace(/_/g, '')] || locales[locale.replace(/_.*$/g, '')]
34+
);
3635
};
3736

3837
const localeParse = (format: string) => {
@@ -76,21 +75,21 @@ const generateConfig: GenerateConfig<Date> = {
7675

7776
locale: {
7877
getWeekFirstDay: (locale) => {
79-
const clone = Locale[dealLocal(locale)];
78+
const clone = getLocale(locale);
8079
return clone.options.weekStartsOn;
8180
},
8281
getWeekFirstDate: (locale, date) => {
83-
return startOfWeek(date, { locale: Locale[dealLocal(locale)] });
82+
return startOfWeek(date, { locale: getLocale(locale) });
8483
},
8584
getWeek: (locale, date) => {
86-
return getWeek(date, { locale: Locale[dealLocal(locale)] });
85+
return getWeek(date, { locale: getLocale(locale) });
8786
},
8887
getShortWeekDays: (locale) => {
89-
const clone = Locale[dealLocal(locale)];
88+
const clone = getLocale(locale);
9089
return Array.from({ length: 7 }).map((_, i) => clone.localize.day(i, { width: 'short' }));
9190
},
9291
getShortMonths: (locale) => {
93-
const clone = Locale[dealLocal(locale)];
92+
const clone = getLocale(locale);
9493
return Array.from({ length: 12 }).map((_, i) =>
9594
clone.localize.month(i, { width: 'abbreviated' }),
9695
);
@@ -100,15 +99,15 @@ const generateConfig: GenerateConfig<Date> = {
10099
return null;
101100
}
102101
return formatDate(date, localeParse(format), {
103-
locale: Locale[dealLocal(locale)],
102+
locale: getLocale(locale),
104103
});
105104
},
106105
parse: (locale, text, formats) => {
107106
for (let i = 0; i < formats.length; i += 1) {
108107
const format = localeParse(formats[i]);
109108
const formatText = text;
110109
const date = parseDate(formatText, format, new Date(), {
111-
locale: Locale[dealLocal(locale)],
110+
locale: getLocale(locale),
112111
});
113112
if (isValid(date)) {
114113
return date;

tests/generate.spec.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,3 +309,17 @@ describe('Generate:dayjs', () => {
309309
expect(dateb).toEqual('2022-11-23 13:05');
310310
});
311311
});
312+
313+
describe('Generate:date-fns', () => {
314+
it('getWeekFirstDay', () => {
315+
expect(dateFnsGenerateConfig.locale.getWeekFirstDay('en_US')).toEqual(0);
316+
expect(dateFnsGenerateConfig.locale.getWeekFirstDay('zh_CN')).toEqual(1);
317+
expect(dateFnsGenerateConfig.locale.getWeekFirstDay('ar_EG')).toEqual(0);
318+
expect(dateFnsGenerateConfig.locale.getWeekFirstDay('ar_MA')).toEqual(1);
319+
expect(dateFnsGenerateConfig.locale.getWeekFirstDay('ar')).toEqual(6);
320+
expect(dateFnsGenerateConfig.locale.getWeekFirstDay('ar')).toEqual(6);
321+
expect(dateFnsGenerateConfig.locale.getWeekFirstDay('ko_KR')).toEqual(0);
322+
expect(dateFnsGenerateConfig.locale.getWeekFirstDay('it_IT')).toEqual(1);
323+
expect(dateFnsGenerateConfig.locale.getWeekFirstDay('fr_FR')).toEqual(1);
324+
});
325+
});

0 commit comments

Comments
 (0)