Module:LangSwitch

    From Commons

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

    --[[
      __  __           _       _        _                      ____          _ _       _     
     |  \/  | ___   __| |_   _| | ___ _| |    __ _ _ __   __ _/ ___|_      _(_) |_ ___| |__  
     | |\/| |/ _ \ / _` | | | | |/ _ (_) |   / _` | '_ \ / _` \___ \ \ /\ / / | __/ __| '_ \ 
     | |  | | (_) | (_| | |_| | |  __/_| |__| (_| | | | | (_| |___) \ V  V /| | || (__| | | |
     |_|  |_|\___/ \__,_|\__,_|_|\___(_)_____\__,_|_| |_|\__, |____/ \_/\_/ |_|\__\___|_| |_|
                                                         |___/                               
     Authors and maintainers:
    * User:Zolo   - original version in Module:Fallback
    * User:Jarekt 
    ]]
    
    -- add optional module 
    -- used for debugging purposes as it detects cases of unintended global variables
    require('Module:No globals') 
    
    local p = {}
    
    --[[
    _langSwitch
     
    This function is the core part of the LangSwitch template. 
     
    Example usage from Lua:
    text = _langSwitch({en='text in english', pl='tekst po polsku'}, lang)
     
    Parameters:
      args - table with translations by language
      lang - desired language (often user's native language)
    
     Error Handling:
    
    ]]
    
    function p._langSwitch(args, lang) -- args: table of translations
    	-- Return error if there is not default and no english version
    	if not args.en and not args.default then
    		local err = '<b class="error">LangSwitch Error: no default</b>'
    		if args.nocat == '1' then
    			return err
    		else
    			return err .. '[[Category:LangSwitch template without default version]]'
    		end
    	end
    	
    	-- To improve performance try quick switch, and load fallback chain only if needed. 
    	-- In the vast majority of cases fast switch is sufficient
    	local val = args[lang]
    	if val == '~' then 
    		return ''
    	elseif val and val ~= '' then 
    		return val 
    	elseif args.quick then
    		return nil
    	end
    	
    	-- get the list of accepetable language (lang + those in lang's fallback chain) and check their content
    	assert(lang, 'LangSwitch Error: no lang')
    	local langList = mw.language.getFallbacksFor(lang)
    	table.insert(langList,1,lang)
    	table.insert(langList,math.max(#langList,2),'default')
    	for _, language in ipairs(langList) do 
    		val = args[language]
    		if val == '~' then 
    			return ''
    		elseif val and val ~= '' then 
    			return val 
    		end
    	end
    end
    
    --[[
    langSwitch
     
    This function is the core part of the LangSwitch template. 
     
    Example Usage from a template:
    {{#invoke:fallback|langSwitch|en=text in english|pl=tekst po polsku|lang={{int:lang}} }}
     
    Parameters:
      frame.args - table with translations by language
      frame.args.lang - desired language (often user's native language)
    
     Error Handling:
    
    ]]
    function p.langSwitch(frame) -- version to be used from wikitext
    	local args = frame.args
    	-- if no expected args provided than check parent template/module args
    	if args.en==nil and args.default==nil and args.nocat==nil then
    		args = mw.getCurrentFrame():getParent().args 
    	end
    	local lang = args.lang
    	if not lang or not mw.language.isKnownLanguageTag(lang) then
    		lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language 
    	end
    	
    	-- Try quick switch which checks the most likely option when fallback is not needed
    	args.quick = true;
    	local val = p._langSwitch(args, lang)
    	if val then
    		return val
    	end
    	
    	-- Allow input in format: {{LangSwitch|de=Grün|es/it/pt=Verde|fr=Vert|en=Green |lang=en}}
    	-- with multiple languages mapping to a single value
    	local args1 = {}
    	for name, value in pairs( args ) do 
    		if value ~= '' and type(name)=='string' then 
        		for str in string.gmatch( name, "([^/]+)" ) do
    				args1[str] = value
    			end
    		end
    	end
    	return p._langSwitch(args1, lang)
    end
    
    return p