Difference between revisions of "Module:Languages"

From Minetest Wiki
Jump to navigation Jump to search
m
m
 
(14 intermediate revisions by 2 users not shown)
Line 2: Line 2:
  
 
local HtmlBuilder = require("Module:HtmlBuilder")
 
local HtmlBuilder = require("Module:HtmlBuilder")
local getArgs = require("Module:Arguments").getArgs
+
local makeInvokeFunc = require("Module:Arguments").makeInvokeFunc
 
local headers = mw.loadData('Module:Languages/headers')
 
local headers = mw.loadData('Module:Languages/headers')
  
function p.languages(frame)
+
-- Get the language code of a page.
     local args = getArgs(frame, {inherited = true})
+
--
     return p._languages(frame, args)
+
-- @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
 
end
  
local function getLangText(frame, title, lang)
+
-- Create the linked text for a translation subpage if it exists.
     title = title .. "/" .. lang
+
--
     local parsedLang = mw.language.fetchLanguageName(lang)
+
-- @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")
 
     local bdi = HtmlBuilder.create("bdi")
         :attr("lang", lang)
+
         :attr("lang", langCode)
         :wikitext("[[:", title, "|", parsedLang, "]]")
+
         :wikitext("[[", title, "|", parsedLang, "]]")
 +
 
 +
    -- Use preprocessing with #ifexist to check if page exists
 
     return frame:preprocess("{{#ifexist:" .. title .. "|&nbsp;• " .. tostring(bdi) .. "}}")
 
     return frame:preprocess("{{#ifexist:" .. title .. "|&nbsp;• " .. tostring(bdi) .. "}}")
 
end
 
end
  
 
function p._languages(frame, args)
 
function p._languages(frame, args)
     local titleObj = mw.title.getCurrentTitle()
+
     local currentTitleObj = mw.title.getCurrentTitle()
     local fullTitle = titleObj.text
+
     local currentLangCode = p.getLanguageCode(currentTitleObj)
     local title = args[1] or titleObj.nsText .. ":" .. titleObj.baseText
+
    local currentHeader = headers[currentLangCode]
     local titleLang = titleObj.subpageText
+
 
     if titleLang == fullTitle then
+
     local title = args[1] -- Use input page name if given
         titleLang = "en"
+
    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
 
     end
     local header = headers[titleLang]
+
 
     if not header then
+
     local translated = false -- Flag for checking if any translation exists
        title = title .. "/" .. titleLang
+
 
        titleLang = "en"
+
     -- Create an alphabetically sorted table of language codes
         header = headers[titleLang]
+
    local langCodes = {}
 +
    for langCode in pairs(headers) do
 +
         table.insert(langCodes, langCode)
 
     end
 
     end
     local text = "[[:" .. title .. "|English]]"
+
     table.sort(langCodes)
     local translated = false
+
 
     for lang, _ in pairs(headers) do
+
     -- Iterate through language codes in order
         if lang ~= "en" then
+
     for _, langCode in ipairs(langCodes) do
             local langText = getLangText(frame, title, lang)
+
         if langCode ~= "en" then -- Skip English because already added
             if langText ~= "" then
+
             local languageText = createLanguageText(frame, title, langCode)
                 text = text ..langText
+
             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
 
                 translated = true
 
             end
 
             end
 
         end
 
         end
 
     end
 
     end
 +
 
     local nmbox = frame:expandTemplate{
 
     local nmbox = frame:expandTemplate{
 
         title = "nmbox",
 
         title = "nmbox",
 
         args = {
 
         args = {
 
             image = "[[File:Geographylogo.png|25px|Languages|link=]]",
 
             image = "[[File:Geographylogo.png|25px|Languages|link=]]",
             header = header,
+
             header = currentHeader,
             text = text
+
             text = languagesText
 
         }
 
         }
 
     }
 
     }
     local categories = "[[Category:Languages pages]]"
+
 
    if not translated then
+
     if not args.nocat then
        categories = categories .. "[[Category:Languages pages without translations]]"
+
        local categories = "[[Category:Languages pages]]"
 +
        if not translated then
 +
            categories = categories .. "[[Category:Languages pages without translations]]"
 +
        end
 +
        return nmbox .. categories
 
     end
 
     end
     return nmbox .. categories
+
 
 +
     return nmbox
 
end
 
end
 +
 +
p.languages = makeInvokeFunc(p._languages, {passFrameParam = true, inherited = true})
  
 
return p
 
return p

Latest revision as of 06:16, 24 September 2021

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 .. "|&nbsp;• " .. 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