<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Alist_of_languages</id>
	<title>Module:list of languages - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Alist_of_languages"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:list_of_languages&amp;action=history"/>
	<updated>2026-06-01T03:04:23Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:list_of_languages&amp;diff=524526&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;local m_fun = require(&quot;Module:fun&quot;) local m_languages = require(&quot;Module:languages&quot;) local m_families_data = require(&quot;Module:families/data&quot;) local m_table = require(&quot;Module:table&quot;)  local concat = table.concat local insert = table.insert local ipairs = ipairs local pairs = pairs local remove = table.remove local size = m_table.size local sort = table.sort local sorted_pairs = m_table.sortedPairs  local export = {} local filters = {} local split = require(&quot;Module:string ut...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:list_of_languages&amp;diff=524526&amp;oldid=prev"/>
		<updated>2026-05-13T23:07:07Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local m_fun = require(&amp;quot;Module:fun&amp;quot;) local m_languages = require(&amp;quot;Module:languages&amp;quot;) local m_families_data = require(&amp;quot;Module:families/data&amp;quot;) local m_table = require(&amp;quot;Module:table&amp;quot;)  local concat = table.concat local insert = table.insert local ipairs = ipairs local pairs = pairs local remove = table.remove local size = m_table.size local sort = table.sort local sorted_pairs = m_table.sortedPairs  local export = {} local filters = {} local split = require(&amp;quot;Module:string ut...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local m_fun = require(&amp;quot;Module:fun&amp;quot;)&lt;br /&gt;
local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_families_data = require(&amp;quot;Module:families/data&amp;quot;)&lt;br /&gt;
local m_table = require(&amp;quot;Module:table&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local ipairs = ipairs&lt;br /&gt;
local pairs = pairs&lt;br /&gt;
local remove = table.remove&lt;br /&gt;
local size = m_table.size&lt;br /&gt;
local sort = table.sort&lt;br /&gt;
local sorted_pairs = m_table.sortedPairs&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
local filters = {}&lt;br /&gt;
local split = require(&amp;quot;Module:string utilities&amp;quot;).split&lt;br /&gt;
&lt;br /&gt;
function export.count()&lt;br /&gt;
	return size(require(&amp;quot;Module:languages/data/all&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function mergeExtra(langdata, extradata)&lt;br /&gt;
	for lkey, lvalue in pairs(extradata) do&lt;br /&gt;
		if langdata[lkey] then&lt;br /&gt;
			for key in pairs(lvalue) do&lt;br /&gt;
				langdata[lkey][key] = lvalue[key]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.show(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local filter_name = args[1]&lt;br /&gt;
	local filter = filters[filter_name]&lt;br /&gt;
	local arg2 = args[2]&lt;br /&gt;
	local ids = require(&amp;quot;Module:yesno&amp;quot;)(args[&amp;quot;ids&amp;quot;])&lt;br /&gt;
	&lt;br /&gt;
	local m_languages_data&lt;br /&gt;
	local use_filter = false&lt;br /&gt;
	&lt;br /&gt;
	-- Choose a data module.&lt;br /&gt;
	if filter_name == &amp;quot;two-letter code&amp;quot; then&lt;br /&gt;
		m_languages_data = require(&amp;quot;Module:languages/data/2&amp;quot;)&lt;br /&gt;
		mergeExtra(m_languages_data, require(&amp;quot;Module:languages/data/2/extra&amp;quot;))&lt;br /&gt;
		if arg2 then&lt;br /&gt;
			use_filter = true&lt;br /&gt;
		end&lt;br /&gt;
	elseif filter_name == &amp;quot;three-letter code&amp;quot; then&lt;br /&gt;
		if arg2 and arg2:find(&amp;quot;^[a-z]$&amp;quot;) then&lt;br /&gt;
			m_languages_data = require(&amp;quot;Module:languages/data/3/&amp;quot; .. arg2)&lt;br /&gt;
			mergeExtra(m_languages_data, require(&amp;quot;Module:languages/data/3/&amp;quot; .. arg2 .. &amp;quot;/extra&amp;quot;))&lt;br /&gt;
		else&lt;br /&gt;
			m_languages_data = require(&amp;quot;Module:languages/data/all&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	elseif filter_name == &amp;quot;exceptional&amp;quot; then&lt;br /&gt;
		m_languages_data = require(&amp;quot;Module:languages/data/exceptional&amp;quot;)&lt;br /&gt;
		mergeExtra(m_languages_data, require(&amp;quot;Module:languages/data/exceptional/extra&amp;quot;))&lt;br /&gt;
	else&lt;br /&gt;
		m_languages_data = require(&amp;quot;Module:languages/data/all&amp;quot;)&lt;br /&gt;
		-- data/all already merges extradata&lt;br /&gt;
		use_filter = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Select language codes to display.&lt;br /&gt;
	local data_tables = {}&lt;br /&gt;
	if use_filter then&lt;br /&gt;
		filter = filter(arg2)&lt;br /&gt;
		data_tables = m_fun.filter(filter, m_languages_data)&lt;br /&gt;
	else&lt;br /&gt;
		data_tables = m_languages_data&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Now go over each code, and create table rows for those that are selected&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	local row_i = 1&lt;br /&gt;
	&lt;br /&gt;
	local function link_script(script)&lt;br /&gt;
		return &amp;quot;[[Wiktionary:List of scripts#&amp;quot; .. script .. &amp;quot;|&amp;lt;code&amp;gt;&amp;quot; .. script .. &amp;quot;&amp;lt;/code&amp;gt;]]&amp;quot;&lt;br /&gt;
	end	&lt;br /&gt;
	&lt;br /&gt;
	for code, data in sorted_pairs(data_tables) do&lt;br /&gt;
		local lang = m_languages.makeObject(code, data)&lt;br /&gt;
		local canonicalName = lang:getCanonicalName()&lt;br /&gt;
		local family = lang:getFamilyCode()&lt;br /&gt;
		local scripts = lang:getScriptCodes()&lt;br /&gt;
		local row = {&lt;br /&gt;
			&amp;quot;\n|-&amp;quot;, (ids and &amp;quot; id=\&amp;quot;&amp;quot; .. code .. &amp;quot;\&amp;quot; |&amp;quot; or &amp;quot;&amp;quot;),&lt;br /&gt;
			&amp;quot;\n|&amp;quot;, &amp;#039;&amp;lt;code class=&amp;quot;language-code&amp;quot;&amp;gt;&amp;#039;, code, &amp;quot;&amp;lt;/code&amp;gt;&amp;quot;,&lt;br /&gt;
			&amp;quot;\n|&amp;quot;, (ids and &amp;quot; id=\&amp;quot;&amp;quot; .. canonicalName .. &amp;quot;\&amp;quot; |&amp;quot; or &amp;quot;&amp;quot;),&lt;br /&gt;
			&amp;quot; [[:Category:&amp;quot;, canonicalName, (canonicalName:find(&amp;quot;[Ll]anguage$&amp;quot;) and &amp;quot;&amp;quot; or &amp;quot; language&amp;quot;), &amp;quot;|&amp;quot;, canonicalName, &amp;quot;]]&amp;quot;,&lt;br /&gt;
			&amp;quot;\n|&amp;quot;, (family and family ~= &amp;quot;qfa-und&amp;quot; and (&amp;quot;[[Wiktionary:List of families#%s|%s]]&amp;quot;):format(family, m_families_data[family] and m_families_data[family][1] or (&amp;quot;&amp;lt;code&amp;gt;&amp;quot; .. family .. &amp;quot;&amp;lt;/code&amp;gt;&amp;quot;)) or &amp;quot;&amp;quot;),&lt;br /&gt;
			&amp;quot;\n|&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if type(scripts) == &amp;quot;string&amp;quot; then&lt;br /&gt;
			scripts = split(scripts, &amp;quot;,&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if scripts and scripts[1] ~= &amp;quot;None&amp;quot; then&lt;br /&gt;
			insert(row, concat(m_fun.map(link_script, scripts), &amp;quot;, &amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		insert(row, &amp;quot;\n|&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local names = lang:getAllNames()&lt;br /&gt;
		remove(names, 1) -- Remove the canonical name.&lt;br /&gt;
		insert(row, concat(names, &amp;quot;, &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
		insert(row,&lt;br /&gt;
			&amp;quot;\n| &amp;quot; .. (data.sort_key and &amp;quot;Yes&amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
			&amp;quot;\n| &amp;quot; .. (data.entry_name and &amp;quot;Yes&amp;quot; or &amp;quot;&amp;quot;)&lt;br /&gt;
		)&lt;br /&gt;
		&lt;br /&gt;
		rows[row_i] = concat(row)&lt;br /&gt;
		row_i = row_i + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return concat {&lt;br /&gt;
[[&lt;br /&gt;
{| class=&amp;quot;wikitable sortable mw-datatable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Canonical name&lt;br /&gt;
! Family&lt;br /&gt;
! style=&amp;quot;width: 12em&amp;quot; | Scripts&lt;br /&gt;
! Other names&lt;br /&gt;
! Sort?&lt;br /&gt;
! Diacr?]], concat(rows), &amp;quot;\n|}&amp;quot;&lt;br /&gt;
	} .. require(&amp;quot;Module:TemplateStyles&amp;quot;)(&amp;quot;Module:list of languages/styles.css&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Filter functions&lt;br /&gt;
-- They receive parameter 2 as argument and generate a new function.&lt;br /&gt;
-- This function returns true or false depending on whether a given code&lt;br /&gt;
-- should be included in the table or not.&lt;br /&gt;
-- They&amp;#039;re used to build shorter sublists.&lt;br /&gt;
-- The arguments are in the order &amp;quot;data, code&amp;quot; because the filter function in&lt;br /&gt;
-- [[Module:fun]] supplies arguments to it in the order value, key.&lt;br /&gt;
&lt;br /&gt;
filters[&amp;quot;two-letter code&amp;quot;] = function (firstletter)&lt;br /&gt;
	local pattern = &amp;quot;^&amp;quot; .. (firstletter or &amp;quot;[a-z]&amp;quot;) .. &amp;quot;[a-z]$&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return function (data, code)&lt;br /&gt;
		return code:find(pattern) ~= nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
filters[&amp;quot;type&amp;quot;] = function (type)&lt;br /&gt;
	return function (data, code)&lt;br /&gt;
		return data.type == type&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
filters[&amp;quot;subst&amp;quot;] = function (arg2)&lt;br /&gt;
	return function (data, code)&lt;br /&gt;
		return data.sort_key or data.entry_name&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
filters[&amp;quot;special&amp;quot;] = function (arg2)&lt;br /&gt;
	return function (data, code)&lt;br /&gt;
		return data[3] == &amp;quot;qfa-not&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
function export.show_etym()&lt;br /&gt;
	local m_languages_data = require(&amp;quot;Module:languages/data/all&amp;quot;)&lt;br /&gt;
	local m_etym_data = require(&amp;#039;Module:etymology_languages/data&amp;#039;)&lt;br /&gt;
	local alias_codes = require(&amp;quot;Module:languages/data&amp;quot;).aliases&lt;br /&gt;
	local data_to_codes = {}&lt;br /&gt;
	local items = {}&lt;br /&gt;
&lt;br /&gt;
	for code, data in sorted_pairs(m_etym_data) do&lt;br /&gt;
		local codes_list = data_to_codes[data]&lt;br /&gt;
		if not codes_list then&lt;br /&gt;
			codes_list = {}&lt;br /&gt;
			data_to_codes[data] = codes_list&lt;br /&gt;
			insert(items, data)&lt;br /&gt;
		end&lt;br /&gt;
		insert(codes_list, code)&lt;br /&gt;
		for alias_code, main_code in pairs(alias_codes) do&lt;br /&gt;
			if main_code == code then&lt;br /&gt;
				insert(codes_list, alias_code)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function make_parent_link(code)&lt;br /&gt;
		if m_languages_data[code] then&lt;br /&gt;
			return (&amp;#039;%s&amp;#039;):format(code, m_languages_data[code][1])&lt;br /&gt;
		elseif m_families_data[code] then&lt;br /&gt;
			return (&amp;#039;%s family&amp;#039;):format(code, m_families_data[code][1])&lt;br /&gt;
		elseif m_etym_data[code] then&lt;br /&gt;
			return (&amp;#039;%s&amp;#039;):format(code, m_etym_data[code][1])&lt;br /&gt;
		elseif code then&lt;br /&gt;
			return &amp;#039;&amp;lt;code&amp;gt;&amp;#039; .. code .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;[missing]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	for _, data in ipairs(items) do&lt;br /&gt;
		local codes = data_to_codes[data]&lt;br /&gt;
		local lang = m_languages.makeObject(codes[1], data)&lt;br /&gt;
		sort(codes)&lt;br /&gt;
		&lt;br /&gt;
		for i, code in ipairs(codes) do&lt;br /&gt;
			codes[i] = &amp;#039;&amp;lt;code class=&amp;quot;language-code&amp;quot; id=&amp;quot;&amp;#039; .. code .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. code .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- finalizeData in [[Module:languages]] moves&lt;br /&gt;
		-- parent from field 3 to field 5: [[Special:Permalink/78289916#L-1659]]&lt;br /&gt;
		&lt;br /&gt;
		local names = lang:getAllNames()&lt;br /&gt;
		remove(names, 1) -- Remove the canonical name.&lt;br /&gt;
		&lt;br /&gt;
		insert(rows,&lt;br /&gt;
			&amp;#039; \n&amp;#039; ..&lt;br /&gt;
			&amp;#039;| &amp;#039; .. concat(codes, &amp;quot;, &amp;quot;) .. &amp;#039;\n&amp;#039; ..&lt;br /&gt;
			&amp;#039;| [[:Category:Terms derived from &amp;#039; .. lang:getDisplayForm() .. &amp;#039; by language|&amp;#039; .. lang:getCanonicalName() .. &amp;#039;]]\n&amp;#039; ..&lt;br /&gt;
			&amp;#039;| &amp;#039; .. concat(names, &amp;quot;, &amp;quot;) .. &amp;#039;\n&amp;#039; ..&lt;br /&gt;
			&amp;#039;| &amp;#039; .. make_parent_link(lang:getParentCode())&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return&lt;br /&gt;
		&amp;quot;{| class=\&amp;quot;wikitable sortable mw-datatable\&amp;quot;\n&amp;quot; ..&lt;br /&gt;
		&amp;quot;! Codes\n&amp;quot; ..&lt;br /&gt;
		&amp;quot;! Canonical name\n&amp;quot; ..&lt;br /&gt;
		&amp;quot;! Other names\n&amp;quot; ..&lt;br /&gt;
		&amp;quot;! Parent\n&amp;quot; ..&lt;br /&gt;
		&amp;quot;|-&amp;quot; .. concat(rows, &amp;quot;\n|-&amp;quot;) .. &amp;quot;\n|}&amp;quot; ..&lt;br /&gt;
		require(&amp;quot;Module:TemplateStyles&amp;quot;)(&amp;quot;Module:list of languages/styles.css&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>