Module:LangSwitcher

From Heroes of Might and Magic: Olden Era Official Wiki
Revision as of 13:29, 30 October 2025 by patrik (talk | contribs)

Documentation for this module may be created at Module:LangSwitcher/doc

local p = {}

local function trim(s) return (s or ""):gsub("^%s+",""):gsub("%s+$","") end

local function getTitleParts()
    local title = mw.title.getCurrentTitle()
    if title.subpageText ~= title.text then
        local last = title.subpageText
        local code = last:match("^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$")
        if code then
            local baseTitle = mw.title.new(title.baseText, title.namespace)
            return baseTitle.fullText, code:lower(), title
        end
    end
    return title.fullText, nil, title
end

local function makeTarget(baseFullText, code, defaultLang)
    if code == defaultLang then return baseFullText end
    local baseTitle = mw.title.new(baseFullText)
    if not baseTitle then return baseFullText .. "/" .. code end
    local targetTitle = mw.title.new(baseTitle.fullText .. "/" .. code, baseTitle.namespace)
    return (targetTitle and targetTitle.fullText) or (baseFullText .. "/" .. code)
end

local function exists(fullTitleText)
    local t = mw.title.new(fullTitleText)
    return t and t.exists
end

local function wikilink(page, label)
    return string.format('[[%s|%s]]', page, label)
end

local builtinNames = {
    en="English", sv="Svenska", da="Dansk",
    de="Deutsch", fr="Français", es="Español", fi="Suomi",
    it="Italiano", nl="Nederlands", pl="Polski", pt="Português",
    ["pt-br"]="Português (Brasil)", ru="Русский", ja="日本語",
    zh="中文", ["zh-hans"]="中文(简体)", ["zh-hant"]="中文(繁體)", ko="한국어",
}

function p.render(frame)
    local args = frame:getParent() and frame:getParent().args or frame.args
    local icon = args.icon or ""
    local defaultLang = trim((args.default or "en")):lower()

    local base, currentLang = getTitleParts()

    -- Candidate codes to auto-scan; add/remove as you need
    local candidates = {
        "en","sv","da","de","fr","es","fi","it","nl","pl","pt","pt-br","ru","ja","zh","zh-hans","zh-hant","ko"
    }

    -- Order: default first, then others that exist
    local seen, ordered = {}, {}
    local function add(code)
        code = (code or ""):lower()
        if code ~= "" and not seen[code] then
            table.insert(ordered, code)
            seen[code] = true
        end
    end
    add(defaultLang)
    for _, code in ipairs(candidates) do
        if code ~= defaultLang then
            local target = makeTarget(base, code, defaultLang)
            if exists(target) then
                add(code)
            end
        end
    end

    -- Build links
    local links = {}
    for _, code in ipairs(ordered) do
        local target = makeTarget(base, code, defaultLang)
        local label = builtinNames[code] or code
        local link = wikilink(target, label)
        local isActive = currentLang and (currentLang == code) or (code == defaultLang)
        if isActive then link = "'''" .. link .. "'''" end
        table.insert(links, link)
    end

    if #links == 0 then return "" end

    local out = {}
    if icon ~= "" then table.insert(out, "''" .. icon .. "'' ") end
    table.insert(out, table.concat(links, " • "))
    return table.concat(out)
end

return p