From 3c97ac5571322af28453a8769bb7f50f6d3fb364 Mon Sep 17 00:00:00 2001 From: Amine27 Date: Tue, 19 May 2020 13:40:14 +0200 Subject: [PATCH] [locale] (ar-dz) improve translation (#5523) --- src/locale/ar-dz.js | 158 ++++++++++++++++++++++++++++++++------- src/test/locale/ar-dz.js | 156 +++++++++++++++++++++++--------------- 2 files changed, 226 insertions(+), 88 deletions(-) diff --git a/src/locale/ar-dz.js b/src/locale/ar-dz.js index cddda42af..12687a6c5 100644 --- a/src/locale/ar-dz.js +++ b/src/locale/ar-dz.js @@ -1,51 +1,153 @@ //! moment.js locale configuration //! locale : Arabic (Algeria) [ar-dz] -//! author : Noureddine LOUAHEDJ : https://github.com/noureddineme +//! author : Amine Roukh: https://github.com/Amine27 +//! author : Abdel Said: https://github.com/abdelsaid +//! author : Ahmed Elkhatib +//! author : forabi https://github.com/forabi +//! author : Noureddine LOUAHEDJ : https://github.com/noureddinem import moment from '../moment'; +var pluralForm = function (n) { + return n === 0 + ? 0 + : n === 1 + ? 1 + : n === 2 + ? 2 + : n % 100 >= 3 && n % 100 <= 10 + ? 3 + : n % 100 >= 11 + ? 4 + : 5; + }, + plurals = { + s: [ + 'أقل من ثانية', + 'ثانية واحدة', + ['ثانيتان', 'ثانيتين'], + '%d ثوان', + '%d ثانية', + '%d ثانية', + ], + m: [ + 'أقل من دقيقة', + 'دقيقة واحدة', + ['دقيقتان', 'دقيقتين'], + '%d دقائق', + '%d دقيقة', + '%d دقيقة', + ], + h: [ + 'أقل من ساعة', + 'ساعة واحدة', + ['ساعتان', 'ساعتين'], + '%d ساعات', + '%d ساعة', + '%d ساعة', + ], + d: [ + 'أقل من يوم', + 'يوم واحد', + ['يومان', 'يومين'], + '%d أيام', + '%d يومًا', + '%d يوم', + ], + M: [ + 'أقل من شهر', + 'شهر واحد', + ['شهران', 'شهرين'], + '%d أشهر', + '%d شهرا', + '%d شهر', + ], + y: [ + 'أقل من عام', + 'عام واحد', + ['عامان', 'عامين'], + '%d أعوام', + '%d عامًا', + '%d عام', + ], + }, + pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, + months = [ + 'جانفي', + 'فيفري', + 'مارس', + 'أفريل', + 'ماي', + 'جوان', + 'جويلية', + 'أوت', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر', + ]; + export default moment.defineLocale('ar-dz', { - months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split( - '_' - ), - monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split( - '_' - ), + months: months, + monthsShort: months, weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin: 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), weekdaysParseExact: true, longDateFormat: { LT: 'HH:mm', LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', + L: 'D/\u200FM/\u200FYYYY', LL: 'D MMMM YYYY', LLL: 'D MMMM YYYY HH:mm', LLLL: 'dddd D MMMM YYYY HH:mm', }, + meridiemParse: /ص|م/, + isPM: function (input) { + return 'م' === input; + }, + meridiem: function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, calendar: { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', sameElse: 'L', }, relativeTime: { - future: 'في %s', + future: 'بعد %s', past: 'منذ %s', - s: 'ثوان', - ss: '%d ثانية', - m: 'دقيقة', - mm: '%d دقائق', - h: 'ساعة', - hh: '%d ساعات', - d: 'يوم', - dd: '%d أيام', - M: 'شهر', - MM: '%d أشهر', - y: 'سنة', - yy: '%d سنوات', + s: pluralize('s'), + ss: pluralize('s'), + m: pluralize('m'), + mm: pluralize('m'), + h: pluralize('h'), + hh: pluralize('h'), + d: pluralize('d'), + dd: pluralize('d'), + M: pluralize('M'), + MM: pluralize('M'), + y: pluralize('y'), + yy: pluralize('y'), + }, + postformat: function (string) { + return string.replace(/,/g, '،'); }, week: { dow: 0, // Sunday is the first day of the week. diff --git a/src/test/locale/ar-dz.js b/src/test/locale/ar-dz.js index 7df8cfecc..48921f785 100644 --- a/src/test/locale/ar-dz.js +++ b/src/test/locale/ar-dz.js @@ -12,7 +12,11 @@ test('parse', function (assert) { assert.equal( moment(input, mmm).month(), i, - input + ' should be month ' + (i + 1) + input + + ' should be month ' + + (i + 1) + + ' instead is month ' + + moment(input, mmm).month() ); } @@ -48,31 +52,31 @@ test('format', function (assert) { var a = [ [ 'dddd, MMMM Do YYYY, h:mm:ss a', - 'الأحد, فيفري 14 2010, 3:25:50 pm', + 'الأحد، فيفري 14 2010، 3:25:50 م', ], - ['ddd, hA', 'احد, 3PM'], + ['ddd, hA', 'أحد، 3م'], ['M Mo MM MMMM MMM', '2 2 02 فيفري فيفري'], ['YYYY YY', '2010 10'], ['D Do DD', '14 14 14'], - ['d do dddd ddd dd', '0 0 الأحد احد أح'], + ['d do dddd ddd dd', '0 0 الأحد أحد ح'], ['DDD DDDo DDDD', '45 45 045'], ['w wo ww', '7 7 07'], ['h hh', '3 03'], ['H HH', '15 15'], ['m mm', '25 25'], ['s ss', '50 50'], - ['a A', 'pm PM'], + ['a A', 'م م'], ['[the] DDDo [day of the year]', 'the 45 day of the year'], ['LT', '15:25'], ['LTS', '15:25:50'], - ['L', '14/02/2010'], + ['L', '14/\u200f2/\u200f2010'], ['LL', '14 فيفري 2010'], ['LLL', '14 فيفري 2010 15:25'], ['LLLL', 'الأحد 14 فيفري 2010 15:25'], - ['l', '14/2/2010'], + ['l', '14/\u200f2/\u200f2010'], ['ll', '14 فيفري 2010'], ['lll', '14 فيفري 2010 15:25'], - ['llll', 'احد 14 فيفري 2010 15:25'], + ['llll', 'أحد 14 فيفري 2010 15:25'], ], b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)), i; @@ -133,7 +137,7 @@ test('format month', function (assert) { }); test('format week', function (assert) { - var expected = 'الأحد احد أح_الإثنين اثنين إث_الثلاثاء ثلاثاء ثلا_الأربعاء اربعاء أر_الخميس خميس خم_الجمعة جمعة جم_السبت سبت سب'.split( + var expected = 'الأحد أحد ح_الإثنين إثنين ن_الثلاثاء ثلاثاء ث_الأربعاء أربعاء ر_الخميس خميس خ_الجمعة جمعة ج_السبت سبت س'.split( '_' ), i; @@ -150,42 +154,42 @@ test('from', function (assert) { var start = moment([2007, 1, 28]); assert.equal( start.from(moment([2007, 1, 28]).add({ s: 44 }), true), - 'ثوان', + '44 ثانية', '44 seconds = a few seconds' ); assert.equal( start.from(moment([2007, 1, 28]).add({ s: 45 }), true), - 'دقيقة', + 'دقيقة واحدة', '45 seconds = a minute' ); assert.equal( start.from(moment([2007, 1, 28]).add({ s: 89 }), true), - 'دقيقة', + 'دقيقة واحدة', '89 seconds = a minute' ); assert.equal( start.from(moment([2007, 1, 28]).add({ s: 90 }), true), - '2 دقائق', + 'دقيقتان', '90 seconds = 2 minutes' ); assert.equal( start.from(moment([2007, 1, 28]).add({ m: 44 }), true), - '44 دقائق', + '44 دقيقة', '44 minutes = 44 minutes' ); assert.equal( start.from(moment([2007, 1, 28]).add({ m: 45 }), true), - 'ساعة', + 'ساعة واحدة', '45 minutes = an hour' ); assert.equal( start.from(moment([2007, 1, 28]).add({ m: 89 }), true), - 'ساعة', + 'ساعة واحدة', '89 minutes = an hour' ); assert.equal( start.from(moment([2007, 1, 28]).add({ m: 90 }), true), - '2 ساعات', + 'ساعتان', '90 minutes = 2 hours' ); assert.equal( @@ -195,27 +199,27 @@ 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( start.from(moment([2007, 1, 28]).add({ h: 36 }), true), - '2 أيام', + 'يومان', '36 hours = 2 days' ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 1 }), true), - 'يوم', + 'يوم واحد', '1 day = a day' ); assert.equal( @@ -225,32 +229,32 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 25 }), true), - '25 أيام', + '25 يومًا', '25 days = 25 days' ); 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( start.from(moment([2007, 1, 28]).add({ d: 46 }), true), - '2 أشهر', + 'شهران', '46 days = 2 months' ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 74 }), true), - '2 أشهر', + 'شهران', '75 days = 2 months' ); assert.equal( @@ -260,7 +264,7 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ M: 1 }), true), - 'شهر', + 'شهر واحد', '1 month = a month' ); assert.equal( @@ -270,35 +274,35 @@ test('from', function (assert) { ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 345 }), true), - 'سنة', + 'عام واحد', '345 days = a year' ); assert.equal( start.from(moment([2007, 1, 28]).add({ d: 548 }), true), - '2 سنوات', + 'عامان', '548 days = 2 years' ); assert.equal( start.from(moment([2007, 1, 28]).add({ y: 1 }), true), - 'سنة', + 'عام واحد', '1 year = a year' ); assert.equal( start.from(moment([2007, 1, 28]).add({ y: 5 }), true), - '5 سنوات', + '5 أعوام', '5 years = 5 years' ); }); test('suffix', function (assert) { - assert.equal(moment(30000).from(0), 'في ثوان', 'prefix'); - assert.equal(moment(0).from(30000), 'منذ ثوان', 'suffix'); + assert.equal(moment(30000).from(0), 'بعد 30 ثانية', 'prefix'); + assert.equal(moment(0).from(30000), 'منذ 30 ثانية', 'suffix'); }); test('now from now', function (assert) { assert.equal( moment().fromNow(), - 'منذ ثوان', + 'منذ ثانية واحدة', 'now from now should display as in the past' ); }); @@ -306,10 +310,10 @@ test('now from now', function (assert) { test('fromNow', function (assert) { assert.equal( moment().add({ s: 30 }).fromNow(), - 'في ثوان', + 'بعد 30 ثانية', 'in a few seconds' ); - assert.equal(moment().add({ d: 5 }).fromNow(), 'في 5 أيام', 'in 5 days'); + assert.equal(moment().add({ d: 5 }).fromNow(), 'بعد 5 أيام', 'in 5 days'); }); test('calendar day', function (assert) { @@ -317,32 +321,32 @@ test('calendar day', function (assert) { assert.equal( moment(a).calendar(), - 'اليوم على الساعة 12:00', + 'اليوم عند الساعة 12:00', 'today at the same time' ); assert.equal( moment(a).add({ m: 25 }).calendar(), - 'اليوم على الساعة 12:25', + 'اليوم عند الساعة 12:25', 'Now plus 25 min' ); assert.equal( moment(a).add({ h: 1 }).calendar(), - 'اليوم على الساعة 13:00', + 'اليوم عند الساعة 13:00', 'Now plus 1 hour' ); assert.equal( moment(a).add({ d: 1 }).calendar(), - 'غدا على الساعة 12:00', + 'غدًا عند الساعة 12:00', 'tomorrow at the same time' ); assert.equal( moment(a).subtract({ h: 1 }).calendar(), - 'اليوم على الساعة 11:00', + 'اليوم عند الساعة 11:00', 'Now minus 1 hour' ); assert.equal( moment(a).subtract({ d: 1 }).calendar(), - 'أمس على الساعة 12:00', + 'أمس عند الساعة 12:00', 'yesterday at the same time' ); }); @@ -353,19 +357,19 @@ test('calendar next week', function (assert) { m = moment().add({ d: i }); assert.equal( m.calendar(), - m.format('dddd [على الساعة] LT'), + m.format('dddd [عند الساعة] LT'), 'Today + ' + i + ' days current time' ); m.hours(0).minutes(0).seconds(0).milliseconds(0); assert.equal( m.calendar(), - m.format('dddd [على الساعة] LT'), + m.format('dddd [عند الساعة] LT'), 'Today + ' + i + ' days beginning of day' ); m.hours(23).minutes(59).seconds(59).milliseconds(999); assert.equal( m.calendar(), - m.format('dddd [على الساعة] LT'), + m.format('dddd [عند الساعة] LT'), 'Today + ' + i + ' days end of day' ); } @@ -377,19 +381,19 @@ test('calendar last week', function (assert) { m = moment().subtract({ d: i }); assert.equal( m.calendar(), - m.format('dddd [على الساعة] LT'), + m.format('dddd [عند الساعة] LT'), 'Today - ' + i + ' days current time' ); m.hours(0).minutes(0).seconds(0).milliseconds(0); assert.equal( m.calendar(), - m.format('dddd [على الساعة] LT'), + m.format('dddd [عند الساعة] LT'), 'Today - ' + i + ' days beginning of day' ); m.hours(23).minutes(59).seconds(59).milliseconds(999); assert.equal( m.calendar(), - m.format('dddd [على الساعة] LT'), + m.format('dddd [عند الساعة] LT'), 'Today - ' + i + ' days end of day' ); } @@ -419,28 +423,60 @@ test('calendar all else', function (assert) { test('weeks year starting sunday formatted', function (assert) { assert.equal( - moment([2016, 1, 4]).format('w ww wo'), + moment([2011, 1, 4]).format('w ww wo'), '5 05 5', - 'Feb 4 2016 should be week 5' + 'Feb 4 2011 should be week 5' ); assert.equal( - moment([2016, 0, 6]).format('w ww wo'), + moment([2012, 0, 6]).format('w ww wo'), '1 01 1', - 'Jan 6 2016 should be week 1' + 'Jan 6 2012 should be week 1' ); assert.equal( - moment([2016, 0, 7]).format('w ww wo'), + moment([2012, 0, 7]).format('w ww wo'), '1 01 1', - 'Jan 7 2016 should be week 1' + 'Jan 7 2012 should be week 1' ); assert.equal( - moment([2016, 0, 13]).format('w ww wo'), + moment([2012, 0, 13]).format('w ww wo'), '2 02 2', - 'Jan 13 2016 should be week 2' + 'Jan 13 2012 should be week 2' ); assert.equal( - moment([2016, 0, 14]).format('w ww wo'), + moment([2012, 0, 14]).format('w ww wo'), '2 02 2', - 'Jan 14 2016 should be week 2' + 'Jan 14 2012 should be week 2' + ); +}); + +test('no leading zeros in long date formats', function (assert) { + var i, j, longDateStr, shortDateStr; + for (i = 1; i <= 9; ++i) { + for (j = 1; j <= 9; ++j) { + longDateStr = moment([2014, i, j]).format('L'); + shortDateStr = moment([2014, i, j]).format('l'); + assert.equal( + longDateStr, + shortDateStr, + 'should not have leading zeros in month or day' + ); + } + } +}); + +// locale-specific +test('ar-dz strict mode parsing works', function (assert) { + var m, formattedDate; + m = moment().locale('ar-dz'); + formattedDate = m.format('l'); + assert.equal( + moment.utc(formattedDate, 'l', 'ar-dz', false).isValid(), + true, + 'Non-strict parsing works' + ); + assert.equal( + moment.utc(formattedDate, 'l', 'ar-dz', true).isValid(), + true, + 'Strict parsing must work' ); }); -- 2.47.2