
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.fahrradmonteur.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3AMultilingual</id>
	<title>Modul:Multilingual - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://www.fahrradmonteur.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3AMultilingual"/>
	<link rel="alternate" type="text/html" href="https://www.fahrradmonteur.de/index.php?title=Modul:Multilingual&amp;action=history"/>
	<updated>2026-04-21T15:01:34Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Fahrradmonteur</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://www.fahrradmonteur.de/index.php?title=Modul:Multilingual&amp;diff=36449&amp;oldid=prev</id>
		<title>RalfRoletschek: 1 Version importiert: Import aus Wikipedia</title>
		<link rel="alternate" type="text/html" href="https://www.fahrradmonteur.de/index.php?title=Modul:Multilingual&amp;diff=36449&amp;oldid=prev"/>
		<updated>2017-10-01T11:54:08Z</updated>

		<summary type="html">&lt;p&gt;1 Version importiert: Import aus Wikipedia&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Multilingual = { suite  = &amp;quot;Multilingual&amp;quot;,&lt;br /&gt;
                       serial = &amp;quot;2016-11-29&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- local globals&lt;br /&gt;
local Frame&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local favorite = function ()&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns code of curent project language&lt;br /&gt;
    if not Multilingual.self then&lt;br /&gt;
        Multilingual.self = mw.language.getContentLanguage():getCode()&lt;br /&gt;
                                                            :lower()&lt;br /&gt;
    end&lt;br /&gt;
    return Multilingual.self&lt;br /&gt;
end -- favorite()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fetch = function ( access, allow )&lt;br /&gt;
    -- Attach config or library module&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access  -- module title&lt;br /&gt;
    --     allow   -- permit non-existence&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  table or false, with library&lt;br /&gt;
    --     Throws error, if not available&lt;br /&gt;
    if type( Multilingual.ext ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
        Multilingual.ext = { }&lt;br /&gt;
    end&lt;br /&gt;
    if Multilingual.ext[ access ] == false then&lt;br /&gt;
    elseif not Multilingual.ext[ access ] then&lt;br /&gt;
        local lucky, got = pcall( require, &amp;quot;Module:&amp;quot; .. access )&lt;br /&gt;
        if lucky then&lt;br /&gt;
            if type( got ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                Multilingual.ext[ access ] = got&lt;br /&gt;
                if type( got[ access ] ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
                    Multilingual.ext[ access ] = got[ access ]()&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if type( Multilingual.ext[ access ] ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            if allow then&lt;br /&gt;
                Multilingual.ext[ access ] = false&lt;br /&gt;
            else&lt;br /&gt;
                got = string.format( &amp;quot;Module:%s invalid&amp;quot;, access )&lt;br /&gt;
                error( got, 0 )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Multilingual.ext[ access ]&lt;br /&gt;
end -- fetch()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function find( ask, alien )&lt;br /&gt;
    -- Derive language code from name&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask    -- language name, downcased&lt;br /&gt;
    --     alien  -- language code of ask&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     nil, or string&lt;br /&gt;
    local codes = mw.language.fetchLanguageNames( alien, &amp;quot;all&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    for k, v in pairs( codes ) do&lt;br /&gt;
        if mw.ustring.lower( v ) == ask then&lt;br /&gt;
            r = k&lt;br /&gt;
            break -- for k, v&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    if not r then&lt;br /&gt;
        r = Multilingual.fair( ask )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- find()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function isSupported( ask, accept )&lt;br /&gt;
    -- Is ask to be supported by application?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask     -- lowercase code&lt;br /&gt;
    --     accept  -- space separated/terminated list of lowercase codes&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     nil, or else&lt;br /&gt;
    local seek = string.format( &amp;quot; %s &amp;quot;, ask )&lt;br /&gt;
    local supported = string.format( &amp;quot; %s&amp;quot;, accept )&lt;br /&gt;
    return supported:find( seek, 1, true )&lt;br /&gt;
end -- isSupported()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.fair = function ( ask )&lt;br /&gt;
    -- Format language specification according to RFC 5646 etc.&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- string or table, as created by .getLang()&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false&lt;br /&gt;
    local s = type( ask )&lt;br /&gt;
    local q, r&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        q = ask&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        q = Multilingual.getLang( ask )&lt;br /&gt;
    end&lt;br /&gt;
    if q  and&lt;br /&gt;
       q.legal  and&lt;br /&gt;
       mw.language.isKnownLanguageTag( q.base ) then&lt;br /&gt;
        r = q.base&lt;br /&gt;
        if q.n &amp;gt; 1 then&lt;br /&gt;
            local order = { &amp;quot;extlang&amp;quot;,&lt;br /&gt;
                            &amp;quot;script&amp;quot;,&lt;br /&gt;
                            &amp;quot;region&amp;quot;,&lt;br /&gt;
                            &amp;quot;other&amp;quot;,&lt;br /&gt;
                            &amp;quot;extension&amp;quot; }&lt;br /&gt;
            for i = 1, #order do&lt;br /&gt;
                s = q[ order[ i ] ]&lt;br /&gt;
                if s then&lt;br /&gt;
                    r =  string.format( &amp;quot;%s-%s&amp;quot;, r, s )&lt;br /&gt;
                end&lt;br /&gt;
            end -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or false&lt;br /&gt;
end -- Multilingual.fair()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.findCode = function ( ask )&lt;br /&gt;
    -- Retrieve code of local (current project or English) language name&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- string, with presumable language name&lt;br /&gt;
    --             A code itself will be identified, too.&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false&lt;br /&gt;
    local seek = mw.text.trim( ask )&lt;br /&gt;
    local r = false&lt;br /&gt;
    if #seek &amp;gt; 1 then&lt;br /&gt;
        if seek:find( &amp;quot;[&amp;quot;, 1, true ) then&lt;br /&gt;
            seek = fetch( &amp;quot;WLink&amp;quot; ).getPlain( seek )&lt;br /&gt;
        end&lt;br /&gt;
        seek = mw.ustring.lower( seek )&lt;br /&gt;
        if Multilingual.isLang( seek ) then&lt;br /&gt;
            r = Multilingual.fair( seek )&lt;br /&gt;
        else&lt;br /&gt;
            local slang = favorite()&lt;br /&gt;
            r = find( seek, slang )&lt;br /&gt;
            if not r  and  slang ~= &amp;quot;en&amp;quot; then&lt;br /&gt;
                r = find( seek, &amp;quot;en&amp;quot; )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.findCode()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.format = function ( apply, alien, alter, active, alert,&lt;br /&gt;
                                 frame, assembly, adjacent, ahead )&lt;br /&gt;
    -- Format one or more languages&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     apply     -- string with language list or item&lt;br /&gt;
    --     alien     -- language of the answer&lt;br /&gt;
    --                  -- nil, false, &amp;quot;*&amp;quot;: native&lt;br /&gt;
    --                  -- &amp;quot;!&amp;quot;: current project&lt;br /&gt;
    --                  -- &amp;quot;#&amp;quot;: code, downcased, space separated&lt;br /&gt;
    --                  -- &amp;quot;-&amp;quot;: code, mixcase, space separated&lt;br /&gt;
    --                  -- any valid code&lt;br /&gt;
    --     alter     -- capitalize, if &amp;quot;c&amp;quot;; downcase all, if &amp;quot;d&amp;quot;&lt;br /&gt;
    --                  capitalize first item only, if &amp;quot;f&amp;quot;&lt;br /&gt;
    --                  downcase every first word only, if &amp;quot;m&amp;quot;&lt;br /&gt;
    --     active    -- link items, if true&lt;br /&gt;
    --     alert     -- string with category title in case of error&lt;br /&gt;
    --     frame     -- if available&lt;br /&gt;
    --     assembly  -- string with split pattern, if list expected&lt;br /&gt;
    --     adjacent  -- string with list separator, else assembly&lt;br /&gt;
    --     ahead     -- string to prepend first element, if any&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false if apply empty&lt;br /&gt;
    local r = false&lt;br /&gt;
    if apply then&lt;br /&gt;
        local slang&lt;br /&gt;
        if assembly then&lt;br /&gt;
            local bucket = mw.text.split( apply, assembly )&lt;br /&gt;
            local shift = alter&lt;br /&gt;
            local separator&lt;br /&gt;
            if adjacent then&lt;br /&gt;
                separator = adjacent&lt;br /&gt;
            elseif alien == &amp;quot;#&amp;quot;  or  alien == &amp;quot;-&amp;quot; then&lt;br /&gt;
                separator = &amp;quot; &amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                separator = assembly&lt;br /&gt;
            end&lt;br /&gt;
            for k, v in pairs( bucket ) do&lt;br /&gt;
                slang = Multilingual.format( v, alien, shift, active,&lt;br /&gt;
                                             alert )&lt;br /&gt;
                if slang then&lt;br /&gt;
                    if r then&lt;br /&gt;
                        r = string.format( &amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
                                           r, separator, slang )&lt;br /&gt;
                    else&lt;br /&gt;
                        r = slang&lt;br /&gt;
                        if shift == &amp;quot;f&amp;quot; then&lt;br /&gt;
                            shift = &amp;quot;d&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end -- for k, v&lt;br /&gt;
            if r and ahead then&lt;br /&gt;
                r = ahead .. r&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            local single = mw.text.trim( apply )&lt;br /&gt;
            if single == &amp;quot;&amp;quot; then&lt;br /&gt;
                r = false&lt;br /&gt;
            else&lt;br /&gt;
                local lapsus, slot&lt;br /&gt;
                slang = Multilingual.findCode( single )&lt;br /&gt;
                if slang then&lt;br /&gt;
                    if alien == &amp;quot;-&amp;quot; then&lt;br /&gt;
                        r = slang&lt;br /&gt;
                    elseif alien == &amp;quot;#&amp;quot; then&lt;br /&gt;
                        r = slang:lower()&lt;br /&gt;
                    else&lt;br /&gt;
                        r = Multilingual.getName( slang, alien )&lt;br /&gt;
                        if active then&lt;br /&gt;
                            local cnf = fetch( &amp;quot;Multilingual/config&amp;quot;,&lt;br /&gt;
                                               true )&lt;br /&gt;
                            if cnf  and&lt;br /&gt;
                               type( cnf.getLink ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
                                if not frame then&lt;br /&gt;
                                    if not Frame then&lt;br /&gt;
                                        Frame = mw.getCurrentFrame()&lt;br /&gt;
                                    end&lt;br /&gt;
                                    frame = Frame&lt;br /&gt;
                                end&lt;br /&gt;
                                slot = cnf.getLink( slang, frame )&lt;br /&gt;
                                if slot then&lt;br /&gt;
                                    local wlink = fetch( &amp;quot;WLink&amp;quot; )&lt;br /&gt;
                                    slot = wlink.getTarget( slot )&lt;br /&gt;
                                else&lt;br /&gt;
                                    lapsus = alert&lt;br /&gt;
                                end&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    r = single&lt;br /&gt;
                    if active then&lt;br /&gt;
                        local title = mw.title.makeTitle( 0, single )&lt;br /&gt;
                        if title.exists then&lt;br /&gt;
                            slot = single&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                    lapsus = alert&lt;br /&gt;
                end&lt;br /&gt;
                if not r then&lt;br /&gt;
                    r = single&lt;br /&gt;
                elseif alter == &amp;quot;c&amp;quot; or alter == &amp;quot;f&amp;quot; then&lt;br /&gt;
                    r = mw.ustring.upper( mw.ustring.sub( r, 1, 1 ) )&lt;br /&gt;
                        .. mw.ustring.sub( r, 2 )&lt;br /&gt;
                elseif alter == &amp;quot;d&amp;quot; then&lt;br /&gt;
                    if Multilingual.isMinusculable( slang or &amp;quot;&amp;quot; ) then&lt;br /&gt;
                        r = mw.ustring.lower( r )&lt;br /&gt;
                    end&lt;br /&gt;
                elseif alter == &amp;quot;m&amp;quot; then&lt;br /&gt;
                    if Multilingual.isMinusculable( slang or &amp;quot;&amp;quot; ) then&lt;br /&gt;
                        r = mw.ustring.lower( mw.ustring.sub( r, 1, 1 ) )&lt;br /&gt;
                            .. mw.ustring.sub( r, 2 )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if slot then&lt;br /&gt;
                    if r == slot then&lt;br /&gt;
                        r = string.format( &amp;quot;[[%s]]&amp;quot;, r )&lt;br /&gt;
                    else&lt;br /&gt;
                        r = string.format( &amp;quot;[[%s|%s]]&amp;quot;, slot, r )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if lapsus and alert then&lt;br /&gt;
                    r = string.format( &amp;quot;%s[[Category:%s]]&amp;quot;, r, alert )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.format()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.getBase = function ( ask )&lt;br /&gt;
    -- Retrieve base language from possibly combined ISO language code&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- language code&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false&lt;br /&gt;
    local r&lt;br /&gt;
    if ask then&lt;br /&gt;
        local slang = ask:match( &amp;quot;^%s*(%a%a%a?)-?%a*%s*$&amp;quot; )&lt;br /&gt;
        if slang then&lt;br /&gt;
            r = slang:lower()&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.getBase()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.getLang = function ( ask )&lt;br /&gt;
    -- Retrieve components of a RFC 5646 language code&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- language code with subtags&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns table with formatted subtags&lt;br /&gt;
    --             .base&lt;br /&gt;
    --             .region&lt;br /&gt;
    --             .script&lt;br /&gt;
    --             .year&lt;br /&gt;
    --             .extension&lt;br /&gt;
    --             .other&lt;br /&gt;
    --             .n&lt;br /&gt;
    local tags = mw.text.split( ask, &amp;quot;-&amp;quot; )&lt;br /&gt;
    local s    = tags[ 1 ]&lt;br /&gt;
    local r&lt;br /&gt;
    if s:match( &amp;quot;^%a%a%a?$&amp;quot; ) then&lt;br /&gt;
        r = { base  = s:lower(),&lt;br /&gt;
              legal = true,&lt;br /&gt;
              n     = #tags }&lt;br /&gt;
        for i = 2, r.n do&lt;br /&gt;
            s = tags[ i ]&lt;br /&gt;
            if #s == 2 then&lt;br /&gt;
                if r.region  or  not s:match( &amp;quot;%a%a&amp;quot; ) then&lt;br /&gt;
                    r.legal = false&lt;br /&gt;
                else&lt;br /&gt;
                    r.region = s:upper()&lt;br /&gt;
                end&lt;br /&gt;
            elseif #s == 4 then&lt;br /&gt;
                if s:match( &amp;quot;%a%a%a%a&amp;quot; ) then&lt;br /&gt;
                    r.legal = ( not r.script )&lt;br /&gt;
                    r.script = s:sub( 1, 1 ):upper() ..&lt;br /&gt;
                               s:sub( 2 ):lower()&lt;br /&gt;
                elseif s:match( &amp;quot;20%d%d&amp;quot; )  or&lt;br /&gt;
                       s:match( &amp;quot;1%d%d%d&amp;quot; ) then&lt;br /&gt;
                    r.legal = ( not r.year )&lt;br /&gt;
                    r.year = s&lt;br /&gt;
                else&lt;br /&gt;
                    r.legal = false&lt;br /&gt;
                end&lt;br /&gt;
            elseif #s == 3 then&lt;br /&gt;
                if r.extlang  or  not s:match( &amp;quot;%a%a%a&amp;quot; ) then&lt;br /&gt;
                    r.legal = false&lt;br /&gt;
                else&lt;br /&gt;
                    r.extlang = s:lower()&lt;br /&gt;
                end&lt;br /&gt;
            elseif #s == 1 then&lt;br /&gt;
                s = s:lower()&lt;br /&gt;
                if s:match( &amp;quot;[tux]&amp;quot; ) then&lt;br /&gt;
                    r.extension = s&lt;br /&gt;
                    for k = i + 1, r.n do&lt;br /&gt;
                        s = tags[ k ]&lt;br /&gt;
                        if s:match( &amp;quot;^%w+$&amp;quot; ) then&lt;br /&gt;
                            r.extension = string.format( &amp;quot;%s-%s&amp;quot;,&lt;br /&gt;
                                                         r.extension, s )&lt;br /&gt;
                        else&lt;br /&gt;
                            r.legal = false&lt;br /&gt;
                        end&lt;br /&gt;
                    end -- for k&lt;br /&gt;
                else&lt;br /&gt;
                    r.legal = false&lt;br /&gt;
                end&lt;br /&gt;
                break -- for i&lt;br /&gt;
            else&lt;br /&gt;
                r.legal = ( not r.other )  and&lt;br /&gt;
                          s:match( &amp;quot;%a%a%a&amp;quot; )&lt;br /&gt;
                r.other = s:lower()&lt;br /&gt;
            end&lt;br /&gt;
            if not r.legal then&lt;br /&gt;
                break -- for i&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
    else&lt;br /&gt;
        r = { legal = false }&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.getLang()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.getName = function ( ask, alien )&lt;br /&gt;
    -- Which name is assigned to this language code?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask    -- language code&lt;br /&gt;
    --     alien  -- language of the answer&lt;br /&gt;
    --               -- nil, false, &amp;quot;*&amp;quot;: native&lt;br /&gt;
    --               -- &amp;quot;!&amp;quot;: current project&lt;br /&gt;
    --               -- any valid code&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false&lt;br /&gt;
    local r&lt;br /&gt;
    if ask then&lt;br /&gt;
        local slang   = alien&lt;br /&gt;
        local support = &amp;quot;Multilingual/names&amp;quot;&lt;br /&gt;
        local tLang&lt;br /&gt;
        if slang then&lt;br /&gt;
            if slang == &amp;quot;*&amp;quot; then&lt;br /&gt;
                slang = Multilingual.fair( ask )&lt;br /&gt;
            elseif slang == &amp;quot;!&amp;quot; then&lt;br /&gt;
                slang = favorite()&lt;br /&gt;
            else&lt;br /&gt;
                slang = Multilingual.fair( slang )&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            slang = Multilingual.fair( ask )&lt;br /&gt;
        end&lt;br /&gt;
        if not slang then&lt;br /&gt;
            slang = ask or &amp;quot;?????&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        slang = slang:lower()&lt;br /&gt;
        tLang = fetch( support, true )&lt;br /&gt;
        if tLang then&lt;br /&gt;
            tLang = tLang[ slang ]&lt;br /&gt;
            if tLang then&lt;br /&gt;
                r = tLang[ ask ]&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not r then&lt;br /&gt;
            if not Multilingual.ext.tMW then&lt;br /&gt;
                Multilingual.ext.tMW = { }&lt;br /&gt;
            end&lt;br /&gt;
            tLang = Multilingual.ext.tMW[ slang ]&lt;br /&gt;
            if tLang == nil then&lt;br /&gt;
                tLang = mw.language.fetchLanguageNames( slang )&lt;br /&gt;
                if tLang then&lt;br /&gt;
                    Multilingual.ext.tMW[ slang ] = tLang&lt;br /&gt;
                else&lt;br /&gt;
                    Multilingual.ext.tMW[ slang ] = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if tLang then&lt;br /&gt;
                r = tLang[ ask ]&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not r then&lt;br /&gt;
            r = mw.language.fetchLanguageName( ask:lower(), slang )&lt;br /&gt;
            if r == &amp;quot;&amp;quot; then&lt;br /&gt;
                r = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.getName()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.isLang = function ( ask )&lt;br /&gt;
    -- Could this be an ISO language code?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- language code&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns boolean&lt;br /&gt;
    local r&lt;br /&gt;
    local s = Multilingual.getBase( ask )&lt;br /&gt;
    if s then&lt;br /&gt;
        r = mw.language.isKnownLanguageTag( s )&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.isLang()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.isLangWiki = function ( ask )&lt;br /&gt;
    -- Could this be a Wiki language version?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- language version specifier&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns boolean&lt;br /&gt;
    local r&lt;br /&gt;
    local s = Multilingual.getBase( ask )&lt;br /&gt;
    if s then&lt;br /&gt;
        r = mw.language.isSupportedLanguage( s )&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.isLangWiki()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.isMinusculable = function ( ask )&lt;br /&gt;
    -- Could this language name become downcased?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- language name&lt;br /&gt;
    local cnf = fetch( &amp;quot;Multilingual/config&amp;quot;, true )&lt;br /&gt;
    local r = true&lt;br /&gt;
    if cnf  and  type( cnf.stopMinusculization ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        local s = string.format( &amp;quot; %s &amp;quot;, ask:lower() )&lt;br /&gt;
        if cnf.stopMinusculization:find( s, 1, true ) then&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.isMinusculable()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.kannDeutsch = function ( ask )&lt;br /&gt;
    -- Kann man mit diesem Sprachcode deutsch verstehen?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- language version specifier&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns boolean&lt;br /&gt;
    local r&lt;br /&gt;
    local s = Multilingual.getBase( ask )&lt;br /&gt;
    if s then&lt;br /&gt;
        local support = [=[ de als bar dsb frr gsw hsb ksh |&lt;br /&gt;
                            lb nds pdc pdt pfl sli stq vmf ]=]&lt;br /&gt;
        if support:find( string.format( &amp;quot; %s &amp;quot;, s ),  1,  true ) then&lt;br /&gt;
            r = true&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.kannDeutsch()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.userLang = function ( accept, frame )&lt;br /&gt;
    -- Try to support user language by application&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     accept  -- space separated list of available ISO 639 codes&lt;br /&gt;
    --                Default: project language, or English&lt;br /&gt;
    --     frame   -- frame, if available&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string with appropriate code&lt;br /&gt;
    local r, slang, support&lt;br /&gt;
    if not frame then&lt;br /&gt;
        if not Frame then&lt;br /&gt;
            Frame = mw.getCurrentFrame()&lt;br /&gt;
        end&lt;br /&gt;
        frame = Frame&lt;br /&gt;
    end&lt;br /&gt;
    slang = frame:callParserFunction( &amp;quot;int&amp;quot;, &amp;quot;lang&amp;quot; ):lower()&lt;br /&gt;
    if type( accept ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        support = accept:lower() .. &amp;quot; &amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        support = favorite()&lt;br /&gt;
        if mw.language.isKnownLanguageTag( support ) then&lt;br /&gt;
            support = string.format( &amp;quot;%s en &amp;quot;, support )&lt;br /&gt;
        else&lt;br /&gt;
            support = &amp;quot;en &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if isSupported( slang, support ) then&lt;br /&gt;
        r = slang&lt;br /&gt;
    elseif slang:find( &amp;quot;-&amp;quot;, 1, true ) then&lt;br /&gt;
        slang = Multilingual.getBase( slang )&lt;br /&gt;
        if isSupported( slang, support ) then&lt;br /&gt;
            r = slang&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not r then&lt;br /&gt;
        if Multilingual.kannDeutsch( slang )  and&lt;br /&gt;
           isSupported( &amp;quot;de&amp;quot;, support ) then&lt;br /&gt;
            r = &amp;quot;de&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if not r then&lt;br /&gt;
            r = support:match( &amp;quot;^(%S+) &amp;quot; )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.userLang()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function Multilingual.failsafe( assert )&lt;br /&gt;
    -- Retrieve versioning and check for compliance&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     assert  -- string, with required version, or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string with appropriate version, or false&lt;br /&gt;
    local r&lt;br /&gt;
    if assert  and  assert &amp;gt; Multilingual.serial then&lt;br /&gt;
        r = false&lt;br /&gt;
    else&lt;br /&gt;
        r = Multilingual.serial&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.failsafe()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
local p = { }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.fair = function ( frame )&lt;br /&gt;
    -- Format language code&lt;br /&gt;
    --     1  -- language code&lt;br /&gt;
    return Multilingual.fair( frame.args[ 1 ] )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.fair&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.findCode = function ( frame )&lt;br /&gt;
    -- Retrieve language code from language name&lt;br /&gt;
    --     1  -- name in current project language&lt;br /&gt;
    return Multilingual.findCode( frame.args[ 1 ] )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.findCode&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.format = function ( frame )&lt;br /&gt;
    -- Format one or more languages&lt;br /&gt;
    --     1          -- language list or item&lt;br /&gt;
    --     slang      -- language of the answer, if not native&lt;br /&gt;
    --                   * -- native&lt;br /&gt;
    --                   ! -- current project&lt;br /&gt;
    --                   any valid code&lt;br /&gt;
    --     shift      -- capitalize, if &amp;quot;c&amp;quot;; downcase, if &amp;quot;d&amp;quot;&lt;br /&gt;
    --                   capitalize first item only, if &amp;quot;f&amp;quot;&lt;br /&gt;
    --     link       -- 1 -- link items&lt;br /&gt;
    --     scream     -- category title in case of error&lt;br /&gt;
    --     split      -- split pattern, if list expected&lt;br /&gt;
    --     separator  -- list separator, else assembly&lt;br /&gt;
    --     start      -- prepend first element, if any&lt;br /&gt;
    local r&lt;br /&gt;
    local link&lt;br /&gt;
    if frame.args.link == &amp;quot;1&amp;quot; then&lt;br /&gt;
        link = true&lt;br /&gt;
    end&lt;br /&gt;
    r = Multilingual.format( frame.args[ 1 ],&lt;br /&gt;
                             frame.args.slang,&lt;br /&gt;
                             frame.args.shift,&lt;br /&gt;
                             link,&lt;br /&gt;
                             frame.args.scream,&lt;br /&gt;
                             frame,&lt;br /&gt;
                             frame.args.split,&lt;br /&gt;
                             frame.args.separator,&lt;br /&gt;
                             frame.args.start )&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.format&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.getBase = function ( frame )&lt;br /&gt;
    -- Retrieve base language from possibly combined ISO language code&lt;br /&gt;
    --     1  -- code&lt;br /&gt;
    return Multilingual.getBase( frame.args[ 1 ] )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.getBase&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.getName = function ( frame )&lt;br /&gt;
    -- Retrieve language name from ISO language code&lt;br /&gt;
    --     1  -- code&lt;br /&gt;
    --     2  -- language to be used for the answer, if not native&lt;br /&gt;
    --           ! -- current project&lt;br /&gt;
    --           * -- native&lt;br /&gt;
    --           any valid code&lt;br /&gt;
    local slang = frame.args[ 2 ]&lt;br /&gt;
    local r&lt;br /&gt;
    if slang then&lt;br /&gt;
        slang = mw.text.trim( slang )&lt;br /&gt;
    end&lt;br /&gt;
    r = Multilingual.getName( frame.args[ 1 ], slang )&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.getName&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.isLang = function ( frame )&lt;br /&gt;
    -- Could this be an ISO language code?&lt;br /&gt;
    --     1  -- code&lt;br /&gt;
    local lucky, r = pcall( Multilingual.isLang,&lt;br /&gt;
                            frame.args[ 1 ] )&lt;br /&gt;
    return r and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.isLang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.isLangWiki = function ( frame )&lt;br /&gt;
    -- Could this be a Wiki language version?&lt;br /&gt;
    --     1  -- code&lt;br /&gt;
    local lucky, r = pcall( Multilingual.isLangWiki,&lt;br /&gt;
                            frame.args[ 1 ] )&lt;br /&gt;
    return r and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.isLangWiki&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.kannDeutsch = function ( frame )&lt;br /&gt;
    -- Kann man mit diesem Sprachcode deutsch verstehen?&lt;br /&gt;
    --     1  -- code&lt;br /&gt;
    local r = Multilingual.kannDeutsch( frame.args[ 1 ] )&lt;br /&gt;
    return r and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.kannDeutsch&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.userLang = function ( frame )&lt;br /&gt;
    -- Which language does the current user prefer?&lt;br /&gt;
    --     1  -- space separated list of available ISO 639 codes&lt;br /&gt;
   return Multilingual.userLang( frame.args[ 1 ], frame )&lt;br /&gt;
end -- p.userLang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.failsafe = function ( frame )&lt;br /&gt;
    local since = frame.args[ 1 ]&lt;br /&gt;
    if since then&lt;br /&gt;
        since = mw.text.trim( since )&lt;br /&gt;
        if since == &amp;quot;&amp;quot; then&lt;br /&gt;
            since = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Multilingual.failsafe( since )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.Multilingual = function ()&lt;br /&gt;
    return Multilingual&lt;br /&gt;
end -- p.Multilingual&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RalfRoletschek</name></author>
		
	</entry>
</feed>