Skip to content

Commit 5470a15

Browse files
authored
fix: Update Slovenian locale for relative time (#2396)
Slovenian translation update so it handles dual and some plural edge cases.
1 parent dd55ee2 commit 5470a15

File tree

2 files changed

+160
-13
lines changed

2 files changed

+160
-13
lines changed

src/locale/sl.js

Lines changed: 78 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,71 @@
11
// Slovenian [sl]
22
import dayjs from 'dayjs'
33

4+
function dual(n) {
5+
return (n % 100) == 2 // eslint-disable-line
6+
}
7+
8+
function threeFour(n) {
9+
return (n % 100) == 3 || (n % 100) == 4 // eslint-disable-line
10+
}
11+
12+
/* eslint-disable */
13+
function translate(number, withoutSuffix, key, isFuture) {
14+
const result = `${number} `
15+
switch (key) {
16+
case 's': // a few seconds / in a few seconds / a few seconds ago
17+
return (withoutSuffix || isFuture) ? 'nekaj sekund' : 'nekaj sekundami'
18+
case 'm': // a minute / in a minute / a minute ago
19+
return withoutSuffix ? 'ena minuta' : 'eno minuto'
20+
case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
21+
if (dual(number)) {
22+
return result + ((withoutSuffix || isFuture) ? 'minuti' : 'minutama')
23+
}
24+
if (threeFour(number)) {
25+
return result + ((withoutSuffix || isFuture) ? 'minute' : 'minutami')
26+
}
27+
return result + ((withoutSuffix || isFuture) ? 'minut' : 'minutami')
28+
case 'h': // an hour / in an hour / an hour ago
29+
return withoutSuffix ? 'ena ura' : (isFuture ? 'eno uro' : 'eno uro')
30+
case 'hh': // 9 hours / in 9 hours / 9 hours ago
31+
if (dual(number)) {
32+
return result + ((withoutSuffix || isFuture) ? 'uri' : 'urama')
33+
}
34+
if (threeFour(number)) {
35+
return result + ((withoutSuffix || isFuture) ? 'ure' : 'urami')
36+
}
37+
return result + ((withoutSuffix || isFuture) ? 'ur' : 'urami')
38+
case 'd': // a day / in a day / a day ago
39+
return (withoutSuffix || isFuture) ? 'en dan' : 'enim dnem'
40+
case 'dd': // 9 days / in 9 days / 9 days ago
41+
if (dual(number)) {
42+
return result + ((withoutSuffix || isFuture) ? 'dneva' : 'dnevoma')
43+
}
44+
return result + ((withoutSuffix || isFuture) ? 'dni' : 'dnevi')
45+
case 'M': // a month / in a month / a month ago
46+
return (withoutSuffix || isFuture) ? 'en mesec' : 'enim mesecem'
47+
case 'MM': // 9 months / in 9 months / 9 months ago
48+
if (dual(number)) { // 2 minutes / in 2 minutes
49+
return result + ((withoutSuffix || isFuture) ? 'meseca' : 'mesecema')
50+
}
51+
if (threeFour(number)) {
52+
return result + ((withoutSuffix || isFuture) ? 'mesece' : 'meseci')
53+
}
54+
return result + ((withoutSuffix || isFuture) ? 'mesecev' : 'meseci')
55+
case 'y': // a year / in a year / a year ago
56+
return (withoutSuffix || isFuture) ? 'eno leto' : 'enim letom'
57+
case 'yy': // 9 years / in 9 years / 9 years ago
58+
if (dual(number)) { // 2 minutes / in 2 minutes
59+
return result + ((withoutSuffix || isFuture) ? 'leti' : 'letoma')
60+
}
61+
if (threeFour(number)) {
62+
return result + ((withoutSuffix || isFuture) ? 'leta' : 'leti')
63+
}
64+
return result + ((withoutSuffix || isFuture) ? 'let' : 'leti')
65+
}
66+
}
67+
68+
/* eslint-enable */
469
const locale = {
570
name: 'sl',
671
weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
@@ -16,26 +81,26 @@ const locale = {
1681
L: 'DD.MM.YYYY',
1782
LL: 'D. MMMM YYYY',
1883
LLL: 'D. MMMM YYYY H:mm',
19-
LLLL: 'dddd, D. MMMM YYYY H:mm'
84+
LLLL: 'dddd, D. MMMM YYYY H:mm',
85+
l: 'D. M. YYYY'
2086
},
2187
relativeTime: {
2288
future: 'čez %s',
2389
past: 'pred %s',
24-
s: 'nekaj sekund',
25-
m: 'minuta',
26-
mm: '%d minut',
27-
h: 'ura',
28-
hh: '%d ur',
29-
d: 'dan',
30-
dd: '%d dni',
31-
M: 'mesec',
32-
MM: '%d mesecev',
33-
y: 'leto',
34-
yy: '%d let'
90+
s: translate,
91+
m: translate,
92+
mm: translate,
93+
h: translate,
94+
hh: translate,
95+
d: translate,
96+
dd: translate,
97+
M: translate,
98+
MM: translate,
99+
y: translate,
100+
yy: translate
35101
}
36102
}
37103

38104
dayjs.locale(locale, null, true)
39105

40106
export default locale
41-

test/locale/sl.test.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import MockDate from 'mockdate'
2+
import dayjs from '../../src'
3+
import relativeTime from '../../src/plugin/relativeTime'
4+
import '../../src/locale/sl'
5+
6+
dayjs.extend(relativeTime)
7+
8+
beforeEach(() => {
9+
MockDate.set(new Date())
10+
})
11+
12+
afterEach(() => {
13+
MockDate.reset()
14+
})
15+
16+
it('Slovenian locale relative time in past and future', () => {
17+
const cases = [
18+
[1, 's', 'čez nekaj sekund', 'nekaj sekund'],
19+
[-1, 's', 'pred nekaj sekundami', 'nekaj sekund'],
20+
[1, 'm', 'čez eno minuto', 'ena minuta'],
21+
[-1, 'm', 'pred eno minuto', 'ena minuta'],
22+
[2, 'm', 'čez 2 minuti', '2 minuti'],
23+
[-2, 'm', 'pred 2 minutama', '2 minuti'],
24+
[3, 'm', 'čez 3 minute', '3 minute'],
25+
[-3, 'm', 'pred 3 minutami', '3 minute'],
26+
[5, 'm', 'čez 5 minut', '5 minut'],
27+
[-5, 'm', 'pred 5 minutami', '5 minut'],
28+
[1, 'h', 'čez eno uro', 'ena ura'],
29+
[-1, 'h', 'pred eno uro', 'ena ura'],
30+
[2, 'h', 'čez 2 uri', '2 uri'],
31+
[-2, 'h', 'pred 2 urama', '2 uri'],
32+
[3, 'h', 'čez 3 ure', '3 ure'],
33+
[-3, 'h', 'pred 3 urami', '3 ure'],
34+
[5, 'h', 'čez 5 ur', '5 ur'],
35+
[-5, 'h', 'pred 5 urami', '5 ur'],
36+
[1, 'd', 'čez en dan', 'en dan'],
37+
[-1, 'd', 'pred enim dnem', 'en dan'],
38+
[2, 'd', 'čez 2 dneva', '2 dneva'],
39+
[-2, 'd', 'pred 2 dnevoma', '2 dneva'],
40+
[3, 'd', 'čez 3 dni', '3 dni'],
41+
[-3, 'd', 'pred 3 dnevi', '3 dni'],
42+
[5, 'd', 'čez 5 dni', '5 dni'],
43+
[-5, 'd', 'pred 5 dnevi', '5 dni'],
44+
[1, 'M', 'čez en mesec', 'en mesec'],
45+
[-1, 'M', 'pred enim mesecem', 'en mesec'],
46+
[2, 'M', 'čez 2 meseca', '2 meseca'],
47+
[-2, 'M', 'pred 2 mesecema', '2 meseca'],
48+
[3, 'M', 'čez 3 mesece', '3 mesece'],
49+
[-3, 'M', 'pred 3 meseci', '3 mesece'],
50+
[5, 'M', 'čez 5 mesecev', '5 mesecev'],
51+
[-5, 'M', 'pred 5 meseci', '5 mesecev'],
52+
[1, 'y', 'čez eno leto', 'eno leto'],
53+
[-1, 'y', 'pred enim letom', 'eno leto'],
54+
[2, 'y', 'čez 2 leti', '2 leti'],
55+
[-2, 'y', 'pred 2 letoma', '2 leti'],
56+
[3, 'y', 'čez 3 leta', '3 leta'],
57+
[-3, 'y', 'pred 3 leti', '3 leta'],
58+
[5, 'y', 'čez 5 let', '5 let'],
59+
[-5, 'y', 'pred 5 leti', '5 let']
60+
// these are rounded
61+
// if user decides to change rounding then it would be good to test them also
62+
// [102, 's', 'čez 102 sekundi', '102 sekundi'],
63+
// [-102, 's', 'pred 102 sekundama', '102 sekundi'],
64+
// [103, 's', 'čez 103 sekunde', '103 sekunde'],
65+
// [-103, 's', 'pred 103 sekundami', '103 sekunde'],
66+
// [114, 's', 'čez 114 sekund', '114 sekund'],
67+
// [-114, 's', 'pred 114 sekundami', '114 sekund'],
68+
// [-102, 'm', 'čez 102 minuti', '102 minuti'],
69+
// [-102, 'm', 'pred 102 minutama', '102 minuti'],
70+
// [103, 'm', 'čez 103 minute', '103 minute'],
71+
// [-103, 'm', 'pred 103 minutami', '103 minute'],
72+
// [114, 'm', 'čez 114 minut', '114 minut'],
73+
// [-114, 'm', 'pred 114 minutami', '114 minut']
74+
]
75+
76+
cases.forEach((c) => {
77+
// With suffix
78+
expect(dayjs().add(c[0], c[1]).locale('sl').fromNow()).toBe(c[2])
79+
// Without suffix
80+
expect(dayjs().add(c[0], c[1]).locale('sl').fromNow(true)).toBe(c[3])
81+
})
82+
})

0 commit comments

Comments
 (0)