81 lines
2.0 KiB
JavaScript
81 lines
2.0 KiB
JavaScript
|
const lang = document.documentElement.getAttribute('lang');
|
||
|
|
||
|
const templateFuture = 'in %value %unit';
|
||
|
const templatePast = lang === "en"
|
||
|
? '%value %unit ago'
|
||
|
: 'vor %value %unit';
|
||
|
|
||
|
const yearUnits = lang === "en"
|
||
|
? ["year", "years"]
|
||
|
: ["Jahr", "Jahren"];
|
||
|
|
||
|
const monthUnits = lang === "en"
|
||
|
? ["month", "months"]
|
||
|
: ["Monat", "Monaten"];
|
||
|
|
||
|
const dayUnits = lang === "en"
|
||
|
? ["day", "days"]
|
||
|
: ["Tag", "Tagen"];
|
||
|
|
||
|
const hourUnits = lang === "en"
|
||
|
? ["hour", "hours"]
|
||
|
: ["Stunde", "Stunden"];
|
||
|
|
||
|
const minuteUnits = lang === "en"
|
||
|
? ["minute", "minutes"]
|
||
|
: ["Minute", "Minuten"];
|
||
|
|
||
|
const secondUnits = lang === "en"
|
||
|
? ["second", "seconds"]
|
||
|
: ["Sekunde", "Sekunden"];
|
||
|
|
||
|
const nowString = lang === "en" ? "now" : "jetzt";
|
||
|
|
||
|
const secondsHour = 60 * 60;
|
||
|
|
||
|
const timeFrames = [
|
||
|
[365 * 24 * 60 * 60, yearUnits],
|
||
|
[30 * 24 * 60 * 60, monthUnits],
|
||
|
[24 * 60 * 60, dayUnits],
|
||
|
[secondsHour, hourUnits],
|
||
|
[60, minuteUnits],
|
||
|
[1, secondUnits],
|
||
|
];
|
||
|
|
||
|
function formatFromNow(timestamp) {
|
||
|
const now = Date.now() / 1000;
|
||
|
const diff = Math.abs(timestamp - now);
|
||
|
const ago = now > timestamp;
|
||
|
|
||
|
for (const [duration, [singular, plural]] of timeFrames) {
|
||
|
const value = diff < secondsHour
|
||
|
? Math.floor(diff / duration)
|
||
|
: Math.round(diff / duration);
|
||
|
|
||
|
if (value) {
|
||
|
const template = ago ? templatePast : templateFuture;
|
||
|
const unit = value === 1 ? singular : plural;
|
||
|
return template
|
||
|
.replace("%value", value)
|
||
|
.replace("%unit", unit);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nowString;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Initialises all countdown fields on the page.
|
||
|
*/
|
||
|
$(document).ready(function () {
|
||
|
$.each($('[data-countdown-ts]'), function (i, e) {
|
||
|
var span = $(e);
|
||
|
const timestamp = span.data("countdown-ts");
|
||
|
var text = span.html();
|
||
|
span.html(text.replace('%c', formatFromNow(timestamp)));
|
||
|
setInterval(function () {
|
||
|
span.html(text.replace('%c', formatFromNow(timestamp)));
|
||
|
}, 1000);
|
||
|
});
|
||
|
});
|