Module:Languages
From Minetest
Documentation for this module may be created at Module:Languages/doc
local p = {}
local HtmlBuilder = require("Module:HtmlBuilder")
local makeInvokeFunc = require("Module:Arguments").makeInvokeFunc
local headers = mw.loadData('Module:Languages/headers')
-- Get the language code of a page.
--
-- @param titleObj Title object of the page, defaults to current page
function p.getLanguageCode(titleObj)
titleObj = titleObj or mw.title.getCurrentTitle() -- Set default if necessary
local title = titleObj.text -- e.g. Dirt/fr or Mods/Quartz
local langCode = titleObj.subpageText -- e.g. fr or Quartz
-- titleObj.subpageText returns titleObj.text if not a subpage.
-- If titleObj.subpageText is a subpage, check if it is a language code.
if langCode == title or not headers[langCode] then
return "en" -- Default to English
end
return langCode
end
-- Create the linked text for a translation subpage if it exists.
--
-- @param frame Current frame, used for preprocessing
-- @param title Page title
-- @param langCode Language code
local function createLanguageText(frame, title, langCode)
title = title .. "/" .. langCode
-- Get language name in native language (a.k.a. autonym)
local parsedLang = mw.language.fetchLanguageName(langCode)
-- Use <bdi> to support both LTR languages and RTL languages
local bdi = HtmlBuilder.create("bdi")
:attr("lang", langCode)
:wikitext("[[", title, "|", parsedLang, "]]")
-- Use preprocessing with #ifexist to check if page exists
return frame:preprocess("{{#ifexist:" .. title .. "| • " .. tostring(bdi) .. "}}")
end
function p._languages(frame, args)
local currentTitleObj = mw.title.getCurrentTitle()
local currentLangCode = p.getLanguageCode(currentTitleObj)
local currentHeader = headers[currentLangCode]
local title = args[1] -- Use input page name if given
if not title then -- Otherwise, use current page
local namespace = currentTitleObj.nsText
local basename = currentTitleObj.baseText
title = namespace .. ":" .. basename -- e.g. Template:Block Data
-- Check if current page is English subpage (e.g. Mods/Quartz)
if currentLangCode == "en" then
local subname = currentTitleObj.subpageText
if subname ~= basename then
title = title .. "/" .. subname
end
end
end
local languagesText = "[[" .. title .. "|English]]" -- Start with English first
-- Bold English text if current language is English
if currentLangCode == "en" then
languagesText = "'''" .. languagesText .. "'''"
end
local translated = false -- Flag for checking if any translation exists
-- Create an alphabetically sorted table of language codes
local langCodes = {}
for langCode in pairs(headers) do
table.insert(langCodes, langCode)
end
table.sort(langCodes)
-- Iterate through language codes in order
for _, langCode in ipairs(langCodes) do
if langCode ~= "en" then -- Skip English because already added
local languageText = createLanguageText(frame, title, langCode)
if languageText ~= "" then -- Check if subpage exists
-- Bold language text if language is current language
if langCode == currentLangCode then
languageText = "'''" .. languageText .. "'''"
end
languagesText = languagesText .. languageText
translated = true
end
end
end
local nmbox = frame:expandTemplate{
title = "nmbox",
args = {
image = "[[File:Geographylogo.png|25px|Languages|link=]]",
header = currentHeader,
text = languagesText
}
}
if not args.nocat then
local categories = "[[Category:Languages pages]]"
if not translated then
categories = categories .. "[[Category:Languages pages without translations]]"
end
return nmbox .. categories
end
return nmbox
end
p.languages = makeInvokeFunc(p._languages, {passFrameParam = true, inherited = true})
return p