From 4a470fbd6fef9e051727d0f26d53cc050b85935d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Teemu=20Sirki=C3=A4?= Date: Sun, 16 Feb 2020 14:53:08 +0200 Subject: [PATCH] fix: Update fi (Finnish) locale relativeTime (#797) --- src/locale/fi.js | 70 +++++++++++++++++++++++++++++------------- test/locale/fi.test.js | 44 ++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 21 deletions(-) create mode 100644 test/locale/fi.test.js diff --git a/src/locale/fi.js b/src/locale/fi.js index 3e7103eb4..0ff83ee1c 100644 --- a/src/locale/fi.js +++ b/src/locale/fi.js @@ -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 @@ -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', diff --git a/test/locale/fi.test.js b/test/locale/fi.test.js new file mode 100644 index 000000000..9c5e27a87 --- /dev/null +++ b/test/locale/fi.test.js @@ -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)) +})