Module:Translation

local p = {} local h = {}

local Term = require("Module:Term") local utilsCargo = require("Module:UtilsCargo") local utilsLanguage = require("Module:UtilsLanguage") local utilsMarkup = require("Module:UtilsMarkup") local utilsString = require("Module:UtilsString") local utilsTable = require("Module:UtilsTable")

local TABLE = "Translations"

local function getLangParams local result = {} for i, code in ipairs(utilsLanguage.enum) do table.insert(result, {code, code .. "M", code .. "R"}) end return result end

local function getFields local fields = utilsTable.concat({"nativeterm", "term", "game"}, unpack(getLangParams)) return table.concat(fields, ",") end

-- Template:Translation/Store function p.Declare(frame) local fields = { nativeterm = "String", term = "Wikitext", game = "Wikitext", }	for i, params in ipairs(getLangParams) do		fields[params[1]] = "Wikitext (size=256;)" fields[params[2]] = "Wikitext" fields[params[3]] = "Wikitext" end return frame:callParserFunction({       name = "#cargo_declare:_table=" .. TABLE,        args = fields    }) end

-- Template:Translation/Store/Documentation function p.Boilerplate(frame) local lines = {"{{Translation/Store||"} for i, params in ipairs(getLangParams) do		for j, param in ipairs(params) do params[j] = "|" .. param .. "= "		end table.insert(lines, table.concat(params)) end table.insert(lines, "}}") local boilerplate = table.concat(lines, "\n") return string.format(" %s ", boilerplate) end

function p.fetchTranslations(page) local whereClause = utilsCargo.allOf({   	nativeterm = page	})

-- Fetch translations of synonyms local term = Term.fetchTerm(page) if term and not utilsString.endsWith(page, ")") then -- without this ) check, Wood (Character) would also fetch data for BotW Wood term = string.gsub(term, "#", "") -- terms with # in them are stored in a version of the page without the #, because MediaWiki. Also Cargo doesn't allow queries with # in them. whereClause = whereClause .. " OR " ..utilsCargo.allOf({	   	term = term		}, "nativeterm NOT LIKE '%)'") -- without this, requesting "Wood" would also fetch data for Wood (Character)	end	local queryResults = utilsCargo.query(TABLE, getFields, { where = whereClause })	return h.formatResults(queryResults, false) end

-- Returns the rows of the specified page for the specified game function p.fetchTranslationsByGame(game, subjects) local tables = TABLE local fields = getFields local queryArgs = { where = utilsCargo.allOf(       	{game = game},         	utilsCargo.IN("nativeterm", subjects)    	) }   local result = utilsCargo.query(tables, fields, queryArgs) return h.formatResults(result, true) end

function p.fetchTranslationsByDataPage(dataPage, options) local whereClause = "_pageName LIKE '"..dataPage.."%'" local rows = utilsCargo.query("Translations", getFields, {		where = whereClause,		limit = options and options.limit,	}) return rows end

function h.formatResults(rows, groupByTranslationKey) local results = {} for _, row in ipairs(rows) do		local subjectTranslations = {} for _, langCode in ipairs(utilsLanguage.enum) do   		if utilsString.notEmpty(row[langCode]) then table.insert(subjectTranslations, {   	    		term = row.term,    	    		game = row.game,    	    		language = langCode,    	    		translation = row[langCode],     	    		meaning = row[langCode .. "M"],     	    		reference = row[langCode .. "R"]    	    	}) end end if groupByTranslationKey then results[row.nativeterm] = utilsTable.concat(results[row.nativeterm] or {}, subjectTranslations) else results = utilsTable.concat(results, subjectTranslations) end end return results end

p.Documentation = { fetchTranslations = { params = {"pageName"}, returns = "Nomenclature data for a given article.", cases = { {				desc = "The returned data includes translations of synonyms as well. For example, requesting translations of  (BotW and TP term) also returns translations of   (OoT term).", args = {"Zora Armor"}, },			{				desc = "Requesting  should not return translations of the Wood item in .", -- this used to happen args = {"Wood (Character)"}, },			{				desc = "Conversely, requesting  should only return translations of the item, not the character.", args = {"Wood"}, },		},	},	fetchTranslationsByDataPage = { params = {"dataPage", "options"}, returns = "All the translations stored on the given .", cases = { {				args = {"Data:Translations/TLoZ/Characters", { limit = 2 } }, },		}	} }

return p