Module:Autotranslate

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Lua

CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules

warning Warning:This page is shared between multiple wikis.
All changes to this page will be automatically copied to all wikis listed in the left side bar.
To avoid unnecessary page regeneration and server load, changes should be tested on the page's sandbox.

Code for {{Autotranslate}}. Also used for {{Autotranslate/clone 1}}, {{Autotranslate/clone 2}}.

Code

  --[[
  __  __           _       _           _         _        _                       _       _       
 |  \/  | ___   __| |_   _| | ___ _   / \  _   _| |_ ___ | |_ _ __ __ _ _ __  ___| | __ _| |_ ___ 
 | |\/| |/ _ \ / _` | | | | |/ _ (_) / _ \| | | | __/ _ \| __| '__/ _` | '_ \/ __| |/ _` | __/ _ \
 | |  | | (_) | (_| | |_| | |  __/_ / ___ \ |_| | || (_) | |_| | | (_| | | | \__ \ | (_| | ||  __/
 |_|  |_|\___/ \__,_|\__,_|_|\___(_)_/   \_\__,_|\__\___/ \__|_|  \__,_|_| |_|___/_|\__,_|\__\___|
 
 Authors and maintainers:
* User:Zolo   - original version
* User:Jarekt 
]]

-- local function to help normalize input arguments
local function normalize_input_args(input_args, output_args)
	for name, value in pairs( input_args ) do 
		if value ~= '' then -- nuke empty strings
			if type(name)=='string' then name=string.lower(name) end -- convert to lower case
			output_args[name] = value
		end
	end
	return output_args
end

-- initialize object to be returned
local p = {}

--[[
autotranslate
 
This function is the core part of the Autotranslate template. 
 
Usage from a template:
{{#invoke:autotranslate|autotranslate|base=|lang= }}
 
Parameters:
  frame.args.base - base page name
  frame.args.lang - desired language (often user's native language)

 Error Handling:

]]
function p.autotranslate(frame) 

	-- switch to lowercase parameters to make them case independent
	local args = {}
	args = normalize_input_args(frame:getParent().args, args)
	args = normalize_input_args(frame.args, args)

	-- get language fallback list
	if not args.lang or not mw.language.isSupportedLanguage(args.lang) then
		args.lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language 
	end
	local langList = mw.language.getFallbacksFor(args.lang)
	table.insert(langList,1,args.lang) -- user's language will be the first one to check

	-- find base page
	local base = args.base
	args.base  = nil -- blank it so it is not passed to language sub-templates
	assert(base and  #base>0, 'Base page not provided for autotranslate' )

	-- Local function for expanding a template that can be pcall()ed: call the template 
	-- with the same template arguments as the ones passed to {{autotranslate}} template.
	local function expandTemplate(title)
		return frame:expandTemplate{ title = title, args = args }
	end
	
	-- find base template language subpage
	local success, res
	for _, language in ipairs(langList) do
		success, res = pcall(expandTemplate, base .. '/' .. language)
		if success then
			break
		end
	end
	local err_msg = 'No fallback page found for autotranslate (base=[[:%s]], lang=%s)'
	if (not success) then
		assert(args.default, string.format(err_msg, base, args.lang)) 
		success, res = pcall(expandTemplate, args.default)
		assert(success, string.format(err_msg, base, args.default))
	end

	-- If this if the base page being translateda
	if (mw.title.getCurrentTitle().fullText==base) then
		-- English language is the last fallback language for most languages, if
		-- nothing else there should be at least an english subpage
		local en_exist = mw.title.new(base .. '/en').exists
		assert(en_exist, string.format(err_msg, base, 'en'))
		if (mw.site.siteName=='Wikimedia Commons') then
			res = res .. '\n[[Category:Autotranslated templates|' .. base .. ']]'
		end 
	end
	return res
end

return p