<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://test.st34an.tech/index.php?action=history&amp;feed=atom&amp;title=Module%3ACategory_tree%2Fposcatboiler%2Fdata%2Flanguages</id>
	<title>Module:Category tree/poscatboiler/data/languages - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://test.st34an.tech/index.php?action=history&amp;feed=atom&amp;title=Module%3ACategory_tree%2Fposcatboiler%2Fdata%2Flanguages"/>
	<link rel="alternate" type="text/html" href="https://test.st34an.tech/index.php?title=Module:Category_tree/poscatboiler/data/languages&amp;action=history"/>
	<updated>2026-04-10T19:00:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://test.st34an.tech/index.php?title=Module:Category_tree/poscatboiler/data/languages&amp;diff=79&amp;oldid=prev</id>
		<title>Jsrs701: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://test.st34an.tech/index.php?title=Module:Category_tree/poscatboiler/data/languages&amp;diff=79&amp;oldid=prev"/>
		<updated>2026-04-10T07:25:52Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:25, 10 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key mediawikidb:diff:1.41:old-78:rev-79 --&gt;
&lt;/table&gt;</summary>
		<author><name>Jsrs701</name></author>
	</entry>
	<entry>
		<id>https://test.st34an.tech/index.php?title=Module:Category_tree/poscatboiler/data/languages&amp;diff=78&amp;oldid=prev</id>
		<title>bob&gt;Juelos: Text replacement - &quot;(\[\[)([^#][^:\]\[]*?\|[^:\]\[]*?\]\])&quot; to &quot;\1Wiktionary:\2&quot;</title>
		<link rel="alternate" type="text/html" href="https://test.st34an.tech/index.php?title=Module:Category_tree/poscatboiler/data/languages&amp;diff=78&amp;oldid=prev"/>
		<updated>2024-08-31T19:37:46Z</updated>

		<summary type="html">&lt;p&gt;Text replacement - &amp;quot;(\[\[)([^#][^:\]\[]*?\|[^:\]\[]*?\]\])&amp;quot; to &amp;quot;\1Wiktionary:\2&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local raw_categories = {}&lt;br /&gt;
local raw_handlers = {}&lt;br /&gt;
&lt;br /&gt;
local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_sc_getByCode = require(&amp;quot;Module:scripts&amp;quot;).getByCode&lt;br /&gt;
local m_table = require(&amp;quot;Module:table&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local Hang = m_sc_getByCode(&amp;quot;Hang&amp;quot;)&lt;br /&gt;
local Hani = m_sc_getByCode(&amp;quot;Hani&amp;quot;)&lt;br /&gt;
local Hira = m_sc_getByCode(&amp;quot;Hira&amp;quot;)&lt;br /&gt;
local Hrkt = m_sc_getByCode(&amp;quot;Hrkt&amp;quot;)&lt;br /&gt;
local Kana = m_sc_getByCode(&amp;quot;Kana&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- This handles language categories of the form e.g. [[Category:French language]] and&lt;br /&gt;
-- [[:Category:British Sign Language]] and regional variant categories of the form&lt;br /&gt;
-- e.g. [[Category:Regional French]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--                                                                         --&lt;br /&gt;
--                              RAW CATEGORIES                             --&lt;br /&gt;
--                                                                         --&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Regionalisms&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Categories that group terms in regional varieties of various languages.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;{{{umbrella_msg}}}&amp;quot;,&lt;br /&gt;
	parents = {&lt;br /&gt;
		&amp;quot;Fundamental&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;All languages&amp;quot;] = {&lt;br /&gt;
	intro = &amp;quot;{{sisterlinks|Category:Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]&amp;quot;,&lt;br /&gt;
	description = &amp;quot;This category contains the categories for every language on Wiktionary.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;Not all languages that Wiktionary recognises may have a category here yet. There are many that have &amp;quot; ..&lt;br /&gt;
	&amp;quot;not yet received any attention from editors, mainly because not all Wiktionary users know about every single &amp;quot; ..&lt;br /&gt;
	&amp;quot;language. See [[Wiktionary:List of languages]] for a full list.&amp;quot;,&lt;br /&gt;
	parents = {&lt;br /&gt;
		&amp;quot;Fundamental&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;All extinct languages&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;This category contains the categories for every {{wt|extinct language}} on Wiktionary.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;Do not confuse this category with [[:Category:Extinct languages]] which is for the names of extinct languages.&amp;quot;,&lt;br /&gt;
	parents = {&lt;br /&gt;
		&amp;quot;All languages&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--                                                                         --&lt;br /&gt;
--                                RAW HANDLERS                             --&lt;br /&gt;
--                                                                         --&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function makeCategoryLink(object)&lt;br /&gt;
	return &amp;quot;[[:Category:&amp;quot; .. object:getCategoryName() .. &amp;quot;|&amp;quot; .. object:getCanonicalName() .. &amp;quot;]]&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ucfirst(text)&lt;br /&gt;
	return mw.getContentLanguage():ucfirst(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function linkbox(lang, setwiki, setwikt, setsister, entryname)&lt;br /&gt;
	local wiktionarylinks = &amp;quot;&amp;#039;&amp;#039;None.&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local canonicalName = lang:getCanonicalName()&lt;br /&gt;
	local wikimediaLanguages = lang:getWikimediaLanguages()&lt;br /&gt;
	local nameWithLanguage = lang:getCategoryName(&amp;quot;nocap&amp;quot;)&lt;br /&gt;
	local categoryName = lang:getCategoryName()&lt;br /&gt;
	local wikipediaArticle = setwiki or lang:getWikipediaArticle()&lt;br /&gt;
	setsister = setsister and ucfirst(setsister) or nil&lt;br /&gt;
	&lt;br /&gt;
	if setwikt then&lt;br /&gt;
		require &amp;quot;Module:debug&amp;quot;.track &amp;quot;langcatboiler/setwikt&amp;quot;&lt;br /&gt;
		if setwikt == &amp;quot;-&amp;quot; then&lt;br /&gt;
			require &amp;quot;Module:debug&amp;quot;.track &amp;quot;langcatboiler/setwikt/hyphen&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if setwikt ~= &amp;quot;-&amp;quot; and wikimediaLanguages and wikimediaLanguages[1] then&lt;br /&gt;
		wiktionarylinks = {}&lt;br /&gt;
		&lt;br /&gt;
		for _, wikimedialang in ipairs(wikimediaLanguages) do&lt;br /&gt;
			table.insert(wiktionarylinks,&lt;br /&gt;
				(wikimedialang:getCanonicalName() ~= canonicalName and &amp;quot;(&amp;#039;&amp;#039;&amp;quot; .. wikimedialang:getCanonicalName() .. &amp;quot;&amp;#039;&amp;#039;) &amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
				&amp;quot;&amp;#039;&amp;#039;&amp;#039;[[:&amp;quot; .. wikimedialang:getCode() .. &amp;quot;:|&amp;quot; .. wikimedialang:getCode() .. &amp;quot;.wiktionary.org]]&amp;#039;&amp;#039;&amp;#039;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		wiktionarylinks = table.concat(wiktionarylinks, &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local plural = wikimediaLanguages[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return table.concat{&lt;br /&gt;
[=[&amp;lt;div style=&amp;quot;clear: right; border: solid #aaa 1px; margin: 1 1 1 1; background: #f9f9f9; width: 270px; padding: 5px; margin: 5px; text-align: left; float: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; margin-bottom: 10px; margin-top: 5px&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;]=], nameWithLanguage, [=[&amp;#039;&amp;#039;&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;font-size: 90%; background: #f9f9f9;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; height: 35px&amp;quot; | [[File:Wikipedia-logo.png|35px|none|Wikipedia]]&lt;br /&gt;
|| &amp;#039;&amp;#039;Article about ]=], nameWithLanguage, [=[&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;padding-left: 10px; border-bottom: 1px solid lightgray;&amp;quot; | ]=], (setwiki == &amp;quot;-&amp;quot; and &amp;quot;&amp;#039;&amp;#039;None.&amp;#039;&amp;#039;&amp;quot; or &amp;quot;&amp;#039;&amp;#039;&amp;#039;[[&amp;quot; .. wikipediaArticle .. &amp;quot;]]&amp;#039;&amp;#039;&amp;#039;&amp;quot;), [=[&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; height: 35px&amp;quot; | [[File:Open book nae 02.svg|35px|none|Entry]]&lt;br /&gt;
|| ]=], nameWithLanguage, [=[ entry&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;padding-left: 10px;&amp;quot; | &amp;#039;&amp;#039;&amp;#039;]=], require(&amp;quot;Module:links&amp;quot;).full_link({lang = m_languages.getByCode(&amp;quot;en&amp;quot;), term = entryname or canonicalName}), [=[&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;]=]&lt;br /&gt;
}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function edit_link(title, text)&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[&amp;#039;&lt;br /&gt;
		.. tostring(mw.uri.fullUrl(title, { action = &amp;quot;edit&amp;quot; }))&lt;br /&gt;
		.. &amp;#039; &amp;#039; .. text .. &amp;#039;]&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Should perhaps use wiki syntax.&lt;br /&gt;
local function infobox(lang)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	&lt;br /&gt;
	table.insert(ret, &amp;#039;&amp;lt;table class=&amp;quot;wikitable language-category-info&amp;quot;&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if type(lang.getRawData) == &amp;quot;function&amp;quot; then&lt;br /&gt;
		local raw_data = lang:getRawData()&lt;br /&gt;
		if raw_data then&lt;br /&gt;
			local replacements = {&lt;br /&gt;
				[1] = &amp;quot;canonical-name&amp;quot;,&lt;br /&gt;
				[2] = &amp;quot;wikidata-item&amp;quot;,&lt;br /&gt;
				[3] = &amp;quot;family&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
			local function replacer(letter1, letter2)&lt;br /&gt;
				return letter1:lower() .. &amp;quot;-&amp;quot; .. letter2:lower()&lt;br /&gt;
			end&lt;br /&gt;
			-- For each key in the language data modules, returns a descriptive&lt;br /&gt;
			-- kebab-case version (containing ASCII lowercase words separated&lt;br /&gt;
			-- by hyphens).&lt;br /&gt;
			local function kebab_case(key)&lt;br /&gt;
				key = replacements[key] or key&lt;br /&gt;
				key = key:gsub(&amp;quot;(%l)(%u)&amp;quot;, replacer):gsub(&amp;quot;(%l)_(%l)&amp;quot;, replacer)&lt;br /&gt;
				return key&lt;br /&gt;
			end&lt;br /&gt;
			local function html_attribute_encode(str)&lt;br /&gt;
				str = mw.text.jsonEncode(str)&lt;br /&gt;
					:gsub(&amp;#039;&amp;quot;&amp;#039;, &amp;quot;&amp;amp;quot;&amp;quot;)&lt;br /&gt;
					-- &amp;amp; in attributes is automatically escaped.&lt;br /&gt;
					-- :gsub(&amp;quot;&amp;amp;&amp;quot;, &amp;quot;&amp;amp;amp;&amp;quot;)&lt;br /&gt;
					:gsub(&amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;amp;lt;&amp;quot;)&lt;br /&gt;
					:gsub(&amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;amp;gt;&amp;quot;)&lt;br /&gt;
				return str&lt;br /&gt;
			end&lt;br /&gt;
			pcall(function ()&lt;br /&gt;
				table.insert(ret, &amp;#039; data-code=&amp;quot;&amp;#039; .. lang:getCode() .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
				for k, v in m_table.sortedPairs(lang:getRawData()) do&lt;br /&gt;
					table.insert(ret, &amp;quot; data-&amp;quot; .. kebab_case(k)&lt;br /&gt;
						.. &amp;#039;=&amp;quot;&amp;#039;&lt;br /&gt;
						.. html_attribute_encode(v)&lt;br /&gt;
						.. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(ret, &amp;#039;&amp;gt;\n&amp;#039;)&lt;br /&gt;
	table.insert(ret, &amp;#039;&amp;lt;tr class=&amp;quot;language-category-data&amp;quot;&amp;gt;\n&amp;lt;th colspan=&amp;quot;2&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		.. edit_link(&amp;quot;Module:&amp;quot; .. m_languages.getDataModuleName(lang:getCode()),&lt;br /&gt;
			&amp;quot;Edit language data&amp;quot;)&lt;br /&gt;
		.. &amp;quot;&amp;lt;/th&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	table.insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;Canonical name&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;quot; .. lang:getCanonicalName() .. &amp;quot;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local otherNames = lang:getOtherNames(true)&lt;br /&gt;
	if otherNames then&lt;br /&gt;
		local names = {}&lt;br /&gt;
		&lt;br /&gt;
		for _, name in ipairs(otherNames) do&lt;br /&gt;
			table.insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. name .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if #names &amp;gt; 0 then&lt;br /&gt;
			table.insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;Other names&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;lt;ul&amp;gt;&amp;quot; .. table.concat(names, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local aliases = lang:getAliases()&lt;br /&gt;
	if aliases then&lt;br /&gt;
		local names = {}&lt;br /&gt;
		&lt;br /&gt;
		for _, name in ipairs(aliases) do&lt;br /&gt;
			table.insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. name .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if #names &amp;gt; 0 then&lt;br /&gt;
			table.insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;Aliases&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;lt;ul&amp;gt;&amp;quot; .. table.concat(names, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local varieties = lang:getVarieties()&lt;br /&gt;
	if varieties then&lt;br /&gt;
		local names = {}&lt;br /&gt;
		&lt;br /&gt;
		for _, name in ipairs(varieties) do&lt;br /&gt;
			if type(name) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				table.insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. name .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				assert(type(name) == &amp;quot;table&amp;quot;)&lt;br /&gt;
				local first_var&lt;br /&gt;
				local subvars = {}&lt;br /&gt;
				for i, var in ipairs(name) do&lt;br /&gt;
					if i == 1 then&lt;br /&gt;
						first_var = var&lt;br /&gt;
					else&lt;br /&gt;
						table.insert(subvars, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. var .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if #subvars &amp;gt; 0 then&lt;br /&gt;
					table.insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;&amp;quot; .. first_var .. &amp;quot;&amp;lt;/dt&amp;gt;\n&amp;lt;dd&amp;gt;&amp;lt;ul&amp;gt;&amp;quot; .. table.concat(subvars, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
				elseif first_var then&lt;br /&gt;
					table.insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. first_var .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if #names &amp;gt; 0 then&lt;br /&gt;
			table.insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;Varieties&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;lt;ul&amp;gt;&amp;quot; .. table.concat(names, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[Wiktionary:Languages|Language code]]&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot; .. lang:getCode() .. &amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	table.insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[Wiktionary:Families|Language family]]&amp;lt;/th&amp;gt;\n&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local fam = lang:getFamily()&lt;br /&gt;
	local famCode = fam and fam:getCode()&lt;br /&gt;
	&lt;br /&gt;
	if not fam then&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;unclassified&amp;lt;/td&amp;gt;&amp;quot;)&lt;br /&gt;
	elseif famCode == &amp;quot;qfa-iso&amp;quot; then&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;[[:Category:Language isolates|language isolate]]&amp;lt;/td&amp;gt;&amp;quot;)&lt;br /&gt;
	elseif famCode == &amp;quot;qfa-mix&amp;quot; then&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;[[:Category:Mixed languages|mixed language]]&amp;lt;/td&amp;gt;&amp;quot;)&lt;br /&gt;
	elseif famCode == &amp;quot;sgn&amp;quot; then&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;[[:Category:Sign languages|sign language]]&amp;lt;/td&amp;gt;&amp;quot;)&lt;br /&gt;
	elseif famCode == &amp;quot;crp&amp;quot; then&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;[[:Category:Creole or pidgin languages|creole or pidgin]]&amp;lt;/td&amp;gt;&amp;quot;)&lt;br /&gt;
	elseif famCode == &amp;quot;art&amp;quot; then&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;[[:Category:Constructed languages|constructed language]]&amp;lt;/td&amp;gt;&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;&amp;quot; .. makeCategoryLink(fam) .. &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(ret, &amp;quot;\n&amp;lt;/tr&amp;gt;\n&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;Ancestors&amp;lt;/th&amp;gt;\n&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local ancestors, ancestorChain = lang:getAncestors(), lang:getAncestorChain()&lt;br /&gt;
	if ancestors[2] then&lt;br /&gt;
		local ancestorList = {}&lt;br /&gt;
		&lt;br /&gt;
		for i, anc in ipairs(ancestors) do&lt;br /&gt;
			ancestorList[i] = &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. makeCategoryLink(anc) .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;&amp;lt;ul&amp;gt;\n&amp;quot; .. table.concat(ancestorList, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;\n&amp;quot;)&lt;br /&gt;
	elseif ancestorChain[1] then&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;&amp;lt;ul&amp;gt;\n&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local chain = {}&lt;br /&gt;
		&lt;br /&gt;
		for i, anc in ipairs(ancestorChain) do&lt;br /&gt;
			chain[i] = &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. makeCategoryLink(anc) .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(ret, table.concat(chain, &amp;quot;\n&amp;lt;ul&amp;gt;\n&amp;quot;))&lt;br /&gt;
		&lt;br /&gt;
		for _, _ in ipairs(chain) do&lt;br /&gt;
			table.insert(ret, &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;/td&amp;gt;\n&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(ret, &amp;quot;&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local scripts = lang:getScripts()&lt;br /&gt;
	&lt;br /&gt;
	if scripts[1] then&lt;br /&gt;
		local script_text = {}&lt;br /&gt;
		&lt;br /&gt;
		local function makeScriptLine(sc)&lt;br /&gt;
			local code = sc:getCode()&lt;br /&gt;
			local url = tostring(mw.uri.fullUrl(&amp;#039;Special:Search&amp;#039;, {&lt;br /&gt;
				search = &amp;#039;contentmodel:css insource:&amp;quot;&amp;#039; .. code&lt;br /&gt;
					.. &amp;#039;&amp;quot; insource:/\\.&amp;#039; .. code .. &amp;#039;/&amp;#039;,&lt;br /&gt;
				ns8 = &amp;#039;1&amp;#039;&lt;br /&gt;
			}))&lt;br /&gt;
			return makeCategoryLink(sc)&lt;br /&gt;
				.. &amp;#039; (&amp;lt;span class=&amp;quot;plainlinks&amp;quot; title=&amp;quot;Search for stylesheets referencing this script&amp;quot;&amp;gt;[&amp;#039; .. url .. &amp;#039; &amp;lt;code&amp;gt;&amp;#039; .. code .. &amp;#039;&amp;lt;/code&amp;gt;]&amp;lt;/span&amp;gt;)&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local function add_Hrkt(text)&lt;br /&gt;
			table.insert(text, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. makeScriptLine(Hrkt))&lt;br /&gt;
			table.insert(text, &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;)&lt;br /&gt;
			table.insert(text, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. makeScriptLine(Hira) .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
			table.insert(text, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. makeScriptLine(Kana) .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
			table.insert(text, &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;)&lt;br /&gt;
			table.insert(text, &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		for _, sc in ipairs(scripts) do&lt;br /&gt;
			local text = {}&lt;br /&gt;
			local code = sc:getCode()&lt;br /&gt;
			&lt;br /&gt;
			if code == &amp;quot;Hrkt&amp;quot; then&lt;br /&gt;
				add_Hrkt(text)&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(text, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. makeScriptLine(sc))&lt;br /&gt;
				if code == &amp;quot;Jpan&amp;quot; then&lt;br /&gt;
					table.insert(text, &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;)&lt;br /&gt;
					table.insert(text, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. makeScriptLine(Hani) .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
					add_Hrkt(text)&lt;br /&gt;
					table.insert(text, &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;)&lt;br /&gt;
				elseif code == &amp;quot;Kore&amp;quot; then&lt;br /&gt;
					table.insert(text, &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;)&lt;br /&gt;
					table.insert(text, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. makeScriptLine(Hang) .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
					table.insert(text, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. makeScriptLine(Hani) .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
					table.insert(text, &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(text, &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			table.insert(script_text, table.concat(text, &amp;quot;\n&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[Wiktionary:Scripts|Scripts]]&amp;lt;/th&amp;gt;\n&amp;lt;td&amp;gt;&amp;lt;ul&amp;gt;\n&amp;quot; .. table.concat(script_text, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[Wiktionary:Scripts|Scripts]]&amp;lt;/th&amp;gt;\n&amp;lt;td&amp;gt;not specified&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function add_module_info(raw_data, heading)&lt;br /&gt;
		if raw_data then&lt;br /&gt;
			local scripts = lang:getScriptCodes()&lt;br /&gt;
			local module_info, n, add = {}, 0, false&lt;br /&gt;
			if type(raw_data) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				table.insert(module_info,&lt;br /&gt;
					(&amp;quot;[[Module:%s]]&amp;quot;):format(raw_data))&lt;br /&gt;
				add = true&lt;br /&gt;
			elseif type(raw_data) == &amp;quot;table&amp;quot; and m_table.size(scripts) == 1 and type(raw_data[scripts[1]]) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				table.insert(module_info,&lt;br /&gt;
					(&amp;quot;[[Module:%s]]&amp;quot;):format(raw_data[scripts[1]]))&lt;br /&gt;
				add = true&lt;br /&gt;
			elseif type(raw_data) == &amp;quot;table&amp;quot; then&lt;br /&gt;
				table.insert(module_info, &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;)&lt;br /&gt;
				for script, data in m_table.sortedPairs(raw_data) do&lt;br /&gt;
					local script_info&lt;br /&gt;
					if m_sc_getByCode(script) then&lt;br /&gt;
						if type(data) == &amp;quot;string&amp;quot; then&lt;br /&gt;
							script_info = (&amp;quot;[[Module:%s]]&amp;lt;/li&amp;gt;&amp;quot;):format(data)&lt;br /&gt;
						else&lt;br /&gt;
							n = n + 1&lt;br /&gt;
							script_info = &amp;quot;(none)\n&amp;quot;&lt;br /&gt;
						end&lt;br /&gt;
						table.insert(module_info, (&amp;quot;&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;: %s&amp;quot;):format(script, script_info))&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(module_info, &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;)&lt;br /&gt;
				if m_table.size(module_info) &amp;gt; 2 and n &amp;lt; (m_table.size(module_info) - 2) then add = true end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if add then&lt;br /&gt;
				table.insert(ret, [=[&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;]=] .. heading .. [=[&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;]=] .. table.concat(module_info) .. [=[&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
]=])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	add_module_info(lang._rawData.generate_forms, &amp;quot;Form-generating&amp;lt;br&amp;gt;module&amp;quot;)&lt;br /&gt;
	add_module_info(lang._rawData.translit, &amp;quot;[[Wiktionary:Transliteration and romanization|Transliteration&amp;lt;br&amp;gt;module]]&amp;quot;)&lt;br /&gt;
	add_module_info(lang._rawData.display_text, &amp;quot;Display text&amp;lt;br&amp;gt;module&amp;quot;)&lt;br /&gt;
	add_module_info(lang._rawData.entry_name, &amp;quot;Entry name&amp;lt;br&amp;gt;module&amp;quot;)&lt;br /&gt;
	add_module_info(lang._rawData.sort_key, &amp;quot;[[Wiktionary:sortkey|Sortkey]]&amp;lt;br&amp;gt;module&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local wikidataItem = lang:getWikidataItem()&lt;br /&gt;
	if lang:getWikidataItem() and mw.wikibase then&lt;br /&gt;
		local URL = mw.wikibase.getEntityUrl(wikidataItem)&lt;br /&gt;
		local link&lt;br /&gt;
		if URL then&lt;br /&gt;
			link = &amp;#039;[&amp;#039; .. URL .. &amp;#039; &amp;#039; .. wikidataItem .. &amp;#039;]&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			link = &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Invalid Wikidata item: &amp;lt;code&amp;gt;&amp;#039; .. wikidataItem .. &amp;#039;&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(ret, &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Wikidata&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;quot; .. link .. &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(ret, &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function NavFrame(content, title)&lt;br /&gt;
	return &amp;#039;&amp;lt;div class=&amp;quot;NavFrame&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;NavHead&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		.. (title or &amp;#039;{{{title}}}&amp;#039;) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		.. &amp;#039;&amp;lt;div class=&amp;quot;NavContent&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		.. content&lt;br /&gt;
		.. &amp;#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function get_description_intro_additional(lang, countries, extinct, setwiki, setwikt, setsister, entryname)&lt;br /&gt;
	local nameWithLanguage = lang:getCategoryName(&amp;quot;nocap&amp;quot;)&lt;br /&gt;
	if lang:getCode() == &amp;quot;und&amp;quot; then&lt;br /&gt;
		local description =&lt;br /&gt;
			&amp;quot;This is the main category of the &amp;#039;&amp;#039;&amp;#039;&amp;quot; .. nameWithLanguage .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;, represented in Wiktionary by the [[Wiktionary:Languages|code]] &amp;#039;&amp;#039;&amp;#039;&amp;quot; .. lang:getCode() .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;. &amp;quot; ..&lt;br /&gt;
			&amp;quot;This language contains terms in historical writing, whose meaning has not yet been determined by scholars.&amp;quot;&lt;br /&gt;
		return description, nil, nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local canonicalName = lang:getCanonicalName()&lt;br /&gt;
	&lt;br /&gt;
	local intro = linkbox(lang, setwiki, setwikt, setsister, entryname)&lt;br /&gt;
&lt;br /&gt;
	local the_prefix&lt;br /&gt;
	if canonicalName:find(&amp;quot; Language$&amp;quot;) then&lt;br /&gt;
		the_prefix = &amp;quot;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		the_prefix = &amp;quot;the &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local description = &amp;quot;This is the main category of &amp;quot; .. the_prefix .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. nameWithLanguage .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local country_links = {}&lt;br /&gt;
	for _, country in ipairs(countries) do&lt;br /&gt;
		if country ~= &amp;quot;UNKNOWN&amp;quot; then&lt;br /&gt;
			local country_without_the = country:match(&amp;quot;^the (.*)$&amp;quot;)&lt;br /&gt;
			if country_without_the then&lt;br /&gt;
				table.insert(country_links, &amp;quot;the [[&amp;quot; .. country_without_the .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(country_links, &amp;quot;[[&amp;quot; .. country .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local country_desc&lt;br /&gt;
	if #country_links &amp;gt; 0 then&lt;br /&gt;
		local country_link_text = m_table.serialCommaJoin(country_links)&lt;br /&gt;
		if extinct then&lt;br /&gt;
			country_desc = &amp;quot;It is an {{wt|extinct language}} that was formerly spoken in &amp;quot; .. country_link_text .. &amp;quot;.\n\n&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			country_desc = &amp;quot;It is spoken in &amp;quot; .. country_link_text .. &amp;quot;.\n\n&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	elseif extinct then&lt;br /&gt;
		country_desc = &amp;quot;It is an {{wt|extinct language}}.&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		country_desc = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local add = country_desc .. &amp;quot;Information about &amp;quot; .. canonicalName .. &amp;quot;:\n\n&amp;quot; .. infobox(lang)&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) then&lt;br /&gt;
		add = add .. &amp;quot;\n\n&amp;quot; ..&lt;br /&gt;
			ucfirst(canonicalName) .. &amp;quot; is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the &amp;#039;&amp;#039;comparative method&amp;#039;&amp;#039;, &amp;quot; ..&lt;br /&gt;
			&amp;quot;which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n&amp;quot; ..&lt;br /&gt;
			&amp;quot;According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in &amp;quot; .. canonicalName ..&lt;br /&gt;
			&amp;quot; should &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; be present in entries in the main namespace, but may be added to the Reconstruction: namespace.&amp;quot;&lt;br /&gt;
	elseif lang:hasType(&amp;quot;appendix-constructed&amp;quot;) then&lt;br /&gt;
		add = add .. &amp;quot;\n\n&amp;quot; ..&lt;br /&gt;
			ucfirst(canonicalName) .. &amp;quot; is a constructed language that is only in sporadic use. &amp;quot; ..&lt;br /&gt;
			&amp;quot;According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in &amp;quot; .. canonicalName ..&lt;br /&gt;
			&amp;quot; should &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; be present in entries in the main namespace, but may be added to the Appendix: namespace. &amp;quot; ..&lt;br /&gt;
			&amp;quot;All terms in this language may be available at [[Appendix:&amp;quot; .. ucfirst(canonicalName) .. &amp;quot;]].&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local about = mw.title.new(&amp;quot;Wiktionary:About &amp;quot; .. canonicalName)&lt;br /&gt;
	&lt;br /&gt;
	if about.exists then&lt;br /&gt;
		add = add .. &amp;quot;\n\n&amp;quot; ..&lt;br /&gt;
			&amp;quot;Please see &amp;#039;&amp;#039;&amp;#039;[[Wiktionary:About &amp;quot; .. canonicalName .. &amp;quot;]]&amp;#039;&amp;#039;&amp;#039; for information and special considerations for creating &amp;quot; .. nameWithLanguage .. &amp;quot; entries.&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ok, tree_of_descendants = pcall(&lt;br /&gt;
		require(&amp;quot;Module:family tree&amp;quot;).print_children,&lt;br /&gt;
		lang:getCode(), {&lt;br /&gt;
			protolanguage_under_family = true,&lt;br /&gt;
			must_have_descendants = true&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
	if ok then&lt;br /&gt;
		if tree_of_descendants then&lt;br /&gt;
			add = add .. NavFrame(&lt;br /&gt;
				tree_of_descendants,&lt;br /&gt;
				&amp;quot;Family tree&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			add = add .. &amp;quot;\n\n&amp;quot; .. ucfirst(lang:getCanonicalName())&lt;br /&gt;
				.. &amp;quot; has no descendants or varieties listed in Wiktionary&amp;#039;s language data modules.&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		mw.log(&amp;quot;error while generating tree: &amp;quot; .. tostring(tree_of_descendants))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return description, intro, add&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function get_parents(lang, countries, extinct)&lt;br /&gt;
	local canonicalName = lang:getCanonicalName()&lt;br /&gt;
	&lt;br /&gt;
	local ret = {{name = &amp;quot;All languages&amp;quot;, sort = canonicalName}}&lt;br /&gt;
	&lt;br /&gt;
	local fam = lang:getFamily()&lt;br /&gt;
	local famCode = fam and fam:getCode()&lt;br /&gt;
	&lt;br /&gt;
	-- FIXME: Some of the following categories should be added to this module.&lt;br /&gt;
	if not fam then&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:Unclassified languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
	elseif famCode == &amp;quot;qfa-iso&amp;quot; then&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:Language isolates&amp;quot;, sort = canonicalName})&lt;br /&gt;
	elseif famCode == &amp;quot;qfa-mix&amp;quot; then&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:Mixed languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
	elseif famCode == &amp;quot;sgn&amp;quot; then&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:All sign languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
	elseif famCode == &amp;quot;crp&amp;quot; then&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:Creole or pidgin languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
		for _, anc in ipairs(lang:getAncestors()) do&lt;br /&gt;
			-- Avoid Haitian Creole being categorised in [[:Category:Haitian Creole-based creole or pidgin languages]], as one of its ancestors is an etymology-only variety of it.&lt;br /&gt;
			-- Use that ancestor&amp;#039;s ancestors instead.&lt;br /&gt;
			if anc:getNonEtymologicalCode() == lang:getCode() then&lt;br /&gt;
				for _, anc_extra in ipairs(anc:getAncestors()) do&lt;br /&gt;
					table.insert(ret, {name = &amp;quot;Category:&amp;quot; .. ucfirst(anc_extra:getNonEtymologicalName()) .. &amp;quot;-based creole or pidgin languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(ret, {name = &amp;quot;Category:&amp;quot; .. ucfirst(anc:getNonEtymologicalName()) .. &amp;quot;-based creole or pidgin languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif famCode == &amp;quot;art&amp;quot; then&lt;br /&gt;
		if lang:hasType(&amp;quot;appendix-constructed&amp;quot;) then&lt;br /&gt;
			table.insert(ret, {name = &amp;quot;Category:Appendix-only constructed languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(ret, {name = &amp;quot;Category:Constructed languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
		end&lt;br /&gt;
		for _, anc in ipairs(lang:getAncestors()) do&lt;br /&gt;
			if anc:getNonEtymologicalCode() == lang:getCode() then&lt;br /&gt;
				for _, anc_extra in ipairs(anc:getAncestors()) do&lt;br /&gt;
					table.insert(ret, {name = &amp;quot;Category:&amp;quot; .. ucfirst(anc_extra:getNonEtymologicalName()) .. &amp;quot;-based constructed languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(ret, {name = &amp;quot;Category:&amp;quot; .. ucfirst(anc:getNonEtymologicalName()) .. &amp;quot;-based constructed languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:&amp;quot; .. fam:getCategoryName(), sort = canonicalName})&lt;br /&gt;
		if lang:hasType(&amp;quot;reconstructed&amp;quot;) then&lt;br /&gt;
			table.insert(ret, {name = &amp;quot;Category:Reconstructed languages&amp;quot;, sort = (mw.ustring.gsub(canonicalName, &amp;quot;^Proto%-&amp;quot;, &amp;quot;&amp;quot;))})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function add_sc_cat(sc)&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:&amp;quot; .. sc:getCategoryName() .. &amp;quot; languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function add_Hrkt()&lt;br /&gt;
		add_sc_cat(Hrkt)&lt;br /&gt;
		add_sc_cat(Hira)&lt;br /&gt;
		add_sc_cat(Kana)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, sc in ipairs(lang:getScripts()) do&lt;br /&gt;
		if sc:getCode() == &amp;quot;Hrkt&amp;quot; then&lt;br /&gt;
			add_Hrkt()&lt;br /&gt;
		else&lt;br /&gt;
			add_sc_cat(sc)&lt;br /&gt;
			if sc:getCode() == &amp;quot;Jpan&amp;quot; then&lt;br /&gt;
				add_sc_cat(Hani)&lt;br /&gt;
				add_Hrkt()&lt;br /&gt;
			elseif sc:getCode() == &amp;quot;Kore&amp;quot; then&lt;br /&gt;
				add_sc_cat(Hang)&lt;br /&gt;
				add_sc_cat(Hani)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasTranslit() then&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:Languages with automatic transliteration&amp;quot;, sort = canonicalName})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local saw_country = false&lt;br /&gt;
	for _, country in ipairs(countries) do&lt;br /&gt;
		if country ~= &amp;quot;UNKNOWN&amp;quot; then&lt;br /&gt;
			table.insert(ret, {name = &amp;quot;Category:Languages of &amp;quot; .. country, sort = canonicalName})&lt;br /&gt;
			saw_country = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if extinct then&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:All extinct languages&amp;quot;, sort = canonicalName})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not saw_country then&lt;br /&gt;
		table.insert(ret, {name = &amp;quot;Category:Languages not sorted into a country category&amp;quot;, sort = canonicalName})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function get_children(lang)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
&lt;br /&gt;
	-- FIXME: We should work on the children mechanism so it isn&amp;#039;t necessary to manually specify these.&lt;br /&gt;
	for _, label in ipairs({&amp;quot;appendices&amp;quot;, &amp;quot;entry maintenance&amp;quot;, &amp;quot;lemmas&amp;quot;, &amp;quot;names&amp;quot;, &amp;quot;phrases&amp;quot;, &amp;quot;rhymes&amp;quot;, &amp;quot;symbols&amp;quot;, &amp;quot;templates&amp;quot;, &amp;quot;terms by etymology&amp;quot;, &amp;quot;terms by usage&amp;quot;}) do&lt;br /&gt;
		table.insert(ret, {name = label, is_label = true})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(ret, {name = &amp;quot;terms derived from {{{langname}}}&amp;quot;, is_label = true, lang = false})&lt;br /&gt;
	table.insert(ret, {module = &amp;quot;topic cat&amp;quot;, args = {code = &amp;quot;{{{langcode}}}&amp;quot;, label = &amp;quot;all topics&amp;quot;}, sort = &amp;quot;all topics&amp;quot;})&lt;br /&gt;
	table.insert(ret, {name = &amp;quot;Regional {{{langname}}}&amp;quot;})&lt;br /&gt;
	table.insert(ret, {name = &amp;quot;Requests concerning {{{langname}}}&amp;quot;})&lt;br /&gt;
	table.insert(ret, {name = &amp;quot;Category:Rhymes:{{{langname}}}&amp;quot;, description = &amp;quot;Lists of {{{langname}}} words by their rhymes.&amp;quot;})&lt;br /&gt;
	table.insert(ret, {name = &amp;quot;Category:User {{{langcode}}}&amp;quot;, description = &amp;quot;Wiktionary users categorized by fluency levels in {{{langname}}}.&amp;quot;})&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Handle language categories of the form e.g. [[:Category:French language]] and&lt;br /&gt;
-- [[:Category:British Sign Language]].&lt;br /&gt;
table.insert(raw_handlers, function(data)&lt;br /&gt;
	local lang&lt;br /&gt;
	local langname = data.category:match(&amp;quot;^(.*) language$&amp;quot;)&lt;br /&gt;
	if langname then&lt;br /&gt;
		lang = m_languages.getByCanonicalName(langname)&lt;br /&gt;
	elseif data.category:find(&amp;quot; Language$&amp;quot;) then&lt;br /&gt;
		lang = m_languages.getByCanonicalName(data.category)&lt;br /&gt;
	end&lt;br /&gt;
	if not lang then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local params = {&lt;br /&gt;
		[4] = {list = true},&lt;br /&gt;
		[&amp;quot;setwiki&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;setwikt&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;setsister&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;entryname&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;extinct&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(data.args, params)&lt;br /&gt;
	-- If called from inside, don&amp;#039;t require any arguments, as they can&amp;#039;t be known&lt;br /&gt;
	-- in general and aren&amp;#039;t needed just to generate the first parent (used for&lt;br /&gt;
	-- breadcrumbs).&lt;br /&gt;
--	if #args[4] == 0 and not data.called_from_inside then&lt;br /&gt;
		-- At least one country must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).&lt;br /&gt;
--		local fam = lang:getFamily()&lt;br /&gt;
--		if not (lang:hasType(&amp;quot;reconstructed&amp;quot;) or (fam and fam:getCode() == &amp;quot;art&amp;quot;)) then&lt;br /&gt;
--			error(&amp;quot;At least one country (param 1=) must be specified for language &amp;#039;&amp;quot; .. lang:getCanonicalName() .. &amp;quot;&amp;#039; (code &amp;#039;&amp;quot; .. lang:getCode() .. &amp;quot;&amp;#039;). &amp;quot; ..&lt;br /&gt;
--				&amp;quot;Use the value UNKNOWN if the language&amp;#039;s location is truly unknown.&amp;quot;)&lt;br /&gt;
--		end&lt;br /&gt;
--	end&lt;br /&gt;
	local description, intro, additional = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
	-- If called from inside the category tree system, it&amp;#039;s called when generating&lt;br /&gt;
	-- parents or children, and we don&amp;#039;t need to generate the description or additional&lt;br /&gt;
	-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],&lt;br /&gt;
	-- which calls [[Module:languages/data/all]]).&lt;br /&gt;
	if not data.called_from_inside then&lt;br /&gt;
		description, intro, additional = get_description_intro_additional(&lt;br /&gt;
			lang, args[4], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	return {&lt;br /&gt;
		description = description,&lt;br /&gt;
		lang = lang:getCode(),&lt;br /&gt;
		intro = intro,&lt;br /&gt;
		additional = additional,&lt;br /&gt;
		breadcrumb = lang:getCanonicalName(),&lt;br /&gt;
		parents = get_parents(lang, args[4], args.extinct),&lt;br /&gt;
		extra_children = get_children(lang),&lt;br /&gt;
		umbrella = false,&lt;br /&gt;
		can_be_empty = true,&lt;br /&gt;
	}, true&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Handle categories such as [[:Category:Regional French]] and [[:Category:Regional Ancient Greek]].&lt;br /&gt;
table.insert(raw_handlers, function(data)&lt;br /&gt;
	local langname = data.category:match(&amp;quot;^Regional (.*)$&amp;quot;)&lt;br /&gt;
	if langname then&lt;br /&gt;
		local lang = require(&amp;quot;Module:languages&amp;quot;).getByCanonicalName(langname)&lt;br /&gt;
		if lang then&lt;br /&gt;
			return {&lt;br /&gt;
				lang = lang:getCode(),&lt;br /&gt;
				description = &amp;quot;Categories containing terms in regional varieties of &amp;quot; .. lang:makeCategoryLink() .. &amp;quot;.&amp;quot;,&lt;br /&gt;
				additional = &amp;quot;This category may also directly contain terms that are uncategorized regionalisms. Such terms should usually be recategorized by the particular regional variety they belong to.&amp;quot;,&lt;br /&gt;
				parents = {&lt;br /&gt;
					&amp;quot;{{{langcat}}}&amp;quot;,&lt;br /&gt;
					{name = &amp;quot;Regionalisms&amp;quot;, sort = langname},&lt;br /&gt;
				},&lt;br /&gt;
				breadcrumb = &amp;quot;Regional&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].&lt;br /&gt;
table.insert(raw_handlers, function(data)&lt;br /&gt;
	local langname = data.category:match(&amp;quot;(.*)%-based creole or pidgin languages$&amp;quot;)&lt;br /&gt;
	if langname then&lt;br /&gt;
		local lang = require(&amp;quot;Module:languages&amp;quot;).getByCanonicalName(langname)&lt;br /&gt;
		if lang then&lt;br /&gt;
			return {&lt;br /&gt;
				lang = lang:getCode(),&lt;br /&gt;
				description = &amp;quot;Languages which developed as a {{wt|creole}} or {{wt|pidgin}} from &amp;quot; .. lang:makeCategoryLink() .. &amp;quot;.&amp;quot;,&lt;br /&gt;
				parents = {{name = &amp;quot;Creole or pidgin languages&amp;quot;, sort = &amp;quot;*&amp;quot; .. langname}},&lt;br /&gt;
				breadcrumb = lang:getCanonicalName() .. &amp;quot;-based&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Handle categories such as [[:Category:English-based constructed languages]].&lt;br /&gt;
table.insert(raw_handlers, function(data)&lt;br /&gt;
	local langname = data.category:match(&amp;quot;(.*)%-based constructed languages$&amp;quot;)&lt;br /&gt;
	if langname then&lt;br /&gt;
		local lang = require(&amp;quot;Module:languages&amp;quot;).getByCanonicalName(langname)&lt;br /&gt;
		if lang then&lt;br /&gt;
			return {&lt;br /&gt;
				lang = lang:getCode(),&lt;br /&gt;
				description = &amp;quot;Constructed languages which are based on &amp;quot; .. lang:makeCategoryLink() .. &amp;quot;.&amp;quot;,&lt;br /&gt;
				parents = {{name = &amp;quot;Constructed languages&amp;quot;, sort = &amp;quot;*&amp;quot; .. langname}},&lt;br /&gt;
				breadcrumb = lang:getCanonicalName() .. &amp;quot;-based&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}&lt;/div&gt;</summary>
		<author><name>bob&gt;Juelos</name></author>
	</entry>
</feed>