Module:I18nUtil

From Porn Base Central
Jump to navigation Jump to search

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

local DEFAULTLANG = 'en'
local util_map = require('Module:MapUtil')
local util_table = require('Module:TableUtil')
local util_vars = require('Module:VarsUtil')

local p = {}
local h = {}

function p.init(...)
	-- generally the i18n will be located at a subpage of the parent module
	local args = util_map.inPlace({...}, function (name)
		return require(('Module:%s/i18n'):format(name))
	end)
	if I18N_INTERNAL_TABLE then
		table.insert(args, 1, I18N_INTERNAL_TABLE)
	end
	h.initGlobalFromTables(unpack(args))
end

function p.initAndClear(...)
	-- generally the i18n will be located at a subpage of the parent module
	local args = util_map.inPlace({...}, function (name)
		return require(('Module:%s/i18n'):format(name))
	end)
	h.initGlobalFromTables(unpack(args))
end

function h.initGlobalFromTables(...)
	-- initialize global table 'i18n' from file
	I18N_INTERNAL_TABLE = h.initFromTables(...)
end

function h.initFromTables(...)
	local args = {...}
	local tbl = h.combineInputsIntoOneTable(args)
	tbl.this = {}
	for k, v in pairs(tbl[DEFAULTLANG]) do
		tbl.this[k] = h.getTranslationList(tbl, k, v)
	end
	return tbl
end

function h.combineInputsIntoOneTable(args)
	local ret = {}
	for lang, _ in pairs(h.getLangListFromArgs(args)) do
		ret[lang] = util_table.merge(unpack(util_map.safe(args, function(arg)
			return arg[lang]
		end)))
	end
	return ret
end

function h.getLangListFromArgs(args)
	local ret = {}
	for _, arg in ipairs(args) do
		for lang, _ in pairs(arg) do
			ret[lang] = true
		end
	end
	return ret
end

function h.getTranslationList(tbl, k, v)
	local output = {}
	for lang, langTable in pairs(tbl) do
		output[#output+1] = ('|%s=%s'):format(lang, langTable[k] or v)
	end
	output[#output+1] = ('|#default=%s'):format(tbl[DEFAULTLANG][k])
	return output
end

function h.concatForPrint(tbl, ...)
	local temp = mw.clone(tbl)
	for i, v in ipairs(temp) do
		temp[i] = v:format(...)
	end
	return ('{{#switch:{{USERLANGUAGECODE}}%s}}'):format(table.concat(temp, ''))
end

function h.checkEverythingExists(key)
	return key and I18N_INTERNAL_TABLE and I18N_INTERNAL_TABLE.this[key]
end

function h.preprocess(output)
	return mw.getCurrentFrame():preprocess(output)
end

function p.print(key, ...)
	-- return the localized value, forces you to use global table
	if not h.checkEverythingExists(key) then return nil end
	return h.preprocess(h.concatForPrint(I18N_INTERNAL_TABLE.this[key], ...))
end

function p.printForInclusion(key, ...)
	-- same as print but doesn't preprocess the output, so it will be displayed in raw wikitext on the page
	-- then when the page is transcluded to raw text via a python script the switch will be included properly
	if not h.checkEverythingExists(key) then return nil end
	return h.concatForPrint(I18N_INTERNAL_TABLE.this[key], ...)
end

function p.printWithFallback(key, ...)
	if not h.checkEverythingExists(key) then return key end
	return h.preprocess(h.concatForPrint(I18N_INTERNAL_TABLE.this[key], ...))
end

function p.default(key, ...)
	-- in the event we're storing a string in cargo it should still go through i18n but we'd just force default language
	if not key then return nil end
	if not I18N_INTERNAL_TABLE then return nil end
	if not I18N_INTERNAL_TABLE[DEFAULTLANG][key] then return nil end
	return I18N_INTERNAL_TABLE[DEFAULTLANG][key]:format(...)
end

function p.defaultWithFallback(key)
	if not key then return nil end
	if not I18N_INTERNAL_TABLE then return nil end
	return I18N_INTERNAL_TABLE[DEFAULTLANG][key] or key
end

function p.exists()
	if I18N_INTERNAL_TABLE then return true end
end

return p