<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=76561198047147677</id>
	<title>Heroes of Might and Magic: Olden Era Official Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=76561198047147677"/>
	<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/Special:Contributions/76561198047147677"/>
	<updated>2026-09-16T05:14:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4930</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4930"/>
		<updated>2025-11-06T12:10:07Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if link then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            if name and code then&lt;br /&gt;
                return name, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4928</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4928"/>
		<updated>2025-11-06T12:06:37Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if link then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            --local full = title.fullText&lt;br /&gt;
            --local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            --local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            --local baseTitle = mw.title.new(name, title.namespace)&lt;br /&gt;
            --if baseTitle and code then&lt;br /&gt;
            if name and code then&lt;br /&gt;
                --return baseTitle.fullText, code:lower(), title&lt;br /&gt;
                return name, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    --local test = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    --local name, code = trim(frame.args[1]):match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. (base or &amp;quot;base&amp;quot;) .. &amp;quot;--&amp;quot; .. (currentLang or &amp;quot;currentLang&amp;quot;) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4927</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4927"/>
		<updated>2025-11-06T11:57:19Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    --[[if false then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            --local full = title.fullText&lt;br /&gt;
            --local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            --local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(name, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
            --if name and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
                --return name, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end]]&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    --local test = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    --local name, code = trim(frame.args[1]):match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. (base or &amp;quot;base&amp;quot;) .. &amp;quot;--&amp;quot; .. (currentLang or &amp;quot;currentLang&amp;quot;) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4926</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4926"/>
		<updated>2025-11-06T11:54:51Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    --[[if false then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            --local full = title.fullText&lt;br /&gt;
            --local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            --local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(name, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
            --if name and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
                --return name, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end]]&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    --local test = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    --local name, code = trim(frame.args[1]):match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. base .. &amp;quot;--&amp;quot; .. currentLang .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4925</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4925"/>
		<updated>2025-11-06T11:47:00Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if false then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            --local full = title.fullText&lt;br /&gt;
            --local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            --local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(name, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
            --if name and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
                --return name, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    --local test = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    --local name, code = trim(frame.args[1]):match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. --[[name .. &amp;quot;--&amp;quot; .. code ..]] &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4924</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4924"/>
		<updated>2025-11-06T11:42:21Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if false then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            --local full = title.fullText&lt;br /&gt;
            --local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            --local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            --local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            --if baseTitle and code then&lt;br /&gt;
            if name and code then&lt;br /&gt;
                --return baseTitle.fullText, code:lower(), title&lt;br /&gt;
                return name, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    --local test = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    local name, code = trim(frame.args[1]):match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. name .. &amp;quot;--&amp;quot; .. code .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4923</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4923"/>
		<updated>2025-11-06T11:38:24Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if false then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            --local full = title.fullText&lt;br /&gt;
            --local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            --local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            --local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            --if baseTitle and code then&lt;br /&gt;
            if name and code then&lt;br /&gt;
                --return baseTitle.fullText, code:lower(), title&lt;br /&gt;
                return name, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    --local test = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. --[[test ..]] &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4922</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4922"/>
		<updated>2025-11-06T11:37:19Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if false then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            --local full = title.fullText&lt;br /&gt;
            --local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            --local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            --local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            --if baseTitle and code then&lt;br /&gt;
            if name and code then&lt;br /&gt;
                --return baseTitle.fullText, code:lower(), title&lt;br /&gt;
                return name, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    local test = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. test .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4921</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4921"/>
		<updated>2025-11-06T11:33:57Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if false then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    local test = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. test .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4920</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4920"/>
		<updated>2025-11-06T11:33:00Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if false then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    local test = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. test &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4919</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4919"/>
		<updated>2025-11-06T11:32:01Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if false then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    local test = mw.title.getCurrentTitle()&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. test.fullText &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4918</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4918"/>
		<updated>2025-11-06T11:30:45Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if link then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    local test = mw.title.getCurrentTitle()&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. test.fullText &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4917</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4917"/>
		<updated>2025-11-06T11:23:06Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if link then&lt;br /&gt;
        local link = trim(link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(frame.args[1])&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    -- local test = frame.args.link or &amp;quot;нет аргумента frame.args.link&amp;quot;&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4916</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4916"/>
		<updated>2025-11-06T11:19:51Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    local test = frame.args.link or &amp;quot;нет аргумента frame.args.link&amp;quot;&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. test .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4915</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4915"/>
		<updated>2025-11-06T11:18:28Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    local test = frame.args[1] or &amp;quot;нет аргумента frame.args[1]&amp;quot;&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. test .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4914</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4914"/>
		<updated>2025-11-06T11:14:43Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    local test = args[1] or &amp;quot;нет аргумента args[1]&amp;quot;&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. test .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4913</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4913"/>
		<updated>2025-11-06T11:11:46Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
	-- print(args.link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    local test = args[1] or &amp;quot;хрен&amp;quot;&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039; .. test&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4912</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4912"/>
		<updated>2025-11-06T11:08:16Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
	-- print(args.link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039; .. args[1]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4911</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4911"/>
		<updated>2025-11-06T11:07:08Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
	-- print(args.link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039; .. args.link&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4910</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4910"/>
		<updated>2025-11-06T10:58:26Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
	print(args.link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4909</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4909"/>
		<updated>2025-11-06T10:44:11Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local ffi = require(&amp;quot;ffi&amp;quot;)  -- Load FFI module (instance)&lt;br /&gt;
&lt;br /&gt;
local user32 = ffi.load(&amp;quot;user32&amp;quot;)   -- Load User32 DLL handle&lt;br /&gt;
&lt;br /&gt;
ffi.cdef([[&lt;br /&gt;
enum{&lt;br /&gt;
    MB_OK = 0x00000000L,&lt;br /&gt;
    MB_ICONINFORMATION = 0x00000040L&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef void* HANDLE;&lt;br /&gt;
typedef HANDLE HWND;&lt;br /&gt;
typedef const char* LPCSTR;&lt;br /&gt;
typedef unsigned UINT;&lt;br /&gt;
&lt;br /&gt;
int MessageBoxA(HWND, LPCSTR, LPCSTR, UINT);&lt;br /&gt;
]]) -- Define C -&amp;gt; Lua interpretation&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
	-- MsgBox(args.link)&lt;br /&gt;
	user32.MessageBoxA(args.link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4908</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4908"/>
		<updated>2025-11-06T10:39:27Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
	MsgBox(args.link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4907</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4907"/>
		<updated>2025-11-06T10:38:07Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
	ui.MsgBox(args.link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4906</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4906"/>
		<updated>2025-11-06T10:26:04Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
	utils.msgbox(args.link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
	<entry>
		<id>https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4905</id>
		<title>Module:LangSwitcherTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.hoodedhorse.com/Heroes_of_Might_and_Magic_Olden_Era/index.php?title=Module:LangSwitcherTest&amp;diff=4905"/>
		<updated>2025-11-06T10:18:04Z</updated>

		<summary type="html">&lt;p&gt;76561198047147677: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s) return (s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
local function getTitleParts(args)&lt;br /&gt;
	print(args.link)&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Учитываем спец. аргумент - начало&lt;br /&gt;
    if args and args.link then&lt;br /&gt;
        local link = trim(args.link) or &amp;quot;&amp;quot;&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local name, code = link:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
            local full = title.fullText&lt;br /&gt;
            local baseWithoutName = full:match(&amp;quot;^(.*)/&amp;quot;)&lt;br /&gt;
            local base = baseWithoutName .. &amp;quot;/&amp;quot; .. name&lt;br /&gt;
            local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
            if baseTitle and code then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Учитываем спец. аргумент - конец&lt;br /&gt;
&lt;br /&gt;
    if title.subpageText ~= title.text then&lt;br /&gt;
        local last = title.subpageText&lt;br /&gt;
        local code = last:match(&amp;quot;^([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
        if code then&lt;br /&gt;
            local baseTitle = mw.title.new(title.baseText, title.namespace)&lt;br /&gt;
            if baseTitle then&lt;br /&gt;
                return baseTitle.fullText, code:lower(), title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local full = title.fullText&lt;br /&gt;
    local base, code = full:match(&amp;quot;^(.*)/([A-Za-z%-][A-Za-z%-][A-Za-z%-]*)$&amp;quot;)&lt;br /&gt;
    if base and code then&lt;br /&gt;
        local baseTitle = mw.title.new(base, title.namespace)&lt;br /&gt;
        if baseTitle then&lt;br /&gt;
            return baseTitle.fullText, code:lower(), title&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return title.fullText, nil, title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTarget(baseFullText, code, defaultLang)&lt;br /&gt;
    code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
    if code == defaultLang then&lt;br /&gt;
        return baseFullText&lt;br /&gt;
    end&lt;br /&gt;
    local baseTitle = mw.title.new(baseFullText)&lt;br /&gt;
    if not baseTitle then&lt;br /&gt;
        return baseFullText .. &amp;quot;/&amp;quot; .. code&lt;br /&gt;
    end&lt;br /&gt;
    local targetTitle = mw.title.new(baseTitle.fullText .. &amp;quot;/&amp;quot; .. code, baseTitle.namespace)&lt;br /&gt;
    return (targetTitle and targetTitle.fullText) or (baseFullText .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikilink(page, label)&lt;br /&gt;
    return string.format(&#039;[[%s|%s]]&#039;, page, label)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local builtinNames = {&lt;br /&gt;
    en=&amp;quot;English&amp;quot;,&lt;br /&gt;
	es=&amp;quot;Español&amp;quot;,&lt;br /&gt;
	it=&amp;quot;Italiano&amp;quot;,&lt;br /&gt;
	fr=&amp;quot;Français&amp;quot;,&lt;br /&gt;
	de=&amp;quot;Deutsch&amp;quot;,&lt;br /&gt;
	[&amp;quot;pt-br&amp;quot;]=&amp;quot;Português (Brasil)&amp;quot;,&lt;br /&gt;
	ja=&amp;quot;日本語&amp;quot;,&lt;br /&gt;
	ko=&amp;quot;한국어&amp;quot;,&lt;br /&gt;
	pl=&amp;quot;Polski&amp;quot;,&lt;br /&gt;
	cs=&amp;quot;Čeština&amp;quot;,&lt;br /&gt;
	nl=&amp;quot;Nederlands&amp;quot;,&lt;br /&gt;
	uk=&amp;quot;Українська&amp;quot;,&lt;br /&gt;
	da=&amp;quot;Dansk&amp;quot;,&lt;br /&gt;
	sv=&amp;quot;Svenska&amp;quot;,&lt;br /&gt;
	tr=&amp;quot;Türkçe&amp;quot;,&lt;br /&gt;
	hu=&amp;quot;Magyar&amp;quot;,&lt;br /&gt;
	ru=&amp;quot;Русский&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hans&amp;quot;]=&amp;quot;中文（简体）&amp;quot;,&lt;br /&gt;
	[&amp;quot;zh-hant&amp;quot;]=&amp;quot;中文（繁體）&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
    local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
&lt;br /&gt;
    local defaultLang = &amp;quot;en&amp;quot; -- fixed to English&lt;br /&gt;
    local icon = args.icon or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local base, currentLang = getTitleParts(args)&lt;br /&gt;
&lt;br /&gt;
    -- Edit this list to control which languages always appear, in desired order.&lt;br /&gt;
    local candidates = {&lt;br /&gt;
        &amp;quot;en&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;pt-br&amp;quot;,&amp;quot;it&amp;quot;,&amp;quot;ja&amp;quot;,&amp;quot;pl&amp;quot;,&amp;quot;ru&amp;quot;,&amp;quot;zh-hans&amp;quot;,&amp;quot;zh-hant&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Order: default first, then listed candidates (excluding duplicate default)&lt;br /&gt;
    local seen, ordered = {}, {}&lt;br /&gt;
    local function add(code)&lt;br /&gt;
        code = (code or &amp;quot;&amp;quot;):lower()&lt;br /&gt;
        if code ~= &amp;quot;&amp;quot; and not seen[code] then&lt;br /&gt;
            table.insert(ordered, code)&lt;br /&gt;
            seen[code] = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    add(defaultLang)&lt;br /&gt;
    for _, code in ipairs(candidates) do&lt;br /&gt;
        if code:lower() ~= defaultLang then&lt;br /&gt;
            add(code)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local links = {}&lt;br /&gt;
    for _, code in ipairs(ordered) do&lt;br /&gt;
        local target = makeTarget(base, code, defaultLang)&lt;br /&gt;
        local label = builtinNames[code] or code&lt;br /&gt;
        local link = wikilink(target, label)&lt;br /&gt;
        local isActive = (currentLang and (currentLang == code)) or (code == defaultLang and not currentLang)&lt;br /&gt;
        if isActive then&lt;br /&gt;
            link = &amp;quot;&#039;&#039;&#039;&amp;quot; .. link .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(links, link)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #links == 0 then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    if icon ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(out, &amp;quot;&#039;&#039;&amp;quot; .. icon .. &amp;quot;&#039;&#039; &amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    table.insert(out, table.concat(links, &amp;quot; • &amp;quot;))&lt;br /&gt;
    return &#039;&amp;lt;div style=&amp;quot;text-align:center; font-size:0.9em; margin-top:0.5em; margin-bottom:1em&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>76561198047147677</name></author>
	</entry>
</feed>