Skip to content

Commit f39fb48

Browse files
committed
fix: Correct upgrading from the improved locale format to the ultimate one
1 parent 4ae6724 commit f39fb48

File tree

4 files changed

+115
-16
lines changed

4 files changed

+115
-16
lines changed

src/plugin/relativeTime/index.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import * as C from '../../constant'
22
import pluralRules from './pluralRules'
33

44
// Returns 0 for singular and 1 for plural for languages with a single plural
5-
const simplePluralRule = pluralRules[1]
5+
const simplePluralRule = 1
66
// Returns 0 for singular, 1 for plural for 2 <= value <= 4 and 2 for plural
77
// for value >= 5, which is sufficient for some languages like Czech
8-
const improvedPluralRule = pluralRules[8]
8+
const improvedPluralRule = 8
99

1010
export default (o, c, d) => {
1111
const proto = c.prototype
@@ -81,7 +81,7 @@ export default (o, c, d) => {
8181
const pluralForms = result[unit] || (result[unit] = [])
8282
// Make sure, that singular comes before plurals and plurals come in
8383
// the right order
84-
pluralForms[kl - 1] = loc[key]
84+
pluralForms[kl - 1] = object[key]
8585
return result
8686
}, {})
8787
}
@@ -160,7 +160,7 @@ export default (o, c, d) => {
160160
}
161161
pluralFormIndex = pluralRule(abs)
162162
} else {
163-
// Singluar is alway sthe first item in the array
163+
// Singular is always the first item in the array
164164
pluralFormIndex = 0
165165
}
166166
out = pluralForms[pluralFormIndex].replace('%d', abs)

src/plugin/relativeTime/pluralRules.js

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// See the expressions to identify the plural form at http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html#pluralforms-list
33

44
/* eslint-disable no-confusing-arrow, no-nested-ternary */
5+
/* istanbul ignore file */
56

67
export default [
78
// Plural rule #0 (1 form)

test/locale/keys.test.js

+13-2
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,26 @@ it('Locale keys', () => {
3737
expect(ordinal(3)).toEqual(expect.anything())
3838
expect(dayjs().locale(name).$locale().name).toBe(name)
3939
if (relativeTime) {
40-
// Old locale object structure
4140
if (relativeTime.s) {
41+
// Old locale object structure
4242
expect(Object.keys(relativeTime).sort())
4343
.toEqual(['d', 'dd', 'future', 'h', 'hh', 'm', 'mm', 'M', 'MM', 'past', 's', 'y', 'yy'].sort())
4444
expect(Object.keys(relativeTime).every(key =>
4545
// eslint-disable-next-line implicit-arrow-linebreak
4646
typeof relativeTime[key] === 'string')).toBeTruthy()
47+
} else if (!relativeTime.pluralRule) {
48+
// Improved locale object structure
49+
expect(Object.keys(relativeTime).sort()).toEqual(['duration', 'future', 'past'].sort());
50+
['duration', 'future', 'past'].forEach(key =>
51+
expect(Object.keys(relativeTime[key]).sort())
52+
.toEqual(['d', 'dd', 'ddd', 'h', 'hh', 'hhh', 'm', 'mm', 'mmm',
53+
'M', 'MM', 'MMM', 's', 'y', 'yy', 'yyy'].sort()));
54+
['duration', 'future', 'past'].forEach(key =>
55+
Object.keys(relativeTime[key]).forEach(key2 =>
56+
// eslint-disable-next-line implicit-arrow-linebreak
57+
expect(typeof relativeTime[key][key2]).toEqual('string')))
4758
} else {
48-
// New locale object structure
59+
// Ultimate locale object structure
4960
expect(Object.keys(relativeTime).sort()).toEqual(['duration', 'future', 'past', 'pluralRule'].sort());
5061
['duration', 'future', 'past'].forEach(key =>
5162
// eslint-disable-next-line implicit-arrow-linebreak

test/plugin/relativeTime.test.js

+97-10
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,104 @@ afterEach(() => {
1414
})
1515

1616
it('Upgrades old locale objects', () => {
17-
// English is the default locale used for tests;
18-
// initially it is defined by the old locale structure
19-
expect(dayjs.en).toBeDefined()
20-
expect(dayjs.en.relativeTime).toBeDefined()
21-
expect(dayjs.en.relativeTime.s).toBeDefined()
22-
expect(dayjs.en.relativeTime.duration).toBeUndefined()
17+
const old = {
18+
name: 'old-relativeTime',
19+
relativeTime: {
20+
future: 'in %s',
21+
past: '%s ago',
22+
s: 'a few seconds',
23+
m: 'a minute',
24+
mm: '%d minutes',
25+
h: 'an hour',
26+
hh: '%d hours',
27+
d: 'a day',
28+
dd: '%d days',
29+
M: 'a month',
30+
MM: '%d months',
31+
y: 'a year',
32+
yy: '%d years'
33+
}
34+
}
35+
dayjs.locale(old, null, true)
36+
const locale = dayjs(undefined, { locale: 'old-relativeTime' }).$locale()
2337
// Call the plugin to upgrade the locale structure on the fly
24-
dayjs().from(dayjs())
25-
// English locale has been upgraded to the new locale structure
26-
expect(dayjs.en.relativeTime.s).toBeUndefined()
27-
expect(dayjs.en.relativeTime.duration).toBeDefined()
38+
dayjs(undefined, { locale: 'old-relativeTime' }).fromNow()
39+
// The locale has been upgraded to the new locale structure
40+
expect(locale.relativeTime.s).toBeUndefined()
41+
expect(typeof locale.relativeTime.duration).toEqual('object')
42+
expect(Array.isArray([locale.relativeTime.duration.s])).toBeTruthy()
43+
expect(typeof locale.relativeTime.duration.s[0]).toEqual('string')
44+
expect(typeof locale.relativeTime.pluralRule).toEqual('number')
45+
})
46+
47+
it('Upgrades improved locale objects', () => {
48+
const improved = {
49+
name: 'improved-relativeTime',
50+
relativeTime: {
51+
duration: {
52+
s: 'několik sekund',
53+
m: 'minuta',
54+
mm: '%d minuty',
55+
mmm: '%d minut',
56+
h: 'hodina',
57+
hh: '%d hodiny',
58+
hhh: '%d hodin',
59+
d: 'den',
60+
dd: '%d dny',
61+
ddd: '%d dní',
62+
M: 'měsíc',
63+
MM: '%d měsíce',
64+
MMM: '%d měsícú',
65+
y: 'rok',
66+
yy: '%d roky',
67+
yyy: '%d let'
68+
},
69+
future: {
70+
s: 'za několik sekund',
71+
m: 'za minutu',
72+
mm: 'za %d minuty',
73+
mmm: 'za %d minut',
74+
h: 'za hodinu',
75+
hh: 'za %d hodiny',
76+
hhh: 'za %d hodin',
77+
d: 'zítra',
78+
dd: 'za %d dny',
79+
ddd: 'za %d dní',
80+
M: 'za měsíc',
81+
MM: 'za %d měsíce',
82+
MMM: 'za %d měsícú',
83+
y: 'za rok',
84+
yy: 'za %d roky',
85+
yyy: 'za %d let'
86+
},
87+
past: {
88+
s: 'před několika sekundami',
89+
m: 'před minutou',
90+
mm: 'před %d minutami',
91+
mmm: 'před %d minutami',
92+
h: 'před hodinou',
93+
hh: 'před %d hodinami',
94+
hhh: 'před %d hodinami',
95+
d: 'včera',
96+
dd: 'před %d dny',
97+
ddd: 'před %d dny',
98+
M: 'před měsícem',
99+
MM: 'před %d měsíci',
100+
MMM: 'před %d měsíci',
101+
y: 'vloni',
102+
yy: 'před %d roky',
103+
yyy: 'před %d lety'
104+
}
105+
}
106+
}
107+
dayjs.locale(improved, null, true)
108+
const locale = dayjs(undefined, { locale: 'improved-relativeTime' }).$locale()
109+
// Call the plugin to upgrade the locale structure on the fly
110+
dayjs(undefined, { locale: 'improved-relativeTime' }).fromNow()
111+
// The locale has been upgraded to the new locale structure
112+
expect(Array.isArray([locale.relativeTime.duration.s])).toBeTruthy()
113+
expect(typeof locale.relativeTime.duration.s[0]).toEqual('string')
114+
expect(typeof locale.relativeTime.pluralRule).toEqual('number')
28115
})
29116

30117
it('Time from X', () => {

0 commit comments

Comments
 (0)