Module:Languages

From Minetest Wiki
Revision as of 16:49, 6 May 2017 by MrIbby (talk | contribs) (Added optional nocat parameter)
Jump to navigation Jump to search

local p = {}

local HtmlBuilder = require("Module:HtmlBuilder") local getArgs = require("Module:Arguments").getArgs local headers = mw.loadData('Module:Languages/headers')

function p.languages(frame)

   local args = getArgs(frame, {inherited = true})
   return p._languages(frame, args)

end

-- 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
   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
               languagesText = languagesText .. languageText
               translated = true
           end
       end
   end
   local nmbox = frame:expandTemplate{
       title = "nmbox",
       args = {
           image = "Languages",
           header = currentHeader,
           text = languagesText
       }
   }
   if not args.nocat then
       local categories = ""
       if not translated then
           categories = categories .. ""
       end
   end
   return nmbox .. categories

end

return p