Zelda Wiki

Want to contribute to this wiki?
Sign up for an account, and get started!

Come join the Zelda Wiki community Discord server!

READ MORE

Zelda Wiki
(this is inherently confusing and hard to document but I tried)
(Remove unnecessary error message)
(2 intermediate revisions by the same user not shown)
Line 4: Line 4:
 
local Term = require("Module:Term")
 
local Term = require("Module:Term")
 
local utilsCargo = require("Module:UtilsCargo")
 
local utilsCargo = require("Module:UtilsCargo")
local utilsError = require("Module:UtilsError")
 
 
local utilsLanguage = require("Module:UtilsLanguage")
 
local utilsLanguage = require("Module:UtilsLanguage")
 
local utilsMarkup = require("Module:UtilsMarkup")
 
local utilsMarkup = require("Module:UtilsMarkup")
Line 36: Line 35:
 
fields[params[3]] = "Wikitext"
 
fields[params[3]] = "Wikitext"
 
end
 
end
  +
return frame:callParserFunction({
return utilsCargo.declare(TABLE, fields)
 
  +
name = "#cargo_declare:_table=" .. TABLE,
  +
args = fields
  +
})
 
end
 
end
   
Line 78: Line 80:
 
where = whereClause
 
where = whereClause
 
})
 
})
if #queryResults == 0 then
 
utilsError.warn(string.format("<code>%s</code> has no translation data.", subject))
 
end
 
 
return h.formatResults(queryResults, false)
 
return h.formatResults(queryResults, false)
 
end
 
end

Revision as of 17:15, 21 November 2020

This module handles interactions with the translations database. It exports querying functions for auto-generating Nomenclature and translation pages.


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