July 25, 2020

👭 Knight Challenge #11 👬

Want to try your hand at these challenges? There's a couple of things you can do!
From writing, to research, to images, find your preferred way to contribute with our eleventh theme: Couples!

Latest Announcements

Module:Translation

From Zelda Wiki, the Zelda encyclopedia
Jump to: navigation, search

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 utilsError = require("Module:UtilsError")
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
	})
	if #queryResults == 0 then
		utilsError.warn(string.format("<code>%s</code> has no translation data.", subject))
	end
	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