Module:LatestUpdate: Difference between revisionsGive feedback
Jump to navigation
Jump to search
created |
Gammaton32 (talk | contribs) added days_since_date to calculate time since any given date |
||
| (5 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local data = mw.loadJsonData("Data:LatestUpdate.json") | local data = mw.loadJsonData("Data:LatestUpdate.json") | ||
local update = data.latest_update | local update = data.latest_update or {} | ||
local month_map = { | |||
January = 1, | |||
February = 2, | |||
March = 3, | |||
April = 4, | |||
May = 5, | |||
June = 6, | |||
July = 7, | |||
August = 8, | |||
September = 9, | |||
October = 10, | |||
November = 11, | |||
December = 12 | |||
} | |||
-- Plural rules | |||
local plural_rules = { | |||
-- English | |||
en = function(n) | |||
return n == 1 and 1 or 2 | |||
end, | |||
-- Spanish | |||
es = function(n) | |||
return n == 1 and 1 or 2 | |||
end, | |||
-- French | |||
fr = function(n) | |||
return (n == 0 or n == 1) and 1 or 2 | |||
end, | |||
-- Korean (no plural distinction) | |||
ko = function(n) | |||
return 1 | |||
end, | |||
-- Russian | |||
ru = function(n) | |||
if n % 10 == 1 and n % 100 ~= 11 then | |||
return 1 | |||
elseif n % 10 >= 2 and n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20) then | |||
return 2 | |||
else | |||
return 3 | |||
end | |||
end, | |||
-- Turkish | |||
tr = function(n) | |||
return 1 | |||
end, | |||
-- Czech | |||
cs = function(n) | |||
if n == 1 then | |||
return 1 | |||
elseif n >= 2 and n <= 4 then | |||
return 2 | |||
else | |||
return 3 | |||
end | |||
end, | |||
-- Chinese (simplified) | |||
["zh-hans"] = function(n) | |||
return 1 | |||
end, | |||
-- Chinese (traditional) | |||
["zh-hant"] = function(n) | |||
return 1 | |||
end, | |||
-- uncomment when needed | |||
-- pl = function(n) | |||
-- if n == 1 then return 1 | |||
-- elseif n % 10 >= 2 and n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20) then return 2 | |||
-- else return 3 end | |||
-- end, | |||
-- uk = function(n) | |||
-- if n % 10 == 1 and n % 100 ~= 11 then return 1 | |||
-- elseif n % 10 >= 2 and n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20) then return 2 | |||
-- else return 3 end | |||
-- end, | |||
-- de = function(n) | |||
-- return n == 1 and 1 or 2 | |||
-- end, | |||
-- it = function(n) | |||
-- return n == 1 and 1 or 2 | |||
-- end, | |||
-- pt = function(n) | |||
-- return n == 1 and 1 or 2 | |||
-- end | |||
} | |||
local translations = { | |||
en = { | |||
[1] = "%d day ago", | |||
[2] = "%d days ago" | |||
}, | |||
es = { | |||
[1] = "hace %d día", | |||
[2] = "hace %d días" | |||
}, | |||
fr = { | |||
[1] = "il y a %d jour", | |||
[2] = "il y a %d jours" | |||
}, | |||
ko = { | |||
[1] = "%d일 전" | |||
}, | |||
ru = { | |||
[1] = "%d день назад", | |||
[2] = "%d дня назад", | |||
[3] = "%d дней назад" | |||
}, | |||
tr = { | |||
[1] = "%d gün önce" | |||
}, | |||
cs = { | |||
[1] = "před %d dnem", | |||
[2] = "před %d dny", | |||
[3] = "před %d dny" | |||
}, | |||
["zh-hans"] = { | |||
[1] = "%d天前" | |||
}, | |||
["zh-hant"] = { | |||
[1] = "%d天前" | |||
}, | |||
-- uncomment when needed | |||
-- pl = { | |||
-- [1] = "%d dzień temu", | |||
-- [2] = "%d dni temu", | |||
-- [3] = "%d dni temu" | |||
-- }, | |||
-- uk = { | |||
-- [1] = "%d день тому", | |||
-- [2] = "%d дні тому", | |||
-- [3] = "%d днів тому" | |||
-- }, | |||
-- de = { | |||
-- [1] = "vor %d Tag", | |||
-- [2] = "vor %d Tagen" | |||
-- }, | |||
-- it = { | |||
-- [1] = "%d giorno fa", | |||
-- [2] = "%d giorni fa" | |||
-- }, | |||
-- pt = { | |||
-- [1] = "há %d dia", | |||
-- [2] = "há %d dias" | |||
-- } | |||
} | |||
-- Special-case wording for 0 and 1 days, keyed by day count. | |||
-- A language missing an entry here falls back to the plural forms above. | |||
local relative_days = { | |||
en = { | |||
[0] = "today", | |||
[1] = "yesterday" | |||
}, | |||
es = { | |||
[0] = "hoy", | |||
[1] = "ayer" | |||
}, | |||
fr = { | |||
[0] = "aujourd'hui", | |||
[1] = "hier" | |||
}, | |||
ko = { | |||
[0] = "오늘", | |||
[1] = "어제" | |||
}, | |||
ru = { | |||
[0] = "сегодня", | |||
[1] = "вчера" | |||
}, | |||
tr = { | |||
[0] = "bugün", | |||
[1] = "dün" | |||
}, | |||
cs = { | |||
[0] = "dnes", | |||
[1] = "včera" | |||
}, | |||
["zh-hans"] = { | |||
[0] = "今天", | |||
[1] = "昨天" | |||
}, | |||
["zh-hant"] = { | |||
[0] = "今天", | |||
[1] = "昨天" | |||
}, | |||
-- uncomment when needed | |||
-- pl = { | |||
-- [0] = "dzisiaj", | |||
-- [1] = "wczoraj" | |||
-- }, | |||
-- uk = { | |||
-- [0] = "сьогодні", | |||
-- [1] = "вчора" | |||
-- }, | |||
-- de = { | |||
-- [0] = "heute", | |||
-- [1] = "gestern" | |||
-- }, | |||
-- it = { | |||
-- [0] = "oggi", | |||
-- [1] = "ieri" | |||
-- }, | |||
-- pt = { | |||
-- [0] = "hoje", | |||
-- [1] = "ontem" | |||
-- } | |||
} | |||
function p.month() | function p.month() | ||
return update.month | return update.month or "" | ||
end | end | ||
function p.day() | function p.day() | ||
return update.day | return update.day or "" | ||
end | end | ||
function p.year() | function p.year() | ||
return update.year | return update.year or "" | ||
end | |||
local function getMonthNumber(monthName) | |||
return month_map[monthName] | |||
end | |||
function p.days_since() | |||
local month_number = getMonthNumber(update.month) | |||
if not month_number or not update.day or not update.year then | |||
return 0 | |||
end | |||
local update_time = os.time({ | |||
year = tonumber(update.year), | |||
month = month_number, | |||
day = tonumber(update.day), | |||
hour = 0 | |||
}) | |||
local now = os.time() | |||
local diff_seconds = os.difftime(now, update_time) | |||
local days = math.floor(diff_seconds / 86400) | |||
if days < 0 then | |||
return 0 | |||
end | |||
return days | |||
end | |||
p.days_since_date = function(frame) | |||
local update_time = os.time({ | |||
year = frame.args[3], | |||
month = frame.args[1], | |||
day = frame.args[2], | |||
hour = 0 | |||
}) | |||
local now = os.time() | |||
local diff_seconds = os.difftime(now, update_time) | |||
local days = math.floor(diff_seconds / 86400) | |||
if days < 0 then | |||
return 0 | |||
end | |||
return days | |||
end | |||
local function normalize_lang(lang) | |||
if not lang or lang == "" then | |||
return "en" | |||
end | |||
return string.gsub(lang, "^/", "") | |||
end | |||
function p.days_since_text(frame) | |||
local args = frame.args or {} | |||
local lang = normalize_lang(args.lang or args[1] or "en") | |||
if not translations[lang] then | |||
lang = "en" | |||
end | |||
local days = p.days_since() | |||
local relative = relative_days[lang] | |||
if relative and relative[days] then | |||
return relative[days] | |||
end | |||
local plural_rule = plural_rules[lang] or plural_rules.en | |||
local form_index = plural_rule(days) | |||
local template = translations[lang][form_index] | |||
return string.format(template, days) | |||
end | end | ||
return p | return p | ||
Latest revision as of 13:46, 21 July 2026
Overview
[edit source]This module calculates the days since the last update stored in Data:LatestUpdate.json and sends to Module:UpdateExcerpt to be displayed by Template:Deadlock Wiki/UpdateExcerpt. It can also be called to calculate the time since any given date, in days.
Examples
[edit source]days_since_date
[edit source]This function can be called to calculate the days passed from a given date, using the format "Month/Day/Year". "Month" has to be in numbers.
For days since January 30 2026:
{{#invoke:LatestUpdate|days_since_date|1|30|2026}}
225
days_since
[edit source]This is an automated function that calculates the days since the latest update stored in Data:LatestUpdate.json.
days_since_text
[edit source]This is an automated function that wraps the "days_since" data in a localized text template to be used by Module:UpdateExcerpt.
local p = {}
local data = mw.loadJsonData("Data:LatestUpdate.json")
local update = data.latest_update or {}
local month_map = {
January = 1,
February = 2,
March = 3,
April = 4,
May = 5,
June = 6,
July = 7,
August = 8,
September = 9,
October = 10,
November = 11,
December = 12
}
-- Plural rules
local plural_rules = {
-- English
en = function(n)
return n == 1 and 1 or 2
end,
-- Spanish
es = function(n)
return n == 1 and 1 or 2
end,
-- French
fr = function(n)
return (n == 0 or n == 1) and 1 or 2
end,
-- Korean (no plural distinction)
ko = function(n)
return 1
end,
-- Russian
ru = function(n)
if n % 10 == 1 and n % 100 ~= 11 then
return 1
elseif n % 10 >= 2 and n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20) then
return 2
else
return 3
end
end,
-- Turkish
tr = function(n)
return 1
end,
-- Czech
cs = function(n)
if n == 1 then
return 1
elseif n >= 2 and n <= 4 then
return 2
else
return 3
end
end,
-- Chinese (simplified)
["zh-hans"] = function(n)
return 1
end,
-- Chinese (traditional)
["zh-hant"] = function(n)
return 1
end,
-- uncomment when needed
-- pl = function(n)
-- if n == 1 then return 1
-- elseif n % 10 >= 2 and n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20) then return 2
-- else return 3 end
-- end,
-- uk = function(n)
-- if n % 10 == 1 and n % 100 ~= 11 then return 1
-- elseif n % 10 >= 2 and n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20) then return 2
-- else return 3 end
-- end,
-- de = function(n)
-- return n == 1 and 1 or 2
-- end,
-- it = function(n)
-- return n == 1 and 1 or 2
-- end,
-- pt = function(n)
-- return n == 1 and 1 or 2
-- end
}
local translations = {
en = {
[1] = "%d day ago",
[2] = "%d days ago"
},
es = {
[1] = "hace %d día",
[2] = "hace %d días"
},
fr = {
[1] = "il y a %d jour",
[2] = "il y a %d jours"
},
ko = {
[1] = "%d일 전"
},
ru = {
[1] = "%d день назад",
[2] = "%d дня назад",
[3] = "%d дней назад"
},
tr = {
[1] = "%d gün önce"
},
cs = {
[1] = "před %d dnem",
[2] = "před %d dny",
[3] = "před %d dny"
},
["zh-hans"] = {
[1] = "%d天前"
},
["zh-hant"] = {
[1] = "%d天前"
},
-- uncomment when needed
-- pl = {
-- [1] = "%d dzień temu",
-- [2] = "%d dni temu",
-- [3] = "%d dni temu"
-- },
-- uk = {
-- [1] = "%d день тому",
-- [2] = "%d дні тому",
-- [3] = "%d днів тому"
-- },
-- de = {
-- [1] = "vor %d Tag",
-- [2] = "vor %d Tagen"
-- },
-- it = {
-- [1] = "%d giorno fa",
-- [2] = "%d giorni fa"
-- },
-- pt = {
-- [1] = "há %d dia",
-- [2] = "há %d dias"
-- }
}
-- Special-case wording for 0 and 1 days, keyed by day count.
-- A language missing an entry here falls back to the plural forms above.
local relative_days = {
en = {
[0] = "today",
[1] = "yesterday"
},
es = {
[0] = "hoy",
[1] = "ayer"
},
fr = {
[0] = "aujourd'hui",
[1] = "hier"
},
ko = {
[0] = "오늘",
[1] = "어제"
},
ru = {
[0] = "сегодня",
[1] = "вчера"
},
tr = {
[0] = "bugün",
[1] = "dün"
},
cs = {
[0] = "dnes",
[1] = "včera"
},
["zh-hans"] = {
[0] = "今天",
[1] = "昨天"
},
["zh-hant"] = {
[0] = "今天",
[1] = "昨天"
},
-- uncomment when needed
-- pl = {
-- [0] = "dzisiaj",
-- [1] = "wczoraj"
-- },
-- uk = {
-- [0] = "сьогодні",
-- [1] = "вчора"
-- },
-- de = {
-- [0] = "heute",
-- [1] = "gestern"
-- },
-- it = {
-- [0] = "oggi",
-- [1] = "ieri"
-- },
-- pt = {
-- [0] = "hoje",
-- [1] = "ontem"
-- }
}
function p.month()
return update.month or ""
end
function p.day()
return update.day or ""
end
function p.year()
return update.year or ""
end
local function getMonthNumber(monthName)
return month_map[monthName]
end
function p.days_since()
local month_number = getMonthNumber(update.month)
if not month_number or not update.day or not update.year then
return 0
end
local update_time = os.time({
year = tonumber(update.year),
month = month_number,
day = tonumber(update.day),
hour = 0
})
local now = os.time()
local diff_seconds = os.difftime(now, update_time)
local days = math.floor(diff_seconds / 86400)
if days < 0 then
return 0
end
return days
end
p.days_since_date = function(frame)
local update_time = os.time({
year = frame.args[3],
month = frame.args[1],
day = frame.args[2],
hour = 0
})
local now = os.time()
local diff_seconds = os.difftime(now, update_time)
local days = math.floor(diff_seconds / 86400)
if days < 0 then
return 0
end
return days
end
local function normalize_lang(lang)
if not lang or lang == "" then
return "en"
end
return string.gsub(lang, "^/", "")
end
function p.days_since_text(frame)
local args = frame.args or {}
local lang = normalize_lang(args.lang or args[1] or "en")
if not translations[lang] then
lang = "en"
end
local days = p.days_since()
local relative = relative_days[lang]
if relative and relative[days] then
return relative[days]
end
local plural_rule = plural_rules[lang] or plural_rules.en
local form_index = plural_rule(days)
local template = translations[lang][form_index]
return string.format(template, days)
end
return p