From: Dušan Simić Date: Thu, 8 Oct 2020 17:59:43 +0000 (+0200) Subject: [locale] Fix Serbian locale (sr, sr-cyrl) (#5742) X-Git-Tag: 2.29.2~13 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=63f3d52945bc773925b862c61ee7a322d4a33308;p=thirdparty%2Fmoment.git [locale] Fix Serbian locale (sr, sr-cyrl) (#5742) --- diff --git a/src/locale/sr-cyrl.js b/src/locale/sr-cyrl.js index 5f695972a..2c26999a0 100644 --- a/src/locale/sr-cyrl.js +++ b/src/locale/sr-cyrl.js @@ -9,32 +9,42 @@ var translator = { words: { //Different grammatical cases ss: ['секунда', 'секунде', 'секунди'], - m: ['један минут', 'једне минуте'], - mm: ['минут', 'минуте', 'минута'], + m: ['један минут', 'једног минута'], + mm: ['минут', 'минута', 'минута'], h: ['један сат', 'једног сата'], hh: ['сат', 'сата', 'сати'], + d: ['један дан', 'једног дана'], dd: ['дан', 'дана', 'дана'], + M: ['један месец', 'једног месеца'], MM: ['месец', 'месеца', 'месеци'], - yy: ['година', 'године', 'година'], + y: ['једну годину', 'једне године'], + yy: ['годину', 'године', 'година'], }, correctGrammaticalCase: function (number, wordKey) { - return number === 1 - ? wordKey[0] - : number >= 2 && number <= 4 - ? wordKey[1] - : wordKey[2]; + if (number % 10 >= 1 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20)) { + return number % 10 === 1 ? wordKey[0] : wordKey[1] + } + return wordKey[2] }, - translate: function (number, withoutSuffix, key) { + translate: function (number, withoutSuffix, key, isFuture) { var wordKey = translator.words[key]; + if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return ( - number + - ' ' + - translator.correctGrammaticalCase(number, wordKey) - ); + // Nominativ + if (key === 'y' && withoutSuffix) return 'једна година' + return isFuture || withoutSuffix ? wordKey[0] : wordKey[1]; } + + const word = translator.correctGrammaticalCase(number, wordKey) + // Nominativ + if ( + key === 'yy' && + withoutSuffix && + word === 'годину') { + return (number + ' година') + } + + return (number + ' ' + word); }, }; @@ -100,11 +110,11 @@ export default moment.defineLocale('sr-cyrl', { mm: translator.translate, h: translator.translate, hh: translator.translate, - d: 'дан', + d: translator.translate, dd: translator.translate, - M: 'месец', + M: translator.translate, MM: translator.translate, - y: 'годину', + y: translator.translate, yy: translator.translate, }, dayOfMonthOrdinalParse: /\d{1,2}\./, diff --git a/src/locale/sr.js b/src/locale/sr.js index 502b54d8d..7e38deab5 100644 --- a/src/locale/sr.js +++ b/src/locale/sr.js @@ -1,3 +1,4 @@ +import { without } from 'lodash'; //! moment.js locale configuration //! locale : Serbian [sr] //! author : Milan Janačković : https://github.com/milan-j @@ -9,32 +10,42 @@ var translator = { words: { //Different grammatical cases ss: ['sekunda', 'sekunde', 'sekundi'], - m: ['jedan minut', 'jedne minute'], - mm: ['minut', 'minute', 'minuta'], + m: ['jedan minut', 'jednog minuta'], + mm: ['minut', 'minuta', 'minuta'], h: ['jedan sat', 'jednog sata'], hh: ['sat', 'sata', 'sati'], + d: ['jedan dan', 'jednog dana'], dd: ['dan', 'dana', 'dana'], + M: ['jedan mesec', 'jednog meseca'], MM: ['mesec', 'meseca', 'meseci'], - yy: ['godina', 'godine', 'godina'], + y: ['jednu godinu', 'jedne godine'], + yy: ['godinu', 'godine', 'godina'], }, correctGrammaticalCase: function (number, wordKey) { - return number === 1 - ? wordKey[0] - : number >= 2 && number <= 4 - ? wordKey[1] - : wordKey[2]; + if (number % 10 >= 1 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20)) { + return number % 10 === 1 ? wordKey[0] : wordKey[1] + } + return wordKey[2] }, - translate: function (number, withoutSuffix, key) { + translate: function (number, withoutSuffix, key, isFuture) { var wordKey = translator.words[key]; + if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return ( - number + - ' ' + - translator.correctGrammaticalCase(number, wordKey) - ); + // Nominativ + if (key === 'y' && withoutSuffix) return 'jedna godina' + return isFuture || withoutSuffix ? wordKey[0] : wordKey[1]; } + + const word = translator.correctGrammaticalCase(number, wordKey) + // Nominativ + if ( + key === 'yy' && + withoutSuffix && + word === 'godinu') { + return (number + ' godina') + } + + return (number + ' ' + word); }, }; @@ -102,11 +113,11 @@ export default moment.defineLocale('sr', { mm: translator.translate, h: translator.translate, hh: translator.translate, - d: 'dan', + d: translator.translate, dd: translator.translate, - M: 'mesec', + M: translator.translate, MM: translator.translate, - y: 'godinu', + y: translator.translate, yy: translator.translate, }, dayOfMonthOrdinalParse: /\d{1,2}\./, diff --git a/src/test/locale/sr-cyrl.js b/src/test/locale/sr-cyrl.js index f21e8886a..dbb67d2d4 100644 --- a/src/test/locale/sr-cyrl.js +++ b/src/test/locale/sr-cyrl.js @@ -165,7 +165,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ s: 90 }), true), - '2 минуте', + '2 минута', '90 seconds = 2 minutes' ); assert.equal( @@ -195,17 +195,17 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ h: 21 }), true), - '21 сати', + '21 сат', '21 hours = 21 hours' ); assert.equal( start.from(moment([2007, 1, 28]).add({ h: 22 }), true), - 'дан', + 'један дан', '22 hours = a day' ); assert.equal( start.from(moment([2007, 1, 28]).add({ h: 35 }), true), - 'дан', + 'један дан', '35 hours = a day' ); assert.equal( @@ -215,7 +215,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 1 }), true), - 'дан', + 'један дан', '1 day = a day' ); assert.equal( @@ -230,17 +230,17 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 26 }), true), - 'месец', + 'један месец', '26 days = a month' ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 30 }), true), - 'месец', + 'један месец', '30 days = a month' ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 43 }), true), - 'месец', + 'један месец', '43 days = a month' ); assert.equal( @@ -260,7 +260,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ M: 1 }), true), - 'месец', + 'један месец', '1 month = a month' ); assert.equal( @@ -270,7 +270,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 345 }), true), - 'годину', + 'једна година', '345 days = a year' ); assert.equal( @@ -280,7 +280,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ y: 1 }), true), - 'годину', + 'једна година', '1 year = a year' ); assert.equal( diff --git a/src/test/locale/sr.js b/src/test/locale/sr.js index 0d4f2e490..ebd848991 100644 --- a/src/test/locale/sr.js +++ b/src/test/locale/sr.js @@ -165,7 +165,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ s: 90 }), true), - '2 minute', + '2 minuta', '90 seconds = 2 minutes' ); assert.equal( @@ -195,17 +195,17 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ h: 21 }), true), - '21 sati', + '21 sat', '21 hours = 21 hours' ); assert.equal( start.from(moment([2007, 1, 28]).add({ h: 22 }), true), - 'dan', + 'jedan dan', '22 hours = a day' ); assert.equal( start.from(moment([2007, 1, 28]).add({ h: 35 }), true), - 'dan', + 'jedan dan', '35 hours = a day' ); assert.equal( @@ -215,7 +215,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 1 }), true), - 'dan', + 'jedan dan', '1 day = a day' ); assert.equal( @@ -230,17 +230,17 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 26 }), true), - 'mesec', + 'jedan mesec', '26 days = a month' ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 30 }), true), - 'mesec', + 'jedan mesec', '30 days = a month' ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 43 }), true), - 'mesec', + 'jedan mesec', '43 days = a month' ); assert.equal( @@ -260,7 +260,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ M: 1 }), true), - 'mesec', + 'jedan mesec', '1 month = a month' ); assert.equal( @@ -270,7 +270,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 345 }), true), - 'godinu', + 'jedna godina', '345 days = a year' ); assert.equal( @@ -280,7 +280,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ y: 1 }), true), - 'godinu', + 'jedna godina', '1 year = a year' ); assert.equal(