// HumanizeDuration.js - https://git.io/j0HgmQ /* global define, module */ (function () { // This has to be defined separately because of a bug: we want to alias // `gr` and `el` for backwards-compatiblity. In a breaking change, we can // remove `gr` entirely. // See https://github.com/EvanHahn/HumanizeDuration.js/issues/143 for more. var greek = { y: function (c) { return c === 1 ? "χρόνος" : "χρόνια"; }, mo: function (c) { return c === 1 ? "μήνας" : "μήνες"; }, w: function (c) { return c === 1 ? "εβδομάδα" : "εβδομάδες"; }, d: function (c) { return c === 1 ? "μέρα" : "μέρες"; }, h: function (c) { return c === 1 ? "ώρα" : "ώρες"; }, m: function (c) { return c === 1 ? "λεπτό" : "λεπτά"; }, s: function (c) { return c === 1 ? "δευτερόλεπτο" : "δευτερόλεπτα"; }, ms: function (c) { return (c === 1 ? "χιλιοστό" : "χιλιοστά") + " του δευτερολέπτου"; }, decimal: "," }; var ARABIC_DIGITS = ["۰", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"]; var LANGUAGES = { af: { y: "jaar", mo: function (c) { return "maand" + (c === 1 ? "" : "e"); }, w: function (c) { return c === 1 ? "week" : "weke"; }, d: function (c) { return c === 1 ? "dag" : "dae"; }, h: function (c) { return c === 1 ? "uur" : "ure"; }, m: function (c) { return c === 1 ? "minuut" : "minute"; }, s: function (c) { return "sekonde" + (c === 1 ? "" : "s"); }, ms: function (c) { return "millisekonde" + (c === 1 ? "" : "s"); }, decimal: "," }, ar: { y: function (c) { return ["سنة", "سنتان", "سنوات"][getArabicForm(c)]; }, mo: function (c) { return ["شهر", "شهران", "أشهر"][getArabicForm(c)]; }, w: function (c) { return ["أسبوع", "أسبوعين", "أسابيع"][getArabicForm(c)]; }, d: function (c) { return ["يوم", "يومين", "أيام"][getArabicForm(c)]; }, h: function (c) { return ["ساعة", "ساعتين", "ساعات"][getArabicForm(c)]; }, m: function (c) { return ["دقيقة", "دقيقتان", "دقائق"][getArabicForm(c)]; }, s: function (c) { return ["ثانية", "ثانيتان", "ثواني"][getArabicForm(c)]; }, ms: function (c) { return ["جزء من الثانية", "جزآن من الثانية", "أجزاء من الثانية"][ getArabicForm(c) ]; }, decimal: ",", delimiter: " و ", _formatCount: function (count, decimal) { var replacements = assign(ARABIC_DIGITS, { ".": decimal }); var characters = count.toString().split(""); for (var i = 0; i < characters.length; i++) { var character = characters[i]; if (has(replacements, character)) { characters[i] = replacements[character]; } } return characters.join(""); } }, bg: { y: function (c) { return ["години", "година", "години"][getSlavicForm(c)]; }, mo: function (c) { return ["месеца", "месец", "месеца"][getSlavicForm(c)]; }, w: function (c) { return ["седмици", "седмица", "седмици"][getSlavicForm(c)]; }, d: function (c) { return ["дни", "ден", "дни"][getSlavicForm(c)]; }, h: function (c) { return ["часа", "час", "часа"][getSlavicForm(c)]; }, m: function (c) { return ["минути", "минута", "минути"][getSlavicForm(c)]; }, s: function (c) { return ["секунди", "секунда", "секунди"][getSlavicForm(c)]; }, ms: function (c) { return ["милисекунди", "милисекунда", "милисекунди"][getSlavicForm(c)]; }, decimal: "," }, bn: { y: "বছর", mo: "মাস", w: "সপ্তাহ", d: "দিন", h: "ঘন্টা", m: "মিনিট", s: "সেকেন্ড", ms: "মিলিসেকেন্ড" }, ca: { y: function (c) { return "any" + (c === 1 ? "" : "s"); }, mo: function (c) { return "mes" + (c === 1 ? "" : "os"); }, w: function (c) { return "setman" + (c === 1 ? "a" : "es"); }, d: function (c) { return "di" + (c === 1 ? "a" : "es"); }, h: function (c) { return "hor" + (c === 1 ? "a" : "es"); }, m: function (c) { return "minut" + (c === 1 ? "" : "s"); }, s: function (c) { return "segon" + (c === 1 ? "" : "s"); }, ms: function (c) { return "milisegon" + (c === 1 ? "" : "s"); }, decimal: "," }, cs: { y: function (c) { return ["rok", "roku", "roky", "let"][getCzechOrSlovakForm(c)]; }, mo: function (c) { return ["měsíc", "měsíce", "měsíce", "měsíců"][getCzechOrSlovakForm(c)]; }, w: function (c) { return ["týden", "týdne", "týdny", "týdnů"][getCzechOrSlovakForm(c)]; }, d: function (c) { return ["den", "dne", "dny", "dní"][getCzechOrSlovakForm(c)]; }, h: function (c) { return ["hodina", "hodiny", "hodiny", "hodin"][getCzechOrSlovakForm(c)]; }, m: function (c) { return ["minuta", "minuty", "minuty", "minut"][getCzechOrSlovakForm(c)]; }, s: function (c) { return ["sekunda", "sekundy", "sekundy", "sekund"][ getCzechOrSlovakForm(c) ]; }, ms: function (c) { return ["milisekunda", "milisekundy", "milisekundy", "milisekund"][ getCzechOrSlovakForm(c) ]; }, decimal: "," }, cy: { y: "flwyddyn", mo: "mis", w: "wythnos", d: "diwrnod", h: "awr", m: "munud", s: "eiliad", ms: "milieiliad" }, da: { y: "år", mo: function (c) { return "måned" + (c === 1 ? "" : "er"); }, w: function (c) { return "uge" + (c === 1 ? "" : "r"); }, d: function (c) { return "dag" + (c === 1 ? "" : "e"); }, h: function (c) { return "time" + (c === 1 ? "" : "r"); }, m: function (c) { return "minut" + (c === 1 ? "" : "ter"); }, s: function (c) { return "sekund" + (c === 1 ? "" : "er"); }, ms: function (c) { return "millisekund" + (c === 1 ? "" : "er"); }, decimal: "," }, de: { y: function (c) { return "Jahr" + (c === 1 ? "" : "e"); }, mo: function (c) { return "Monat" + (c === 1 ? "" : "e"); }, w: function (c) { return "Woche" + (c === 1 ? "" : "n"); }, d: function (c) { return "Tag" + (c === 1 ? "" : "e"); }, h: function (c) { return "Stunde" + (c === 1 ? "" : "n"); }, m: function (c) { return "Minute" + (c === 1 ? "" : "n"); }, s: function (c) { return "Sekunde" + (c === 1 ? "" : "n"); }, ms: function (c) { return "Millisekunde" + (c === 1 ? "" : "n"); }, decimal: "," }, el: greek, en: { y: function (c) { return "year" + (c === 1 ? "" : "s"); }, mo: function (c) { return "month" + (c === 1 ? "" : "s"); }, w: function (c) { return "week" + (c === 1 ? "" : "s"); }, d: function (c) { return "day" + (c === 1 ? "" : "s"); }, h: function (c) { return "hour" + (c === 1 ? "" : "s"); }, m: function (c) { return "minute" + (c === 1 ? "" : "s"); }, s: function (c) { return "second" + (c === 1 ? "" : "s"); }, ms: function (c) { return "millisecond" + (c === 1 ? "" : "s"); }, decimal: "." }, eo: { y: function (c) { return "jaro" + (c === 1 ? "" : "j"); }, mo: function (c) { return "monato" + (c === 1 ? "" : "j"); }, w: function (c) { return "semajno" + (c === 1 ? "" : "j"); }, d: function (c) { return "tago" + (c === 1 ? "" : "j"); }, h: function (c) { return "horo" + (c === 1 ? "" : "j"); }, m: function (c) { return "minuto" + (c === 1 ? "" : "j"); }, s: function (c) { return "sekundo" + (c === 1 ? "" : "j"); }, ms: function (c) { return "milisekundo" + (c === 1 ? "" : "j"); }, decimal: "," }, es: { y: function (c) { return "año" + (c === 1 ? "" : "s"); }, mo: function (c) { return "mes" + (c === 1 ? "" : "es"); }, w: function (c) { return "semana" + (c === 1 ? "" : "s"); }, d: function (c) { return "día" + (c === 1 ? "" : "s"); }, h: function (c) { return "hora" + (c === 1 ? "" : "s"); }, m: function (c) { return "minuto" + (c === 1 ? "" : "s"); }, s: function (c) { return "segundo" + (c === 1 ? "" : "s"); }, ms: function (c) { return "milisegundo" + (c === 1 ? "" : "s"); }, decimal: "," }, et: { y: function (c) { return "aasta" + (c === 1 ? "" : "t"); }, mo: function (c) { return "kuu" + (c === 1 ? "" : "d"); }, w: function (c) { return "nädal" + (c === 1 ? "" : "at"); }, d: function (c) { return "päev" + (c === 1 ? "" : "a"); }, h: function (c) { return "tund" + (c === 1 ? "" : "i"); }, m: function (c) { return "minut" + (c === 1 ? "" : "it"); }, s: function (c) { return "sekund" + (c === 1 ? "" : "it"); }, ms: function (c) { return "millisekund" + (c === 1 ? "" : "it"); }, decimal: "," }, eu: { y: "urte", mo: "hilabete", w: "aste", d: "egun", h: "ordu", m: "minutu", s: "segundo", ms: "milisegundo", decimal: "," }, fa: { y: "سال", mo: "ماه", w: "هفته", d: "روز", h: "ساعت", m: "دقیقه", s: "ثانیه", ms: "میلی ثانیه", decimal: "." }, fi: { y: function (c) { return c === 1 ? "vuosi" : "vuotta"; }, mo: function (c) { return c === 1 ? "kuukausi" : "kuukautta"; }, w: function (c) { return "viikko" + (c === 1 ? "" : "a"); }, d: function (c) { return "päivä" + (c === 1 ? "" : "ä"); }, h: function (c) { return "tunti" + (c === 1 ? "" : "a"); }, m: function (c) { return "minuutti" + (c === 1 ? "" : "a"); }, s: function (c) { return "sekunti" + (c === 1 ? "" : "a"); }, ms: function (c) { return "millisekunti" + (c === 1 ? "" : "a"); }, decimal: "," }, fo: { y: "ár", mo: function (c) { return c === 1 ? "mánaður" : "mánaðir"; }, w: function (c) { return c === 1 ? "vika" : "vikur"; }, d: function (c) { return c === 1 ? "dagur" : "dagar"; }, h: function (c) { return c === 1 ? "tími" : "tímar"; }, m: function (c) { return c === 1 ? "minuttur" : "minuttir"; }, s: "sekund", ms: "millisekund", decimal: "," }, fr: { y: function (c) { return "an" + (c >= 2 ? "s" : ""); }, mo: "mois", w: function (c) { return "semaine" + (c >= 2 ? "s" : ""); }, d: function (c) { return "jour" + (c >= 2 ? "s" : ""); }, h: function (c) { return "heure" + (c >= 2 ? "s" : ""); }, m: function (c) { return "minute" + (c >= 2 ? "s" : ""); }, s: function (c) { return "seconde" + (c >= 2 ? "s" : ""); }, ms: function (c) { return "milliseconde" + (c >= 2 ? "s" : ""); }, decimal: "," }, gr: greek, he: { y: function (c) { return c === 1 ? "שנה" : "שנים"; }, mo: function (c) { return c === 1 ? "חודש" : "חודשים"; }, w: function (c) { return c === 1 ? "שבוע" : "שבועות"; }, d: function (c) { return c === 1 ? "יום" : "ימים"; }, h: function (c) { return c === 1 ? "שעה" : "שעות"; }, m: function (c) { return c === 1 ? "דקה" : "דקות"; }, s: function (c) { return c === 1 ? "שניה" : "שניות"; }, ms: function (c) { return c === 1 ? "מילישנייה" : "מילישניות"; }, decimal: "." }, hr: { y: function (c) { if (c % 10 === 2 || c % 10 === 3 || c % 10 === 4) { return "godine"; } return "godina"; }, mo: function (c) { if (c === 1) { return "mjesec"; } else if (c === 2 || c === 3 || c === 4) { return "mjeseca"; } return "mjeseci"; }, w: function (c) { if (c % 10 === 1 && c !== 11) { return "tjedan"; } return "tjedna"; }, d: function (c) { return c === 1 ? "dan" : "dana"; }, h: function (c) { if (c === 1) { return "sat"; } else if (c === 2 || c === 3 || c === 4) { return "sata"; } return "sati"; }, m: function (c) { var mod10 = c % 10; if ((mod10 === 2 || mod10 === 3 || mod10 === 4) && (c < 10 || c > 14)) { return "minute"; } return "minuta"; }, s: function (c) { var mod10 = c % 10; if (mod10 === 5 || (Math.floor(c) === c && c >= 10 && c <= 19)) { return "sekundi"; } else if (mod10 === 1) { return "sekunda"; } else if (mod10 === 2 || mod10 === 3 || mod10 === 4) { return "sekunde"; } return "sekundi"; }, ms: function (c) { if (c === 1) { return "milisekunda"; } else if (c % 10 === 2 || c % 10 === 3 || c % 10 === 4) { return "milisekunde"; } return "milisekundi"; }, decimal: "," }, hi: { y: "साल", mo: function (c) { return c === 1 ? "महीना" : "महीने"; }, w: function (c) { return c === 1 ? "हफ़्ता" : "हफ्ते"; }, d: "दिन", h: function (c) { return c === 1 ? "घंटा" : "घंटे"; }, m: "मिनट", s: "सेकंड", ms: "मिलीसेकंड", decimal: "." }, hu: { y: "év", mo: "hónap", w: "hét", d: "nap", h: "óra", m: "perc", s: "másodperc", ms: "ezredmásodperc", decimal: "," }, id: { y: "tahun", mo: "bulan", w: "minggu", d: "hari", h: "jam", m: "menit", s: "detik", ms: "milidetik", decimal: "." }, is: { y: "ár", mo: function (c) { return "mánuð" + (c === 1 ? "ur" : "ir"); }, w: function (c) { return "vik" + (c === 1 ? "a" : "ur"); }, d: function (c) { return "dag" + (c === 1 ? "ur" : "ar"); }, h: function (c) { return "klukkutím" + (c === 1 ? "i" : "ar"); }, m: function (c) { return "mínút" + (c === 1 ? "a" : "ur"); }, s: function (c) { return "sekúnd" + (c === 1 ? "a" : "ur"); }, ms: function (c) { return "millisekúnd" + (c === 1 ? "a" : "ur"); }, decimal: "." }, it: { y: function (c) { return "ann" + (c === 1 ? "o" : "i"); }, mo: function (c) { return "mes" + (c === 1 ? "e" : "i"); }, w: function (c) { return "settiman" + (c === 1 ? "a" : "e"); }, d: function (c) { return "giorn" + (c === 1 ? "o" : "i"); }, h: function (c) { return "or" + (c === 1 ? "a" : "e"); }, m: function (c) { return "minut" + (c === 1 ? "o" : "i"); }, s: function (c) { return "second" + (c === 1 ? "o" : "i"); }, ms: function (c) { return "millisecond" + (c === 1 ? "o" : "i"); }, decimal: "," }, ja: { y: "年", mo: "ヶ月", w: "週", d: "日", h: "時間", m: "分", s: "秒", ms: "ミリ秒", decimal: "." }, km: { y: "ឆ្នាំ", mo: "ខែ", w: "សប្តាហ៍", d: "ថ្ងៃ", h: "ម៉ោង", m: "នាទី", s: "វិនាទី", ms: "មិល្លីវិនាទី" }, kn: { y: function (c) { return c === 1 ? "ವರ್ಷ" : "ವರ್ಷಗಳು"; }, mo: function (c) { return c === 1 ? "ತಿಂಗಳು" : "ತಿಂಗಳುಗಳು"; }, w: function (c) { return c === 1 ? "ವಾರ" : "ವಾರಗಳು"; }, d: function (c) { return c === 1 ? "ದಿನ" : "ದಿನಗಳು"; }, h: function (c) { return c === 1 ? "ಗಂಟೆ" : "ಗಂಟೆಗಳು"; }, m: function (c) { return c === 1 ? "ನಿಮಿಷ" : "ನಿಮಿಷಗಳು"; }, s: function (c) { return c === 1 ? "ಸೆಕೆಂಡ್" : "ಸೆಕೆಂಡುಗಳು"; }, ms: function (c) { return c === 1 ? "ಮಿಲಿಸೆಕೆಂಡ್" : "ಮಿಲಿಸೆಕೆಂಡುಗಳು"; } }, ko: { y: "년", mo: "개월", w: "주일", d: "일", h: "시간", m: "분", s: "초", ms: "밀리 초", decimal: "." }, ku: { y: "sal", mo: "meh", w: "hefte", d: "roj", h: "seet", m: "deqe", s: "saniye", ms: "mîlîçirk", decimal: "," }, lo: { y: "ປີ", mo: "ເດືອນ", w: "ອາທິດ", d: "ມື້", h: "ຊົ່ວໂມງ", m: "ນາທີ", s: "ວິນາທີ", ms: "ມິນລິວິນາທີ", decimal: "," }, lt: { y: function (c) { return c % 10 === 0 || (c % 100 >= 10 && c % 100 <= 20) ? "metų" : "metai"; }, mo: function (c) { return ["mėnuo", "mėnesiai", "mėnesių"][getLithuanianForm(c)]; }, w: function (c) { return ["savaitė", "savaitės", "savaičių"][getLithuanianForm(c)]; }, d: function (c) { return ["diena", "dienos", "dienų"][getLithuanianForm(c)]; }, h: function (c) { return ["valanda", "valandos", "valandų"][getLithuanianForm(c)]; }, m: function (c) { return ["minutė", "minutės", "minučių"][getLithuanianForm(c)]; }, s: function (c) { return ["sekundė", "sekundės", "sekundžių"][getLithuanianForm(c)]; }, ms: function (c) { return ["milisekundė", "milisekundės", "milisekundžių"][ getLithuanianForm(c) ]; }, decimal: "," }, lv: { y: function (c) { return getLatvianForm(c) ? "gads" : "gadi"; }, mo: function (c) { return getLatvianForm(c) ? "mēnesis" : "mēneši"; }, w: function (c) { return getLatvianForm(c) ? "nedēļa" : "nedēļas"; }, d: function (c) { return getLatvianForm(c) ? "diena" : "dienas"; }, h: function (c) { return getLatvianForm(c) ? "stunda" : "stundas"; }, m: function (c) { return getLatvianForm(c) ? "minūte" : "minūtes"; }, s: function (c) { return getLatvianForm(c) ? "sekunde" : "sekundes"; }, ms: function (c) { return getLatvianForm(c) ? "milisekunde" : "milisekundes"; }, decimal: "," }, mk: { y: function (c) { return c === 1 ? "година" : "години"; }, mo: function (c) { return c === 1 ? "месец" : "месеци"; }, w: function (c) { return c === 1 ? "недела" : "недели"; }, d: function (c) { return c === 1 ? "ден" : "дена"; }, h: function (c) { return c === 1 ? "час" : "часа"; }, m: function (c) { return c === 1 ? "минута" : "минути"; }, s: function (c) { return c === 1 ? "секунда" : "секунди"; }, ms: function (c) { return c === 1 ? "милисекунда" : "милисекунди"; }, decimal: "," }, mn: { y: "жил", mo: "сар", w: "долоо хоног", d: "өдөр", h: "цаг", m: "минут", s: "секунд", ms: "миллисекунд", decimal: "." }, mr: { y: function (c) { return c === 1 ? "वर्ष" : "वर्षे"; }, mo: function (c) { return c === 1 ? "महिना" : "महिने"; }, w: function (c) { return c === 1 ? "आठवडा" : "आठवडे"; }, d: "दिवस", h: "तास", m: function (c) { return c === 1 ? "मिनिट" : "मिनिटे"; }, s: "सेकंद", ms: "मिलिसेकंद" }, ms: { y: "tahun", mo: "bulan", w: "minggu", d: "hari", h: "jam", m: "minit", s: "saat", ms: "milisaat", decimal: "." }, nl: { y: "jaar", mo: function (c) { return c === 1 ? "maand" : "maanden"; }, w: function (c) { return c === 1 ? "week" : "weken"; }, d: function (c) { return c === 1 ? "dag" : "dagen"; }, h: "uur", m: function (c) { return c === 1 ? "minuut" : "minuten"; }, s: function (c) { return c === 1 ? "seconde" : "seconden"; }, ms: function (c) { return c === 1 ? "milliseconde" : "milliseconden"; }, decimal: "," }, no: { y: "år", mo: function (c) { return "måned" + (c === 1 ? "" : "er"); }, w: function (c) { return "uke" + (c === 1 ? "" : "r"); }, d: function (c) { return "dag" + (c === 1 ? "" : "er"); }, h: function (c) { return "time" + (c === 1 ? "" : "r"); }, m: function (c) { return "minutt" + (c === 1 ? "" : "er"); }, s: function (c) { return "sekund" + (c === 1 ? "" : "er"); }, ms: function (c) { return "millisekund" + (c === 1 ? "" : "er"); }, decimal: "," }, pl: { y: function (c) { return ["rok", "roku", "lata", "lat"][getPolishForm(c)]; }, mo: function (c) { return ["miesiąc", "miesiąca", "miesiące", "miesięcy"][ getPolishForm(c) ]; }, w: function (c) { return ["tydzień", "tygodnia", "tygodnie", "tygodni"][getPolishForm(c)]; }, d: function (c) { return ["dzień", "dnia", "dni", "dni"][getPolishForm(c)]; }, h: function (c) { return ["godzina", "godziny", "godziny", "godzin"][getPolishForm(c)]; }, m: function (c) { return ["minuta", "minuty", "minuty", "minut"][getPolishForm(c)]; }, s: function (c) { return ["sekunda", "sekundy", "sekundy", "sekund"][getPolishForm(c)]; }, ms: function (c) { return ["milisekunda", "milisekundy", "milisekundy", "milisekund"][ getPolishForm(c) ]; }, decimal: "," }, pt: { y: function (c) { return "ano" + (c === 1 ? "" : "s"); }, mo: function (c) { return c === 1 ? "mês" : "meses"; }, w: function (c) { return "semana" + (c === 1 ? "" : "s"); }, d: function (c) { return "dia" + (c === 1 ? "" : "s"); }, h: function (c) { return "hora" + (c === 1 ? "" : "s"); }, m: function (c) { return "minuto" + (c === 1 ? "" : "s"); }, s: function (c) { return "segundo" + (c === 1 ? "" : "s"); }, ms: function (c) { return "milissegundo" + (c === 1 ? "" : "s"); }, decimal: "," }, ro: { y: function (c) { return c === 1 ? "an" : "ani"; }, mo: function (c) { return c === 1 ? "lună" : "luni"; }, w: function (c) { return c === 1 ? "săptămână" : "săptămâni"; }, d: function (c) { return c === 1 ? "zi" : "zile"; }, h: function (c) { return c === 1 ? "oră" : "ore"; }, m: function (c) { return c === 1 ? "minut" : "minute"; }, s: function (c) { return c === 1 ? "secundă" : "secunde"; }, ms: function (c) { return c === 1 ? "milisecundă" : "milisecunde"; }, decimal: "," }, ru: { y: function (c) { return ["лет", "год", "года"][getSlavicForm(c)]; }, mo: function (c) { return ["месяцев", "месяц", "месяца"][getSlavicForm(c)]; }, w: function (c) { return ["недель", "неделя", "недели"][getSlavicForm(c)]; }, d: function (c) { return ["дней", "день", "дня"][getSlavicForm(c)]; }, h: function (c) { return ["часов", "час", "часа"][getSlavicForm(c)]; }, m: function (c) { return ["минут", "минута", "минуты"][getSlavicForm(c)]; }, s: function (c) { return ["секунд", "секунда", "секунды"][getSlavicForm(c)]; }, ms: function (c) { return ["миллисекунд", "миллисекунда", "миллисекунды"][ getSlavicForm(c) ]; }, decimal: "," }, sq: { y: function (c) { return c === 1 ? "vit" : "vjet"; }, mo: "muaj", w: "javë", d: "ditë", h: "orë", m: function (c) { return "minut" + (c === 1 ? "ë" : "a"); }, s: function (c) { return "sekond" + (c === 1 ? "ë" : "a"); }, ms: function (c) { return "milisekond" + (c === 1 ? "ë" : "a"); }, decimal: "," }, sr: { y: function (c) { return ["години", "година", "године"][getSlavicForm(c)]; }, mo: function (c) { return ["месеци", "месец", "месеца"][getSlavicForm(c)]; }, w: function (c) { return ["недељи", "недеља", "недеље"][getSlavicForm(c)]; }, d: function (c) { return ["дани", "дан", "дана"][getSlavicForm(c)]; }, h: function (c) { return ["сати", "сат", "сата"][getSlavicForm(c)]; }, m: function (c) { return ["минута", "минут", "минута"][getSlavicForm(c)]; }, s: function (c) { return ["секунди", "секунда", "секунде"][getSlavicForm(c)]; }, ms: function (c) { return ["милисекунди", "милисекунда", "милисекунде"][getSlavicForm(c)]; }, decimal: "," }, ta: { y: function (c) { return c === 1 ? "வருடம்" : "ஆண்டுகள்"; }, mo: function (c) { return c === 1 ? "மாதம்" : "மாதங்கள்"; }, w: function (c) { return c === 1 ? "வாரம்" : "வாரங்கள்"; }, d: function (c) { return c === 1 ? "நாள்" : "நாட்கள்"; }, h: function (c) { return c === 1 ? "மணி" : "மணிநேரம்"; }, m: function (c) { return "நிமிட" + (c === 1 ? "ம்" : "ங்கள்"); }, s: function (c) { return "வினாடி" + (c === 1 ? "" : "கள்"); }, ms: function (c) { return "மில்லி விநாடி" + (c === 1 ? "" : "கள்"); } }, te: { y: function (c) { return "సంవత్స" + (c === 1 ? "రం" : "రాల"); }, mo: function (c) { return "నెల" + (c === 1 ? "" : "ల"); }, w: function (c) { return c === 1 ? "వారం" : "వారాలు"; }, d: function (c) { return "రోజు" + (c === 1 ? "" : "లు"); }, h: function (c) { return "గంట" + (c === 1 ? "" : "లు"); }, m: function (c) { return c === 1 ? "నిమిషం" : "నిమిషాలు"; }, s: function (c) { return c === 1 ? "సెకను" : "సెకన్లు"; }, ms: function (c) { return c === 1 ? "మిల్లీసెకన్" : "మిల్లీసెకన్లు"; } }, uk: { y: function (c) { return ["років", "рік", "роки"][getSlavicForm(c)]; }, mo: function (c) { return ["місяців", "місяць", "місяці"][getSlavicForm(c)]; }, w: function (c) { return ["тижнів", "тиждень", "тижні"][getSlavicForm(c)]; }, d: function (c) { return ["днів", "день", "дні"][getSlavicForm(c)]; }, h: function (c) { return ["годин", "година", "години"][getSlavicForm(c)]; }, m: function (c) { return ["хвилин", "хвилина", "хвилини"][getSlavicForm(c)]; }, s: function (c) { return ["секунд", "секунда", "секунди"][getSlavicForm(c)]; }, ms: function (c) { return ["мілісекунд", "мілісекунда", "мілісекунди"][getSlavicForm(c)]; }, decimal: "," }, ur: { y: "سال", mo: function (c) { return c === 1 ? "مہینہ" : "مہینے"; }, w: function (c) { return c === 1 ? "ہفتہ" : "ہفتے"; }, d: "دن", h: function (c) { return c === 1 ? "گھنٹہ" : "گھنٹے"; }, m: "منٹ", s: "سیکنڈ", ms: "ملی سیکنڈ", decimal: "." }, sk: { y: function (c) { return ["rok", "roky", "roky", "rokov"][getCzechOrSlovakForm(c)]; }, mo: function (c) { return ["mesiac", "mesiace", "mesiace", "mesiacov"][ getCzechOrSlovakForm(c) ]; }, w: function (c) { return ["týždeň", "týždne", "týždne", "týždňov"][ getCzechOrSlovakForm(c) ]; }, d: function (c) { return ["deň", "dni", "dni", "dní"][getCzechOrSlovakForm(c)]; }, h: function (c) { return ["hodina", "hodiny", "hodiny", "hodín"][getCzechOrSlovakForm(c)]; }, m: function (c) { return ["minúta", "minúty", "minúty", "minút"][getCzechOrSlovakForm(c)]; }, s: function (c) { return ["sekunda", "sekundy", "sekundy", "sekúnd"][ getCzechOrSlovakForm(c) ]; }, ms: function (c) { return ["milisekunda", "milisekundy", "milisekundy", "milisekúnd"][ getCzechOrSlovakForm(c) ]; }, decimal: "," }, sl: { y: function (c) { if (c % 10 === 1) { return "leto"; } else if (c % 100 === 2) { return "leti"; } else if ( c % 100 === 3 || c % 100 === 4 || (Math.floor(c) !== c && c % 100 <= 5) ) { return "leta"; } else { return "let"; } }, mo: function (c) { if (c % 10 === 1) { return "mesec"; } else if (c % 100 === 2 || (Math.floor(c) !== c && c % 100 <= 5)) { return "meseca"; } else if (c % 10 === 3 || c % 10 === 4) { return "mesece"; } else { return "mesecev"; } }, w: function (c) { if (c % 10 === 1) { return "teden"; } else if (c % 10 === 2 || (Math.floor(c) !== c && c % 100 <= 4)) { return "tedna"; } else if (c % 10 === 3 || c % 10 === 4) { return "tedne"; } else { return "tednov"; } }, d: function (c) { return c % 100 === 1 ? "dan" : "dni"; }, h: function (c) { if (c % 10 === 1) { return "ura"; } else if (c % 100 === 2) { return "uri"; } else if (c % 10 === 3 || c % 10 === 4 || Math.floor(c) !== c) { return "ure"; } else { return "ur"; } }, m: function (c) { if (c % 10 === 1) { return "minuta"; } else if (c % 10 === 2) { return "minuti"; } else if ( c % 10 === 3 || c % 10 === 4 || (Math.floor(c) !== c && c % 100 <= 4) ) { return "minute"; } else { return "minut"; } }, s: function (c) { if (c % 10 === 1) { return "sekunda"; } else if (c % 100 === 2) { return "sekundi"; } else if (c % 100 === 3 || c % 100 === 4 || Math.floor(c) !== c) { return "sekunde"; } else { return "sekund"; } }, ms: function (c) { if (c % 10 === 1) { return "milisekunda"; } else if (c % 100 === 2) { return "milisekundi"; } else if (c % 100 === 3 || c % 100 === 4 || Math.floor(c) !== c) { return "milisekunde"; } else { return "milisekund"; } }, decimal: "," }, sv: { y: "år", mo: function (c) { return "månad" + (c === 1 ? "" : "er"); }, w: function (c) { return "veck" + (c === 1 ? "a" : "or"); }, d: function (c) { return "dag" + (c === 1 ? "" : "ar"); }, h: function (c) { return "timm" + (c === 1 ? "e" : "ar"); }, m: function (c) { return "minut" + (c === 1 ? "" : "er"); }, s: function (c) { return "sekund" + (c === 1 ? "" : "er"); }, ms: function (c) { return "millisekund" + (c === 1 ? "" : "er"); }, decimal: "," }, sw: { y: function (c) { return c === 1 ? "mwaka" : "miaka"; }, mo: function (c) { return c === 1 ? "mwezi" : "miezi"; }, w: "wiki", d: function (c) { return c === 1 ? "siku" : "masiku"; }, h: function (c) { return c === 1 ? "saa" : "masaa"; }, m: "dakika", s: "sekunde", ms: "milisekunde", decimal: ".", _numberFirst: true }, tr: { y: "yıl", mo: "ay", w: "hafta", d: "gün", h: "saat", m: "dakika", s: "saniye", ms: "milisaniye", decimal: "," }, th: { y: "ปี", mo: "เดือน", w: "สัปดาห์", d: "วัน", h: "ชั่วโมง", m: "นาที", s: "วินาที", ms: "มิลลิวินาที", decimal: "." }, vi: { y: "năm", mo: "tháng", w: "tuần", d: "ngày", h: "giờ", m: "phút", s: "giây", ms: "mili giây", decimal: "," }, zh_CN: { y: "年", mo: "个月", w: "周", d: "天", h: "小时", m: "分钟", s: "秒", ms: "毫秒", decimal: "." }, zh_TW: { y: "年", mo: "個月", w: "周", d: "天", h: "小時", m: "分鐘", s: "秒", ms: "毫秒", decimal: "." } }; // You can create a humanizer, which returns a function with default // parameters. function humanizer(passedOptions) { var result = function humanizer(ms, humanizerOptions) { var options = assign({}, result, humanizerOptions || {}); return doHumanization(ms, options); }; return assign( result, { language: "en", spacer: " ", conjunction: "", serialComma: true, units: ["y", "mo", "w", "d", "h", "m", "s"], languages: {}, round: false, unitMeasures: { y: 31557600000, mo: 2629800000, w: 604800000, d: 86400000, h: 3600000, m: 60000, s: 1000, ms: 1 } }, passedOptions ); } // The main function is just a wrapper around a default humanizer. var humanizeDuration = humanizer({}); // Build dictionary from options function getDictionary(options) { var languagesFromOptions = [options.language]; if (has(options, "fallbacks")) { if (isArray(options.fallbacks) && options.fallbacks.length) { languagesFromOptions = languagesFromOptions.concat(options.fallbacks); } else { throw new Error("fallbacks must be an array with at least one element"); } } for (var i = 0; i < languagesFromOptions.length; i++) { var languageToTry = languagesFromOptions[i]; if (has(options.languages, languageToTry)) { return options.languages[languageToTry]; } else if (has(LANGUAGES, languageToTry)) { return LANGUAGES[languageToTry]; } } throw new Error("No language found."); } // doHumanization does the bulk of the work. function doHumanization(ms, options) { var i, len, piece; // Make sure we have a positive number. // Has the nice sideffect of turning Number objects into primitives. ms = Math.abs(ms); var dictionary = getDictionary(options); var pieces = []; // Start at the top and keep removing units, bit by bit. var unitName, unitMS, unitCount; for (i = 0, len = options.units.length; i < len; i++) { unitName = options.units[i]; unitMS = options.unitMeasures[unitName]; // What's the number of full units we can fit? if (i + 1 === len) { if (has(options, "maxDecimalPoints")) { // We need to use this expValue to avoid rounding functionality of toFixed call var expValue = Math.pow(10, options.maxDecimalPoints); var unitCountFloat = ms / unitMS; unitCount = parseFloat( (Math.floor(expValue * unitCountFloat) / expValue).toFixed( options.maxDecimalPoints ) ); } else { unitCount = ms / unitMS; } } else { unitCount = Math.floor(ms / unitMS); } // Add the string. pieces.push({ unitCount: unitCount, unitName: unitName }); // Remove what we just figured out. ms -= unitCount * unitMS; } var firstOccupiedUnitIndex = 0; for (i = 0; i < pieces.length; i++) { if (pieces[i].unitCount) { firstOccupiedUnitIndex = i; break; } } if (options.round) { var ratioToLargerUnit, previousPiece; for (i = pieces.length - 1; i >= 0; i--) { piece = pieces[i]; piece.unitCount = Math.round(piece.unitCount); if (i === 0) { break; } previousPiece = pieces[i - 1]; ratioToLargerUnit = options.unitMeasures[previousPiece.unitName] / options.unitMeasures[piece.unitName]; if ( piece.unitCount % ratioToLargerUnit === 0 || (options.largest && options.largest - 1 < i - firstOccupiedUnitIndex) ) { previousPiece.unitCount += piece.unitCount / ratioToLargerUnit; piece.unitCount = 0; } } } var result = []; for (i = 0, pieces.length; i < len; i++) { piece = pieces[i]; if (piece.unitCount) { result.push( render(piece.unitCount, piece.unitName, dictionary, options) ); } if (result.length === options.largest) { break; } } if (result.length) { var delimiter; if (has(options, "delimiter")) { delimiter = options.delimiter; } else if (has(dictionary, "delimiter")) { delimiter = dictionary.delimiter; } else { delimiter = ", "; } if (!options.conjunction || result.length === 1) { return result.join(delimiter); } else if (result.length === 2) { return result.join(options.conjunction); } else if (result.length > 2) { return ( result.slice(0, -1).join(delimiter) + (options.serialComma ? "," : "") + options.conjunction + result.slice(-1) ); } } else { return render( 0, options.units[options.units.length - 1], dictionary, options ); } } function render(count, type, dictionary, options) { var decimal; if (has(options, "decimal")) { decimal = options.decimal; } else if (has(dictionary, "decimal")) { decimal = dictionary.decimal; } else { decimal = "."; } var countStr; if (typeof dictionary._formatCount === "function") { countStr = dictionary._formatCount(count, decimal); } else { countStr = count.toString().replace(".", decimal); } var dictionaryValue = dictionary[type]; var word; if (typeof dictionaryValue === "function") { word = dictionaryValue(count); } else { word = dictionaryValue; } if (dictionary._numberFirst) { return word + options.spacer + countStr; } return countStr + options.spacer + word; } function assign(destination) { var source; for (var i = 1; i < arguments.length; i++) { source = arguments[i]; for (var prop in source) { if (has(source, prop)) { destination[prop] = source[prop]; } } } return destination; } function getArabicForm(c) { if (c === 1) { return 0; } if (c === 2) { return 1; } if (c > 2 && c < 11) { return 2; } return 0; } function getPolishForm(c) { if (c === 1) { return 0; } else if (Math.floor(c) !== c) { return 1; } else if (c % 10 >= 2 && c % 10 <= 4 && !(c % 100 > 10 && c % 100 < 20)) { return 2; } else { return 3; } } function getSlavicForm(c) { if (Math.floor(c) !== c) { return 2; } else if ( (c % 100 >= 5 && c % 100 <= 20) || (c % 10 >= 5 && c % 10 <= 9) || c % 10 === 0 ) { return 0; } else if (c % 10 === 1) { return 1; } else if (c > 1) { return 2; } else { return 0; } } function getCzechOrSlovakForm(c) { if (c === 1) { return 0; } else if (Math.floor(c) !== c) { return 1; } else if (c % 10 >= 2 && c % 10 <= 4 && c % 100 < 10) { return 2; } else { return 3; } } function getLithuanianForm(c) { if (c === 1 || (c % 10 === 1 && c % 100 > 20)) { return 0; } else if ( Math.floor(c) !== c || (c % 10 >= 2 && c % 100 > 20) || (c % 10 >= 2 && c % 100 < 10) ) { return 1; } else { return 2; } } function getLatvianForm(c) { return c % 10 === 1 && c % 100 !== 11; } // We need to make sure we support browsers that don't have // `Array.isArray`, so we define a fallback here. var isArray = Array.isArray || function (arg) { return Object.prototype.toString.call(arg) === "[object Array]"; }; function has(obj, key) { return Object.prototype.hasOwnProperty.call(obj, key); } humanizeDuration.getSupportedLanguages = function getSupportedLanguages() { var result = []; for (var language in LANGUAGES) { if (has(LANGUAGES, language) && language !== "gr") { result.push(language); } } return result; }; humanizeDuration.humanizer = humanizer; if (typeof define === "function" && define.amd) { define(function () { return humanizeDuration; }); } else if (typeof module !== "undefined" && module.exports) { module.exports = humanizeDuration; } else { this.humanizeDuration = humanizeDuration; } })();