From: Michel Weimerskirch Date: Sat, 2 Nov 2013 13:48:14 +0000 (+0100) Subject: Added Luxembourgish (lb) X-Git-Tag: 2.5.0^2~39^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65a4f44a6af8ff055eb33280a655186a2fd638c5;p=thirdparty%2Fmoment.git Added Luxembourgish (lb) --- diff --git a/lang/lb.js b/lang/lb.js new file mode 100644 index 000000000..d58375748 --- /dev/null +++ b/lang/lb.js @@ -0,0 +1,160 @@ +// moment.js language configuration +// language : Luxembourgish (lb) +// author : mweimerskirch : https://github.com/mweimerskirch + +// Note: Luxembourgish has a very particular phonological rule ("Eifeler Regel") that causes the +// deletion of the final "n" in certain contexts. That's what the "eifelerRegelAppliesToWeekday" +// and "eifelerRegelAppliesToNumber" methods are meant for + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'dd': [number + ' Deeg', number + ' Deeg'], + 'M': ['ee Mount', 'engem Mount'], + 'MM': [number + ' Méint', number + ' Méint'], + 'y': ['ee Joer', 'engem Joer'], + 'yy': [number + ' Joer', number + ' Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return "a " + string; + } + return "an " + string; + } + + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return "viru " + string; + } + return "virun " + string; + } + + function processLastWeek(string1) { + var weekday = this.format('d'); + if (eifelerRegelAppliesToWeekday(weekday)) { + return '[Leschte] dddd [um] LT'; + } + return '[Leschten] dddd [um] LT'; + } + + /** + * Returns true if the word before the given week day loses the "-n" ending. + * e.g. "Leschten Dënschdeg" but "Leschte Méindeg" + * + * @param weekday {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToWeekday(weekday) { + weekday = parseInt(weekday); + switch (weekday) { + case 0: // Sonndeg + case 1: // Méindeg + case 3: // Mëttwoch + case 5: // Freideg + case 6: // Samschdeg + return true; + default: // 2 Dënschdeg, 4 Donneschdeg + return false; + } + } + + /** + * Returns true if the word before the given number loses the "-n" ending. + * e.g. "an 10 Deeg" but "a 5 Deeg" + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; + } + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; + } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + return moment.lang('lb', { + months: "Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"), + monthsShort: "Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"), + weekdays: "Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"), + weekdaysShort: "So._Mé._Dë._Më._Do._Fr._Sa.".split("_"), + weekdaysMin: "So_Mé_Dë_Më_Do_Fr_Sa".split("_"), + longDateFormat: { + LT: "H:mm [Auer]", + L: "DD.MM.YYYY", + LL: "D. MMMM YYYY", + LLL: "D. MMMM YYYY LT", + LLLL: "dddd, D. MMMM YYYY LT" + }, + calendar: { + sameDay: "[Haut um] LT", + sameElse: "L", + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: processLastWeek + }, + relativeTime: { + future: processFutureTime, + past: processPastTime, + s: "e puer Sekonnen", + m: processRelativeTime, + mm: "%d Minutten", + h: processRelativeTime, + hh: "%d Stonnen", + d: processRelativeTime, + dd: processRelativeTime, + M: processRelativeTime, + MM: processRelativeTime, + y: processRelativeTime, + yy: processRelativeTime + }, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/test/lang/lb.js b/test/lang/lb.js new file mode 100644 index 000000000..9bc5e89fd --- /dev/null +++ b/test/lang/lb.js @@ -0,0 +1,184 @@ +var moment = require("../../moment"); + +/************************************************** + Luxembourgish + *************************************************/ + +exports["lang:lb"] = { + setUp: function (cb) { + moment.lang('lb'); + cb(); + }, + + tearDown: function (cb) { + moment.lang('lb'); + cb(); + }, + + "parse": function (test) { + test.expect(96); + + var tests = 'Januar Jan._Februar Febr._Mäerz Mrz._Abrëll Abr._Mee Mee_Juni Jun._Juli Jul._August Aug._September Sept._Oktober Okt._November Nov._Dezember Dez.'.split("_"), i; + + function equalTest(input, mmm, i) { + test.equal(moment(input, mmm).month(), i, input + ' should be month ' + (i + 1)); + } + + for (i = 0; i < 12; i++) { + tests[i] = tests[i].split(' '); + equalTest(tests[i][0], 'MMM', i); + equalTest(tests[i][1], 'MMM', i); + equalTest(tests[i][0], 'MMMM', i); + equalTest(tests[i][1], 'MMMM', i); + equalTest(tests[i][0].toLocaleLowerCase(), 'MMMM', i); + equalTest(tests[i][1].toLocaleLowerCase(), 'MMMM', i); + equalTest(tests[i][0].toLocaleUpperCase(), 'MMMM', i); + equalTest(tests[i][1].toLocaleUpperCase(), 'MMMM', i); + } + test.done(); + }, + + "format": function (test) { + test.expect(22); + + var a = [ + ['dddd, Do MMMM YYYY, HH:mm:ss', 'Sonndeg, 14. Februar 2010, 15:25:50'], + ['ddd, HH:mm', 'So., 15:25'], + ['M Mo MM MMMM MMM', '2 2. 02 Februar Febr.'], + ['YYYY YY', '2010 10'], + ['D Do DD', '14 14. 14'], + ['d do dddd ddd dd', '0 0. Sonndeg So. So'], + ['DDD DDDo DDDD', '45 45. 045'], + ['w wo ww', '6 6. 06'], + ['h hh', '3 03'], + ['H HH', '15 15'], + ['m mm', '25 25'], + ['s ss', '50 50'], + ['a A', 'pm PM'], + ['[the] DDDo [day of the year]', 'the 45. day of the year'], + ['L', '14.02.2010'], + ['LL', '14. Februar 2010'], + ['LLL', '14. Februar 2010 15:25 Auer'], + ['LLLL', 'Sonndeg, 14. Februar 2010 15:25 Auer'], + ['l', '14.2.2010'], + ['ll', '14. Febr. 2010'], + ['lll', '14. Febr. 2010 15:25 Auer'], + ['llll', 'So., 14. Febr. 2010 15:25 Auer'] + ], + b = moment(new Date(2010, 1, 14, 15, 25, 50, 125)), + i; + for (i = 0; i < a.length; i++) { + test.equal(b.format(a[i][0]), a[i][1], a[i][0] + ' ---> ' + a[i][1]); + } + test.done(); + }, + + "format month": function (test) { + test.expect(12); + + var expected = 'Januar Jan._Februar Febr._Mäerz Mrz._Abrëll Abr._Mee Mee_Juni Jun._Juli Jul._August Aug._September Sept._Oktober Okt._November Nov._Dezember Dez.'.split("_"), i; + for (i = 0; i < expected.length; i++) { + test.equal(moment([2011, i, 1]).format('MMMM MMM'), expected[i], expected[i]); + } + test.done(); + }, + + "format week": function (test) { + test.expect(7); + + var expected = 'Sonndeg So. So_Méindeg Mé. Mé_Dënschdeg Dë. Dë_Mëttwoch Më. Më_Donneschdeg Do. Do_Freideg Fr. Fr_Samschdeg Sa. Sa'.split("_"), i; + for (i = 0; i < expected.length; i++) { + test.equal(moment([2011, 0, 2 + i]).format('dddd ddd dd'), expected[i], expected[i]); + } + test.done(); + }, + + "from": function (test) { + test.expect(30); + var start = moment([2007, 1, 28]); + test.equal(start.from(moment([2007, 1, 28]).add({s: 44}), true), "e puer Sekonnen", "44 seconds = a few seconds"); + test.equal(start.from(moment([2007, 1, 28]).add({s: 45}), true), "eng Minutt", "45 seconds = a minute"); + test.equal(start.from(moment([2007, 1, 28]).add({s: 89}), true), "eng Minutt", "89 seconds = a minute"); + test.equal(start.from(moment([2007, 1, 28]).add({s: 90}), true), "2 Minutten", "90 seconds = 2 minutes"); + test.equal(start.from(moment([2007, 1, 28]).add({m: 44}), true), "44 Minutten", "44 minutes = 44 minutes"); + test.equal(start.from(moment([2007, 1, 28]).add({m: 45}), true), "eng Stonn", "45 minutes = an hour"); + test.equal(start.from(moment([2007, 1, 28]).add({m: 89}), true), "eng Stonn", "89 minutes = an hour"); + test.equal(start.from(moment([2007, 1, 28]).add({m: 90}), true), "2 Stonnen", "90 minutes = 2 hours"); + test.equal(start.from(moment([2007, 1, 28]).add({h: 5}), true), "5 Stonnen", "5 hours = 5 hours"); + test.equal(start.from(moment([2007, 1, 28]).add({h: 21}), true), "21 Stonnen", "21 hours = 21 hours"); + test.equal(start.from(moment([2007, 1, 28]).add({h: 22}), true), "een Dag", "22 hours = a day"); + test.equal(start.from(moment([2007, 1, 28]).add({h: 35}), true), "een Dag", "35 hours = a day"); + test.equal(start.from(moment([2007, 1, 28]).add({h: 36}), true), "2 Deeg", "36 hours = 2 days"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 1}), true), "een Dag", "1 day = a day"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 5}), true), "5 Deeg", "5 days = 5 days"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 25}), true), "25 Deeg", "25 days = 25 days"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 26}), true), "ee Mount", "26 days = a month"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 30}), true), "ee Mount", "30 days = a month"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 45}), true), "ee Mount", "45 days = a month"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 46}), true), "2 Méint", "46 days = 2 months"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 74}), true), "2 Méint", "75 days = 2 months"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 76}), true), "3 Méint", "76 days = 3 months"); + test.equal(start.from(moment([2007, 1, 28]).add({M: 1}), true), "ee Mount", "1 month = a month"); + test.equal(start.from(moment([2007, 1, 28]).add({M: 5}), true), "5 Méint", "5 months = 5 months"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 344}), true), "11 Méint", "344 days = 11 months"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 345}), true), "ee Joer", "345 days = a year"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 547}), true), "ee Joer", "547 days = a year"); + test.equal(start.from(moment([2007, 1, 28]).add({d: 548}), true), "2 Joer", "548 days = 2 years"); + test.equal(start.from(moment([2007, 1, 28]).add({y: 1}), true), "ee Joer", "1 year = a year"); + test.equal(start.from(moment([2007, 1, 28]).add({y: 5}), true), "5 Joer", "5 years = 5 years"); + test.done(); + }, + + "suffix": function (test) { + test.expect(2); + test.equal(moment(30000).from(0), "an e puer Sekonnen", "prefix"); + test.equal(moment(0).from(30000), "virun e puer Sekonnen", "suffix"); + test.done(); + }, + + "fromNow": function (test) { + test.expect(13); + test.equal(moment().add({s: 30}).fromNow(), "an e puer Sekonnen", "in a few seconds"); + test.equal(moment().add({d: 1}).fromNow(), "an engem Dag", "in one day"); + test.equal(moment().add({d: 2}).fromNow(), "an 2 Deeg", "in 2 days"); + test.equal(moment().add({d: 3}).fromNow(), "an 3 Deeg", "in 3 days"); + test.equal(moment().add({d: 4}).fromNow(), "a 4 Deeg", "in 4 days"); + test.equal(moment().add({d: 5}).fromNow(), "a 5 Deeg", "in 5 days"); + test.equal(moment().add({d: 6}).fromNow(), "a 6 Deeg", "in 6 days"); + test.equal(moment().add({d: 7}).fromNow(), "a 7 Deeg", "in 7 days"); + test.equal(moment().add({d: 8}).fromNow(), "an 8 Deeg", "in 8 days"); + test.equal(moment().add({d: 9}).fromNow(), "an 9 Deeg", "in 9 days"); + test.equal(moment().add({d: 10}).fromNow(), "an 10 Deeg", "in 10 days"); + test.equal(moment().add({y: 100}).fromNow(), "an 100 Joer", "in 100 years"); + test.equal(moment().add({y: 400}).fromNow(), "a 400 Joer", "in 400 years"); + test.done(); + }, + + "calendar last week": function (test) { + test.expect(15); + + var i, m, weekday, datestring; + for (i = 2; i < 7; i++) { + m = moment().subtract({ d: i }); + + // Different date string for "Dënschdeg" (Tuesday) and "Donneschdeg" (Thursday) + weekday = parseInt(m.format('d')); + datestring = (weekday === 2 || weekday === 4 ? '[Leschten] dddd [um] LT' : '[Leschte] dddd [um] LT'); + + test.equal(m.calendar(), m.format(datestring), "Today + " + i + " days current time"); + m.hours(0).minutes(0).seconds(0).milliseconds(0); + test.equal(m.calendar(), m.format(datestring), "Today + " + i + " days beginning of day"); + m.hours(23).minutes(59).seconds(59).milliseconds(999); + test.equal(m.calendar(), m.format(datestring), "Today + " + i + " days end of day"); + } + test.done(); + }, + + "returns the name of the language": function (test) { + if (typeof module !== 'undefined' && module.exports) { + test.equal(require('../../lang/lb'), 'lb', "module should export lb"); + } + + test.done(); + } +};