<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://chaldeanwiki.com/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://chaldeanwiki.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ALanguages"/>
		<link rel="alternate" type="text/html" href="https://chaldeanwiki.com/index.php?title=Module:Languages&amp;action=history"/>
		<updated>2026-05-01T05:21:46Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.24.0</generator>

	<entry>
		<id>https://chaldeanwiki.com/index.php?title=Module:Languages&amp;diff=144&amp;oldid=prev</id>
		<title>Ian: 1 revision imported: Template:Information importing</title>
		<link rel="alternate" type="text/html" href="https://chaldeanwiki.com/index.php?title=Module:Languages&amp;diff=144&amp;oldid=prev"/>
				<updated>2015-03-30T21:05:01Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision imported: Template:Information importing&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 21:05, 30 March 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Ian</name></author>	</entry>

	<entry>
		<id>https://chaldeanwiki.com/index.php?title=Module:Languages&amp;diff=143&amp;oldid=prev</id>
		<title>Rillke: that's why test are soooo useful: Restoring language collation order</title>
		<link rel="alternate" type="text/html" href="https://chaldeanwiki.com/index.php?title=Module:Languages&amp;diff=143&amp;oldid=prev"/>
				<updated>2014-12-10T16:04:49Z</updated>
		
		<summary type="html">&lt;p&gt;that&amp;#039;s why test are soooo useful: Restoring language collation order&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 == 'function' or ( at == 'table' 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( 'Module:Page' );&lt;br /&gt;
    &lt;br /&gt;
    title = page.clean(title);&lt;br /&gt;
    &lt;br /&gt;
    if tt == 'function' or ( tt == 'table' and getmetatable(transform).__call ) then&lt;br /&gt;
        local fetch, pages, langcode, langname = mw.language.fetchLanguageName, {};&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 ~= '' 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;
    pages = language_subpages( frame, function( title, page, code, name )&lt;br /&gt;
        return mw.ustring.format( '&amp;lt;span lang=&amp;quot;%s&amp;quot; xml:lang=&amp;quot;%s&amp;quot; class=&amp;quot;language lang-%s&amp;quot;&amp;gt;&amp;lt;bdi&amp;gt;[[%s/%s|%s]]&amp;lt;/bdi&amp;gt;&amp;lt;/span&amp;gt;',&lt;br /&gt;
            code, code, code, title, page, name&lt;br /&gt;
        );&lt;br /&gt;
    end);&lt;br /&gt;
    return table.concat( pages, '&amp;amp;nbsp;·&amp;amp;nbsp;' );&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;
    pages = language_subpages( frame, function( title, page, code, name )&lt;br /&gt;
        return mw.ustring.format( '&amp;lt;span lang=&amp;quot;%s&amp;quot; xml:lang=&amp;quot;%s&amp;quot; class=&amp;quot;language lang-%s&amp;quot;&amp;gt;&amp;lt;bdi&amp;gt;[%s/%s %s]&amp;lt;/bdi&amp;gt;&amp;lt;/span&amp;gt;',&lt;br /&gt;
            code, code, code, tostring( mw.uri.fullUrl( title ) ), page:gsub( ' ', '_' ), name&lt;br /&gt;
        );&lt;br /&gt;
    end);&lt;br /&gt;
    return table.concat( pages, '&amp;amp;nbsp;| ' );&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;
    &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 contentLangInstance = mw.language.getContentLanguage()&lt;br /&gt;
    local langInstance = contentLangInstance --Quota hit here otherwise&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 langName&lt;br /&gt;
    local langNameUCFirst&lt;br /&gt;
    local langNameTranslated&lt;br /&gt;
    local langNameTranslatedUCFirst&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 l, lTr&lt;br /&gt;
    &lt;br /&gt;
    if ( langNameReq ) then&lt;br /&gt;
    	l = mw.language.fetchLanguageNames()&lt;br /&gt;
	end&lt;br /&gt;
	if ( langNameTranslatedReq ) then&lt;br /&gt;
		lTr = mw.language.fetchLanguageNames( inLang )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local lcIdList = require( 'Module:Languages/List' ).getSortedList( l or lTr )&lt;br /&gt;
&lt;br /&gt;
    for i, lcId in pairs( lcIdList ) do&lt;br /&gt;
         line = pattern:gsub( &amp;quot;$lc&amp;quot;, lcId )&lt;br /&gt;
        &lt;br /&gt;
        if langNameReq then&lt;br /&gt;
            line = line:gsub( &amp;quot;$lnP&amp;quot;, l[lcId] )&lt;br /&gt;
        end&lt;br /&gt;
        if langNameUCFirstReq then&lt;br /&gt;
            --langInstance = mw.getLanguage( lcId ) --Quota hit here&lt;br /&gt;
            langNameUCFirst = langInstance:ucfirst( l[lcId] )&lt;br /&gt;
            line = line:gsub( &amp;quot;$lnUC1&amp;quot;, langNameUCFirst )&lt;br /&gt;
        end&lt;br /&gt;
        if langNameTranslatedReq then&lt;br /&gt;
            langNameTranslated = lTr[lcId]&lt;br /&gt;
            line = line:gsub( &amp;quot;$lnTrP&amp;quot;, langNameTranslated )&lt;br /&gt;
        end&lt;br /&gt;
        if langNameTranslatedUCFirstReq then&lt;br /&gt;
            --if not langInstance then langInstance = mw.getLanguage( lcId ) end --Quota hit here&lt;br /&gt;
            langNameTranslatedUCFirst = langInstance:ucfirst( langNameTranslated )&lt;br /&gt;
            line = line:gsub( &amp;quot;$lnTrUC1&amp;quot;, langNameTranslatedUCFirst )&lt;br /&gt;
        end&lt;br /&gt;
         --langInstance = nil&lt;br /&gt;
&lt;br /&gt;
        table.insert(ret, line)&lt;br /&gt;
    end&lt;br /&gt;
    return prefix .. table.concat( ret, sep ) .. postfix&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
 Provide logic for [[Template:Lle]] (Language Links external, to be substituted)&lt;br /&gt;
]=]&lt;br /&gt;
function p.lle(frame)&lt;br /&gt;
    local ret&lt;br /&gt;
    local pattern = &amp;quot;{{&amp;lt;includeonly/&amp;gt;subst:#ifexist:{{{1}}}/$lc|[{{fullurl:{{{1}}}/$lc}} $lnUC1]&amp;amp;nbsp;{{&amp;lt;includeonly/&amp;gt;subst:!}} &amp;lt;!--\n--&amp;gt;}}&amp;quot;&lt;br /&gt;
    ret = p.forEachLanguage({ args= { pattern = pattern } })&lt;br /&gt;
    ret = frame:preprocess(ret)&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
 Provide logic for [[Template:Ll]] (Language Links, to be substituted)&lt;br /&gt;
]=]&lt;br /&gt;
function p.ll(frame)&lt;br /&gt;
    local ret&lt;br /&gt;
    local pattern = &amp;quot;{{&amp;lt;includeonly/&amp;gt;subst:#ifexist:{{{1}}}/$lc|[[{{{1}}}/$lc{{&amp;lt;includeonly/&amp;gt;subst:!}}$lnUC1]]&amp;amp;nbsp;{{&amp;lt;includeonly/&amp;gt;subst:!}} &amp;lt;!--\n--&amp;gt;}}&amp;quot;&lt;br /&gt;
    ret = p.forEachLanguage({ args= { pattern = pattern } })&lt;br /&gt;
    ret = frame:preprocess(ret)&lt;br /&gt;
    return ret&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='Commons:Picture of the Year/2010' }, getParent=function() end })&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page='Main Page' }, getParent=function() end })&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page='Template:No_source_since' }, getParent=function() end })&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page='MediaWiki:Gadget-HotCat' }, 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 = { abort= { time=3.5, on=function() &lt;br /&gt;
            pages2 = p.forEachLanguage({ args= { pattern = '{{#ifexist:' .. title .. '/$lc|[[' .. title .. '/$lc|$lnUC1]]&amp;amp;nbsp;&amp;amp;#124;&amp;amp;#32;}}' } })&lt;br /&gt;
        end } }&lt;br /&gt;
    local pages = language_subpages( frame, function( basepagename, subpagename, code, langname )&lt;br /&gt;
        return mw.ustring.format( '&amp;lt;span lang=&amp;quot;%s&amp;quot; xml:lang=&amp;quot;%s&amp;quot; class=&amp;quot;language lang-%s&amp;quot; style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;&amp;lt;bdi&amp;gt;[[%s/%s|%s]]&amp;lt;/bdi&amp;gt;&amp;lt;/span&amp;gt;&amp;amp;nbsp;| ',&lt;br /&gt;
            code, code, code, basepagename, subpagename, contentLangInstance:ucfirst( langname ) )&lt;br /&gt;
    end, options );&lt;br /&gt;
    return pages2 and frame:preprocess(pages2) or table.concat(  pages, '' );&lt;br /&gt;
    ]==]&lt;br /&gt;
    return frame:preprocess( p.forEachLanguage({ args= { pattern = '{{#ifexist:' .. title .. '/$lc|[[' .. title .. '/$lc|$lnUC1]]&amp;amp;nbsp;&amp;amp;#124;&amp;amp;#32;}}' } }) )&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'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 'both' == 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 'parent' == 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( '{{int:lang}}' )&lt;br /&gt;
    local tl, tlns = 'Template:', 10&lt;br /&gt;
    local tlb, fallback1, currenttemplate&lt;br /&gt;
    local fallback, contentlang = mw.text.split( userlang, '-', 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;'autolang' in [[Module:Languages]] was called but the 'base' parameter could not be found.&amp;quot; .. &lt;br /&gt;
            &amp;quot;The base parameter specifies the template that's subpages will be sought for a suitable translation.&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    tlb = tl .. base .. '/'&lt;br /&gt;
    &lt;br /&gt;
    currenttemplate = tlb .. userlang&lt;br /&gt;
    if mw.title.new( currenttemplate, tlns ).exists then&lt;br /&gt;
        return createReturn(currenttemplate)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    fallback1 = frame:preprocess( '{{Fallback|1=' .. base .. '|2=' .. userlang .. '}}' )&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;
    if mw.title.new( currenttemplate, tlns ).exists then&lt;br /&gt;
        return createReturn(currenttemplate)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    currenttemplate = tlb .. contentlang&lt;br /&gt;
    if mw.title.new( currenttemplate, tlns ).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 '' ) and '1' or ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.file_languages(frame)&lt;br /&gt;
    local M_link = require( 'Module:Link' )&lt;br /&gt;
    local contentLangInstance = mw.language.getContentLanguage()&lt;br /&gt;
    local pattern = frame.args.pattern or '%s (%s)'&lt;br /&gt;
    local original = frame.args.original or mw.title.getCurrentTitle().text&lt;br /&gt;
    local ext_start, _ = string.find( original, '\.%w+$' )&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('&amp;lt;gallery&amp;gt;\n'..(table.concat(M_link.forEachLink( p.forEachLanguage( { args= { pattern = '[[$lc]]' } } ), &lt;br /&gt;
        function(linkInfo)&lt;br /&gt;
            local filename = mw.ustring.format( pattern, original, linkInfo.text ) .. file_ext&lt;br /&gt;
            if mw.title.new( filename, 6 ).exists then&lt;br /&gt;
                return mw.ustring.format( '%s|%s', filename, contentLangInstance:ucfirst( mw.language.fetchLanguageName( linkInfo.text ) ) )&lt;br /&gt;
            else&lt;br /&gt;
                return nil&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    ), '\n'))..'\n&amp;lt;/gallery&amp;gt;')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.runTests()&lt;br /&gt;
	return p.langLinksNonExpensive({ args= { page='Module:Languages/testcases/test' }, getParent=function() end }) == &amp;quot;[[Module:Languages/testcases/test/de|Deutsch]]&amp;amp;nbsp;&amp;amp;#124;&amp;amp;#32;[[Module:Languages/testcases/test/en|English]]&amp;amp;nbsp;&amp;amp;#124;&amp;amp;#32;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>Rillke</name></author>	</entry>

	</feed>