This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing.
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing.
--[[
__ __ _ _ _ _ _ _ _
| \/ | ___ __| |_ _| | ___ _ / \ _ _| |_ ___ | |_ _ __ __ _ _ __ ___| | __ _| |_ ___
| |\/| |/ _ \ / _` | | | | |/ _ (_) / _ \| | | | __/ _ \| __| '__/ _` | '_ \/ __| |/ _` | __/ _ \
| | | | (_) | (_| | |_| | | __/_ / ___ \ |_| | || (_) | |_| | | (_| | | | \__ \ | (_| | || __/
|_| |_|\___/ \__,_|\__,_|_|\___(_)_/ \_\__,_|\__\___/ \__|_| \__,_|_| |_|___/_|\__,_|\__\___|
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