Module:Languages
Jump to navigation
Jump to search
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 to support both LTR languages and RTL languages local bdi = HtmlBuilder.create("bdi") :attr("lang", langCode) :wikitext("", parsedLang, "")
-- Use preprocessing with #ifexist to check if page exists return frame:preprocess("")
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 = "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 = "", header = currentHeader, text = languagesText } }
if not args.nocat then local categories = "" if not translated then categories = categories .. "" end return nmbox .. categories end
return nmbox
end
p.languages = makeInvokeFunc(p._languages, {passFrameParam = true, inherited = true})
return p