Module:TNTFallback

From Imperivm Romanvm
Jump to navigation Jump to search

Documentation for this module may be created at Module:TNTFallback/doc

--------------------------------------------------------------------------------
-- This module implements a wrapper for [[Module:TNT]] that allows returning
-- a fallback message; used by {{Documentation}}.
--
-- @module TNTFallback
-- @alias  p
-- @author [[User:ExE Boss]]
-- @require [[Module:No globals]]
-- @require [[Module:TNT]]
--------------------------------------------------------------------------------

require("Module:No globals");
local TNT = require("Module:TNT");

local p = {};

--------------------------------------------------------------------------------
-- Based on [[Module:TNT]]'s `msg` function,
-- but takes an optional `fallback` parameter.
--------------------------------------------------------------------------------
function p.msg(frame)
	local dataset, key;
	local params = { n = 0 };
	local lang = nil;
	local fallback = nil;

	for k, v in pairs(frame.args) do
		if (k == 1) then
			dataset = v;
		elseif (k == 2) then
			key = v;
		elseif (type(k) == "number" and k > 2) then
			local i = k - 2;
			params[i] = v;
			params.n = math.max(params.n, i);
		elseif ((k == "lang") and (v ~= "_")) then
			lang = v;
		elseif ((k == "fallback") and (v ~= "")) then
			fallback = v;
		end
	end

	local result;
	if (lang) then
		result = TNT.formatInLanguage(lang, dataset, key, unpack(params, 1, params.n));
	else
		result = TNT.format(dataset, key, unpack(params, 1, params.n));
	end

	if (fallback and (
		-- not translated
		(result and result == TNT.formatInLanguage("en", dataset, key, unpack(params, 1, params.n)))
		-- no message
		or (not result)
	)) then
		if (not lang) then
			if (frame:callParserFunction("int:lang") ~= "en") then
				return mw.message.newRawMessage(fallback, unpack(params, 1, params.n)):plain();
			end
		elseif (lang ~= "en") then
			return mw.message.newRawMessage(fallback, unpack(params, 1, params.n)):plain();
		end
	end

	return result;
end

return p;