Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Relative times in Finnish locale #797

Merged
merged 2 commits into from
Feb 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 49 additions & 21 deletions src/locale/fi.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,43 @@
// Finnish [fi]
import dayjs from 'dayjs'

function relativeTimeFormatter(number, withoutSuffix, key, isFuture) {
const past = {
s: 'muutama sekunti',
m: 'minuutti',
mm: '%d minuuttia',
h: 'tunti',
hh: '%d tuntia',
d: 'päivä',
dd: '%d päivää',
M: 'kuukausi',
MM: '%d kuukautta',
y: 'vuosi',
yy: '%d vuotta',
numbers: 'nolla_yksi_kaksi_kolme_neljä_viisi_kuusi_seitsemän_kahdeksan_yhdeksän'.split('_')
}
const future = {
s: 'muutaman sekunnin',
m: 'minuutin',
mm: '%d minuutin',
h: 'tunnin',
hh: '%d tunnin',
d: 'päivän',
dd: '%d päivän',
M: 'kuukauden',
MM: '%d kuukauden',
y: 'vuoden',
yy: '%d vuoden',
numbers: 'nollan_yhden_kahden_kolmen_neljän_viiden_kuuden_seitsemän_kahdeksan_yhdeksän'.split('_')
}
const words = (isFuture && !withoutSuffix) ? future : past
const result = words[key]
if (number < 10) {
return result.replace('%d', words.numbers[number])
}
return result.replace('%d', number)
}

const locale = {
name: 'fi', // Finnish
weekdays: 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), // Note weekdays are not capitalized in Finnish
Expand All @@ -10,29 +47,20 @@ const locale = {
monthsShort: 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
ordinal: n => `${n}.`,
weekStart: 1,
/*
* This relativeTime is currently configured for having proper past
* tense forms since Finnish needs a separate version for future tense
* and I think past tense is a more common use case for this kind of
* library.
*
* Doing this properly requires this issue to be fixed:
* https://github.com/iamkun/dayjs/issues/302
*/
relativeTime: {
future: '%s kuluttua',
future: '%s päästä',
past: '%s sitten',
s: 'muutama sekunti', // for past tense
m: 'minuutti', // for past tense
mm: '%d minuuttia', // for past tense
h: 'tunti', // for past tense
hh: '%d tuntia', // for past tense
d: 'päivä', // for past tense
dd: '%d päivää', // for past tense
M: 'kuukausi', // for past tense
MM: '%d kuukautta', // for past tense
y: 'vuosi', // for past tense
yy: '%d vuotta' // for past tense
s: relativeTimeFormatter,
m: relativeTimeFormatter,
mm: relativeTimeFormatter,
h: relativeTimeFormatter,
hh: relativeTimeFormatter,
d: relativeTimeFormatter,
dd: relativeTimeFormatter,
M: relativeTimeFormatter,
MM: relativeTimeFormatter,
y: relativeTimeFormatter,
yy: relativeTimeFormatter
},
formats: {
LT: 'HH.mm',
Expand Down
44 changes: 44 additions & 0 deletions test/locale/fi.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import MockDate from 'mockdate'
import moment from 'moment'
import dayjs from '../../src'
import relativeTime from '../../src/plugin/relativeTime'
import '../../src/locale/fi'

dayjs.extend(relativeTime)

beforeEach(() => {
MockDate.set(new Date())
})

afterEach(() => {
MockDate.reset()
})

it('Finnish locale relative time in past and future', () => {
const cases = [
[1, 'd', 'päivän päästä'],
[-1, 'd', 'päivä sitten'],
[2, 'd', 'kahden päivän päästä'],
[-2, 'd', 'kaksi päivää sitten'],
[10, 'd', '10 päivän päästä'],
[-10, 'd', '10 päivää sitten'],
[6, 'm', 'kuuden minuutin päästä'],
[-6, 'm', 'kuusi minuuttia sitten'],
[5, 'h', 'viiden tunnin päästä'],
[-5, 'h', 'viisi tuntia sitten'],
[3, 'M', 'kolmen kuukauden päästä'],
[-3, 'M', 'kolme kuukautta sitten'],
[4, 'y', 'neljän vuoden päästä'],
[-4, 'y', 'neljä vuotta sitten']
]
cases.forEach((c) => {
expect(dayjs().add(c[0], c[1]).locale('fi').fromNow())
.toBe(c[2])
expect(dayjs().add(c[0], c[1]).locale('fi').fromNow())
.toBe(moment().add(c[0], c[1]).locale('fi').fromNow())
})
expect(dayjs().add(-10, 'd').locale('fi').fromNow(true))
.toBe('10 päivää')
expect(dayjs().add(-10, 'd').locale('fi').fromNow(true))
.toBe(moment().add(-10, 'd').locale('fi').fromNow(true))
})