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

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

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 utilsMarkup.pre(boilerplate) end

-- Returns the rows of the specified page. -- Examples: -- input: Wood (Character) -- output: every translation whose key == Wood (Character)

-- input: Wood -- output: every translation whose key is such that Series: == Wood, except the ones with the key Wood (Character)

-- input: Red Water of Life -- output: every translation whose key is such that Series: == Red Water of Life, which includes the translations for 2nd Potion function p.fetchTranslations(subject) local whereClause if utilsString.endsWith(subject, ")") then		whereClause = utilsCargo.allOf({ nativeterm = subject })	else		local term = Term.fetchTerm(subject) or ""		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 = utilsCargo.allOf({ term = term }, "nativeterm NOT LIKE '%)'") 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 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

return p