<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://the-democratika.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AISO_639_name</id>
	<title>Module:ISO 639 name - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://the-democratika.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AISO_639_name"/>
	<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:ISO_639_name&amp;action=history"/>
	<updated>2026-04-04T15:20:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://the-democratika.com/wiki/index.php?title=Module:ISO_639_name&amp;diff=6161&amp;oldid=prev</id>
		<title>&gt;Trappist the monk: -temp_mod_name_get();</title>
		<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:ISO_639_name&amp;diff=6161&amp;oldid=prev"/>
		<updated>2024-07-11T15:43:33Z</updated>

		<summary type="html">&lt;p&gt;-temp_mod_name_get();&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;);&lt;br /&gt;
local getArgs = require (&amp;#039;Module:Arguments&amp;#039;).getArgs;&lt;br /&gt;
local override_data = mw.loadData (&amp;#039;Module:ISO 639 name/ISO 639 override&amp;#039;);&lt;br /&gt;
local deprecated_data = mw.loadData (&amp;#039;Module:ISO 639 name/ISO 639 deprecated&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
local parts = {&lt;br /&gt;
	{&amp;#039;Module:ISO 639 name/ISO 639-1&amp;#039;, &amp;#039;1&amp;#039;},&lt;br /&gt;
	{&amp;#039;Module:ISO 639 name/ISO 639-2&amp;#039;, &amp;#039;2&amp;#039;},&lt;br /&gt;
	{&amp;#039;Module:ISO 639 name/ISO 639-2B&amp;#039;, &amp;#039;2B&amp;#039;},&lt;br /&gt;
	{&amp;#039;Module:ISO 639 name/ISO 639-3&amp;#039;, &amp;#039;3&amp;#039;},&lt;br /&gt;
	{&amp;#039;Module:ISO 639 name/ISO 639-5&amp;#039;, &amp;#039;5&amp;#039;},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E R R O R _ M E S S A G E S &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local error_messages = {&lt;br /&gt;
	[&amp;#039;err_msg&amp;#039;] = &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%;&amp;quot; class=&amp;quot;error show_639_err_msgs&amp;quot;&amp;gt;error: $1 ([[Template:ISO 639 name|help]])&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
	[&amp;#039;err_text&amp;#039;] = {															-- error messages used only in the code to name functions&lt;br /&gt;
		[&amp;#039;ietf&amp;#039;] = &amp;#039;$1 is an IETF tag&amp;#039;,											-- $1 is the ietf tag&lt;br /&gt;
		[&amp;#039;required&amp;#039;] = &amp;#039;ISO 639$1 code is required&amp;#039;,							-- $1 is the 639 &amp;#039;-1&amp;#039;, &amp;#039;-2&amp;#039;, &amp;#039;-3&amp;#039;, &amp;#039;-5&amp;#039; part suffix; may be empty string&lt;br /&gt;
&lt;br /&gt;
																				-- code to name functions and iso_639_name_to_code()&lt;br /&gt;
		[&amp;#039;not_found&amp;#039;] = &amp;#039;$1 not found in ISO 639-$2 list&amp;#039;,						-- $1 is code or language name; $2 is 639 part suffix(es)&lt;br /&gt;
&lt;br /&gt;
																				-- iso_639_name_to_code() only&lt;br /&gt;
		[&amp;#039;name&amp;#039;] = &amp;#039;language name required&amp;#039;,&lt;br /&gt;
		[&amp;#039;not_part&amp;#039;] = &amp;#039;$1 not an ISO 639 part&amp;#039;,								-- $1 is invalid 639 suffix (without hyphen)&lt;br /&gt;
&lt;br /&gt;
		[&amp;#039;code_name&amp;#039;] = &amp;#039;language code or name required&amp;#039;,						-- iso_639() only&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local error_cat = &amp;#039;[[Category:ISO 639 name template errors]]&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S U B S T I T U T E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Populates numbered arguments in a message string using an argument table.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function substitute (msg, args)&lt;br /&gt;
	return args and mw.message.newRawMessage (msg, args):plain() or msg;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E R R O R _ M S G &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
create an error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function error_msg (msg, arg, hide, nocat)&lt;br /&gt;
	local retval = &amp;#039;&amp;#039;;&lt;br /&gt;
	if not hide then&lt;br /&gt;
		retval = substitute (error_messages.err_msg, substitute (error_messages.err_text[msg], arg));&lt;br /&gt;
		retval = nocat and retval or (retval .. error_cat);&lt;br /&gt;
	end&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ S E T &amp;gt;------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns true if argument is set; false otherwise. Argument is &amp;#039;set&amp;#039; when it exists (not nil) or when it is not an empty string.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_set (var)&lt;br /&gt;
	return not (var == nil or var == &amp;#039;&amp;#039;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; M A K E _ W I K I L I N K &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only&lt;br /&gt;
link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an&lt;br /&gt;
empty string.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function make_wikilink (link, display)&lt;br /&gt;
	if is_set (link) then&lt;br /&gt;
		if is_set (display) then&lt;br /&gt;
			return table.concat ({&amp;#039;[[&amp;#039;, link, &amp;#039;|&amp;#039;, display, &amp;#039;]]&amp;#039;});&lt;br /&gt;
		else&lt;br /&gt;
			return table.concat ({&amp;#039;[[&amp;#039;, link, &amp;#039;]]&amp;#039;});&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L A N G _ N A M E _ G E T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns first listed language name for code from data{} table; strips parenthetical disambiguation; wikilinks to&lt;br /&gt;
the language article if link is true; returns nil else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function lang_name_get (code, data, link, label, raw)&lt;br /&gt;
	local name;&lt;br /&gt;
	if data[code] then&lt;br /&gt;
--		name = raw and data[code][1] or data[code][1]:gsub (&amp;#039;%s*%b()&amp;#039;, &amp;#039;&amp;#039;);		-- get the name; strip parenthetical disambiguators if any when &amp;lt;raw&amp;gt; is false&lt;br /&gt;
		if raw then&lt;br /&gt;
			name = data[code][1];&lt;br /&gt;
		else&lt;br /&gt;
			name = data[code][1]:gsub (&amp;#039;%s*%b()&amp;#039;, &amp;#039;&amp;#039;);							-- strip parenthetical disambiguators if any&lt;br /&gt;
			name = name:gsub (&amp;#039;([^,]-), +(.+)&amp;#039;, &amp;#039;%2 %1&amp;#039;);						-- if inverted, uninvert&lt;br /&gt;
		end&lt;br /&gt;
		if link then															-- make a link to the language article?&lt;br /&gt;
			if name:find (&amp;#039;languages&amp;#039;) or name:find (&amp;#039;[Ll]anguage$&amp;#039;) then&lt;br /&gt;
				name = make_wikilink (name, label);								-- simple wikilink for collective languages or langauges ending in &amp;#039;Language&amp;#039; unless there is a label&lt;br /&gt;
			elseif override_data.article_name[code] then&lt;br /&gt;
				name = make_wikilink (override_data.article_name[code][1], label or name);	-- language name or label with wikilink from override data&lt;br /&gt;
			else&lt;br /&gt;
				name = make_wikilink (name .. &amp;#039; language&amp;#039;, label or name);		-- [[name language|name]] or [[name language|label]]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return name;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A D D _ I E T F _ E R R O R _ M S G &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
assembles return-text (language code, language name, or error message) with IETF error message into properly&lt;br /&gt;
formatted readable text&lt;br /&gt;
&lt;br /&gt;
|hide-err=yes suppresses error message and category&lt;br /&gt;
|cat=no supresses category&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function add_ietf_error_msg (text, ietf_err, hide, nocat)&lt;br /&gt;
	if hide then&lt;br /&gt;
		ietf_err = &amp;#039;&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not nocat then															-- |cat= empty or omitted -&amp;gt; nocat=false&lt;br /&gt;
		nocat = &amp;#039;&amp;#039; == ietf_err;													-- spoof; don&amp;#039;t add cat when no error&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat ({														-- tack on ietf error message if one exists&lt;br /&gt;
		text,																	-- code name, language name, or error message&lt;br /&gt;
		&amp;#039;&amp;#039; ~= ietf_err and &amp;#039; &amp;#039; or &amp;#039;&amp;#039;,											-- needs a space when ietf_err is not empty&lt;br /&gt;
		ietf_err,&lt;br /&gt;
		nocat and &amp;#039;&amp;#039; or error_cat,												-- add error category when |cat=&amp;lt;aynthing but &amp;#039;no&amp;#039;&amp;gt;&lt;br /&gt;
		});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ P A R T _ I N D E X &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
gets index suitable for parts{} table from ISO 639-&amp;lt;part&amp;gt; (usually args[2])&lt;br /&gt;
&lt;br /&gt;
return valid index [1] - [5]; nil else&lt;br /&gt;
	1   &amp;lt;- part [&amp;#039;1&amp;#039;]&lt;br /&gt;
	2   &amp;lt;- part [&amp;#039;2&amp;#039;]															-- this is part 2T&lt;br /&gt;
	3   &amp;lt;- part [&amp;#039;2B&amp;#039;]&lt;br /&gt;
	4   &amp;lt;- part [&amp;#039;3&amp;#039;]&lt;br /&gt;
	nil &amp;lt;- part [&amp;#039;4&amp;#039;]															-- there is no part 4&lt;br /&gt;
	5   &amp;lt;- part [&amp;#039;5&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_part_index (part)&lt;br /&gt;
	return ({[&amp;#039;1&amp;#039;]=1, [&amp;#039;2&amp;#039;]=2, [&amp;#039;2B&amp;#039;]=3, [&amp;#039;3&amp;#039;]=4, [&amp;#039;4&amp;#039;]=nil, [&amp;#039;5&amp;#039;]=5})[part]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ C O D E _ T O _ N A M E _ C O M M O N &amp;gt;------------------------&lt;br /&gt;
&lt;br /&gt;
this is code that is common to all of the iso_639_code_n_to_name() functions which serve only as template entry&lt;br /&gt;
points to provide the frame, the name of the appropriate data source, and to identify which 639 part applies.&lt;br /&gt;
&lt;br /&gt;
this function returns a language name or an error message.  data is searched in this order:&lt;br /&gt;
	part-specific override data -&amp;gt; standard part data -&amp;gt; part-specific deprecated data&lt;br /&gt;
&lt;br /&gt;
a second retval used by _iso_639_code_to_name() is true when a code is found; nil else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_code_to_name_common (args, source, part)&lt;br /&gt;
	local hide = &amp;#039;yes&amp;#039; == args[&amp;#039;hide-err&amp;#039;];										-- suppress error messages and error categorization&lt;br /&gt;
	local nocat = &amp;#039;no&amp;#039; == args.cat;												-- suppress error categorization (primarily for demo use)&lt;br /&gt;
	local raw = &amp;#039;yes&amp;#039; == args.raw;												-- disable override and dab removal&lt;br /&gt;
	local data;																	-- one of the override or part tables&lt;br /&gt;
	local name;																	-- holds language name from data&lt;br /&gt;
&lt;br /&gt;
	if not args[1] then															-- if code not provided in the template call&lt;br /&gt;
		return error_msg (&amp;#039;required&amp;#039;, &amp;#039;-&amp;#039; .. part, hide, nocat);						-- abandon&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local code;																	-- used for error messaging&lt;br /&gt;
	local ietf_err;																-- holds an error message when args[1] (language code) is in IETF tag form (may or may not be a valid IETF tag)&lt;br /&gt;
	code, ietf_err = args[1]:gsub(&amp;#039;(.-)%-.*&amp;#039;, &amp;#039;%1&amp;#039;);							-- strip ietf subtags; ietf_err is non-zero when subtags are stripped&lt;br /&gt;
	ietf_err = (0 ~= ietf_err) and error_msg (&amp;#039;ietf&amp;#039;, args[1], hide, nocat) or &amp;#039;&amp;#039;;		-- when tags are stripped create an error message; empty string for concatenation else&lt;br /&gt;
&lt;br /&gt;
	if not raw then																-- when raw is true, fetch name as is from part data; ignore override&lt;br /&gt;
		data = override_data[&amp;#039;override_&amp;#039; .. part];								-- get override data for this part&lt;br /&gt;
		name = lang_name_get (code:lower(), data, args.link, args.label, raw);	-- get override language name if there is one&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not name then&lt;br /&gt;
		data = mw.loadData (source);											-- get the data for this ISO 639 part&lt;br /&gt;
		name = lang_name_get (code:lower(), data, args.link, args.label, raw);	-- get language name if there is one&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not name then															-- TODO: do something special to indicate when a name is fetched from deprecated data?&lt;br /&gt;
		data = deprecated_data[&amp;#039;deprecated_&amp;#039; .. part];							-- get deprecated data for this part&lt;br /&gt;
		name = lang_name_get (code:lower(), data, args.link, args.label, raw);	-- get deprecated language name if there is one&lt;br /&gt;
&lt;br /&gt;
		if not name then&lt;br /&gt;
			return error_msg (&amp;#039;not_found&amp;#039;, {code, part}, hide, nocat);			-- code not found, return error message&lt;br /&gt;
		end&lt;br /&gt;
	end		&lt;br /&gt;
	return add_ietf_error_msg (name, ietf_err, hide, nocat), true;				-- return language name with ietf error message if any; true because we found a code&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; _ I S O _ 6 3 9 _ C O D E _ T O _ N A M E &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
searches through the ISO 639 language tables for a name that matches the supplied code.  on success returns first&lt;br /&gt;
language name that matches code from template frame perhaps with an error message and a second return value of true;&lt;br /&gt;
on failure returns an error message and a second return value of nil.  The second return value is a return value&lt;br /&gt;
used by iso_639_code_exists()&lt;br /&gt;
&lt;br /&gt;
looks first in the override data and then sequentially in the 639-1, -2, -3, and -5 data&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function _iso_639_code_to_name (frame)&lt;br /&gt;
	local args = getArgs(frame);&lt;br /&gt;
	local hide = &amp;#039;yes&amp;#039; == args[&amp;#039;hide-err&amp;#039;];										-- suppress error messages and error categorization&lt;br /&gt;
	local nocat = &amp;#039;no&amp;#039; == args.cat;												-- suppress error categorization (primarily for demo use)&lt;br /&gt;
	&lt;br /&gt;
	if not args[1] then															-- if code not provided in the template call&lt;br /&gt;
		return error_msg (&amp;#039;required&amp;#039;, &amp;#039;&amp;#039;, hide, nocat);							-- abandon&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local name;																	-- the retrieved language name and / or error message&lt;br /&gt;
	local found;																-- set to true when language name is found&lt;br /&gt;
&lt;br /&gt;
	for _, part in ipairs (parts) do&lt;br /&gt;
		name, found = iso_639_code_to_name_common (args, part[1],  part[2]);&lt;br /&gt;
		if found then&lt;br /&gt;
			return name, true;													-- second retval for iso_639_name_exists()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return error_msg (&amp;#039;not_found&amp;#039;, {args[1], &amp;#039;1, -2, -2B, -3, -5&amp;#039;}, hide, nocat);	-- here when code (args[1]) is not found in the data tables&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ C O D E _ T O _ N A M E &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point; returns first language name that matches code from template frame or an error message&lt;br /&gt;
looks first in the override data and then sequentially in the 639-1, -2, -3, and -5 data&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_code_to_name (frame)&lt;br /&gt;
	local ret_val = _iso_639_code_to_name (frame);								-- ignore second return value&lt;br /&gt;
	return ret_val;																-- return language name and / or error message&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ C O D E _ E X I S T S &amp;gt;----------------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point; returns true if language code maps to a language name; intended as a replacement for:&lt;br /&gt;
	{{#exist:Template:ISO 639 name &amp;lt;code&amp;gt;|&amp;lt;exists&amp;gt;|&amp;lt;doesn&amp;#039;t exist&amp;gt;}}&lt;br /&gt;
Instead of that expensive parser function call use this function:&lt;br /&gt;
	{{#if:{{#invoke:ISO 639 name|iso_639_code_exists|&amp;lt;code&amp;gt;}}|&amp;lt;exists&amp;gt;|&amp;lt;doesn&amp;#039;t exist&amp;gt;}}&lt;br /&gt;
on success, returns true; nil else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_code_exists (frame)&lt;br /&gt;
	local _, exists;&lt;br /&gt;
	 _, exists = _iso_639_code_to_name (frame);									-- ignore name/error message return; &amp;lt;exists&amp;gt; is true when name found for code; nil else&lt;br /&gt;
	 return exists;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ C O D E _ 1 _ T O _ N A M E &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point; returns first language name that matches ISO 639-1 code from template frame or an error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_code_1_to_name (frame)&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
	local retval = iso_639_code_to_name_common (args, parts[1][1],  parts[1][2]);	-- suppress second return value&lt;br /&gt;
	return retval;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ C O D E _ 2 _ T O _ N A M E &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point; returns first language name that matches ISO 639-2 code from template frame or an error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_code_2_to_name (frame)&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
	local retval = iso_639_code_to_name_common (args, parts[2][1],  parts[2][2]);	-- suppress second return value&lt;br /&gt;
	return retval;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ C O D E _ 2 B _ T O _ N A M E &amp;gt;--------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point; returns first language name that matches ISO 639-2 code from template frame or an error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_code_2B_to_name (frame)&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
	local retval = iso_639_code_to_name_common (args, parts[3][1],  parts[3][2]);	-- suppress second return value&lt;br /&gt;
	return retval;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ C O D E _ 3 _ T O _ N A M E &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point; returns first language name that matches ISO 639-3 code from template frame or an error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_code_3_to_name (frame)&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
	local retval = iso_639_code_to_name_common (args, parts[4][1],  parts[4][2]);	-- suppress second return value&lt;br /&gt;
	return retval;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ C O D E _ 5 _ T O _ N A M E &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point; returns first language name that matches ISO 639-5 code from template frame or an error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_code_5_to_name (frame)&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
	local retval = iso_639_code_to_name_common (args, parts[5][1],  parts[5][2]);	-- index [4] -&amp;gt; part 5 because there is no part 4; suppress second return value&lt;br /&gt;
	return retval;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N A M E _ I N _ P A R T _ C O D E _ G E T &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
indexes into the &amp;lt;name_data&amp;gt; using &amp;lt;name&amp;gt; and extracts the language code assigned to &amp;lt;part&amp;gt; (1, 2, 2B, 3, 5).&lt;br /&gt;
attempts to index override data first; returns code on success, nil else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function name_in_part_code_get (name, part, part_idx, name_data)&lt;br /&gt;
	return name_data[name] and (&lt;br /&gt;
		name_data[name][part_idx+5]	or											-- see if the name exists in the part&amp;#039;s override table&lt;br /&gt;
		name_data[name][part_idx] or											-- see if the name exists in the part&amp;#039;s main table&lt;br /&gt;
		name_data[name][part_idx+10]											-- see if the name exists in the part&amp;#039;s deprecated table&lt;br /&gt;
		);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; _ I S O _ 6 3 9 _ N A M E _ T O _ C O D E &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
module entry point; returns ISO 639-1, -2, -2B, -3, or -5 code associated with language name according to part&lt;br /&gt;
(1, 2, 2B, 3, 5) argument; when part is not provided scans 1, 2, 2B, 3, 5 and returns first code&lt;br /&gt;
&lt;br /&gt;
override data are examined first&lt;br /&gt;
&lt;br /&gt;
&amp;lt;args&amp;gt; is frame arguments from getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function _iso_639_name_to_code (args)&lt;br /&gt;
	local hide = &amp;#039;yes&amp;#039; == args[&amp;#039;hide-err&amp;#039;];										-- suppress error messages and error categorization&lt;br /&gt;
	local nocat = &amp;#039;no&amp;#039; == args.cat;												-- suppress error categorization (primarily for demo use)&lt;br /&gt;
&lt;br /&gt;
	if not args[1] then&lt;br /&gt;
		return error_msg (&amp;#039;name&amp;#039;, &amp;#039;&amp;#039;, hide, nocat);								-- abandon when language name missing&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local name = args[1];														-- used in error messaging&lt;br /&gt;
	local lc_name = name:gsub(&amp;#039; +&amp;#039;, &amp;#039; &amp;#039;):lower();								-- lowercase version of name for indexing into the data table; strip extraneous space characters&lt;br /&gt;
&lt;br /&gt;
	local part_idx;&lt;br /&gt;
	local part = args[2];&lt;br /&gt;
	if part then&lt;br /&gt;
		part_idx = get_part_index (part);&lt;br /&gt;
		if not part_idx then&lt;br /&gt;
			return error_msg (&amp;#039;not_part&amp;#039;, part, hide, nocat);					-- abandon; args[2] is not a valid ISO 639 part&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local name_data = mw.loadData (&amp;#039;Module:ISO 639 name/ISO 639 name to code&amp;#039;);	-- ISO 639 language names to code table&lt;br /&gt;
&lt;br /&gt;
	local code;&lt;br /&gt;
	&lt;br /&gt;
	if part then&lt;br /&gt;
		code = name_in_part_code_get (lc_name, part, part_idx, name_data);		-- search the specified override table + part table&lt;br /&gt;
	else&lt;br /&gt;
		for part_idx, part_tag in ipairs ({&amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;2B&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;5&amp;#039;}) do		-- no part provided, spin through all parts override first and get the first available code&lt;br /&gt;
			code = name_in_part_code_get (lc_name, part_tag, part_idx, name_data);&lt;br /&gt;
			if code then														-- nil when specified &amp;lt;part&amp;gt; does not have code for specified language &amp;lt;name&amp;gt;&lt;br /&gt;
				break;															-- when code is not nil, done&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if code then&lt;br /&gt;
		return code, true;&lt;br /&gt;
	end&lt;br /&gt;
	return error_msg (&amp;#039;not_found&amp;#039;, {name, part or &amp;#039;1, -2, -2B, -3, -5&amp;#039;}, hide, nocat), false;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ N A M E _ T O _ C O D E &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point; returns ISO 639-1, -2, -2B, -3, or -5 code associated with language name according to part&lt;br /&gt;
(1, 2, 2B, 3, 5) argument; when part is not provided scans 1, 2, 2B, 3, 5 and returns first code&lt;br /&gt;
&lt;br /&gt;
override data are examined first&lt;br /&gt;
&lt;br /&gt;
args[1] is language name&lt;br /&gt;
args[2] is ISO 639 part&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_name_to_code (frame)&lt;br /&gt;
	local args = getArgs(frame);&lt;br /&gt;
	local result, _ = _iso_639_name_to_code (args);								-- suppress true/false return used by iso_639_name_exists()&lt;br /&gt;
	return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 _ N A M E _ E X I S T S &amp;gt;----------------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point; returns ISO 639-1, -2, -3, or -5 code associated with language name according to part (1, 2, 3, 5) argument;&lt;br /&gt;
when part is not provided scans 1, 2, 3 , 5 and returns first code&lt;br /&gt;
&lt;br /&gt;
override data are examined first&lt;br /&gt;
&lt;br /&gt;
args[1] is language name&lt;br /&gt;
args[2] is ISO 639 part&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639_name_exists (frame)&lt;br /&gt;
	local args = getArgs(frame);&lt;br /&gt;
	local _, result = _iso_639_name_to_code (args);								-- suppress code return used by iso_639_name_to_code()&lt;br /&gt;
	return result and true or nil;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S O _ 6 3 9 &amp;gt;----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point.&lt;br /&gt;
returns:&lt;br /&gt;
	language name if args[1] is valid language code&lt;br /&gt;
	language code if args[1] is valid language name&lt;br /&gt;
&lt;br /&gt;
this function is constrained to the ISO 639 part specified in args[2] which must be 1, 2, 2B, 3, or 5.  When not provided&lt;br /&gt;
all parts are tested. The first match is found&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function iso_639 (frame)&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
	local hide = &amp;#039;yes&amp;#039; == args[&amp;#039;hide-err&amp;#039;];										-- suppress error messages and error categorization&lt;br /&gt;
	local nocat = &amp;#039;no&amp;#039; == args.cat;												-- suppress error categorization (primarily for demo use)&lt;br /&gt;
	local result;&lt;br /&gt;
	local found;																-- set to true when language name is found&lt;br /&gt;
&lt;br /&gt;
	if not args[1] then&lt;br /&gt;
		return error_msg (&amp;#039;code_name&amp;#039;, &amp;#039;&amp;#039;, hide, nocat);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local part = args[2];&lt;br /&gt;
	if part then																-- if ISO 639 part supplied&lt;br /&gt;
		local part_idx = get_part_index (part);									-- map index from &amp;lt;part&amp;gt;; anything else nil&lt;br /&gt;
&lt;br /&gt;
		if not part_idx then&lt;br /&gt;
			return error_msg (&amp;#039;not_part&amp;#039;, part, hide, nocat);					-- abandon; args[2] is not a valid ISO 639 part&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		result, found = iso_639_code_to_name_common (args, parts[part_idx][1], parts[part_idx][2]);		-- attempt to find a code match&lt;br /&gt;
		if found then&lt;br /&gt;
			return result;														-- found the code so return the language name&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		result = _iso_639_name_to_code (args);									-- might be a language name; return code if it is; error message or empty string else&lt;br /&gt;
		return result;															-- this way to suppress second return&lt;br /&gt;
&lt;br /&gt;
	else		&lt;br /&gt;
		for _, part in ipairs (parts) do										-- for each of the iso 639 parts&lt;br /&gt;
			result, found = iso_639_code_to_name_common (args, part[1], part[2]);	-- attempt to find a code match&lt;br /&gt;
			if found then&lt;br /&gt;
				return result;													-- found the code so return the language name&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end	&lt;br /&gt;
&lt;br /&gt;
	result = _iso_639_name_to_code (args);										-- might be a language name; return code if it is; error message or empty string else&lt;br /&gt;
	return result;																-- this way to suppress second return&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	iso_639 = iso_639,															-- returns code when given name; returns name when given code&lt;br /&gt;
&lt;br /&gt;
	iso_639_code_exists = iso_639_code_exists,&lt;br /&gt;
	iso_639_name_exists = iso_639_name_exists,&lt;br /&gt;
&lt;br /&gt;
	iso_639_code_to_name = iso_639_code_to_name,&lt;br /&gt;
	iso_639_code_1_to_name = iso_639_code_1_to_name,&lt;br /&gt;
	iso_639_code_2_to_name = iso_639_code_2_to_name,&lt;br /&gt;
	iso_639_code_2B_to_name = iso_639_code_2B_to_name,&lt;br /&gt;
	iso_639_code_3_to_name = iso_639_code_3_to_name,&lt;br /&gt;
	iso_639_code_5_to_name = iso_639_code_5_to_name,&lt;br /&gt;
&lt;br /&gt;
	iso_639_name_to_code = iso_639_name_to_code,&lt;br /&gt;
	};&lt;/div&gt;</summary>
		<author><name>&gt;Trappist the monk</name></author>
	</entry>
</feed>