Jump to content

Module:Month translator

From Wikipedia, the free encyclopedia

This is an old revision of this page, as edited by Trappist the monk (talk | contribs) at 10:35, 20 December 2018 (create;). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)
require ('Module:No globals')

local langs = {'ca', 'de', 'es', 'pl', 'pt'};

local en_months = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};

local month_names = {};

local patterns = {
	{'^(%d%d?) +(%a+) +(%d%d%d%d%a?)$', 'd', 'm', 'y', 'dmy'},					-- dd Mmm yyyy
	{'^(%d%d?) +de +(%a+) +de +(%d%d%d%d%a?)$', 'd', 'm', 'y', 'dmy'},			-- dd de Mmm de yyyy
	{'^(%a+) +(%d%d%d%d%a?)$', 'm', 'y', nil, 'my'},							-- Mmm yyyy
	{'^(%a+) +de +(%d%d%d%d%a?)$', 'm', 'y', nil, 'my'},						-- Mmm de yyyy
	};


--[[--------------------------< M O N T H _ L I S T _ G E T >--------------------------------------------------

TODO: move this to a data module so that it can be mw.loadData()'d

]]

local function month_names_get()
	for _, lang in ipairs (langs) do											-- spin through the languages table
		local lang_obj = mw.getLanguage (lang);									-- make a language object for the current language
		for i, en_month in ipairs (en_months) do								-- spin through the English month-names table
			month_names[lang_obj:formatDate('F', en_month):lower()] = en_month;	-- translate the English name to the current language and store in the translations table
			if 'pl' == lang then												-- for polish and other languages that have nominative and genitive forms
				month_names[lang_obj:formatDate('xg', en_month):lower()] = en_month;	-- translate English to genitive form and save
			end
		end
	end
end


--[[--------------------------< M O N T H _ X L A T E >--------------------------------------------------------

{{#invoke:Sandbox/trappist the monk/month translator|month_xlate|<date>}}

]]

local function month_xlate (frame)
	local t = {};
	local day, month, year;
	
	month_names_get ();															-- build month names list; TODO: move table creation into a data module
	
	if 'dump' == frame.args[1] then												-- frame.args[1] = 'dump' to dump month_names table; 
		return mw.dumpObject (month_names);
	end
	
	for i, pattern in ipairs (patterns) do										-- spin through the patterns table looking for a match
		local c1, c2, c3;														-- captures in the 'pattern' from the pattern table go here
	
		c1, c2, c3 = mw.ustring.match (frame.args[1], pattern[1]);				-- one or more captures set if source matches patterns[i][1])
		if c1 then																-- c1 always set on match
			t = {
				[pattern[2] or 'x'] = c1,										-- fill the table of captures with the rest of the captures
				[pattern[3] or 'x'] = c2,										-- take index names from pattern table and assign sequential captures
				[pattern[4] or 'x'] = c3,										-- index name may be nil in pattern table so "or 'x'" spoofs a name for this index in this table
				};
			day = t.d or '';													-- translate table contents to named variables;
			month = t.m or '';													-- absent table entries are nil so set unused parts to empty string
			year= t.y or '';

			if month_names[month:lower()] then									-- look in translation table for non-English month name; TODO: add support for an override table for when MediaWiki is wrong
				if 'dmy' == pattern[5] then										-- for dmy dates
					return table.concat ({day, month_names[month:lower()], year}, ' ');	-- assemble an English language dmy date
				elseif 'my' == pattern[5] then									-- for month year dates
					return table.concat ({month_names[month:lower()], year}, ' ');		-- assemble an English language dmy date
				end
			end
			break;																-- and done
		end
	end	
	return frame.args[1];														-- if here, couldn't translate so return the original date
end


--[[--------------------------< E X P O R T E D   F U N C T I O N S >------------------------------------------
]]

return {month_xlate = month_xlate};