Zelda Wiki

OoT Navi.png

Hey! Listen!

This wiki contains spoilers! Read at your own risk!

READ MORE

Zelda Wiki
Advertisement
Zelda Wiki
10,305
pages

Documentation for this module may be created at Module:Translation/Documentation

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 {{Term|Series|translationKey}} == Wood, except the ones with the key Wood (Character)

-- input: Red Water of Life
-- output: every translation whose key is such that {{Term|Series|translationKey}} == 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
Advertisement