<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://themidnight.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ALanguages</id>
	<title>Module:Languages - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://themidnight.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ALanguages"/>
	<link rel="alternate" type="text/html" href="https://themidnight.wiki/index.php?title=Module:Languages&amp;action=history"/>
	<updated>2026-04-03T21:29:58Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://themidnight.wiki/index.php?title=Module:Languages&amp;diff=7688&amp;oldid=prev</id>
		<title>Timothy: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://themidnight.wiki/index.php?title=Module:Languages&amp;diff=7688&amp;oldid=prev"/>
		<updated>2023-06-12T15:53:34Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:53, 12 June 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key themidnightwiki_wiki:diff:1.41:old-7687:rev-7688 --&gt;
&lt;/table&gt;</summary>
		<author><name>Timothy</name></author>
	</entry>
	<entry>
		<id>https://themidnight.wiki/index.php?title=Module:Languages&amp;diff=7687&amp;oldid=prev</id>
		<title>wikimedia&gt;Verdy p at 23:57, 2 May 2020</title>
		<link rel="alternate" type="text/html" href="https://themidnight.wiki/index.php?title=Module:Languages&amp;diff=7687&amp;oldid=prev"/>
		<updated>2020-05-02T23:57:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[=[&lt;br /&gt;
Not globally exposed. Internal function only.&lt;br /&gt;
&lt;br /&gt;
language_subpages( frame, transform, options )&lt;br /&gt;
Parameters&lt;br /&gt;
    frame:     The frame that was passed to the method invoked. The first argument or the page argument will be respected.&lt;br /&gt;
    transform: A transform function. Example: function( basepagename, subpagename, code, langname ) end&lt;br /&gt;
    options:   An object with options. Example: { abort= { on=function() end, time=0.8 }  }&lt;br /&gt;
        Following options are available:&lt;br /&gt;
        abort: Aborts iterating over the subpages if one of the conditions is met. If the process is aborted, nil is returned!&lt;br /&gt;
            on: Function to be called if an abort-condition was met.&lt;br /&gt;
            cycles: The maximum number of subpages to run over.&lt;br /&gt;
            time: Maximum time to spend running over the subpages.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
function language_subpages( frame, transform, options )&lt;br /&gt;
    local args, pargs, options = frame.args, ( frame:getParent() or {} ).args or {}, options or {};&lt;br /&gt;
    local title = args.page or args[1] or pargs.page or pargs[1] or &amp;quot;&amp;quot;;&lt;br /&gt;
    local abort = options.abort or {};&lt;br /&gt;
    local at, clock = type( abort.on ), os.clock();&lt;br /&gt;
    local ac = function()&lt;br /&gt;
        if  at == &amp;#039;function&amp;#039; or ( at == &amp;#039;table&amp;#039; and getmetatable(abort.on).__call ) then&lt;br /&gt;
            abort.on();&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local tt = type( transform );&lt;br /&gt;
    local page = require( &amp;#039;Module:Page&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
    title = page.clean(title);&lt;br /&gt;
&lt;br /&gt;
    if tt == &amp;#039;function&amp;#039; or ( tt == &amp;#039;table&amp;#039; and getmetatable(transform).__call ) then&lt;br /&gt;
        local fetch, pages, langcode, langname = mw.language.fetchLanguageName, {};&lt;br /&gt;
--[==[&lt;br /&gt;
&lt;br /&gt;
     / \&lt;br /&gt;
    / | \&lt;br /&gt;
   /  ·  \&lt;br /&gt;
   ¯¯¯¯¯¯¯&lt;br /&gt;
   Page.subpages() no longer works because it attempted to parse the HTML content generated by&lt;br /&gt;
   calling the parser function &amp;quot;Special:Prefixindex:&amp;quot; which is no longer expanded in Lua but&lt;br /&gt;
   converted to a &amp;quot;stripped tag&amp;quot; (containing a unique identifier surrounded by ASCII DEL characters)&lt;br /&gt;
   representing the tag name and its parameters.&lt;br /&gt;
   The actual expansion of stripped tags can no longer be performed in Lua.&lt;br /&gt;
   Now unstripping these tags just kills ALL these tags (except &amp;quot;wiki&amp;quot; tags) instead of performing&lt;br /&gt;
   their expansion by running the extension code. Only MediaWiki can unstrip these tags in texts after&lt;br /&gt;
   they have been returned by Lua.&lt;br /&gt;
   For this reason, page.subpages() is now completely empty (Module:Page no longer works).&lt;br /&gt;
   This cannot be bypassed, except by using a Scribunto extension library if lifting the limits set by mw.unstrip.&lt;br /&gt;
   Note that &amp;quot;Special:Prefixindex:&amp;quot; is also costly, even if it just requires a single database query to&lt;br /&gt;
   get all subpages, instead of one costly #ifexist or one costly mw.title() property reading per&lt;br /&gt;
   tested subpage to know if it exists.&lt;br /&gt;
   For now there&amp;#039;s still no reliable way to get a list of subpages, or performing queries similar to&lt;br /&gt;
   the [[Special:Prefixindex]] page or list members of a category like when viewing a category page.&lt;br /&gt;
   Ideally, there should exist a method for such queries on Title objects returned by the mw.title library;&lt;br /&gt;
   but for now there&amp;#039;s none.&lt;br /&gt;
   In Lua now, the only expansion possible with an immediate effect is the expansion of standard templates,&lt;br /&gt;
   all special tags or special pages, or parser function extensions do not work (Only the #expr parser&lt;br /&gt;
   function is supported by using an external Scribunto library).&lt;br /&gt;
--]==]&lt;br /&gt;
        for pg in page.subpages( title, { ignoreNS=true } ) do&lt;br /&gt;
            if abort.cycles then&lt;br /&gt;
                abort.cycles = abort.cycles - 1&lt;br /&gt;
                if 0 == abort.cycles then return ac()  end&lt;br /&gt;
            end&lt;br /&gt;
            if abort.time then&lt;br /&gt;
                if (os.clock() - clock) &amp;gt; abort.time then return ac()  end&lt;br /&gt;
            end&lt;br /&gt;
            if mw.ustring.len( pg ) &amp;lt;= 12 then&lt;br /&gt;
                langcode = string.lower( pg );&lt;br /&gt;
                langname = fetch( langcode );&lt;br /&gt;
                if langname ~= &amp;#039;&amp;#039; then&lt;br /&gt;
                    table.insert( pages, transform( title, pg, langcode, langname ) );&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return pages;&lt;br /&gt;
    end&lt;br /&gt;
    return {};&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cloneArgs(frame)&lt;br /&gt;
    local args, pargs = {}, {}&lt;br /&gt;
    for k,v in pairs( frame.args ) do args[k] = v end&lt;br /&gt;
    if frame:getParent() then&lt;br /&gt;
        for k,v in pairs( frame:getParent().args ) do pargs[k] = v end&lt;br /&gt;
    end&lt;br /&gt;
    return args, pargs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local p = {};&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:languages|internal|Template:Adjective}}&lt;br /&gt;
]=]&lt;br /&gt;
function p.internal(frame)&lt;br /&gt;
    return table.concat(&lt;br /&gt;
        language_subpages( frame,&lt;br /&gt;
            function( title, page, code, name )&lt;br /&gt;
                return mw.ustring.format(&lt;br /&gt;
                    &amp;#039;&amp;lt;bdi class=&amp;quot;language lang-%s&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;[[%s/%s|%s]]&amp;lt;/bdi&amp;gt;&amp;#039;,&lt;br /&gt;
                    code, code,&lt;br /&gt;
                    title, page,&lt;br /&gt;
                    name&lt;br /&gt;
                );&lt;br /&gt;
            end&lt;br /&gt;
        ),&lt;br /&gt;
        &amp;#039;&amp;amp;nbsp;&amp;lt;b&amp;gt;·&amp;lt;/b&amp;gt;&amp;amp;#32;&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:languages|external|Template:Adjective}}&lt;br /&gt;
]=]&lt;br /&gt;
function p.external(frame)&lt;br /&gt;
    return table.concat(&lt;br /&gt;
        language_subpages( frame,&lt;br /&gt;
            function( title, page, code, name )&lt;br /&gt;
                return mw.ustring.format(&lt;br /&gt;
                    &amp;#039;&amp;lt;bdi class=&amp;quot;language lang-%s&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;[%s/%s %s]&amp;lt;/bdi&amp;gt;&amp;#039;,&lt;br /&gt;
                    code, code,&lt;br /&gt;
                    tostring( mw.uri.fullUrl( title ) ), page:gsub( &amp;#039; &amp;#039;, &amp;#039;_&amp;#039; ),&lt;br /&gt;
                    name&lt;br /&gt;
                );&lt;br /&gt;
            end&lt;br /&gt;
        ),&lt;br /&gt;
        &amp;#039;&amp;amp;nbsp;&amp;lt;b&amp;gt;·&amp;lt;/b&amp;gt;&amp;amp;#32;&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
forEachLanguage&lt;br /&gt;
&lt;br /&gt;
This function iterates over all language codes known to MediaWiki based on a maintained list&lt;br /&gt;
replacing patterns in a pattern-string for each language&lt;br /&gt;
&lt;br /&gt;
Usage&lt;br /&gt;
{{#invoke:Languages|forEachLanguage&lt;br /&gt;
  |pattern=patternstring&lt;br /&gt;
  |before=string to insert before iteration&lt;br /&gt;
  |after=string added after iteration&lt;br /&gt;
  |sep=separator string between iterations&lt;br /&gt;
  |inLang=langcode used for $lnTrP and $lnTrUC1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    pattern: A pattern string which is processed for each language and which is concatenated at the end and returned as one string&lt;br /&gt;
    before: A string that is inserted before the concatenated result&lt;br /&gt;
    after: A string that is inserted after the concatenated result&lt;br /&gt;
    sep: A string that is inserted between each line created from the pattern while iterating (like ProcessedPattern_sep_ProcessedPattern_sep_ProcessedPattern)&lt;br /&gt;
    inLang: Langcode to use for $lnTrP and $lnTrUC1&lt;br /&gt;
    preprocess: if set to a non-empty value, the output will be preprocessed before being returned.&lt;br /&gt;
&lt;br /&gt;
Warning&lt;br /&gt;
    The output is still not prepreprocessed by default: so parser functions and magic keywords generated by the pattern are still not executed and replaced,&lt;br /&gt;
    and template transclusions are still not expanded (see examples in other functions in this module).&lt;br /&gt;
    When using this function directly from a MediaWiki page or template, this means it is only possible to use patterns generating basic MediaWiki formatting&lt;br /&gt;
    or HTML tags. It you want the output to be preprocessed (in the given frame), set the preprocess parameter to a non-empty string.&lt;br /&gt;
    &lt;br /&gt;
Patterns&lt;br /&gt;
    $lc - language code such as en or de&lt;br /&gt;
    $lnP - language name in own language (autonym)&lt;br /&gt;
    $lnUC1 - language name in own language (autonym), first letter upper case&lt;br /&gt;
    $lnTrP - language name translated to the language requested by language code passed to inLang&lt;br /&gt;
    $lnTrUC1 - language name translated to the language requested by language code passed to inLang, first letter upper case&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
    {{#invoke:Languages|forEachLanguage|pattern=&amp;lt;span lang=&amp;quot;$lc&amp;quot; xml:lang=&amp;quot;$lc&amp;quot; class=&amp;quot;language lang-$lc&amp;quot;&amp;gt;[[Page/$lc|$lnP]]&amp;lt;/span&amp;gt;}}&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
-- =p.forEachLanguage({ args= { pattern = &amp;quot;$lc - $lnTrP\n&amp;quot;, inLang = &amp;quot;en&amp;quot; } })&lt;br /&gt;
function p.forEachLanguage(frame)&lt;br /&gt;
    local l = require(&amp;quot;Module:Languages/List&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local ret = {}&lt;br /&gt;
    local lang    = mw.language&lt;br /&gt;
    local line&lt;br /&gt;
    local pattern = frame.args.pattern   or frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
    local prefix  = frame.args.before    or frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
    local postfix = frame.args.after     or frame.args[3] or &amp;quot;&amp;quot;&lt;br /&gt;
    local sep     = frame.args.sep       or frame.args.separator or frame.args[4] or &amp;quot;&amp;quot;&lt;br /&gt;
    local inLang  = frame.args.inLang    or frame.args[5] or nil&lt;br /&gt;
    local preprocess = frame.args.preprocess or frame.args[6] or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local langNameUCFirstReq           = not not pattern:find( &amp;quot;$lnUC1&amp;quot;, 1, true )&lt;br /&gt;
    local langNameReq                  = not not pattern:find( &amp;quot;$lnP&amp;quot;, 1, true ) or langNameUCFirstReq&lt;br /&gt;
    local langNameTranslatedUCFirstReq = not not pattern:find( &amp;quot;$lnTrUC1&amp;quot;, 1, true )&lt;br /&gt;
    local langNameTranslatedReq        = not not pattern:find( &amp;quot;$lnTrP&amp;quot;, 1, true ) or langNameTranslatedUCFirstReq&lt;br /&gt;
    local contentLangInstance = mw.language.getContentLanguage()&lt;br /&gt;
    local inLangLangInstance&lt;br /&gt;
    local l = mw.language.fetchLanguageNames() -- autonyms&lt;br /&gt;
    local lTr&lt;br /&gt;
    local lcIdList = require(&amp;#039;Module:Languages/List&amp;#039;).getSortedList( l )&lt;br /&gt;
&lt;br /&gt;
    if langNameTranslatedReq then&lt;br /&gt;
        inLangLangInstance = --[==[&lt;br /&gt;
            mw.getLanguage( inLang ) -- Quota hit in :ucfirst() if using too many langInstances&lt;br /&gt;
            --]==] contentLangInstance&lt;br /&gt;
        lTr = mw.language.fetchLanguageNames( inLang ) -- translated names&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, lcId in pairs( lcIdList ) do&lt;br /&gt;
        local subst = lcId:gsub(&amp;#039;%%&amp;#039;, &amp;#039;%%%%&amp;#039;)&lt;br /&gt;
        line = pattern:gsub( &amp;quot;%$lc&amp;quot;, subst )&lt;br /&gt;
        local langName, langInstance&lt;br /&gt;
        -- autonym (name of lcId in locale lcId)&lt;br /&gt;
        if langNameReq then&lt;br /&gt;
            langName = l[lcId]&lt;br /&gt;
            subst = langName:gsub(&amp;#039;%%&amp;#039;, &amp;#039;%%%%&amp;#039;)&lt;br /&gt;
            line = line:gsub( &amp;quot;%$lnP&amp;quot;, subst )&lt;br /&gt;
        end&lt;br /&gt;
        if langNameUCFirstReq then&lt;br /&gt;
            langInstance = --[==[&lt;br /&gt;
                mw.getLanguage( lcId ) -- Quota hit in :ucfirst() if using too many langInstances&lt;br /&gt;
                --]==] contentLangInstance&lt;br /&gt;
            langName = langInstance:ucfirst( langName )&lt;br /&gt;
            subst = langName:gsub(&amp;#039;%%&amp;#039;, &amp;#039;%%%%&amp;#039;)&lt;br /&gt;
            line = line:gsub( &amp;quot;%$lnUC1&amp;quot;, subst )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- translated name (name of lcId in locale inLang)&lt;br /&gt;
        if langNameTranslatedReq then&lt;br /&gt;
            langName = lTr[lcId]&lt;br /&gt;
            subst = langName:gsub(&amp;#039;%%&amp;#039;, &amp;#039;%%%%&amp;#039;)&lt;br /&gt;
            line = line:gsub( &amp;quot;%$lnTrP&amp;quot;, subst )&lt;br /&gt;
        end&lt;br /&gt;
        if langNameTranslatedUCFirstReq then&lt;br /&gt;
            langName = inLangLangInstance:ucfirst( langName )&lt;br /&gt;
            subst = langName:gsub(&amp;#039;%%&amp;#039;, &amp;#039;%%%%&amp;#039;)&lt;br /&gt;
            line = line:gsub( &amp;quot;%$lnTrUC1&amp;quot;, subst )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        table.insert(ret, line)&lt;br /&gt;
    end&lt;br /&gt;
    ret = prefix .. table.concat( ret, sep ) .. postfix&lt;br /&gt;
    if preprocess ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        ret = frame:preprocess(ret)&lt;br /&gt;
    end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
 Provide logic for [[Template:Lle]] (Language Links external, to be substituted, language names written exactly as #language would provide them)&lt;br /&gt;
 Warning: may expands too many costly #ifexist without limitation (if not substituted into a separate &amp;quot;/lang&amp;quot; template)&lt;br /&gt;
]=]&lt;br /&gt;
function p.lle(frame)&lt;br /&gt;
    return frame:preprocess(&lt;br /&gt;
        p.forEachLanguage({&lt;br /&gt;
            args = {&lt;br /&gt;
                pattern = &amp;#039;{{subst:#ifexist:{{{1}}}/$lc|[{{subst:fullurl:{{{1}}}/$lc}} &amp;lt;bdi class=&amp;quot;language lang-$lc&amp;quot; lang=&amp;quot;$lc&amp;quot;&amp;gt;$lnP&amp;lt;/bdi&amp;gt;]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&amp;lt;!--\n--&amp;gt;}}&amp;#039;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
 Provide logic for [[Template:Ll]] (Language Links internal, to be substituted, language names written exactly as #language would provide them)&lt;br /&gt;
 Warning: may expands too many costly #ifexist without limitation (if not substituted into a separate &amp;quot;/lang&amp;quot; template)&lt;br /&gt;
]=]&lt;br /&gt;
function p.ll(frame)&lt;br /&gt;
    return frame:preprocess(&lt;br /&gt;
        p.forEachLanguage({&lt;br /&gt;
            args = {&lt;br /&gt;
                pattern = &amp;#039;{{subst:#ifexist:{{{1}}}/$lc|[[{{{1}}}/$lc|&amp;lt;bdi class=&amp;quot;language lang-$lc&amp;quot; lang=&amp;quot;$lc&amp;quot;&amp;gt;$lnP&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&amp;lt;!--\n--&amp;gt;}}&amp;#039;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------&lt;br /&gt;
--- Different approaches for [[Template:Lang links]] ---&lt;br /&gt;
--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
 Provide logic for [[Template:Lang links]]&lt;br /&gt;
 Using a cute Hybrid-Method:&lt;br /&gt;
    First check the subpages which is quite fast; if there are too many fall back to checking for each language page individually&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page=&amp;#039;Commons:Picture of the Year/2010&amp;#039; }, getParent=function() end })&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page=&amp;#039;Main Page&amp;#039; }, getParent=function() end })&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page=&amp;#039;Template:No_source_since&amp;#039; }, getParent=function() end })&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page=&amp;#039;MediaWiki:Gadget-HotCat&amp;#039; }, getParent=function() end })&lt;br /&gt;
function p.langLinksNonExpensive(frame)&lt;br /&gt;
    local args, pargs = frame.args, ( frame:getParent() or {} ).args or {};&lt;br /&gt;
    local title = args.page or args[1] or pargs.page or pargs[1] or &amp;quot;&amp;quot;;&lt;br /&gt;
    local contentLangInstance = mw.language.getContentLanguage();&lt;br /&gt;
    local pages2&lt;br /&gt;
    if frame.preprocess == nil then&lt;br /&gt;
        frame = mw.getCurrentFrame()&lt;br /&gt;
    end&lt;br /&gt;
--[==[&lt;br /&gt;
    local options = {&lt;br /&gt;
        abort = {&lt;br /&gt;
            time = 3.5,&lt;br /&gt;
            on = function()&lt;br /&gt;
                pages2 = p.forEachLanguage({&lt;br /&gt;
                    args = {&lt;br /&gt;
                       pattern = &amp;#039;{{#ifexist:&amp;#039; .. title .. &amp;#039;/$lc|[[&amp;#039; .. title .. &amp;#039;/$lc|&amp;lt;bdi lang=&amp;quot;$lc&amp;quot;&amp;gt;$lnP&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;}}&amp;#039;&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
            end&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    local pages = language_subpages( frame,&lt;br /&gt;
        function( title, page, code, langname )&lt;br /&gt;
            return mw.ustring.format(&lt;br /&gt;
                &amp;#039;[[%s/%s|&amp;lt;bdi lang=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/bdi&amp;gt;]]&amp;lt;/span&amp;gt;&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&amp;#039;,&lt;br /&gt;
                title, page, code, langname&lt;br /&gt;
            )&lt;br /&gt;
        end, options );&lt;br /&gt;
    return pages2 and frame:preprocess(pages2) or table.concat(pages, &amp;#039;&amp;#039;);&lt;br /&gt;
--]==]&lt;br /&gt;
    return frame:preprocess(&lt;br /&gt;
        p.forEachLanguage( {&lt;br /&gt;
            args = {&lt;br /&gt;
                pattern = &amp;#039;{{#ifexist:&amp;#039; .. title .. &amp;#039;/$lc|[[&amp;#039; .. title .. &amp;#039;/$lc|&amp;lt;bdi lang=&amp;quot;$lc&amp;quot;&amp;gt;$lnP&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;}}&amp;#039;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
----------------- [[Template:Autolang]] -----------------&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
  Works like {{autotranslate}} just allowing an unlimited number of arguments, even named arguments.&lt;br /&gt;
  It&amp;#039;s doing Magic! No arguments should be passed to {{#invoke:}}&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function p.autolang(frame)&lt;br /&gt;
    local args, pargs = cloneArgs( frame )&lt;br /&gt;
    if nil == args.useargs then&lt;br /&gt;
        if not args.base then args = pargs end&lt;br /&gt;
    elseif &amp;#039;both&amp;#039; == args.useargs then&lt;br /&gt;
        for k,v in pairs(args) do pargs[k] = v end&lt;br /&gt;
        args = pargs&lt;br /&gt;
    elseif &amp;#039;parent&amp;#039; == args.useargs then&lt;br /&gt;
        args = pargs&lt;br /&gt;
        if pargs.base and not args.base then&lt;br /&gt;
            args.base = pargs.base&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local base = args.base&lt;br /&gt;
    local userlang = frame:preprocess( &amp;#039;{{Int:Lang}}&amp;#039; )&lt;br /&gt;
    local tl, tlns = &amp;#039;Template:&amp;#039;, 10&lt;br /&gt;
    local tlb, fallback1, currenttemplate&lt;br /&gt;
    local fallback, contentlang = mw.text.split( userlang, &amp;#039;-&amp;#039;, true )[1], mw.language.getContentLanguage():getCode()&lt;br /&gt;
&lt;br /&gt;
    local createReturn = function(title)&lt;br /&gt;
        local ret&lt;br /&gt;
        local tlargs = {}&lt;br /&gt;
         -- When LUA is invoked, templates are already expanded. This must be respected.&lt;br /&gt;
        return frame:expandTemplate{ title = title, args = args }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not base then&lt;br /&gt;
        return (&amp;quot;&amp;#039;autolang&amp;#039; in [[Module:Languages]] was called but the &amp;#039;base&amp;#039; parameter could not be found.&amp;quot; ..&lt;br /&gt;
            &amp;quot;The base parameter specifies the template that&amp;#039;s subpages will be sought for a suitable translation.&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    tlb = tl .. base .. &amp;#039;/&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    currenttemplate = tlb .. userlang&lt;br /&gt;
    local ok, exists = pcall( function()&lt;br /&gt;
        return mw.title.new( currenttemplate, tlns ).exists&lt;br /&gt;
    end )&lt;br /&gt;
    if ok and exists then&lt;br /&gt;
        return createReturn(currenttemplate)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    fallback1 = frame:preprocess( &amp;#039;{{Fallback|1=&amp;#039; .. base .. &amp;#039;|2=&amp;#039; .. userlang .. &amp;#039;}}&amp;#039; )&lt;br /&gt;
    if fallback1 ~= contentlang then&lt;br /&gt;
        return createReturn(tlb .. fallback1)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    currenttemplate = tlb .. fallback&lt;br /&gt;
    local ok, exists = pcall( function()&lt;br /&gt;
        return mw.title.new( currenttemplate, tlns ).exists&lt;br /&gt;
    end )&lt;br /&gt;
    if ok and exists then&lt;br /&gt;
        return createReturn(currenttemplate)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    currenttemplate = tlb .. contentlang&lt;br /&gt;
    local ok, exists = pcall( function()&lt;br /&gt;
        return mw.title.new( currenttemplate, tlns ).exists&lt;br /&gt;
    end )&lt;br /&gt;
    if ok and exists then&lt;br /&gt;
        return createReturn(currenttemplate)&lt;br /&gt;
    end&lt;br /&gt;
    return createReturn(tl .. base)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:languages|isKnownLanguageTag|gsw}} -&amp;gt; 1&lt;br /&gt;
{{#invoke:languages|isKnownLanguageTag|doesNotExist}} -&amp;gt;&lt;br /&gt;
]=]&lt;br /&gt;
function p.isKnownLanguageTag(frame)&lt;br /&gt;
    return mw.language.isKnownLanguageTag( frame.args[1] or frame.args.tag or frame.args.code or &amp;#039;&amp;#039; ) and &amp;#039;1&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.file_languages(frame)&lt;br /&gt;
    local M_link = require( &amp;#039;Module:Link&amp;#039; )&lt;br /&gt;
    local contentLangInstance = mw.language.getContentLanguage()&lt;br /&gt;
    local pattern = frame.args.pattern or &amp;#039;%s (%s)&amp;#039;&lt;br /&gt;
    local original = frame.args.original or mw.title.getCurrentTitle().text&lt;br /&gt;
    local ext_start, _ = string.find( original, &amp;#039;\.%w+$&amp;#039; )&lt;br /&gt;
    local file_ext = string.sub( original, ext_start )&lt;br /&gt;
    original = string.sub( original, 0, ext_start - 1 )&lt;br /&gt;
    return frame:preprocess(&lt;br /&gt;
        &amp;#039;&amp;lt;gallery&amp;gt;\n&amp;#039; ..&lt;br /&gt;
        (table.concat(&lt;br /&gt;
            M_link.forEachLink(&lt;br /&gt;
                p.forEachLanguage({&lt;br /&gt;
                    args = { pattern = &amp;#039;[[$lc]]&amp;#039; }&lt;br /&gt;
                }),&lt;br /&gt;
                function( linkInfo )&lt;br /&gt;
                    local filename = mw.ustring.format( pattern, original, linkInfo.text ) .. file_ext&lt;br /&gt;
                    local ok, exists = pcall( function()&lt;br /&gt;
                            return mw.title.new( filename, 6 ).exists&lt;br /&gt;
                        end )&lt;br /&gt;
                    if ok and exists then&lt;br /&gt;
                        return mw.ustring.format( &amp;#039;%s|%s&amp;#039;,&lt;br /&gt;
                            filename,&lt;br /&gt;
                            mw.language.fetchLanguageName( linkInfo.text )&lt;br /&gt;
                        )&lt;br /&gt;
                    else&lt;br /&gt;
                        return nil&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            ), &amp;#039;\n&amp;#039;&lt;br /&gt;
        )) ..&lt;br /&gt;
        &amp;#039;\n&amp;lt;/gallery&amp;gt;&amp;#039;&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.runTests()&lt;br /&gt;
    return p.langLinksNonExpensive({&lt;br /&gt;
        args = {&lt;br /&gt;
            page = &amp;#039;Module:Languages/testcases/test&amp;#039;&lt;br /&gt;
        },&lt;br /&gt;
        getParent = function() end&lt;br /&gt;
    }) ==&lt;br /&gt;
        &amp;#039;[[Module:Languages/testcases/test/de|&amp;lt;bdi lang=&amp;quot;de&amp;quot;&amp;gt;Deutsch&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&amp;#039; ..&lt;br /&gt;
        &amp;#039;[[Module:Languages/testcases/test/en|&amp;lt;bdi lang=&amp;quot;en&amp;quot;&amp;gt;English&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>wikimedia&gt;Verdy p</name></author>
	</entry>
</feed>