<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://commons.islamical.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AAutotranslate%2Fsandbox</id>
	<title>Module:Autotranslate/sandbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://commons.islamical.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AAutotranslate%2Fsandbox"/>
	<link rel="alternate" type="text/html" href="https://commons.islamical.org/w/index.php?title=Module:Autotranslate/sandbox&amp;action=history"/>
	<updated>2026-09-27T02:41:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://commons.islamical.org/w/index.php?title=Module:Autotranslate/sandbox&amp;diff=3727&amp;oldid=prev</id>
		<title>Shahroudi: Created page with &quot;  --[[   __  __           _       _           _         _        _                       _       _         |  \/  | ___   __| |_   _| | ___ _   / \  _   _| |_ ___ | |_ _ __ __ _ _ __  ___| | __ _| |_ ___   | |\/| |/ _ \ / _` | | | | |/ _ (_) / _ \| | | | __/ _ \| __| &#039;__/ _` | &#039;_ \/ __| |/ _` | __/ _ \  | |  | | (_) | (_| | |_| | |  __/_ / ___ \ |_| | || (_) | |_| | | (_| | | | \__ \ | (_| | ||  __/  |_|  |_|\___/ \__,_|\__,_|_|\___(_)_/   \_\__,_|\__\___/ \__|_|  \__,_|...&quot;</title>
		<link rel="alternate" type="text/html" href="https://commons.islamical.org/w/index.php?title=Module:Autotranslate/sandbox&amp;diff=3727&amp;oldid=prev"/>
		<updated>2025-11-02T21:13:29Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;  --[[   __  __           _       _           _         _        _                       _       _         |  \/  | ___   __| |_   _| | ___ _   / \  _   _| |_ ___ | |_ _ __ __ _ _ __  ___| | __ _| |_ ___   | |\/| |/ _ \ / _` | | | | |/ _ (_) / _ \| | | | __/ _ \| __| &amp;#039;__/ _` | &amp;#039;_ \/ __| |/ _` | __/ _ \  | |  | | (_) | (_| | |_| | |  __/_ / ___ \ |_| | || (_) | |_| | | (_| | | | \__ \ | (_| | ||  __/  |_|  |_|\___/ \__,_|\__,_|_|\___(_)_/   \_\__,_|\__\___/ \__|_|  \__,_|...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;  --[[&lt;br /&gt;
  __  __           _       _           _         _        _                       _       _       &lt;br /&gt;
 |  \/  | ___   __| |_   _| | ___ _   / \  _   _| |_ ___ | |_ _ __ __ _ _ __  ___| | __ _| |_ ___ &lt;br /&gt;
 | |\/| |/ _ \ / _` | | | | |/ _ (_) / _ \| | | | __/ _ \| __| &amp;#039;__/ _` | &amp;#039;_ \/ __| |/ _` | __/ _ \&lt;br /&gt;
 | |  | | (_) | (_| | |_| | |  __/_ / ___ \ |_| | || (_) | |_| | | (_| | | | \__ \ | (_| | ||  __/&lt;br /&gt;
 |_|  |_|\___/ \__,_|\__,_|_|\___(_)_/   \_\__,_|\__\___/ \__|_|  \__,_|_| |_|___/_|\__,_|\__\___|&lt;br /&gt;
 &lt;br /&gt;
 Authors and maintainers:&lt;br /&gt;
* User:Zolo   - original version&lt;br /&gt;
* User:Jarekt &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local err_msg = &amp;#039;No fallback page found for autotranslate (base=[[:%s]], lang=%s)&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- local function to help normalize input arguments&lt;br /&gt;
local function normalize_input_args(input_args, output_args)&lt;br /&gt;
	for name, value in pairs( input_args ) do &lt;br /&gt;
		if value ~= &amp;#039;&amp;#039; then -- nuke empty strings&lt;br /&gt;
			if type(name)==&amp;#039;string&amp;#039; then name=string.lower(name) end -- convert to lower case&lt;br /&gt;
			output_args[name] = value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return output_args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
local function fallback_list(lang)&lt;br /&gt;
	-- get language fallback list&lt;br /&gt;
	if not lang or not mw.language.isSupportedLanguage(lang) then&lt;br /&gt;
		lang = frame:callParserFunction( &amp;quot;int&amp;quot;, &amp;quot;lang&amp;quot; ) -- get user&amp;#039;s chosen language &lt;br /&gt;
	end&lt;br /&gt;
	local langList = mw.language.getFallbacksFor(lang)&lt;br /&gt;
	table.insert(langList,1,lang) -- user&amp;#039;s language will be the first one to check&lt;br /&gt;
	return langList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------&lt;br /&gt;
local function verify(base)&lt;br /&gt;
    res = &amp;#039;&amp;#039;&lt;br /&gt;
	if (mw.title.getCurrentTitle().namespace==10) then&lt;br /&gt;
		-- English language is the last fallback language for most languages, if&lt;br /&gt;
		-- nothing else there should be at least an english subpage&lt;br /&gt;
		local en_exist = mw.title.new(base .. &amp;#039;/en&amp;#039;).exists&lt;br /&gt;
		assert(en_exist, string.format(err_msg, base, &amp;#039;en&amp;#039;))&lt;br /&gt;
		if (mw.site.siteName==&amp;#039;Wikimedia Commons&amp;#039;) then&lt;br /&gt;
			res = &amp;#039;\n[[Category:Autotranslated templates|&amp;#039; .. base .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- initialize object to be returned&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
autotranslate&lt;br /&gt;
 &lt;br /&gt;
This function is the core part of the Autotranslate template. &lt;br /&gt;
 &lt;br /&gt;
Usage from a template:&lt;br /&gt;
{{#invoke:autotranslate|autotranslate|base=|lang= }}&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
  frame.args.base - base page name&lt;br /&gt;
  frame.args.lang - desired language (often user&amp;#039;s default language)&lt;br /&gt;
&lt;br /&gt;
 Error Handling:&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
function p.autotranslate(frame) &lt;br /&gt;
&lt;br /&gt;
	-- switch to lowercase parameters to make them case independent&lt;br /&gt;
	local args = {}&lt;br /&gt;
	args = normalize_input_args(frame:getParent().args, args)&lt;br /&gt;
	args = normalize_input_args(frame.args, args)&lt;br /&gt;
	local langList = fallback_list(args.lang)&lt;br /&gt;
&lt;br /&gt;
	-- single out autotranslate template parameters and exclude them from&lt;br /&gt;
	-- parameters passed to language sub-templates&lt;br /&gt;
	local base    = args.base&lt;br /&gt;
	local lang    = args.lang&lt;br /&gt;
	local default = args.default&lt;br /&gt;
	args.base     = nil -- blank it&lt;br /&gt;
	args.lang     = nil -- blank it &lt;br /&gt;
	args.default  = nil -- blank it &lt;br /&gt;
	assert(base and  #base&amp;gt;0, &amp;#039;Base page not provided for autotranslate&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	-- Local function for expanding a template that can be pcall()ed: call the template &lt;br /&gt;
	-- with the same template arguments as the ones passed to {{autotranslate}} template.&lt;br /&gt;
	local function expandTemplate(title)&lt;br /&gt;
		return frame:expandTemplate{ title = title, args = args }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- find base template language subpage&lt;br /&gt;
	local success, res&lt;br /&gt;
	for _, language in ipairs(langList) do&lt;br /&gt;
		success, res = pcall(expandTemplate, base .. &amp;#039;/&amp;#039; .. language)&lt;br /&gt;
		if success then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (not success) then&lt;br /&gt;
		assert(default, string.format(err_msg, base, lang)) &lt;br /&gt;
		success, res = pcall(expandTemplate, default)&lt;br /&gt;
		assert(success, string.format(err_msg, base, default))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return res .. verify(base)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function p.autotranslate_te(frame) &lt;br /&gt;
	-- version of autotranslate that works with translation extension&lt;br /&gt;
&lt;br /&gt;
	-- switch to lowercase parameters to make them case independent&lt;br /&gt;
	local args = {}&lt;br /&gt;
	args = normalize_input_args(frame:getParent().args, args)&lt;br /&gt;
	args = normalize_input_args(frame.args, args)&lt;br /&gt;
	local langList = fallback_list(args.lang)&lt;br /&gt;
	&lt;br /&gt;
	-- single out autotranslate template parameters and exclude them from&lt;br /&gt;
	-- parameters passed to language sub-templates&lt;br /&gt;
	local base    = args.base&lt;br /&gt;
	local lang    = args.lang&lt;br /&gt;
	local default = args.default&lt;br /&gt;
	args.base     = nil -- blank it&lt;br /&gt;
	args.lang     = nil -- blank it &lt;br /&gt;
	args.default  = nil -- blank it &lt;br /&gt;
	assert(base and  #base&amp;gt;0, &amp;#039;Base page not provided for autotranslate&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	-- find base template language subpage&lt;br /&gt;
	local page = default  -- default page if provided or nil otherwise&lt;br /&gt;
	for _, language in ipairs(langList) do&lt;br /&gt;
		if mw.title.new(base .. &amp;#039;/&amp;#039; .. language).exists then&lt;br /&gt;
			page =  base .. &amp;#039;/&amp;#039; .. language -- returns only the page&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- last check for errors. This one would be vary rarely used maybe a language which &amp;quot;isSupportedLanguage&amp;quot; but does &lt;br /&gt;
	-- not have any fallback languages, like qqx&lt;br /&gt;
	assert(page, string.format(err_msg, base, lang))&lt;br /&gt;
 &lt;br /&gt;
	-- Transclude {{page |....}} with template arguments the same as the ones passed to {{autotranslate}} template.&lt;br /&gt;
	local res = frame:expandTemplate{ title = page, args = args}&lt;br /&gt;
	return res .. verify(base)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Shahroudi</name></author>
	</entry>
</feed>