Module:Autotranslate: Difference between revisions
From WWII Archives
Paul Sidle (talk | contribs) m (1 revision imported) |
wc>Jarekt (rewrite proposed by User:Tacsipacsi using more efficient test for existence of language subtemplate) |
||
Line 49: | Line 49: | ||
-- get language fallback list | -- get language fallback list | ||
if not args.lang or not mw.language.isSupportedLanguage(args.lang) then | if not args.lang or not mw.language.isSupportedLanguage(args.lang) then | ||
args.lang = frame:callParserFunction( "int", "lang" ) | args.lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language | ||
end | end | ||
local langList = mw.language.getFallbacksFor(args.lang) | local langList = mw.language.getFallbacksFor(args.lang) | ||
table.insert(langList,1,args.lang) | table.insert(langList,1,args.lang) -- user's language will be the first one to check | ||
-- find base page | -- find base page | ||
local base = args.base | local base = args.base | ||
args.base = nil | 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' ) | 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 | end | ||
-- find base template language subpage | -- find base template language subpage | ||
local | local success, res | ||
for _, language in ipairs(langList) do | for _, language in ipairs(langList) do | ||
success, res = pcall(expandTemplate, base .. '/' .. language) | |||
if success then | |||
break | break | ||
end | end | ||
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)) | ||
return | 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 | end | ||
return p | return p |
Revision as of 13:29, 18 April 2024
Documentation for this module may be created at Module:Autotranslate/doc
--[[ __ __ _ _ _ _ _ _ _ | \/ | ___ __| |_ _| | ___ _ / \ _ _| |_ ___ | |_ _ __ __ _ _ __ ___| | __ _| |_ ___ | |\/| |/ _ \ / _` | | | | |/ _ (_) / _ \| | | | __/ _ \| __| '__/ _` | '_ \/ __| |/ _` | __/ _ \ | | | | (_) | (_| | |_| | | __/_ / ___ \ |_| | || (_) | |_| | | (_| | | | \__ \ | (_| | || __/ |_| |_|\___/ \__,_|\__,_|_|\___(_)_/ \_\__,_|\__\___/ \__|_| \__,_|_| |_|___/_|\__,_|\__\___| 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